import type { NextConfig } from '@/next' import createMDX from '@next/mdx' import { codeInspectorPlugin } from 'code-inspector-plugin' import { env } from './env' const isDev = process.env.NODE_ENV === 'development' const withMDX = createMDX() const nextConfig: NextConfig = { basePath: env.NEXT_PUBLIC_BASE_PATH, transpilePackages: ['@t3-oss/env-core', '@t3-oss/env-nextjs', 'echarts', 'zrender'], turbopack: { rules: codeInspectorPlugin({ bundler: 'turbopack', }), }, productionBrowserSourceMaps: false, // enable browser source map generation during the production build // Configure pageExtensions to include md and mdx pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'], typescript: { // https://nextjs.org/docs/api-reference/next.config.js/ignoring-typescript-errors ignoreBuildErrors: true, }, async redirects() { return [ { source: '/', destination: '/apps', permanent: false, }, ] }, // Anti-framing for device-flow surfaces. A framed /device page could UI-trick // a victim with a valid device_approval_grant cookie into approving a // device_code — functionally CSRF, bypasses the double-submit token. Deny // framing outright on every device-flow route; no trusted embedder exists. async headers() { const antiFrame = [ { key: 'X-Frame-Options', value: 'DENY' }, { key: 'Content-Security-Policy', value: "frame-ancestors 'none'" }, ] return [ { source: '/device', headers: antiFrame }, { source: '/device/:path*', headers: antiFrame }, ] }, output: 'standalone', compiler: { removeConsole: isDev ? false : { exclude: ['warn', 'error'] }, }, } export default withMDX(nextConfig)