/** @type {import('next').NextConfig} */ const { version } = require('./package.json'); const nextConfig = { output: 'standalone', // Next.js sucht per Lockfile-Suche nach oben selbst einen "Workspace-Root" fuer die // File-Tracing des Standalone-Outputs. Findet es dort ein weiteres Lockfile (auf dem // Produktionshost liegt in /root eine verwaiste, leere package-lock.json), haelt es // /root faelschlich fuer die Wurzel und verschachtelt den Output um einen Ordner tiefer: // .next-build/standalone/My-Weekly-ToDo-List/server.js statt .next-build/standalone/ // server.js. scripts/update-app.sh erwartet Letzteres fest und der Smoke-Test schlaegt // sonst fehl ("Cannot find module '.../standalone/server.js'"), live aufgetreten // 2026-09-12 beim ersten Deploy nach next@15. __dirname verankert die Wurzel explizit, // unabhaengig davon, was sonst noch im Dateisystem oberhalb des Projekts herumliegt. outputFileTracingRoot: __dirname, // Kein "X-Powered-By: Next.js" -- unnoetige Versions-/Framework-Preisgabe an Scanner. poweredByHeader: false, // Ziel des Builds. update-app.sh baut nach .next-build, damit das laufende .next // waehrend des Builds unberuehrt bleibt, und schaltet erst nach erfolgreichem // Smoke-Test um. Ohne das zerstoert ein fehlgeschlagener Build die laufende App. distDir: process.env.NEXT_DIST_DIR || '.next', eslint: { // Aus: Der Build meldet ESLint-Fehler. Warnungen blockieren ihn nicht, nur Errors. // // Kurzzeitig stand hier wieder true, weil ich ESLint fuer den OOM-Absturz des Builds // auf dem Produktionscontainer verantwortlich hielt. Eine Messung widerlegte das: // Spitzenspeicher mit ESLint 2.590 MB, ohne 2.595 MB -- kein Unterschied. Die Ursache // war Nodes Standard-Heap-Limit von rund 1,5 GB; dafuer setzt scripts/update-app.sh // jetzt NODE_OPTIONS. ignoreDuringBuilds: false, }, typescript: { // Aus: Der Build bricht bei Typfehlern ab. Bis v1.118.1 stand hier true — dadurch // liefen mehrfach fehlende Importe durch, die zur Laufzeit ReferenceError geworfen // haetten, waehrend der Build "erfolgreich" meldete. ignoreBuildErrors: false, }, optimizeFonts: false, env: { NEXT_PUBLIC_APP_VERSION: version, }, experimental: { serverComponentsExternalPackages: ['ical.js', 'tsdav'], }, // Standard-Sicherheitsheader, die von Scannern (securityheaders.com, Mozilla Observatory, // OWASP ZAP Baseline) sonst als fehlend markiert werden. // // Content-Security-Policy laeuft bewusst nur als Report-Only: sie blockiert nichts, meldet // aber ueber /api/csp-report, was eine scharfe Policy blockieren wuerde. Die Whitelist ist // aus dem tatsaechlichen Code abgeleitet (12.09.2026): // - script-src/style-src 'unsafe-inline': Next.js' App-Router-Hydration-Skripte und der // eine dangerouslySetInnerHTML-Block in WeeklyView.tsx (View-Transition-Styles) brauchen // das ohne Nonce-Infrastruktur (eigener, groesserer Umbau via Middleware). // - style-src/font-src fonts.googleapis.com/fonts.gstatic.com: FontPicker.tsx und // WeeklyView.tsx laden Nutzer-Schriftarten zur Laufzeit per -Tag nach. // - Keine weiteren externen Domains gefunden: kein