import type { NextConfig } from "next"; import createNextIntlPlugin from "next-intl/plugin"; // Im Dev-Betrieb braucht Turbopack/HMR 'unsafe-eval' und WebSocket-Verbindungen // zum Dev-Server. Diese Lockerungen gelten NUR in der Entwicklung, nie im Build. const isDev = process.env.NODE_ENV !== "production"; // Content-Security-Policy (F-07). // // Hinweis Skripte: 'unsafe-inline' ist ein bewusster Zwischenstand. Next.js liefert // seinen Hydration-Bootstrap als Inline-Skript aus; eine Nonce-basierte CSP (Nonce in // proxy.ts erzeugen und durchreichen) ist ein eigenes Folgepaket. const csp = [ "default-src 'self'", `script-src 'self' 'unsafe-inline'${isDev ? " 'unsafe-eval'" : ""}`, // Next.js und Tailwind v4 setzen Inline-Styles. "style-src 'self' 'unsafe-inline'", // data: für den MFA-QR-Code; blob: für clientseitige Foto-Vorschauen (Einsatz-Fotos). "img-src 'self' data: blob:", // blob: für lokale Wiedergabe von Sprachnotizen vor dem Upload. "media-src 'self' blob:", "font-src 'self' data:", // Im Dev zusätzlich der HMR-WebSocket des Dev-Servers. `connect-src 'self'${isDev ? " ws: wss:" : ""}`, // PWA: Service Worker nur vom eigenen Ursprung. "worker-src 'self'", "manifest-src 'self'", "frame-ancestors 'none'", "form-action 'self'", "base-uri 'self'", "object-src 'none'", ].join("; "); // Same-origin embedding for inline document previews (PDF viewer in the import review // mask, document previews). Everything else stays frame-ancestors 'none' / DENY. const cspEmbeddable = csp.replace("frame-ancestors 'none'", "frame-ancestors 'self'"); // Routes that stream stored files and may be shown in a same-origin