Skip to main content

Contributing

Guide to developing and contributing to the eSheet monorepo.

๐Ÿค Repository Structureโ€‹

mSheet/
|- apps/
| |- demo/ # Vite demo app (builder + renderer)
| `- docs/ # Docusaurus documentation site
|- packages/
| |- core/ # @esheet/core - types, stores, logic (vanilla TS)
| |- fields/ # @esheet/fields - 19 field components (React)
| |- builder/ # @esheet/builder - visual form editor (React)
| |- renderer/ # @esheet/renderer - form fill-out (React)
| |- renderer-standalone/ # @esheet/renderer-standalone - non-React mount API
| `- renderer-blaze/ # @esheet/renderer-blaze - Meteor Blaze integration
|- pnpm-workspace.yaml
|- tsconfig.base.json
`- package.json

๐Ÿ”— Dependency Graphโ€‹

@esheet/core (no React dependency)
^
@esheet/fields (depends on core)
^
@esheet/builder (depends on core + fields)
@esheet/renderer (depends on core + fields)
^
@esheet/renderer-standalone (depends on renderer)
@esheet/renderer-blaze (depends on renderer)

๐Ÿš€ Development Workflowโ€‹

Prerequisitesโ€‹

  • Node.js 20+
  • Corepack

Installโ€‹

corepack enable
pnpm install

Run the Demo Appโ€‹

pnpm dev:demo

Run the Docs Siteโ€‹

pnpm dev:docs

Build All Packagesโ€‹

pnpm build

Run Testsโ€‹

pnpm test

Lintโ€‹

pnpm lint

๐Ÿ“ Code Styleโ€‹

  • TypeScript strict mode - no any unless unavoidable. Prefer unknown + narrowing.
  • nodenext module resolution - use .js extensions in relative imports
  • No enums - use as const objects or string literal unions
  • readonly where appropriate - for immutable parameters and data
  • Interfaces over type aliases - for object shapes (unless union/intersection needed)
  • Early returns over nested conditionals
  • Keep functions short - under ~40 lines when possible

๐Ÿ“š Docs Styleโ€‹

  • Keep docs clear, technical, and concise.
  • Use emoji sparingly for wayfinding in major headings only.
  • Avoid dense or decorative emoji usage in body text.
  • Prefer consistency: if one page uses heading emojis, keep them subtle and section-scoped.

๐Ÿงช Testingโ€‹

  • Tests use Vitest with globals: true (no need to import describe/it/expect)
  • Test files live next to source: foo.ts -> foo.spec.ts
  • Run specific package tests: pnpm --filter @esheet/core test

๐Ÿ› ๏ธ Workspace Commandsโ€‹

Workspace tasks are exposed through root scripts and package filters:

CommandDescription
pnpm dev:demoStart demo app dev server
pnpm dev:docsStart docs dev server
pnpm buildBuild all packages
pnpm testRun all package tests
pnpm lintLint all workspaces
pnpm --filter @esheet/core testTest one package
pnpm --filter @esheet/demo... buildBuild an app and its deps