scaffold: SvelteKit adapter-node + TypeScript + ESLint #9

Merged
forgejo_admin merged 1 commit from 6-scaffold-sveltekit-adapter-node into main 2026-04-26 00:51:42 +00:00

Summary

Initialize the westside-admin SvelteKit project skeleton: adapter-node SSR (required for Drizzle server queries), strict TypeScript, ESLint flat config, Prettier, placeholder home + layout, and a /health route for the upcoming Dockerfile HEALTHCHECK.

Closes #6

Trace

  • story: admin-row-crud
  • arch: sveltekit-ssr
  • project: project-westside-admin

Changes

  • package.json -- adapter-node, kit/svelte/svelte-check/vite pinned to match westside-app; new deps (typescript, eslint, prettier, adapter-node) at latest stable.
  • svelte.config.js -- @sveltejs/adapter-node with out: 'build'.
  • vite.config.ts -- standard sveltekit() plugin.
  • tsconfig.json -- strict mode, extends .svelte-kit/tsconfig.json, matches westside-contracts conventions.
  • eslint.config.js -- ESLint 9 flat config (js + ts + svelte + prettier).
  • .prettierrc, .prettierignore -- tabs, single quotes, no trailing commas, 100 cols.
  • .gitignore -- node_modules, build, .svelte-kit, .env, .DS_Store.
  • src/app.html, src/app.d.ts, src/app.css -- minimal shell with CSS vars (no Tailwind per feedback_no_tailwind).
  • src/routes/+layout.svelte -- header with brand placeholder.
  • src/routes/+page.svelte -- placeholder home naming the app + roadmap.
  • src/routes/health/+server.ts -- GET /health returns 200 {"status":"ok"} for #7's HEALTHCHECK and k8s probes.
  • src/lib/server/.gitkeep -- reserves the server-only dir for #1 (db.ts) and #2 (hooks.server.ts).
  • static/.gitkeep
  • README.md -- stack, dev/build commands, roadmap pointing at #1-#8.

Out of Scope (deferred)

