fix(build): main bouwt weer — extensionAlias voor @shared + PageProps-constraint #175

Merged
janpeter merged 1 commit from fix/shared-js-extension-webpack into main 2026-08-17 10:47:00 +02:00
Owner

main staat rood sinds #174. De CI-job Lint, Typecheck, Test & Build faalt, en de deploy-flow strandde vandaag op precies dezelfde fout bij stap 7 — een geslaagde prisma migrate deploy. De database heeft het issue-tracker-schema dus al; alleen de code stond nog niet uitgerold.

Twee losse blokkers.

1. Module not found: Can't resolve './issue-status.js'

De gevendorde @shared-code gebruikt ESM-stijl .js-extensies in relatieve imports naar .ts-bron: issue-forgejo-mirror.ts'./issue-status.js', terwijl het bestand issue-status.ts heet.

Dat is geen slordigheid maar een bewuste keuze uit shared #52scrum4me-mcp compileert met nodenext en weigert de extensieloze vorm. De rollout-runbook noemt die PR ook expliciet.

Turbopack kan dit hier niet resolven: zijn .js.ts-resolutie hangt aan nodenext-TS-resolutie terwijl dit project op moduleResolution: "Bundler" staat, en turbopack.resolveAlias werkt niet op relatieve specifiers. Vandaar een webpack-extensionAlias plus --webpack op zowel dev als build — laat die vlag niet weg, anders komt de fout terug.

Dit is niet nieuw bedacht: scrum4me-workers liep hier eerder op stuk en loste het op dezelfde manier op. De comment in de config verwijst daarnaar, zodat de volgende lezer niet opnieuw op Turbopack gokt.

Prijs die je hiervoor betaalt: Scrum4Me bouwt weer met webpack in plaats van Turbopack. Trager, en een bewuste stap terug. Het alternatief — de .js-extensie in shared terugdraaien — repareert Scrum4Me maar breekt scrum4me-mcp, dus dat is geen uitweg.

2. PageProps-constraint op de admin-jobs-pagina

Type 'AdminJobsPageProps | undefined' does not satisfy the constraint 'PageProps'

AdminJobsPage({ searchParams }: AdminJobsPageProps = {}) — die = {}-default maakt het props-type … | undefined, en de door Next gegenereerde PageProps-constraint verwerpt dat. Next levert props altijd aan, dus de default dekte niets af. De twee andere searchParams-pagina's in deze repo (insights, mobile solo) staan al zonder default; deze was de uitzondering.

Verificatie

vóór
Compileren Module not found ✓ Compiled successfully
tsc --noEmit 1 fout 0 fouten

Wat ik niet lokaal kon afmaken: de laatste buildfase, page-data-collectie, evalueert route-modules en vereist een echte DATABASE_URL. Mijn clone heeft geen .env; met placeholders valt hij om op /api/hub/approvals/[id]/answer. CI krijgt DATABASE_URL/DIRECT_URL uit secrets en de server heeft een .env, dus die fase hoort daar te slagen — maar ik claim dat niet, CI moet het bevestigen.

Terzijde: mijn eerdere baseline van "296 typefouten" in deze repo was een artefact van een niet-gegenereerde Prisma-client. Na een schone npm ci zijn het er 1, en na deze PR 0.

Daarna

Zodra dit groen is kan de deploy hervat worden; die maakt stap 2 en 4 van de issue-tracker-rollout af. De migraties zijn al toegepast.

