const { withSentryConfig } = require('@sentry/nextjs'); const createNextIntlPlugin = require('next-intl/plugin'); const withNextIntl = createNextIntlPlugin('./i18n/request.ts'); function getPublicApiOrigin() { try { return process.env.NEXT_PUBLIC_API_URL ? new URL(process.env.NEXT_PUBLIC_API_URL).origin : ''; } catch { return ''; } } /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, output: 'standalone', // ESLint runs in the monorepo via `pnpm lint` (CI step) using the root // flat config. The Next-built-in lint duplicates the run with stricter // legacy rules (e.g. `@next/next/no-html-link-for-pages` on error // boundaries that legitimately want a hard nav). Turn it off here so the // production build doesn't fail when the explicit lint step has already // passed. eslint: { ignoreDuringBuilds: true, }, // In monorepo, trace from repo root so standalone output includes all deps outputFileTracingRoot: require('path').join(__dirname, '../../'), images: { remotePatterns: [ { protocol: 'https', hostname: '**', }, // MinIO / local object storage in development and test ...(process.env.NODE_ENV !== 'production' ? [{ protocol: 'http', hostname: 'localhost' }, { protocol: 'http', hostname: '127.0.0.1' }] : []), ], }, async headers() { return [ { source: '/(.*)', headers: [ { key: 'X-Content-Type-Options', value: 'nosniff' }, { key: 'X-Frame-Options', value: 'DENY' }, { key: 'X-XSS-Protection', value: '1; mode=block' }, { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }, { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains; preload', }, { key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=(self), payment=(self)' }, { key: 'Content-Security-Policy', value: [ "default-src 'self'", "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://api.mapbox.com", "style-src 'self' 'unsafe-inline' https://api.mapbox.com", "img-src 'self' data: blob: https://*.mapbox.com https://*.tiles.mapbox.com https:", "font-src 'self' data:", `connect-src 'self' https://*.mapbox.com https://api.mapbox.com https://events.mapbox.com https://api.goodgo.vn${process.env.NODE_ENV !== 'production' ? ` ${getPublicApiOrigin()} http://localhost:3001 http://localhost:3011 http://localhost:3200 http://localhost:3201 http://localhost:9000 ws://localhost:3001 ws://localhost:3011 ws://localhost:3200 ws://localhost:3201` : ''}`, "worker-src 'self' blob:", "child-src 'self' blob:", "frame-ancestors 'none'", "base-uri 'self'", "form-action 'self'", ].join('; '), }, ], }, ]; }, }; module.exports = withSentryConfig(withNextIntl(nextConfig), { org: process.env.SENTRY_ORG, project: process.env.SENTRY_PROJECT, silent: !process.env.CI, widenClientFileUpload: true, disableLogger: true, automaticVercelMonitors: true, });