test(typecheck): verbreed typecheck naar alle testbestanden (179/180) #101

Merged
janpeter merged 1 commit from claude/awesome-rosalind-7b450b into main 2026-07-26 11:49:17 +02:00
Owner

Aanleiding

Testbestanden werden vrijwel niet getypecheckt. tsconfig.json include't alleen src/**/*, en tsconfig.type-tests.json was gescoped op precies één bestand. Vitest transpileert zonder typecheck, dus een typefout in eender welk ander testbestand kwam ongemerkt door CI.

Meting vóór de wijziging

tsc --noEmit met een tijdelijke config over src/**/* + __tests__/**/*: 54 fouten in 16 bestanden, allemaal in __tests__/, nul in src/.

Bestand # Bestand #
dispatch-job.test.ts 11 update-idea-grill-md-product.test.ts 2
idea-plan-loop.test.ts 10 deploy-eligibility.test.ts 2
update-idea.test.ts 7 create-transaction.test.ts 2
deploy-dispatch.test.ts 4 worker-instance-id.test.ts 1
create-idea.test.ts 4 tools/get-review.test.ts 1
get-job-status.test.ts 3 send-idea-chat-message.test.ts 1
wait-for-job-runtime-claim.test.ts 2 realtime-payload-contract.test.ts 1
verify-task-against-plan.test.ts 2 queue-listen.test.ts 1

Per code: 29× TS2339, 10× TS2571, 3× TS2348, 3× TS2345, 2× TS2835, 2× TS2493, 2× TS18046, 1× elk TS2532/TS2352/TS2307.

De src/presence/worker.ts-fouten uit de config-comment bestaan niet meer

Drie onafhankelijke bevestigingen: de verbrede run geeft 0 fouten in src/; npm run typecheck is schoon; en src/presence/worker.ts heeft geen commits sinds de config werd toegevoegd (2026-06-07, 00b92bf). Ook met de gegenereerde Prisma-client weggehaald geeft dat bestand nul fouten. De smalle scope was dus niet langer nodig.

Wat er is gewijzigd

Alle 54 opgelost, zonder productiecode aan te raken — de diff bevat alleen __tests__/ en tsconfig.type-tests.json. Dekking nu 179 van de 180 .ts-bestanden onder __tests__/.

  • __tests__/helpers/tool-result.ts — narrowt de CallToolResult content-unie (28 sites in 6 bestanden). Alleen handlers die met dat SDK-type geannoteerd zijn hadden dit nodig; handlers met een afgeleid object-literal niet.
  • __tests__/helpers/mocks.tsAnyMock, omdat ReturnType<typeof vi.fn> onder vitest 4 de niet-aanroepbare unie Mock<Procedure | Constructable> oplevert. Alleen de sites die de mock echt aanroepen zijn omgezet, niet het hele idioom (310 gebruiken in 84 bestanden).
  • Drie echte NodeNext-overtredingen: ontbrekende .js-extensies. In realtime-payload-contract.test.ts kon TS de module daardoor helemaal niet resolven — die contracttest controleerde dus niets.
  • Expliciete mock-signaturen in deploy-dispatch, deploy-eligibility, create-transaction en worker-instance-id.
  • EventEmitter.getEventListeners i.p.v. de module-level export: alleen de statische variant is getypeerd in @types/node v22, beide bestaan runtime (geverifieerd).

Eén gedocumenteerde carve-out

realtime-payload-contract.test.ts blijft buiten de config. Mét de juiste .js-extensie resolvet de import wél, en dan blijkt vendor/scrum4me-shared/lib/realtime-payload.ts zélf extensieloze relatieve imports te gebruiken (4× TS2835) — het enige vendored bestand met dat probleem, en src/ importeert het nergens. Dat is een aparte repo, dus reden en echte fix staan in tsconfig.type-tests.json: extensies toevoegen in scrum4me-shared, submodule-pointer bumpen, dan die regel weghalen.

Gesignaleerd, niet gewijzigd

PlanReviewLog.rounds is unknown[] in src/lib/idea-plan-loop.ts — oorzaak van 10 van de 54 fouten. Hier test-side genarrowd; het netjes typen in src is de betere fix, maar dat is productiecode.

Verificatie

  • npm run typecheck — schoon
  • npm run typecheck:tests — schoon, nu over 179 bestanden i.p.v. 1
  • npm test176 passed | 2 skipped (178 bestanden); 1317 tests passed, 20 skipped. De 2 overgeslagen bestanden zijn de bestaande TEST_DATABASE_URL-gated integratietests.

CI heeft geen wijziging nodig: die draait npm run typecheck en npm run test, en pretest trekt de verbrede config mee.

