refactor(#86): SETS → discriminated union + factories #93

Closed
opened 2026-04-21 15:07:31 +02:00 by Ghost · 1 comment
Ghost commented 2026-04-21 15:07:31 +02:00 (Migrated from codeberg.org)

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

Context

`SETS` in `cities.js` heeft 12 velden × 32 sets. Niet elke set gebruikt elk veld → overal in de consumenten-code (`index.html`) staan `>25` ad-hoc guards (`SETS[n]?.phases?`, `SETS[n]?.clickCorrectKm ??` etc.).

3 duidelijke varianten te onderscheiden:

  • simple — één quizType, default mastery/click-drempels
  • phased — 2-4 fases, per-fase quizType
  • daily/bonus — mixed-type, eigen pool-builder, geen vaste quizType

Scope

  • Factory-functies `simpleSet(...)`, `phasedSet(...)`, `dailyBonusSet(...)` in `cities.js`
  • `SETS`-object via factory-calls opbouwen
  • Consumenten in `index.html` vereenvoudigen: `switch (set.kind)` i.p.v. null-checks
  • Default-waardes naar factories, niet naar call-site

Verificatie

  • `node test.js` → 1437+ groen (SET-checks blijven intact)
  • `npx playwright test` → 166 groen
  • Aantal `SETS[n]?.`-guards geteld: moet substantieel dalen (baseline ~25)

Effort/Impact/Risico

3 / 3 / 3 — raakt alle call-sites

Afhankelijkheid

Liever na #94 (centrale router) — route-switching gaat door dezelfde call-sites.

Part of #86 (code-audit scope 1). Zie [AUDIT.md §4](../blob/dev/AUDIT.md#4-citiesjs-sets-veld-overzicht--voorstel-discriminated-union). ## Context \`SETS\` in \`cities.js\` heeft 12 velden × 32 sets. Niet elke set gebruikt elk veld → overal in de consumenten-code (\`index.html\`) staan \`>25\` ad-hoc guards (\`SETS[n]?.phases?\`, \`SETS[n]?.clickCorrectKm ??\` etc.). 3 duidelijke varianten te onderscheiden: - **simple** — één quizType, default mastery/click-drempels - **phased** — 2-4 fases, per-fase quizType - **daily/bonus** — mixed-type, eigen pool-builder, geen vaste quizType ## Scope - Factory-functies \`simpleSet(...)\`, \`phasedSet(...)\`, \`dailyBonusSet(...)\` in \`cities.js\` - \`SETS\`-object via factory-calls opbouwen - Consumenten in \`index.html\` vereenvoudigen: \`switch (set.kind)\` i.p.v. null-checks - Default-waardes naar factories, niet naar call-site ## Verificatie - [ ] \`node test.js\` → 1437+ groen (SET-checks blijven intact) - [ ] \`npx playwright test\` → 166 groen - [ ] Aantal \`SETS[n]?.\`-guards geteld: moet substantieel dalen (baseline ~25) ## Effort/Impact/Risico 3 / 3 / 3 — raakt alle call-sites ## Afhankelijkheid Liever na #94 (centrale router) — route-switching gaat door dezelfde call-sites.
Ghost commented 2026-04-21 21:50:54 +02:00 (Migrated from codeberg.org)

Fixed in v2.19.3 — SETS zijn nu aangemaakt via simpleSet/phasedSet/dailyBonusSet factories die een kind-discriminator stempelen. Alle consumenten in index.html branchen op switch(set.kind)/set.variant i.p.v. ad-hoc null-checks op .phases/.daily/.bonus. Legacy velden verwijderd, clickResult genormaliseerd (expliciete thresholds op sets 61-67), SETS_BEHAVIOR_SNAPSHOT + CLICK_GOLDEN oracles in test.js bewaken regressie.

Release: https://github.com/jelmerkk/topoquiz/releases/tag/v2.19.3

Fixed in v2.19.3 — SETS zijn nu aangemaakt via simpleSet/phasedSet/dailyBonusSet factories die een kind-discriminator stempelen. Alle consumenten in index.html branchen op switch(set.kind)/set.variant i.p.v. ad-hoc null-checks op .phases/.daily/.bonus. Legacy velden verwijderd, clickResult genormaliseerd (expliciete thresholds op sets 61-67), SETS_BEHAVIOR_SNAPSHOT + CLICK_GOLDEN oracles in test.js bewaken regressie. Release: https://github.com/jelmerkk/topoquiz/releases/tag/v2.19.3
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#93
No description provided.