/** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, logging: { fetches: { fullUrl: true, }, }, images: { remotePatterns: [ { protocol: 'https', hostname: '**', port: '', pathname: '**' }, { protocol: 'http', hostname: '**', port: '', pathname: '**' }, ], deviceSizes: [640, 750], minimumCacheTTL: 60, }, experimental: { reactCompiler: true, }, async headers() { return [ { source: '/(.*)', headers: securityHeaders }, { source: '/api/:path*', headers: corsHeaders }, ]; }, }; const ContentSecurityPolicy = ` default-src 'self' bmrk.cc; script-src 'self' 'unsafe-eval' 'unsafe-inline' *.googletagmanager.com *.lemonsqueezy.com; style-src 'self' 'unsafe-inline'; img-src * blob: data:; frame-src 'self' bmrkcc.lemonsqueezy.com; media-src 'self'; connect-src *; font-src 'self'; `; const securityHeaders = [ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy { key: 'Referrer-Policy', value: 'origin-when-cross-origin', }, // https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP { key: 'Content-Security-Policy', value: ContentSecurityPolicy.replace(/\s{2,}/g, ' ').trim(), }, // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options { key: 'X-Frame-Options', value: 'DENY', }, // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options { key: 'X-Content-Type-Options', value: 'nosniff', }, // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-DNS-Prefetch-Control { key: 'X-DNS-Prefetch-Control', value: 'on', }, // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains; preload', }, // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=(), autoplay=()', }, ]; const corsHeaders = [ { key: 'Access-Control-Allow-Credentials', value: 'true' }, { key: 'Access-Control-Allow-Origin', value: 'https://bmrk.cc' }, { key: 'Access-Control-Allow-Methods', value: 'GET,DELETE,PATCH,POST,PUT' }, { key: 'Access-Control-Allow-Headers', value: 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version', }, ]; export default nextConfig;