npm run dev: Start Vite dev server (no Cloudflare bindings)npm run dev:cf: Build + run Wrangler dev with Cloudflare bindings (D1/R2/Browser)npm run build: Build for productionnpm run preview: Preview production buildnpm run deploy: Build + deploy to Cloudflare Workersnpm run check: Run type checksnpm run check:watch: Run type checks in watch modenpm run format: Format with Prettiernpm run lint: Check formattingnpm run test: Run Playwright testsnpm run test:ui: Playwright UI modenpm run test:headed: Playwright headed mode- Single test:
playwright test <file>orplaywright test -g "<test-name>"
- Use tabs (Prettier config), single quotes, 100 char line width
- Component files are PascalCase (e.g.,
InvoiceFormComponent.svelte) - Identifiers: camelCase, types: PascalCase
- Prefer named exports from
$lib/src/libbarrels - Import order: external deps → internal modules → relative imports
- No trailing commas (Prettier)
- Strict TypeScript enabled
src/routes: Page layouts/actions/endpoints; API routes live undersrc/routes/apisrc/components: Reusable UI components (PascalCase files)src/lib: Domain utilities, helpers, types, auth client, PDF generation, i18nsrc/lib/server: Server-only auth/db/session logic (Drizzle + Better Auth)src/lib/templates: Invoice template registry + template componentssrc/services: Reserved for service modules (currently empty)src/stores: Svelte stores for invoice data/page settings/templatesstatic/: Public assetstests/: Playwright specswrangler.toml: Cloudflare Worker bindings (D1, R2, Browser)- Run
npm run checkbefore pushing
npm run checkcurrently fails- Errors:
src/routes/dashboard/+page.svelte: comma operator used for reactive triggers (line ~99)
- Warnings (high level):
- A11y click handlers on non-interactive elements in
src/components/Header.svelte - A11y missing labels on icon-only buttons in
src/components/dashboard/InvoiceCardGrid.svelte,src/components/dashboard/InvoiceTableView.svelte,src/routes/admin/+page.svelte - A11y click handlers on modal overlay/div in
src/routes/admin/+page.svelte,src/routes/admin/deleted/+page.svelte - Invalid SSR markup:
ulinsidepinsrc/routes/admin/deleted/+page.svelte - Unused CSS selectors in
src/routes/shared/[token]/+page.svelte - CSS compatibility note for
appearanceinsrc/components/PageSettingsSelector.svelte
- A11y click handlers on non-interactive elements in