import withSerwistInit from "@serwist/next" import { withBotId } from "botid/next/config" import type { NextConfig } from "next" const withSerwist = withSerwistInit({ swSrc: "app/sw.ts", swDest: "public/sw.js", disable: process.env.NODE_ENV === "development", }) const securityHeaders = [ { key: "X-Frame-Options", value: "DENY" }, { key: "X-Content-Type-Options", value: "nosniff" }, { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=()", }, { key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload", }, { key: "Content-Security-Policy", value: [ "default-src 'self'", "script-src 'self' 'unsafe-inline' https://va.vercel-scripts.com https://analytics.fuwn.me", "style-src 'self' 'unsafe-inline'", "img-src 'self' data: https: http:", "font-src 'self'", "connect-src 'self' https://*.supabase.co wss://*.supabase.co https://api.stripe.com https://analytics.fuwn.me", "frame-src https://js.stripe.com https://hooks.stripe.com", "media-src 'self' https: http:", "object-src 'none'", "base-uri 'self'", "form-action 'self'", "frame-ancestors 'none'", ].join("; "), }, ] const nextConfig: NextConfig = { reactCompiler: true, turbopack: {}, async headers() { return [ { source: "/(.*)", headers: securityHeaders, }, ] }, } export default withBotId(withSerwist(nextConfig))