2.6 KiB
2.6 KiB
portal.Rhemawavetech.com
SvelteKit 2 + Svelte 5 (runes) + Tailwind CSS v4 + Prisma 7 + PostgreSQL + Better-Auth.
Quick start
npm install # engine-strict=true in .npmrc
npm run prepare # svelte-kit sync (generate types)
npm run dev # vite dev on :5173
Requires .env with at least DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL.
Commands
| npm run ... | What it does |
|---|---|
check |
svelte-kit sync && svelte-check (typecheck) |
lint |
prettier --check . && eslint . (order matters) |
format |
prettier --write . |
test |
vitest --run (single run) |
test:unit |
vitest (watch mode) |
migrate -- --name <name> |
Create a Prisma migration |
deploy |
Apply pending migrations |
build |
Production build (adapter-node) |
Testing quirks
- Two Vitest projects:
client(Playwright/Chromium headless,src/**/*.svelte.{test,spec}.{js,ts}) andserver(node env, everything else). Tests co-located beside source files. expect: { requireAssertions: true }— every test must assert something.- All route tests mock
$lib/db(Prisma client) and$lib/auth-client/$lib/authviavi.mock(). Stub factories insrc/lib/test-utils.ts. - No
.env.test— mocking$lib/dbmakes real DB unnecessary. - Known bug: register page
throw redirect()is caught by try/catch and returns 400 instead of redirecting (documented in test).
Architecture notes
- Route groups:
(protected)/requires auth + profile;(user)/is user-facing;admin/requires roleId <= 3 (STAFF+). - Svelte-Admin: custom config-driven CRUD in
src/lib/svelte-admin/. Models registered inregistry.ts. Dynamic routes[model]/[id]. - Prisma client generated to
src/lib/generated/prisma/(notnode_modules/.prisma/client). Lazy singleton via Proxy insrc/lib/db.ts. - Better-Auth server instance in
src/lib/auth.ts, browser client insrc/lib/auth-client.ts. Session fetched insrc/hooks.server.ts. - Roles: integer hierarchy (SUPER=1, ADMIN=2, STAFF=3, USER=4).
canAccessAdminchecks roleId <= 3. - Payments are stubbed (
src/lib/payments.ts— setTimeout + console.log).
Formatting conventions
- Tabs, single quotes, no trailing commas, 100 print width (enforced by Prettier).
- Svelte 5 runes only (
$state,$derived,$effect,$props). No legacy stores.
Generated / build artifacts
.svelte-kit/— SvelteKit generated types (gitignored)src/lib/generated/prisma/— Prisma client output (not gitignored; regenerate withnpx prisma generate)