Per ticket: NO Drizzle (#1), NO Keycloak hooks.server.ts (#2), NO tenant helper (#3), NO players routes (#4/#5), NO Dockerfile (#7), NO .woodpecker.yaml (#8).

Test Plan

  • npm install clean (198 packages, 0 warnings)
  • npm run check -- 141 files, 0 errors, 0 warnings
  • npm run build -- emits build/index.js via @sveltejs/adapter-node
  • node build/index.js -- prod server listens (PORT=3001 in test)
  • GET / -> HTTP 200
  • GET /health -> HTTP 200, body {"status":"ok"}
  • prettier --write . clean
  • eslint . clean

Review Checklist

  • Branch name follows {issue-number}-{kebab-case} -- 6-scaffold-sveltekit-adapter-node
  • No Tailwind, pure CSS vars (feedback_no_tailwind)
  • adapter-node (SSR), NOT adapter-static
  • TypeScript strict mode enabled in tsconfig.json
  • /health route returns 200 (Dockerfile #7 dependency)
  • No deferred features bleeding in (no Drizzle / auth / Dockerfile / CI)
  • Pinned shared deps (kit/svelte/svelte-check/vite) match westside-app
  • src/lib/server/ reserved for #1 + #2
  • PR closes #6
  • project-westside-admin -- project root in pal-e-docs
  • story-westside-admin-admin-row-crud -- user story
  • arch-deployment-westside-admin -- deployment architecture
  • arch-dataflow-westside-admin -- dataflow (justifies SSR over static)
  • feedback_no_tailwind -- pure CSS vars convention
  • Follow-up tickets: forgejo_admin/westside-admin#1, #2, #3, #4, #5, #7, #8

Discovered Scope

None. Scope tight; followups already ticketed (#1, #2, #3, #4, #5, #7, #8).

## Summary Initialize the `westside-admin` SvelteKit project skeleton: `adapter-node` SSR (required for Drizzle server queries), strict TypeScript, ESLint flat config, Prettier, placeholder home + layout, and a `/health` route for the upcoming Dockerfile HEALTHCHECK. Closes #6 ## Trace - story: `admin-row-crud` - arch: `sveltekit-ssr` - project: `project-westside-admin` ## Changes - `package.json` -- adapter-node, kit/svelte/svelte-check/vite pinned to match westside-app; new deps (typescript, eslint, prettier, adapter-node) at latest stable. - `svelte.config.js` -- `@sveltejs/adapter-node` with `out: 'build'`. - `vite.config.ts` -- standard `sveltekit()` plugin. - `tsconfig.json` -- strict mode, extends `.svelte-kit/tsconfig.json`, matches westside-contracts conventions. - `eslint.config.js` -- ESLint 9 flat config (js + ts + svelte + prettier). - `.prettierrc`, `.prettierignore` -- tabs, single quotes, no trailing commas, 100 cols. - `.gitignore` -- node_modules, build, .svelte-kit, .env, .DS_Store. - `src/app.html`, `src/app.d.ts`, `src/app.css` -- minimal shell with CSS vars (no Tailwind per `feedback_no_tailwind`). - `src/routes/+layout.svelte` -- header with brand placeholder. - `src/routes/+page.svelte` -- placeholder home naming the app + roadmap. - `src/routes/health/+server.ts` -- `GET /health` returns `200 {"status":"ok"}` for #7's HEALTHCHECK and k8s probes. - `src/lib/server/.gitkeep` -- reserves the server-only dir for #1 (`db.ts`) and #2 (`hooks.server.ts`). - `static/.gitkeep` - `README.md` -- stack, dev/build commands, roadmap pointing at #1-#8. ## Out of Scope (deferred) Per ticket: NO Drizzle (#1), NO Keycloak `hooks.server.ts` (#2), NO tenant helper (#3), NO players routes (#4/#5), NO Dockerfile (#7), NO `.woodpecker.yaml` (#8). ## Test Plan - [x] `npm install` clean (198 packages, 0 warnings) - [x] `npm run check` -- 141 files, 0 errors, 0 warnings - [x] `npm run build` -- emits `build/index.js` via `@sveltejs/adapter-node` - [x] `node build/index.js` -- prod server listens (PORT=3001 in test) - [x] `GET /` -> HTTP 200 - [x] `GET /health` -> HTTP 200, body `{"status":"ok"}` - [x] `prettier --write .` clean - [x] `eslint .` clean ## Review Checklist - [ ] Branch name follows `{issue-number}-{kebab-case}` -- `6-scaffold-sveltekit-adapter-node` - [ ] No Tailwind, pure CSS vars (`feedback_no_tailwind`) - [ ] adapter-node (SSR), NOT adapter-static - [ ] TypeScript strict mode enabled in `tsconfig.json` - [ ] `/health` route returns 200 (Dockerfile #7 dependency) - [ ] No deferred features bleeding in (no Drizzle / auth / Dockerfile / CI) - [ ] Pinned shared deps (kit/svelte/svelte-check/vite) match westside-app - [ ] `src/lib/server/` reserved for #1 + #2 - [ ] PR closes #6 ## Related Notes - `project-westside-admin` -- project root in pal-e-docs - `story-westside-admin-admin-row-crud` -- user story - `arch-deployment-westside-admin` -- deployment architecture - `arch-dataflow-westside-admin` -- dataflow (justifies SSR over static) - `feedback_no_tailwind` -- pure CSS vars convention - Follow-up tickets: `forgejo_admin/westside-admin#1`, `#2`, `#3`, `#4`, `#5`, `#7`, `#8` ## Discovered Scope None. Scope tight; followups already ticketed (#1, #2, #3, #4, #5, #7, #8).
Initialize the westside-admin SvelteKit project skeleton: adapter-node
SSR (required for Drizzle server queries), strict TypeScript, ESLint
flat config, Prettier, placeholder home + layout, and a /health route
for the upcoming Dockerfile HEALTHCHECK.

No Tailwind per feedback_no_tailwind -- pure CSS vars in app.css.
No Drizzle / auth / Dockerfile / CI -- those land in #1, #2, #7, #8.

Verified:
- npm install clean
- npm run check (svelte-check) passes 0 errors / 0 warnings
- npm run build emits build/index.js via @sveltejs/adapter-node
- node build/index.js -> GET / 200, GET /health 200 {"status":"ok"}
- prettier + eslint clean

Closes #6

story:admin-row-crud
arch:sveltekit-ssr
Author
Owner

PR #9 Review — Scaffold SvelteKit adapter-node

DOMAIN REVIEW (SvelteKit / TypeScript)

Stack identified: SvelteKit 2 + Svelte 5 (runes) + TypeScript strict + adapter-node + ESLint flat config + Prettier. Pure CSS vars (no Tailwind, no PostCSS).

Versions cross-checked against ~/westside-app/package.json reference:

Package westside-app this PR Match
@sveltejs/kit ^2.16.0 ^2.16.0 yes
svelte ^5.19.0 ^5.19.0 yes
@sveltejs/vite-plugin-svelte ^5.0.3 ^5.0.3 yes
svelte-check ^4.1.4 ^4.1.4 yes
vite ^6.1.0 ^6.1.0 yes
adapter static node ^5.2.0 correct divergence (admin needs SSR for Drizzle)

Code quality:

  • svelte.config.js — clean, out: 'build' set so npm start -> node build/index.js works as documented.
  • src/routes/health/+server.ts — uses json() helper, returns exact contract 200 {"status":"ok"} per ticket. JSDoc cites the consumer (#7 HEALTHCHECK + k8s probes). Good.
  • src/routes/+layout.svelte uses Svelte 5 runes ($props(), {@render children()}) — modern.
  • src/app.css defines spacing + color tokens via CSS vars — sets the no-Tailwind precedent for follow-up tickets.
  • tsconfig.json strict + bundler resolution.
  • eslint.config.js flat config with TS + svelte + prettier — current best practice.

BLOCKERS

None.

NITS

  1. Westside accent #c8102e is inline in app.css. Fine for scaffold; consider a tokens.css once the design language solidifies (push to plan Epilogue per feedback_nits_to_epilogue).
  2. .gitignore whitelists .env.example but no .env.example is committed yet. Will land naturally with #1 (Drizzle) when DATABASE_URL shows up — call out in #1 ticket so it isn't missed.
  3. src/app.d.ts has all App.* interfaces commented out — expected for scaffold; Locals will be uncommented in #2 (Keycloak auth). No action needed.

SOP COMPLIANCE

  • Branch named 6-scaffold-sveltekit-adapter-node (matches {issue}-{kebab-purpose})
  • Commit message includes Closes #6
  • Commit message includes story:admin-row-crud
  • Commit message includes arch:sveltekit-ssr
  • Commit message includes verification steps (npm install, npm run check, npm run build, runtime probe of / and /health, prettier + eslint clean)
  • No secrets, no .env, no credentials committed
  • No premature scope: no Drizzle config, no hooks.server.ts, no routes/players, no Dockerfile, no .woodpecker.yaml — those correctly defer to #1/#2/#7/#8
  • No Tailwind, no PostCSS (per feedback_no_tailwind)
  • adapter-node, NOT adapter-static (per ticket spec — admin needs SSR)

PROCESS OBSERVATIONS

  • Clean ticket-sized PR. One concern, one outcome — exactly the feedback_smaller_scopes_parallel and feedback_three_thing_limit shape.
  • README enumerates the follow-up ticket map (#1, #2, #3, #4, #5, #7, #8) — good forward visibility for the next dev agent.
  • Verification block in the commit message is exemplary: it lists exactly what was run and the observed result, satisfying feedback_validate_before_done at the dev-agent layer (CI/runtime validation will come with #8 + post-merge).
  • Risk to next ticket: package-lock.json is committed (correct), so #7's Dockerfile must use npm ci, not npm install. Flag in #7 if not already.

VERDICT: APPROVED

## PR #9 Review — Scaffold SvelteKit adapter-node ### DOMAIN REVIEW (SvelteKit / TypeScript) Stack identified: SvelteKit 2 + Svelte 5 (runes) + TypeScript strict + adapter-node + ESLint flat config + Prettier. Pure CSS vars (no Tailwind, no PostCSS). Versions cross-checked against `~/westside-app/package.json` reference: | Package | westside-app | this PR | Match | |---|---|---|---| | @sveltejs/kit | ^2.16.0 | ^2.16.0 | yes | | svelte | ^5.19.0 | ^5.19.0 | yes | | @sveltejs/vite-plugin-svelte | ^5.0.3 | ^5.0.3 | yes | | svelte-check | ^4.1.4 | ^4.1.4 | yes | | vite | ^6.1.0 | ^6.1.0 | yes | | adapter | static | node ^5.2.0 | correct divergence (admin needs SSR for Drizzle) | Code quality: - `svelte.config.js` — clean, `out: 'build'` set so `npm start` -> `node build/index.js` works as documented. - `src/routes/health/+server.ts` — uses `json()` helper, returns exact contract `200 {"status":"ok"}` per ticket. JSDoc cites the consumer (#7 HEALTHCHECK + k8s probes). Good. - `src/routes/+layout.svelte` uses Svelte 5 runes (`$props()`, `{@render children()}`) — modern. - `src/app.css` defines spacing + color tokens via CSS vars — sets the no-Tailwind precedent for follow-up tickets. - `tsconfig.json` strict + bundler resolution. - `eslint.config.js` flat config with TS + svelte + prettier — current best practice. ### BLOCKERS None. ### NITS 1. Westside accent `#c8102e` is inline in `app.css`. Fine for scaffold; consider a `tokens.css` once the design language solidifies (push to plan Epilogue per `feedback_nits_to_epilogue`). 2. `.gitignore` whitelists `.env.example` but no `.env.example` is committed yet. Will land naturally with #1 (Drizzle) when `DATABASE_URL` shows up — call out in #1 ticket so it isn't missed. 3. `src/app.d.ts` has all `App.*` interfaces commented out — expected for scaffold; `Locals` will be uncommented in #2 (Keycloak auth). No action needed. ### SOP COMPLIANCE - [x] Branch named `6-scaffold-sveltekit-adapter-node` (matches `{issue}-{kebab-purpose}`) - [x] Commit message includes `Closes #6` - [x] Commit message includes `story:admin-row-crud` - [x] Commit message includes `arch:sveltekit-ssr` - [x] Commit message includes verification steps (`npm install`, `npm run check`, `npm run build`, runtime probe of `/` and `/health`, prettier + eslint clean) - [x] No secrets, no `.env`, no credentials committed - [x] No premature scope: no Drizzle config, no `hooks.server.ts`, no `routes/players`, no Dockerfile, no `.woodpecker.yaml` — those correctly defer to #1/#2/#7/#8 - [x] No Tailwind, no PostCSS (per `feedback_no_tailwind`) - [x] adapter-node, NOT adapter-static (per ticket spec — admin needs SSR) ### PROCESS OBSERVATIONS - Clean ticket-sized PR. One concern, one outcome — exactly the `feedback_smaller_scopes_parallel` and `feedback_three_thing_limit` shape. - README enumerates the follow-up ticket map (#1, #2, #3, #4, #5, #7, #8) — good forward visibility for the next dev agent. - Verification block in the commit message is exemplary: it lists exactly what was run and the observed result, satisfying `feedback_validate_before_done` at the dev-agent layer (CI/runtime validation will come with #8 + post-merge). - Risk to next ticket: `package-lock.json` is committed (correct), so #7's Dockerfile must use `npm ci`, not `npm install`. Flag in #7 if not already. ### VERDICT: APPROVED
forgejo_admin deleted branch 6-scaffold-sveltekit-adapter-node 2026-04-26 00:51:42 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
forgejo_admin/westside-admin!9
No description provided.