/** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, swcMinify: true, // Environment variables exposed to the browser env: { NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3001', NEXT_PUBLIC_APP_NAME: process.env.NEXT_PUBLIC_APP_NAME || 'Math Platform', }, // Optimize images images: { domains: [], formats: ['image/avif', 'image/webp'], deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840], imageSizes: [16, 32, 48, 64, 96, 128, 256, 384], }, // Compiler options compiler: { removeConsole: process.env.NODE_ENV === 'production', }, // Headers for security and CORS async headers() { return [ { source: '/:path*', headers: [ { key: 'X-DNS-Prefetch-Control', value: 'on' }, { key: 'X-Frame-Options', value: 'SAMEORIGIN' }, { key: 'X-Content-Type-Options', value: 'nosniff' }, { key: 'Referrer-Policy', value: 'origin-when-cross-origin' }, { key: 'X-XSS-Protection', value: '1; mode=block' } ] } ]; }, // Webpack configuration for KaTeX webpack: (config, { isServer }) => { if (!isServer) { config.resolve.fallback = { ...config.resolve.fallback, fs: false, }; } // Add support for importing CSS files config.module.rules.push({ test: /\.(css|scss)$/, use: ['style-loader', 'css-loader', 'postcss-loader'], }); return config; }, // Performance optimization poweredByHeader: false, compress: true, // Output configuration for Docker - use no-static to avoid SSR prerendering issues output: 'standalone', // Disable static page generation to avoid KaTeX SSR issues staticPageGenerationTimeout: 1, // Experimental features experimental: { optimizePackageImports: ['lucide-react', '@radix-ui/react-icons'], }, }; // Bundle analyzer plugin const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }); module.exports = withBundleAnalyzer(nextConfig);