Acceptatie-probe: tijdelijk een verplicht veld toegevoegd aan registerShutdownHandlerstypecheck:tests gaf 5× TS2345 in __tests__/presence-shutdown.test.ts, daarna schoon teruggedraaid. De regressie die eerder stil doorkwam, wordt nu gevangen.

Follow-up: de carve-out voor realtime-payload-contract.test.ts wordt opgeheven in een aparte PR (submodule-bump naar janpeter/scrum4me-shared#43), nadat #43 gemerged is. Deze PR bevat die bump niet.

🤖 Generated with Claude Code

## Aanleiding Testbestanden werden vrijwel niet getypecheckt. `tsconfig.json` include't alleen `src/**/*`, en `tsconfig.type-tests.json` was gescoped op precies één bestand. Vitest transpileert zonder typecheck, dus een typefout in eender welk ander testbestand kwam ongemerkt door CI. ## Meting vóór de wijziging `tsc --noEmit` met een tijdelijke config over `src/**/*` + `__tests__/**/*`: **54 fouten in 16 bestanden, allemaal in `__tests__/`, nul in `src/`.** | Bestand | # | Bestand | # | |---|---|---|---| | `dispatch-job.test.ts` | 11 | `update-idea-grill-md-product.test.ts` | 2 | | `idea-plan-loop.test.ts` | 10 | `deploy-eligibility.test.ts` | 2 | | `update-idea.test.ts` | 7 | `create-transaction.test.ts` | 2 | | `deploy-dispatch.test.ts` | 4 | `worker-instance-id.test.ts` | 1 | | `create-idea.test.ts` | 4 | `tools/get-review.test.ts` | 1 | | `get-job-status.test.ts` | 3 | `send-idea-chat-message.test.ts` | 1 | | `wait-for-job-runtime-claim.test.ts` | 2 | `realtime-payload-contract.test.ts` | 1 | | `verify-task-against-plan.test.ts` | 2 | `queue-listen.test.ts` | 1 | Per code: 29× TS2339, 10× TS2571, 3× TS2348, 3× TS2345, 2× TS2835, 2× TS2493, 2× TS18046, 1× elk TS2532/TS2352/TS2307. ## De `src/presence/worker.ts`-fouten uit de config-comment bestaan niet meer Drie onafhankelijke bevestigingen: de verbrede run geeft **0 fouten in `src/`**; `npm run typecheck` is schoon; en `src/presence/worker.ts` heeft **geen commits** sinds de config werd toegevoegd (2026-06-07, `00b92bf`). Ook met de gegenereerde Prisma-client weggehaald geeft dat bestand nul fouten. De smalle scope was dus niet langer nodig. ## Wat er is gewijzigd Alle 54 opgelost, **zonder productiecode aan te raken** — de diff bevat alleen `__tests__/` en `tsconfig.type-tests.json`. Dekking nu **179 van de 180** `.ts`-bestanden onder `__tests__/`. - **`__tests__/helpers/tool-result.ts`** — narrowt de `CallToolResult` content-unie (28 sites in 6 bestanden). Alleen handlers die met dat SDK-type geannoteerd zijn hadden dit nodig; handlers met een afgeleid object-literal niet. - **`__tests__/helpers/mocks.ts`** — `AnyMock`, omdat `ReturnType<typeof vi.fn>` onder vitest 4 de niet-aanroepbare unie `Mock<Procedure | Constructable>` oplevert. Alleen de sites die de mock echt aanroepen zijn omgezet, niet het hele idioom (310 gebruiken in 84 bestanden). - **Drie echte NodeNext-overtredingen:** ontbrekende `.js`-extensies. In `realtime-payload-contract.test.ts` kon TS de module daardoor helemaal niet resolven — die contracttest controleerde dus niets. - Expliciete mock-signaturen in `deploy-dispatch`, `deploy-eligibility`, `create-transaction` en `worker-instance-id`. - `EventEmitter.getEventListeners` i.p.v. de module-level export: alleen de statische variant is getypeerd in `@types/node` v22, beide bestaan runtime (geverifieerd). ## Eén gedocumenteerde carve-out `realtime-payload-contract.test.ts` blijft buiten de config. Mét de juiste `.js`-extensie resolvet de import wél, en dan blijkt `vendor/scrum4me-shared/lib/realtime-payload.ts` zélf extensieloze relatieve imports te gebruiken (4× TS2835) — het enige vendored bestand met dat probleem, en `src/` importeert het nergens. Dat is een aparte repo, dus reden en echte fix staan in `tsconfig.type-tests.json`: extensies toevoegen in scrum4me-shared, submodule-pointer bumpen, dan die regel weghalen. ## Gesignaleerd, niet gewijzigd `PlanReviewLog.rounds` is `unknown[]` in `src/lib/idea-plan-loop.ts` — oorzaak van 10 van de 54 fouten. Hier test-side genarrowd; het netjes typen in src is de betere fix, maar dat is productiecode. ## Verificatie - `npm run typecheck` — schoon - `npm run typecheck:tests` — schoon, nu over 179 bestanden i.p.v. 1 - `npm test` — **176 passed | 2 skipped (178 bestanden); 1317 tests passed, 20 skipped**. De 2 overgeslagen bestanden zijn de bestaande `TEST_DATABASE_URL`-gated integratietests. CI heeft geen wijziging nodig: die draait `npm run typecheck` en `npm run test`, en `pretest` trekt de verbrede config mee. **Acceptatie-probe:** tijdelijk een verplicht veld toegevoegd aan `registerShutdownHandlers` → `typecheck:tests` gaf 5× TS2345 in `__tests__/presence-shutdown.test.ts`, daarna schoon teruggedraaid. De regressie die eerder stil doorkwam, wordt nu gevangen. **Follow-up:** de carve-out voor `realtime-payload-contract.test.ts` wordt opgeheven in een aparte PR (submodule-bump naar janpeter/scrum4me-shared#43), nadat #43 gemerged is. Deze PR bevat die bump niet. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
test(typecheck): verbreed typecheck naar alle testbestanden (179/180)
All checks were successful
CI / Verify (pull_request) Successful in 2m11s
36ebe358e1
tsconfig.json include't alleen src/**/*, en tsconfig.type-tests.json was
gescoped op precies één bestand. Vitest transpileert zonder typecheck, dus
een typefout in eender welk ander testbestand kwam ongemerkt door CI.

Gemeten vóór de wijziging: 54 fouten in 16 bestanden, allemaal in __tests__/,
nul in src/. De in de config-comment genoemde src/presence/worker.ts-fouten
bestaan niet meer — geen commits daar sinds 2026-06-07, en ook zonder
gegenereerde Prisma-client nul fouten in dat bestand. De smalle scope was
dus niet langer nodig.

Alle 54 opgelost zonder productiecode aan te raken:

- __tests__/helpers/tool-result.ts — narrowt de CallToolResult content-unie
  (28 sites in 6 bestanden). Alleen handlers die met dat SDK-type geannoteerd
  zijn hadden dit nodig; handlers met een afgeleid object-literal niet.
- __tests__/helpers/mocks.ts — AnyMock, omdat ReturnType<typeof vi.fn> onder
  vitest 4 de niet-aanroepbare unie Mock<Procedure | Constructable> oplevert.
  Alleen de sites die de mock echt aanroepen zijn omgezet, niet het hele
  idioom (310 gebruiken, 84 bestanden).
- Drie echte NodeNext-overtredingen: ontbrekende .js-extensies. In
  realtime-payload-contract.test.ts kon TS de module daardoor helemaal niet
  resolven, waardoor die contracttest niets controleerde.
- Expliciete mock-signaturen in deploy-dispatch, deploy-eligibility,
  create-transaction en worker-instance-id.
- EventEmitter.getEventListeners i.p.v. de module-level export: alleen de
  statische variant is getypeerd in @types/node v22, beide bestaan runtime.

Carve-out: realtime-payload-contract.test.ts blijft buiten de config. Mét de
juiste .js-extensie resolvet de import wél, en dan blijkt
vendor/scrum4me-shared/lib/realtime-payload.ts zelf extensieloze relatieve
imports te gebruiken (4× TS2835). Dat is een aparte repo; reden en echte fix
staan in tsconfig.type-tests.json.

Gesignaleerd maar niet gewijzigd: PlanReviewLog.rounds is unknown[] in
src/lib/idea-plan-loop.ts — oorzaak van 10 van de 54 fouten, hier test-side
genarrowd.

Verificatie: npm run typecheck schoon; npm run typecheck:tests schoon over
179 bestanden i.p.v. 1; npm test 176 passed | 2 skipped (1317 tests, 20
skipped — de twee TEST_DATABASE_URL-gated integratietests).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
janpeter changed title from test(typecheck): verbreed typecheck naar alle testbestanden (179/180) to test(typecheck): verbreed typecheck naar alle testbestanden (180/180) 2026-07-26 11:55:09 +02:00
janpeter changed title from test(typecheck): verbreed typecheck naar alle testbestanden (180/180) to test(typecheck): verbreed typecheck naar alle testbestanden (179/180) 2026-07-26 11:56:30 +02:00
Sign in to join this conversation.
No reviewers
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
janpeter/scrum4me-mcp!101
No description provided.