/** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, swcMinify: true, // Environment variables env: { NEXT_PUBLIC_CROSSPLANE_API: process.env.NEXT_PUBLIC_CROSSPLANE_API, NEXT_PUBLIC_ARGOCD_URL: process.env.NEXT_PUBLIC_ARGOCD_URL, NEXT_PUBLIC_GRAFANA_URL: process.env.NEXT_PUBLIC_GRAFANA_URL, NEXT_PUBLIC_LOKI_URL: process.env.NEXT_PUBLIC_LOKI_URL, }, // Headers for security async headers() { return [ { source: '/:path*', headers: [ { key: 'X-DNS-Prefetch-Control', value: 'on', }, { key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload', }, { key: 'X-Frame-Options', value: 'DENY', }, { key: 'X-Content-Type-Options', value: 'nosniff', }, { key: 'X-XSS-Protection', value: '1; mode=block', }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin', }, { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()', }, { key: 'Content-Security-Policy', value: [ "default-src 'self'", "script-src 'self' 'unsafe-eval' 'unsafe-inline'", "style-src 'self' 'unsafe-inline'", "img-src 'self' data: https:", "font-src 'self' data:", "connect-src 'self' https:", ].join('; '), }, ], }, ]; }, // Rewrites for API proxying async rewrites() { return [ { source: '/api/crossplane/:path*', destination: `${process.env.NEXT_PUBLIC_CROSSPLANE_API || 'http://localhost:8080'}/:path*`, }, ]; }, }; module.exports = nextConfig;