fix(env): skip validation during next build static analysis #2

Merged
janpeter merged 1 commit from fix/env-validation-skip into main 2026-05-26 20:58:19 +02:00
Owner

Summary

Vervolg-fix op PR #1 (al gemerged) voor M16 fase 1 task 16 build-blocker.

Na de prisma-dir fix komt de Docker-build verder maar next build faalt op lib/env.ts module-load: next doet static analysis die modules importeert, en lib/env.ts throwt als DATABASE_URL/WORKERS_SESSION_SECRET missen (die landen pas at-runtime via docker-compose env_file).

Fix

Twee escape-hatches in lib/env.ts:

const SKIP_VALIDATION =
  process.env.SKIP_ENV_VALIDATION === '1' ||
  process.env.NEXT_PHASE === 'phase-production-build'

if (!SKIP_VALIDATION && !parsed.success) { throw ... }
export const env: Env = parsed.success ? parsed.data : ({} as Env)

Plus ENV SKIP_ENV_VALIDATION=1 in Dockerfile builder-stage vóór RUN npm run build.

Runtime (dev/start/test) blijft volledig valideren — alleen next build static-analysis krijgt de bypass. Bij SKIP wordt env een leeg object cast naar Env; build-time consumers die env.X lezen krijgen undefined (acceptabel — runtime via env_file is altijd valid).

Test plan

  • SKIP_ENV_VALIDATION=1 tsx import lib/env.ts → env={} no throw
  • Met env-vars set → env gevalideerd + populated
  • npm run verify → 15/15 tests passing, typecheck clean, lint clean (tests gebruiken tests/setup.ts die env-stubs zet, dus validation runt en passeert)

Server-Claude retry:

cd /srv/scrum4me/repos/scrum4me-workers && git pull --ff-only
cd /srv/scrum4me/compose && docker compose build scrum4me-workers

Verwacht: build slaagt door alle RUN-lines inclusief npm run build.

Context

Deel 2/2 van M16 fase 1 task 16 build-blockers (deel 1 was PR #1 prisma-dir fix, al gemerged in 54f9693).

## Summary Vervolg-fix op PR #1 (al gemerged) voor M16 fase 1 task 16 build-blocker. Na de prisma-dir fix komt de Docker-build verder maar `next build` faalt op `lib/env.ts` module-load: `next` doet static analysis die modules importeert, en `lib/env.ts` throwt als `DATABASE_URL`/`WORKERS_SESSION_SECRET` missen (die landen pas at-runtime via docker-compose env_file). ## Fix Twee escape-hatches in `lib/env.ts`: ```ts const SKIP_VALIDATION = process.env.SKIP_ENV_VALIDATION === '1' || process.env.NEXT_PHASE === 'phase-production-build' if (!SKIP_VALIDATION && !parsed.success) { throw ... } export const env: Env = parsed.success ? parsed.data : ({} as Env) ``` Plus `ENV SKIP_ENV_VALIDATION=1` in Dockerfile builder-stage vóór `RUN npm run build`. Runtime (dev/start/test) blijft volledig valideren — alleen `next build` static-analysis krijgt de bypass. Bij SKIP wordt env een leeg object cast naar Env; build-time consumers die env.X lezen krijgen undefined (acceptabel — runtime via env_file is altijd valid). ## Test plan - [x] `SKIP_ENV_VALIDATION=1 tsx import lib/env.ts` → env={} no throw - [x] Met env-vars set → env gevalideerd + populated - [x] `npm run verify` → 15/15 tests passing, typecheck clean, lint clean (tests gebruiken __tests__/setup.ts die env-stubs zet, dus validation runt en passeert) Server-Claude retry: ```bash cd /srv/scrum4me/repos/scrum4me-workers && git pull --ff-only cd /srv/scrum4me/compose && docker compose build scrum4me-workers ``` Verwacht: build slaagt door alle RUN-lines inclusief `npm run build`. ## Context Deel 2/2 van M16 fase 1 task 16 build-blockers (deel 1 was PR #1 prisma-dir fix, al gemerged in `54f9693`).
next build does a production-build pass that imports modules to collect
route metadata. lib/env.ts throws on module-load if DATABASE_URL or
WORKERS_SESSION_SECRET are missing — at build time they aren't (they
land at runtime via docker-compose env_file).

Two escape hatches, both checked:
1. NEXT_PHASE=phase-production-build (set automatically by next build)
2. SKIP_ENV_VALIDATION=1 (explicit, set in Dockerfile builder stage)

When SKIP is active and parsing fails, env is exported as {} cast to Env.
Build-time consumers reading env.X get undefined — acceptable because
real runtime always has the env_file values. Tests still set defaults
via __tests__/setup.ts so validation runs and passes there.

Tested:
- SKIP_ENV_VALIDATION=1 tsx import → env={} no throw
- DATABASE_URL+WORKERS_SESSION_SECRET set → env populated
- npm run verify → 15/15 tests passing, typecheck clean, lint clean
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-workers!2
No description provided.