Repository navigation
Expand file tree
/
Copy pathnext.config.ts
More file actions
123 lines (110 loc) · 4.2 KB
/
Copy pathnext.config.ts
File metadata and controls
123 lines (110 loc) · 4.2 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
import fs from 'fs'
import path from 'path'
import type { NextConfig } from 'next'
import frontmatter from '@gr2m/gray-matter'
import { getLogLevelNumber } from '@/observability/logger/lib/log-levels'
import { languageKeys } from '@/languages/lib/languages'
const ROOT = process.env.ROOT || '.'
const homepage = path.posix.join(ROOT, 'content/index.md')
const { data } = frontmatter(fs.readFileSync(homepage, 'utf8'))
const productIds = data.children as string[]
const config: NextConfig = {
allowedDevOrigins: ['127.0.0.1'],
// Transpile @primer/react and @primer/react-brand so Next's webpack can process their
// CSS and other assets. This ensures CSS from these node_modules packages is handled by
// the app's loaders.
transpilePackages: ['@primer/react', '@primer/react-brand'],
// Keep OTel packages out of the Next.js server bundle.
// They must be loaded via native require() for auto-instrumentation to work.
serverExternalPackages: [
'@opentelemetry/api',
'@opentelemetry/auto-instrumentations-node',
'@opentelemetry/core',
'@opentelemetry/exporter-trace-otlp-proto',
'@opentelemetry/sdk-node',
],
// speed up production `next build` by ignoring typechecking during that step of build.
// type-checking still occurs in the Dockerfile build
typescript: {
ignoreBuildErrors: true,
},
i18n: {
locales: languageKeys,
defaultLocale: 'en',
},
sassOptions: {
quietDeps: true,
silenceDeprecations: ['legacy-js-api', 'import', 'global-builtin', 'color-4-api'],
},
// Don't use automatic Next.js request logging unless the log level is `debug` or higher.
// Our own request logger already covers it. `false` would also stop `[browser]` console forwarding.
// See `src/observability/logger/README.md` for log levels
logging: getLogLevelNumber() < 3 ? { incomingRequests: false } : {},
async rewrites() {
const DEFAULT_VERSION = 'free-pro-team@latest'
return productIds.map((productId) => {
return {
source: `/${productId}/:path*`,
destination: `/${DEFAULT_VERSION}/${productId}/:path*`,
}
})
},
webpack: (webpackConfig, { isServer }) => {
webpackConfig.resolve.fallback = { fs: false, async_hooks: false, child_process: false }
// OTel is server-only. Alias to empty stub in browser bundles.
if (!isServer) {
webpackConfig.resolve.alias = {
...webpackConfig.resolve.alias,
'@/observability/lib/tracing': path.resolve('./src/observability/lib/tracing.browser.ts'),
}
}
return webpackConfig
},
// Turbopack is the default bundler in Next.js 16
// Keep webpack config for now to support both bundlers
// Turbopack configuration for Next.js 16 (replaces webpack fallbacks)
turbopack: {
resolveAlias: {
fs: {
browser: './stub.ts',
},
async_hooks: {
browser: './stub.ts',
},
child_process: {
browser: './stub.ts',
},
'@/observability/logger': {
browser: './stub.ts',
},
'@/observability/logger/lib/logger-context': {
browser: './stub.ts',
},
'@/observability/lib/tracing': {
browser: './src/observability/lib/tracing.browser.ts',
},
},
},
// https://nextjs.org/docs/api-reference/next.config.js/compression
compress: false,
// ETags break stale content serving from the CDN. When a response has
// an ETag, the CDN attempts to revalidate the content in the background.
// This causes problems with serving stale content, since upon revalidating
// the CDN marks the cached content as "fresh".
generateEtags: false,
experimental: {
// getServerSideProps returns rendered Markdown, so many pages exceed the 128 kB default.
// https://nextjs.org/docs/messages/large-page-data
largePageDataBytes: 1024 * 1024, // 1 MB
},
// Disable Next.js's in-memory data cache. We don't use ISR or cached
// fetch — all pages render via Express middleware with getServerSideProps.
// The default 50 MB cache is unnecessary overhead during a memory-leak
// investigation and is implicated in known Next.js 16.1.x memory issues
// (vercel/next.js#88603).
cacheMaxMemorySize: 0,
compiler: {
styledComponents: true,
},
}
export default config