2.5 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Tech Stack
- SvelteKit 5 + TypeScript + Bun + Tailwind v4 + better-sqlite3
- Auth via Synology SSO Server (OIDC) using Auth.js
Development Commands
bun run dev # Start dev server
bun run build # Production build
bun run check # TypeScript type-check
bun run lint # ESLint (must pass with 0 errors)
bun run format # Prettier formatting
bun run test # Run unit tests (must all pass)
bun run test:watch # Run tests in watch mode
bun run test:coverage # Run tests with coverage report
Code Quality
Linting and tests must pass before considering any task complete
After making changes, always verify:
bun run lint— must exit with 0 errors (warnings are acceptable)bun run test— all tests must pass
Write unit tests after every major feature
When adding or significantly modifying server-side business logic (files under src/lib/server/), write corresponding unit tests in a .test.ts file alongside the module (e.g. src/lib/server/lodgings.test.ts).
Tests use Vitest with an in-memory SQLite database. Use the setupTestDb() helper from src/tests/helpers.ts to get a fresh DB per test:
import { setupTestDb } from '../../tests/helpers.js';
import type { Database } from './db/types.js';
let db: Database;
beforeEach(() => { db = setupTestDb(); });
afterEach(() => { db.close(); });
Test coverage should include the happy path, optional fields, ownership/authorisation checks, and any relationship linking (e.g. guests, travellers).
ESLint notes
svelte/require-each-keyis set towarn— keyless{#each}blocks are acceptable where keys are not meaningful@typescript-eslint/no-unused-expressionsis off — thevalue;reactivity-tracking pattern used in Svelte 5$effectblocks is intentional- Prefix unused variables/args/catch bindings with
_to satisfy the no-unused-vars rule - Use
// eslint-disable-next-line svelte/prefer-svelte-reactivityfornew URLSearchParams()used as local temporaries (not reactive state)
DB / Testing Architecture
All server modules import db from $lib/server/db/index.ts. In tests, _setDb() is used to inject an in-memory SQLite instance, bypassing the $env/dynamic/private SvelteKit virtual module entirely. Never call _setDb in production code.
SvelteKit virtual modules ($env/dynamic/private, $app/paths) are stubbed via path aliases in vitest.config.ts.