pediatric-ai-scribe-v3/client/main.ts
Daniel 759135f76f chore(ts): frontend build scaffold — esbuild + tsconfig.client + main.ts
Strangler-fig migration setup for the frontend. Legacy public/js/*.js
keeps working unchanged; new TypeScript code lives under client/ and
gets bundled into public/dist/ at image-build time.

Adds:
- esbuild@0.28 as a regular dep (so docker build can run the bundler
  without --include-dev). It's small; tsx already pulled in a pinned
  version transitively.
- scripts/build-client.mjs: bundles every top-level client/*.ts file
  into public/dist/<name>.js as ESM with sourcemap. --watch mode for
  dev. Sub-directories under client/ are bundled by their parent
  entry, not separately.
- tsconfig.client.json: browser target (lib: DOM), bundler module
  resolution, isolatedModules:true so esbuild + tsc agree.
- Two npm scripts: build:client, typecheck:client.
- Dockerfile: 'RUN node scripts/build-client.mjs' between COPY and CMD,
  so the prod image ships with the built bundle.
- .gitignore: public/dist/ — build output, never committed.
- public/index.html: <script type="module" src="/dist/main.js">
  appended after legacy script tags.
- client/main.ts: minimal entry point with a console.log marker
  (window.__clientBundle = true) so we can verify the bundle loaded.

Sacred files (per project memory) kept off the migration path:
- public/js/encounters.js (save/idempotency)
- voiceDictation.js, sickVisit.js recording paths (STT plumbing)
These need explicit per-file approval from Daniel before migration.

Verification:
- npm run typecheck → 0 errors (backend)
- npm run typecheck:client → 0 errors (frontend)
- npm run build:client → public/dist/main.js + .map in 3 ms
- 46/46 unit tests pass

Next session: migrate the first real frontend module (small + isolated,
likely extensions.js or memories.js) into client/ as ES module + TS.
2026-04-27 23:54:38 +02:00

27 lines
1.1 KiB
TypeScript

// ============================================================
// client/main.ts — Entry point for the TypeScript frontend bundle.
//
// Built by scripts/build-client.mjs into public/dist/main.js,
// loaded by index.html via:
// <script type="module" src="/dist/main.js"></script>
//
// Strangler-fig migration: this bundle runs ALONGSIDE the legacy
// public/js/*.js IIFE files. As each legacy module is migrated, it
// moves out of public/js/ into client/<feature>/ and is imported
// from this entry point. The legacy script tag is removed from
// index.html in the same commit.
//
// Sacred files (per project memory) — DO NOT migrate without
// per-file approval from Daniel:
// - public/js/encounters.js (save/idempotency logic)
// - public/js/voiceDictation.js, sickVisit.js recording paths
// (voice/STT plumbing)
// ============================================================
console.log('[client] TypeScript bundle loaded.');
// Marker so anything else that wants to know if the bundle reached
// the page can check window.__clientBundle === true.
(window as any).__clientBundle = true;
export {};