Scaffold SvelteKit adapter-node + TypeScript + ESLint #6

Closed
opened 2026-04-25 22:01:38 +00:00 by forgejo_admin · 3 comments

Type

Task

Lineage

First foundational ticket for westside-admin. No parent issue. Blocks: forgejo_admin/westside-admin#1 (Drizzle), #2 (Auth), #3 (Tenant helper), #4 (Players list), #5 (Players edit), #7 (Dockerfile), #8 (Woodpecker).

Repo

forgejo_admin/westside-admin

User Story

story-westside-admin-admin-row-crud. Foundational scaffolding — the app cannot exist without the SvelteKit project structure.

Context

westside-admin is a new SvelteKit adapter-node app that will use Drizzle ORM to provide admin CRUD over the basketball-api Postgres DB, gated by Keycloak admin role. This ticket creates the empty SvelteKit project skeleton — no auth, no Drizzle, no routes beyond a placeholder home page. Subsequent tickets layer those in.

adapter-node is required (NOT adapter-static) because Drizzle queries run server-side via +page.server.ts and hooks.server.ts. See arch-deployment-westside-admin and arch-dataflow-westside-admin.

Reference repo caveat: westside-app is adapter-static + plain JavaScript + no ESLint config. It is NOT a transferable scaffold reference. Use the SvelteKit official adapter-node + TypeScript scaffold (npm create svelte@latest with TypeScript + ESLint + Prettier). If westside-contracts exists and is adapter-node, prefer that as the reference for repo conventions.

Scope

Initialize the SvelteKit project skeleton as the foundation for all subsequent feature tickets. Run npm create svelte@latest (or pnpm equivalent) selecting: TypeScript syntax, ESLint, Prettier, no test framework yet. Then install @sveltejs/adapter-node and configure svelte.config.js to use it.

