Repository navigation
Expand file tree
/
Copy pathnext.config.mjs
More file actions
138 lines (117 loc) · 4 KB
/
Copy pathnext.config.mjs
File metadata and controls
138 lines (117 loc) · 4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/** @type {import('next').NextConfig} */
import { fileURLToPath } from 'node:url';
import { withSentryConfig } from '@sentry/nextjs';
import createJiti from 'jiti';
import createNextIntlPlugin from 'next-intl/plugin';
const jiti = createJiti(fileURLToPath(import.meta.url));
jiti('./env');
// const backendUrl = new URL(process.env.NEXT_PUBLIC_BACKEND_URL);
const backendUrl = new URL(process.env.BACKEND_URL || 'http://localhost:8000');
const platformUrl = new URL(process.env.NEXT_PUBLIC_PLATFORM_URL || 'http://localhost:3000');
const withNextIntl = createNextIntlPlugin('./i18n.ts');
const nextConfig = withNextIntl({
transpilePackages: ['opub-ui'],
// next-intl v3 still writes aliases to experimental.turbo, which Next.js 16 ignores.
turbopack: {
resolveAlias: {
'next-intl/config': './i18n.ts',
},
},
// Non-public environments (dev) must not be indexed by search engines.
// X-Git-Sha: the commit this build came from (GITHUB_SHA in CI), so tests can
// tell which code is live, like the backend's /health/ git_sha.
async headers() {
const headers = [];
if (process.env.GITHUB_SHA) {
headers.push({ key: 'X-Git-Sha', value: process.env.GITHUB_SHA });
}
if (process.env.FEATURE_SITEMAPS !== 'true') {
headers.push({ key: 'X-Robots-Tag', value: 'noindex, nofollow' });
}
return headers.length ? [{ source: '/:path*', headers }] : [];
},
// Performance optimizations
experimental: {
optimizePackageImports: ['opub-ui', 'echarts', 'lucide-react', '@tabler/icons-react'],
},
// Webpack optimizations
webpack: (config, { dev, isServer }) => {
// Optimize for development speed
if (dev) {
config.watchOptions = {
poll: false,
ignored: ['**/node_modules', '**/.git', '**/.next'],
};
}
// Production bundle optimizations
if (!dev && !isServer) {
config.optimization = config.optimization || {};
config.optimization.splitChunks = config.optimization.splitChunks || {};
config.optimization.splitChunks.cacheGroups = {
...(config.optimization.splitChunks.cacheGroups || {}),
echarts: {
name: 'echarts',
test: /[\\/]node_modules[\\/]echarts/,
chunks: 'all',
priority: 20,
},
icons: {
name: 'icons',
test: /[\\/]node_modules[\\/](@tabler\/icons-react|lucide-react)/,
chunks: 'all',
priority: 15,
},
ui: {
name: 'opub-ui',
test: /[\\/]node_modules[\\/]opub-ui/,
chunks: 'all',
priority: 10,
},
};
}
return config;
},
images: {
remotePatterns: [
{
protocol: backendUrl.protocol.slice(0, -1),
hostname: backendUrl.hostname,
port: backendUrl.port || '',
pathname: '/**',
},
{
protocol: platformUrl.protocol.slice(0, -1),
hostname: platformUrl.hostname,
port: platformUrl.port || '',
pathname: '/**',
},
],
},
});
const sentryConfig = withSentryConfig(
nextConfig,
{
// For all available options, see:
// https://github.com/getsentry/sentry-webpack-plugin#options
org: process.env.SENTRY_ORG_NAME,
project: process.env.SENTRY_PROJECT_NAME,
// Only print logs for uploading source maps in CI
silent: !process.env.CI,
// For all available options, see:
// https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/
// Upload a larger set of source maps for prettier stack traces (increases build time)
widenClientFileUpload: process.env.NODE_ENV === 'production',
// Disable source map upload in development for speed
sourcemaps: {
disable: process.env.NODE_ENV === 'development',
},
treeshake: {
removeDebugLogging: true,
},
}
);
// next-intl v3 still injects experimental.turbo; Next.js 16 only accepts top-level turbopack.
if (sentryConfig?.experimental?.turbo) {
delete sentryConfig.experimental.turbo;
}
export default sentryConfig;