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.
27 lines
1.1 KiB
TypeScript
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 {};
|