Files created: package.json (with kit, svelte, vite, typescript, eslint, prettier deps), svelte.config.js (using @sveltejs/adapter-node), vite.config.ts, strict tsconfig.json, .eslintrc.cjs + .prettierrc, .gitignore (node_modules, build, .env, .DS_Store), minimal src/app.html, placeholder src/routes/+layout.svelte with nav placeholder, placeholder src/routes/+page.svelte displaying "westside-admin" plus a /health route at src/routes/health/+server.ts that returns 200 (Dockerfile ticket #7 needs this), .gitkeep in src/lib/server/ to reserve the server-only directory, and a README.md pointing to project-westside-admin in pal-e-docs.

Do NOT create in this ticket: src/lib/server/db.ts (covered by #1), hooks.server.ts (covered by #2), Dockerfile (#7), .woodpecker.yaml (#8).

Pin versions for kit/svelte/svelte-check/vite to whatever westside-app uses (those packages are the same in adapter-static and adapter-node). Leave new deps (typescript, eslint, prettier, adapter-node) at latest stable. No Tailwind per feedback_no_tailwind.

Acceptance Criteria

  • npm install (or pnpm install) runs clean with no warnings
  • npm run check (svelte-check) passes
  • npm run build produces a build/ directory with index.js
  • npm run dev starts dev server on port 5173 and serves the placeholder
  • node build/index.js starts production server on port 3000
  • GET /health returns HTTP 200 (so Dockerfile HEALTHCHECK in #7 works)
  • Repo passes ESLint + Prettier on all created files

Test Expectations

  • Unit tests: not required for scaffolding (no logic yet)
  • Build sanity: node build/index.js responds 200 to GET / and GET /health

Constraints

  • adapter-node, NOT adapter-static
  • TypeScript strict mode
  • No Tailwind per feedback_no_tailwind
  • Pin kit/svelte/svelte-check/vite versions to match westside-app where they're shared dependencies; everything else latest stable

Checklist

  • PR opened
  • npm run check + npm run build green
  • /health route confirmed returning 200
  • No unrelated changes
  • project-westside-admin
  • story-westside-admin-admin-row-crud
  • arch-deployment-westside-admin
### Type Task ### Lineage First foundational ticket for westside-admin. No parent issue. Blocks: `forgejo_admin/westside-admin#1` (Drizzle), `#2` (Auth), `#3` (Tenant helper), `#4` (Players list), `#5` (Players edit), `#7` (Dockerfile), `#8` (Woodpecker). ### Repo `forgejo_admin/westside-admin` ### User Story `story-westside-admin-admin-row-crud`. Foundational scaffolding — the app cannot exist without the SvelteKit project structure. ### Context westside-admin is a new SvelteKit `adapter-node` app that will use Drizzle ORM to provide admin CRUD over the basketball-api Postgres DB, gated by Keycloak admin role. This ticket creates the empty SvelteKit project skeleton — no auth, no Drizzle, no routes beyond a placeholder home page. Subsequent tickets layer those in. `adapter-node` is required (NOT `adapter-static`) because Drizzle queries run server-side via `+page.server.ts` and `hooks.server.ts`. See `arch-deployment-westside-admin` and `arch-dataflow-westside-admin`. **Reference repo caveat:** westside-app is `adapter-static` + plain JavaScript + no ESLint config. It is NOT a transferable scaffold reference. Use the SvelteKit official adapter-node + TypeScript scaffold (`npm create svelte@latest` with TypeScript + ESLint + Prettier). If westside-contracts exists and is adapter-node, prefer that as the reference for repo conventions. ### Scope Initialize the SvelteKit project skeleton as the foundation for all subsequent feature tickets. Run `npm create svelte@latest` (or pnpm equivalent) selecting: TypeScript syntax, ESLint, Prettier, no test framework yet. Then install `@sveltejs/adapter-node` and configure `svelte.config.js` to use it. Files created: `package.json` (with kit, svelte, vite, typescript, eslint, prettier deps), `svelte.config.js` (using @sveltejs/adapter-node), `vite.config.ts`, strict `tsconfig.json`, `.eslintrc.cjs` + `.prettierrc`, `.gitignore` (node_modules, build, .env, .DS_Store), minimal `src/app.html`, placeholder `src/routes/+layout.svelte` with nav placeholder, placeholder `src/routes/+page.svelte` displaying "westside-admin" plus a `/health` route at `src/routes/health/+server.ts` that returns 200 (Dockerfile ticket #7 needs this), `.gitkeep` in `src/lib/server/` to reserve the server-only directory, and a `README.md` pointing to `project-westside-admin` in pal-e-docs. Do NOT create in this ticket: `src/lib/server/db.ts` (covered by #1), `hooks.server.ts` (covered by #2), `Dockerfile` (#7), `.woodpecker.yaml` (#8). Pin versions for kit/svelte/svelte-check/vite to whatever westside-app uses (those packages are the same in adapter-static and adapter-node). Leave new deps (typescript, eslint, prettier, adapter-node) at latest stable. No Tailwind per `feedback_no_tailwind`. ### Acceptance Criteria - [ ] `npm install` (or pnpm install) runs clean with no warnings - [ ] `npm run check` (svelte-check) passes - [ ] `npm run build` produces a `build/` directory with `index.js` - [ ] `npm run dev` starts dev server on port 5173 and serves the placeholder - [ ] `node build/index.js` starts production server on port 3000 - [ ] `GET /health` returns HTTP 200 (so Dockerfile HEALTHCHECK in #7 works) - [ ] Repo passes ESLint + Prettier on all created files ### Test Expectations - Unit tests: not required for scaffolding (no logic yet) - Build sanity: `node build/index.js` responds 200 to GET / and GET /health ### Constraints - adapter-node, NOT adapter-static - TypeScript strict mode - No Tailwind per `feedback_no_tailwind` - Pin kit/svelte/svelte-check/vite versions to match westside-app where they're shared dependencies; everything else latest stable ### Checklist - [ ] PR opened - [ ] `npm run check` + `npm run build` green - [ ] `/health` route confirmed returning 200 - [ ] No unrelated changes ### Related - `project-westside-admin` - `story-westside-admin-admin-row-crud` - `arch-deployment-westside-admin`
Author
Owner

Scope Review: NEEDS_REFINEMENT

Review note: review-1087-2026-04-25

Ticket body and scope are solid — Task template complete, AC verifiable, no decomposition needed, no upstream blockers (foundational ticket). One label fix and one minor body tightening keep it from being READY.

  • [LABEL] arch:sveltekit-server does not match any arch note. Project page lists only arch-domain-westside-admin, arch-dataflow-westside-admin, arch-deployment-westside-admin. Suggest arch:deployment-westside-admin (the issue's Related section already links there).
  • [BODY] (minor) Narrow "Match package versions to westside-app" — westside-app uses adapter-static, no TS, no ESLint, jsconfig (not tsconfig). Only @sveltejs/kit, svelte, svelte-check, vite versions are actually applicable.
  • [SCOPE] (board-wide, not this ticket) 10 other items use component-style arch labels (arch:scopeddb-helper, arch:keycloak, arch:hooks-server, arch:page-server, arch:postgres-grants, arch:woodpecker-ci, arch:deployment) with no backing notes. Project-level convention call for Ava.
## Scope Review: NEEDS_REFINEMENT Review note: `review-1087-2026-04-25` Ticket body and scope are solid — Task template complete, AC verifiable, no decomposition needed, no upstream blockers (foundational ticket). One label fix and one minor body tightening keep it from being READY. - `[LABEL]` `arch:sveltekit-server` does not match any arch note. Project page lists only `arch-domain-westside-admin`, `arch-dataflow-westside-admin`, `arch-deployment-westside-admin`. Suggest `arch:deployment-westside-admin` (the issue's Related section already links there). - `[BODY]` (minor) Narrow "Match package versions to westside-app" — westside-app uses adapter-static, no TS, no ESLint, jsconfig (not tsconfig). Only `@sveltejs/kit`, `svelte`, `svelte-check`, `vite` versions are actually applicable. - `[SCOPE]` (board-wide, not this ticket) 10 other items use component-style arch labels (`arch:scopeddb-helper`, `arch:keycloak`, `arch:hooks-server`, `arch:page-server`, `arch:postgres-grants`, `arch:woodpecker-ci`, `arch:deployment`) with no backing notes. Project-level convention call for Ava.
Author
Owner

Scope Review: READY

Review note: review-1087-2026-04-25-v2 (supersedes review-1087-2026-04-25 NEEDS_REFINEMENT)

All v1 blockers resolved:

  • Arch label corrected to arch:sveltekit-ssr (canonical per convention-architecture-ids)
  • /health route added to scope + AC + Test Expectations (unblocks Dockerfile #7)
  • westside-app reference caveat added (it's adapter-static + plain JS, not a transferable reference)
  • Version pinning narrowed to kit/svelte/svelte-check/vite only
  • Blocker list explicit in Lineage (#1, #2, #3, #4, #5, #7, #8)

Ready to advance backlog → todo.

## Scope Review: READY Review note: `review-1087-2026-04-25-v2` (supersedes `review-1087-2026-04-25` NEEDS_REFINEMENT) All v1 blockers resolved: - Arch label corrected to `arch:sveltekit-ssr` (canonical per `convention-architecture-ids`) - `/health` route added to scope + AC + Test Expectations (unblocks Dockerfile #7) - westside-app reference caveat added (it's adapter-static + plain JS, not a transferable reference) - Version pinning narrowed to kit/svelte/svelte-check/vite only - Blocker list explicit in Lineage (#1, #2, #3, #4, #5, #7, #8) Ready to advance backlog → todo.
Author
Owner

PR opened: #9

Scaffold complete. All ACs verified locally:

  • npm install clean
  • npm run check -- 0 errors / 0 warnings
  • npm run build -- emits build/index.js
  • node build/index.js -- GET / 200, GET /health 200 {"status":"ok"}
  • prettier + eslint clean

Branch: 6-scaffold-sveltekit-adapter-node

PR opened: https://forgejo.tail5b443a.ts.net/forgejo_admin/westside-admin/pulls/9 Scaffold complete. All ACs verified locally: - `npm install` clean - `npm run check` -- 0 errors / 0 warnings - `npm run build` -- emits `build/index.js` - `node build/index.js` -- `GET /` 200, `GET /health` 200 `{"status":"ok"}` - `prettier` + `eslint` clean Branch: `6-scaffold-sveltekit-adapter-node`
Sign in to join this conversation.
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#6
No description provided.