refactor(#86): pure-logica extract naar src/game/ + build-stap #95

Closed
opened 2026-04-21 15:08:11 +02:00 by Ghost · 2 comments
Ghost commented 2026-04-21 15:08:11 +02:00 (Migrated from codeberg.org)

Part of #86 (code-audit scope 1). Zie AUDIT.md §1.3 + §4.

Context

~280 LOC pure logica in `index.html` (haversine, levenshtein, dateSeedG, seededShuffle, dailyPool, BonusPool, fuzzy-matching, smoothing helpers) is vandaag al 1:1 getest in `test.js` maar blijft in de monoliet staan. Verhuizen naar `src/game/*.js` maakt:

  • Unit-tests directer (geen spiegel-definitie meer nodig in test.js)
  • Monoliet krimpt met ~280 LOC
  • Deur open voor meer extracties (schermen, feedback-logica)

Vereist een bundle-stap (esbuild of native `

Part of #86 (code-audit scope 1). Zie [AUDIT.md §1.3](../blob/dev/AUDIT.md#13-js-sectie-regels-742-2673--onderverdeling) + §4. ## Context ~280 LOC pure logica in \`index.html\` (haversine, levenshtein, dateSeedG, seededShuffle, dailyPool, BonusPool, fuzzy-matching, smoothing helpers) is vandaag al 1:1 getest in \`test.js\` maar blijft in de monoliet staan. Verhuizen naar \`src/game/*.js\` maakt: - Unit-tests directer (geen spiegel-definitie meer nodig in test.js) - Monoliet krimpt met ~280 LOC - Deur open voor meer extracties (schermen, feedback-logica) Vereist een bundle-stap (esbuild of native \`<script type="module">\`) omdat de productie-versie ook na die extractie één HTML-bestand moet blijven (rsync-deploy, CF cache). ## Scope - Kies bundler: \`esbuild\` (simpel, 1 file), native ES modules (geen build), of inline build in e2e-workflow - Verplaats helpers naar \`src/game/{date,fuzzy,shuffle,daily,smooth}.js\` - \`test.js\` importeert uit \`src/game/\` direct (geen spiegel meer) - \`index.html\` importeert via bundled output of via native module-import - \`.github/workflows/e2e.yml\` draait bundle-step vóór tests - Rsync-allowlist uitbreiden als er build-artifacts zijn ## Verificatie - [ ] \`node test.js\` groen (nu zonder spiegel-code) - [ ] \`npx playwright test\` 166 groen - [ ] Productie-build is nog één \`index.html\` (of één \`bundle.js\`-include) - [ ] CF-preview laadt zonder extra requests - [ ] Source-maps aanwezig voor debug ## Effort/Impact/Risico 3 / 3 / 2 — tooling-beslissing nodig ## Afhankelijkheid #90 (buildPolygonLayer dedup) heeft voorrang — kleinste tak eerst. ## Open vraag Welke bundler? \`esbuild\` (aanbevolen — simpel, snel), native ES modules (geen build), of \`vite\` (overkill voor dit project)?
Ghost commented 2026-04-22 10:21:35 +02:00 (Migrated from codeberg.org)

Bundler-keuze: native ESM (geen build-stap)

Beslist na afweging native ESM / esbuild / Vite in v2.24.1-sessie.

Rationale

  • Nul build-stappen in CI — past bij komende migratie naar Codeberg + Forgejo runners (minder toolchain-deps op de runner).
  • Betere cache-granulariteit op CF — fix in één helper invalidateert alleen dat bestand, geen bundle.hash.js-hit.
  • Directe bron in productie — stack traces wijzen naar /src/game/daily.js:L, geen sourcemap-indirectie.
  • Past bij bestaand modelcities.js is al een losse top-level file die index.html laadt; src/game/*.js is hetzelfde patroon.
  • Geen framework / geen TS / geen tree-shaking-winst — bundler-tooling heeft hier geen inhoudelijke waarde.

Scope-impact

  • src/game/{date,fuzzy,shuffle,daily,smooth,geo}.js — ESM-exports (named).
  • index.html: één <script type="module"> met import { dailyPool } from '/src/game/daily.js' etc. Behoud cities.js-globals (aparte migratie).
  • test.js → ESM ("type":"module" in package.json of rename naar test.mjs). Importeert direct uit src/game/ — geen spiegel-definities meer.
  • .github/workflows/e2e.yml rsync-allowlist: --include='src/***' toevoegen.
  • sw.js: /src/game/*.js opnemen in ASSETS zodat PWA offline blijft werken.
  • Geen esbuild/vite/rollup-dependency.

Escape-hatch

Als de module-count ooit > ~15 wordt, of TypeScript / een framework intreedt: esbuild-toevoegen bovenop deze structuur is 1 dag werk, geen re-write. Je gooit niks weg door nu native ESM te kiezen.

## Bundler-keuze: **native ESM** (geen build-stap) Beslist na afweging native ESM / esbuild / Vite in v2.24.1-sessie. ### Rationale - **Nul build-stappen in CI** — past bij komende migratie naar Codeberg + Forgejo runners (minder toolchain-deps op de runner). - **Betere cache-granulariteit op CF** — fix in één helper invalidateert alleen dat bestand, geen `bundle.hash.js`-hit. - **Directe bron in productie** — stack traces wijzen naar `/src/game/daily.js:L`, geen sourcemap-indirectie. - **Past bij bestaand model** — `cities.js` is al een losse top-level file die `index.html` laadt; `src/game/*.js` is hetzelfde patroon. - **Geen framework / geen TS / geen tree-shaking-winst** — bundler-tooling heeft hier geen inhoudelijke waarde. ### Scope-impact - `src/game/{date,fuzzy,shuffle,daily,smooth,geo}.js` — ESM-exports (named). - `index.html`: één `<script type="module">` met `import { dailyPool } from '/src/game/daily.js'` etc. Behoud cities.js-globals (aparte migratie). - `test.js` → ESM (`"type":"module"` in package.json of rename naar `test.mjs`). Importeert direct uit `src/game/` — geen spiegel-definities meer. - `.github/workflows/e2e.yml` rsync-allowlist: `--include='src/***'` toevoegen. - `sw.js`: `/src/game/*.js` opnemen in `ASSETS` zodat PWA offline blijft werken. - **Geen** esbuild/vite/rollup-dependency. ### Escape-hatch Als de module-count ooit > ~15 wordt, of TypeScript / een framework intreedt: esbuild-toevoegen bovenop deze structuur is 1 dag werk, geen re-write. Je gooit niks weg door nu native ESM te kiezen.
Ghost commented 2026-04-22 13:13:54 +02:00 (Migrated from codeberg.org)

Done. Pure-logica-extract is gemerged in v2.25.x — src/game/text.js, src/game/geo.js, src/game/click.js, src/game/daily.js, src/game/shapes.js, src/game/smooth.js. test.mjs importeert nu direct uit die modules (geen spiegel-code meer). Bundle-stap bleek niet nodig — native ES modules via <script type="module"> werkt zowel op CF als Uberspace (sw.js cachet de losse files). Index.html gekrompen met ~280 LOC.

Done. Pure-logica-extract is gemerged in v2.25.x — `src/game/text.js`, `src/game/geo.js`, `src/game/click.js`, `src/game/daily.js`, `src/game/shapes.js`, `src/game/smooth.js`. `test.mjs` importeert nu direct uit die modules (geen spiegel-code meer). Bundle-stap bleek niet nodig — native ES modules via `<script type="module">` werkt zowel op CF als Uberspace (sw.js cachet de losse files). Index.html gekrompen met ~280 LOC.
Sign in to join this conversation.
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
jelmer/topoquiz#95
No description provided.