// Get Onyx Web Version const { version: package_version } = require("./package.json"); // version from package.json const env_version = process.env.ONYX_VERSION; // version from env variable // Use env version if set & valid, otherwise default to package version const version = env_version || package_version; // Always require withSentryConfig const { withSentryConfig } = require("@sentry/nextjs"); const cspHeader = ` style-src 'self' 'unsafe-inline'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; ${process.env.NEXT_PUBLIC_CLOUD_ENABLED === "true" ? "upgrade-insecure-requests;" : ""} `; /** @type {import('next').NextConfig} */ const nextConfig = { output: "standalone", publicRuntimeConfig: { version, }, async headers() { return [ { source: "/(.*)", headers: [ { key: "Content-Security-Policy", value: cspHeader.replace(/\n/g, ""), }, { key: "Strict-Transport-Security", value: "max-age=63072000; includeSubDomains; preload", }, { key: "Referrer-Policy", value: "strict-origin-when-cross-origin", }, { key: "X-Frame-Options", value: "DENY", }, { key: "X-Content-Type-Options", value: "nosniff", }, { key: "Permissions-Policy", // Deny all permissions by default value: "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), camera=(), cross-origin-isolated=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), geolocation=(), gyroscope=(), keyboard-map=(), magnetometer=(), microphone=(), midi=(), navigation-override=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), sync-xhr=(), usb=(), web-share=(), xr-spatial-tracking=()", }, ], }, ]; }, }; // Sentry configuration for error monitoring: // - Without SENTRY_AUTH_TOKEN and NEXT_PUBLIC_SENTRY_DSN: Sentry is completely disabled // - With both configured: Only unhandled errors are captured (no performance/session tracking) // Determine if Sentry should be enabled const sentryEnabled = Boolean( process.env.SENTRY_AUTH_TOKEN && process.env.NEXT_PUBLIC_SENTRY_DSN ); // Sentry webpack plugin options const sentryWebpackPluginOptions = { org: process.env.SENTRY_ORG || "onyx", project: process.env.SENTRY_PROJECT || "data-plane-web", authToken: process.env.SENTRY_AUTH_TOKEN, silent: !sentryEnabled, // Silence output when Sentry is disabled dryRun: !sentryEnabled, // Don't upload source maps when Sentry is disabled sourceMaps: { include: ["./.next"], validate: false, urlPrefix: "~/_next", skip: !sentryEnabled, }, }; // Export the module with conditional Sentry configuration module.exports = withSentryConfig(nextConfig, sentryWebpackPluginOptions);