spb/autoscholar
Public
1import type { NextConfig } from "next";23const isProd = process.env.NODE_ENV === "production";4const staging = process.env.STAGING_MODE === "1";56const securityHeaders = [7 { key: "X-Content-Type-Options", value: "nosniff" },8 { key: "X-Frame-Options", value: "SAMEORIGIN" },9 { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },10 { key: "Permissions-Policy", value: "camera=(), microphone=(), geolocation=(), browsing-topics=()" },11 {12 key: "Content-Security-Policy",13 value: [14 "default-src 'self'",15 `script-src 'self'${isProd ? "" : " 'unsafe-eval'"} 'unsafe-inline'`,16 "style-src 'self' 'unsafe-inline'",17 "img-src 'self' data: blob:",18 "font-src 'self' data:",19 "connect-src 'self'",20 "frame-src 'self' blob:",21 "object-src 'self'",22 "base-uri 'self'",23 "form-action 'self'",24 "frame-ancestors 'self'",25 ...(isProd ? ["upgrade-insecure-requests"] : []),26 ].join("; "),27 },28 ...(isProd ? [{ key: "Strict-Transport-Security", value: "max-age=31536000; includeSubDomains" }] : []),29 ...(staging ? [{ key: "X-Robots-Tag", value: "noindex, nofollow" }] : []),30];3132const nextConfig: NextConfig = {33 reactStrictMode: true,34 poweredByHeader: false,35 serverExternalPackages: ["pg", "pino", "@node-rs/argon2", "pdfjs-dist", "pdf-lib", "drizzle-orm"],36 experimental: { serverActions: { bodySizeLimit: "2mb" } },37 async headers() {38 return [39 { source: "/(.*)", headers: securityHeaders },40 {41 source: "/papers/:path*",42 headers: [{ key: "Cache-Control", value: "public, max-age=31536000, immutable" }],43 },44 ];45 },46};4748export default nextConfig;49