`main` staat rood sinds #174. De CI-job *Lint, Typecheck, Test & Build* faalt, en de deploy-flow strandde vandaag op precies dezelfde fout bij stap 7 — **ná** een geslaagde `prisma migrate deploy`. De database heeft het issue-tracker-schema dus al; alleen de code stond nog niet uitgerold. Twee losse blokkers. ## 1. `Module not found: Can't resolve './issue-status.js'` De gevendorde `@shared`-code gebruikt ESM-stijl `.js`-extensies in relatieve imports naar `.ts`-bron: `issue-forgejo-mirror.ts` → `'./issue-status.js'`, terwijl het bestand `issue-status.ts` heet. Dat is geen slordigheid maar een bewuste keuze uit shared **#52** — `scrum4me-mcp` compileert met `nodenext` en weigert de extensieloze vorm. De rollout-runbook noemt die PR ook expliciet. Turbopack kan dit hier niet resolven: zijn `.js` → `.ts`-resolutie hangt aan nodenext-TS-resolutie terwijl dit project op `moduleResolution: "Bundler"` staat, en `turbopack.resolveAlias` werkt niet op relatieve specifiers. Vandaar een webpack-`extensionAlias` plus `--webpack` op **zowel `dev` als `build`** — laat die vlag niet weg, anders komt de fout terug. Dit is niet nieuw bedacht: `scrum4me-workers` liep hier eerder op stuk en loste het op dezelfde manier op. De comment in de config verwijst daarnaar, zodat de volgende lezer niet opnieuw op Turbopack gokt. **Prijs die je hiervoor betaalt:** Scrum4Me bouwt weer met webpack in plaats van Turbopack. Trager, en een bewuste stap terug. Het alternatief — de `.js`-extensie in shared terugdraaien — repareert Scrum4Me maar breekt `scrum4me-mcp`, dus dat is geen uitweg. ## 2. PageProps-constraint op de admin-jobs-pagina ``` Type 'AdminJobsPageProps | undefined' does not satisfy the constraint 'PageProps' ``` `AdminJobsPage({ searchParams }: AdminJobsPageProps = {})` — die `= {}`-default maakt het props-type `… | undefined`, en de door Next gegenereerde `PageProps`-constraint verwerpt dat. Next levert props altijd aan, dus de default dekte niets af. De twee andere `searchParams`-pagina's in deze repo (`insights`, mobile solo) staan al zonder default; deze was de uitzondering. ## Verificatie | | vóór | ná | |---|---|---| | Compileren | `Module not found` | **`✓ Compiled successfully`** | | `tsc --noEmit` | 1 fout | **0 fouten** | Wat ik **niet** lokaal kon afmaken: de laatste buildfase, page-data-collectie, evalueert route-modules en vereist een echte `DATABASE_URL`. Mijn clone heeft geen `.env`; met placeholders valt hij om op `/api/hub/approvals/[id]/answer`. CI krijgt `DATABASE_URL`/`DIRECT_URL` uit secrets en de server heeft een `.env`, dus die fase hoort daar te slagen — maar ik claim dat niet, CI moet het bevestigen. Terzijde: mijn eerdere baseline van "296 typefouten" in deze repo was een artefact van een niet-gegenereerde Prisma-client. Na een schone `npm ci` zijn het er 1, en na deze PR 0. ## Daarna Zodra dit groen is kan de deploy hervat worden; die maakt stap 2 en 4 van de [issue-tracker-rollout](../src/branch/main/docs/runbooks/issue-tracker-rollout.md) af. De migraties zijn al toegepast.
fix(build): main bouwt weer — extensionAlias voor @shared + PageProps-constraint
All checks were successful
CI / Lint, Typecheck, Test & Build (pull_request) Successful in 4m57s
CI / Deploy Manual (workflow_dispatch) (pull_request) Has been skipped
CI / Detect deploy-relevant changes (pull_request) Has been skipped
CI / Deploy Preview (PR) (pull_request) Has been skipped
CI / Deploy Production (main) (pull_request) Has been skipped
9e28cf836b
`main` staat rood sinds #174: de CI-job "Lint, Typecheck, Test & Build" faalt en
de deploy-flow strandde op dezelfde fout bij stap 7, ná een geslaagde
migrate-deploy. Twee losse blokkers.

1) Module not found: Can't resolve './issue-status.js'

De gevendorde @shared-code gebruikt ESM-stijl `.js`-extensies in relatieve
imports naar `.ts`-bron (issue-forgejo-mirror.ts → './issue-status.js'). Dat is
geen slordigheid: shared #52 heeft die extensie bewust toegevoegd omdat
scrum4me-mcp met nodenext compileert en de extensieloze vorm weigert.

Turbopack kan dat hier niet resolven — zijn `.js` → `.ts`-resolutie hangt aan
nodenext-TS-resolutie terwijl dit project op `moduleResolution: "Bundler"` staat,
en `turbopack.resolveAlias` werkt niet op relatieve specifiers. Daarom een
webpack-`extensionAlias` plus `--webpack` op zowel `dev` als `build`, exact zoals
scrum4me-workers dit eerder heeft opgelost.

2) PageProps-constraint op de admin-jobs-pagina

`AdminJobsPage({ searchParams }: AdminJobsPageProps = {})` maakt het props-type
`AdminJobsPageProps | undefined`, en de door Next gegenereerde PageProps-
constraint verwerpt dat. Next levert props altijd aan, dus de default dekte
niets af; de twee andere searchParams-pagina's in deze repo staan al zonder.

Geverifieerd: `✓ Compiled successfully` (was: Module not found) en
`tsc --noEmit` geeft 0 fouten (was: 1). De laatste buildfase, page-data-
collectie, vereist een echte DATABASE_URL en draait daarom in CI en op de
server, niet in een clone zonder .env.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
s4m-codex-reviewer left a comment

Verdict: APPROVED

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

Geen blokkerende of niet-blokkerende findings.

Verificatie

  • npm run typecheck: geslaagd.
  • npm run lint: geslaagd met 0 errors en 6 bestaande warnings.
  • SESSION_SECRET=0123456789abcdef0123456789abcdef npm run build: geslaagd; Next 16.2.4 build draait expliciet met webpack en compileert inclusief TypeScript/page generation.
# Verdict: APPROVED Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings Geen blokkerende of niet-blokkerende findings. ## Verificatie - `npm run typecheck`: geslaagd. - `npm run lint`: geslaagd met 0 errors en 6 bestaande warnings. - `SESSION_SECRET=0123456789abcdef0123456789abcdef npm run build`: geslaagd; Next 16.2.4 build draait expliciet met webpack en compileert inclusief TypeScript/page generation.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
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!175
No description provided.