7a8da9741d
add `experimental.esmExternals: boolean | 'loose'` config option remove `output.environment` configuration in favor of `target` | | `esmExternals: false` (default) | `esmExternals: 'loose'` | `esmExternals: true` | | ------------------------ | ------------------------------- | ----------------------- | -------------------- | | import cjs package | `require()` | `require()` | `require()` | | require cjs package | `require()` | `require()` | `require()` | | import mixed package | `require()` *** | `import()` | `import()` | | require mixed package | `require()` | `require()` | `require()` | | import pure esm package | `import()` | `import()` | `import()` | | require pure esm package | Error ** | `import()` * | Error ** | | import pure cjs package | `require()` | `require()` | Resolving error | | require pure cjs package | `require()` | `require()` | `require()` | cjs package: Offers only CJS implementation (may not even have an `exports` field) mixed package: Offers CJS and ESM implementation via `exports` field pure esm package: Only offers an ESM implementation (may not even have an `exports` field) pure cjs package: CommonJs package that prevents importing via `exports` field when `import` is used. `*` This case will behave a bit unexpected for now, since `require` will return a Promise. So that need to be awaited. This will be fixed once the whole next.js bundle is ESM. It didn't work at all before this PR. `**` This is a new Error when trying to require an esm package. `***` For mixed packages we prefer the CommonJS variant to avoid a breaking change. ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [x] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes
146 lines
3.4 KiB
TypeScript
146 lines
3.4 KiB
TypeScript
import os from 'os'
|
|
import { Header, Redirect, Rewrite } from '../lib/load-custom-routes'
|
|
import { imageConfigDefault } from './image-config'
|
|
|
|
export type DomainLocales = Array<{
|
|
http?: true
|
|
domain: string
|
|
locales?: string[]
|
|
defaultLocale: string
|
|
}>
|
|
|
|
export type NextConfig = { [key: string]: any } & {
|
|
cleanDistDir?: boolean
|
|
i18n?: {
|
|
locales: string[]
|
|
defaultLocale: string
|
|
domains?: DomainLocales
|
|
localeDetection?: false
|
|
} | null
|
|
|
|
headers?: () => Promise<Header[]>
|
|
rewrites?: () => Promise<
|
|
| Rewrite[]
|
|
| {
|
|
beforeFiles: Rewrite[]
|
|
afterFiles: Rewrite[]
|
|
fallback: Rewrite[]
|
|
}
|
|
>
|
|
redirects?: () => Promise<Redirect[]>
|
|
trailingSlash?: boolean
|
|
webpack5?: false
|
|
excludeDefaultMomentLocales?: boolean
|
|
|
|
future: {
|
|
/**
|
|
* @deprecated this options was moved to the top level
|
|
*/
|
|
webpack5?: false
|
|
strictPostcssConfiguration?: boolean
|
|
}
|
|
experimental: {
|
|
cpus?: number
|
|
plugins?: boolean
|
|
profiling?: boolean
|
|
sprFlushToDisk?: boolean
|
|
reactMode?: 'legacy' | 'concurrent' | 'blocking'
|
|
workerThreads?: boolean
|
|
pageEnv?: boolean
|
|
optimizeImages?: boolean
|
|
optimizeCss?: boolean
|
|
scrollRestoration?: boolean
|
|
stats?: boolean
|
|
externalDir?: boolean
|
|
conformance?: boolean
|
|
amp?: {
|
|
optimizer?: any
|
|
validator?: string
|
|
skipValidation?: boolean
|
|
}
|
|
reactRoot?: boolean
|
|
disableOptimizedLoading?: boolean
|
|
gzipSize?: boolean
|
|
craCompat?: boolean
|
|
esmExternals?: boolean | 'loose'
|
|
}
|
|
}
|
|
|
|
export const defaultConfig: NextConfig = {
|
|
env: [],
|
|
webpack: null,
|
|
webpackDevMiddleware: null,
|
|
distDir: '.next',
|
|
cleanDistDir: true,
|
|
assetPrefix: '',
|
|
configOrigin: 'default',
|
|
useFileSystemPublicRoutes: true,
|
|
generateBuildId: () => null,
|
|
generateEtags: true,
|
|
pageExtensions: ['tsx', 'ts', 'jsx', 'js'],
|
|
target: 'server',
|
|
poweredByHeader: true,
|
|
compress: true,
|
|
analyticsId: process.env.VERCEL_ANALYTICS_ID || '',
|
|
images: imageConfigDefault,
|
|
devIndicators: {
|
|
buildActivity: true,
|
|
},
|
|
onDemandEntries: {
|
|
maxInactiveAge: 60 * 1000,
|
|
pagesBufferLength: 2,
|
|
},
|
|
amp: {
|
|
canonicalBase: '',
|
|
},
|
|
basePath: '',
|
|
sassOptions: {},
|
|
trailingSlash: false,
|
|
i18n: null,
|
|
productionBrowserSourceMaps: false,
|
|
optimizeFonts: true,
|
|
experimental: {
|
|
cpus: Math.max(
|
|
1,
|
|
(Number(process.env.CIRCLE_NODE_TOTAL) ||
|
|
(os.cpus() || { length: 1 }).length) - 1
|
|
),
|
|
plugins: false,
|
|
profiling: false,
|
|
sprFlushToDisk: true,
|
|
workerThreads: false,
|
|
pageEnv: false,
|
|
optimizeImages: false,
|
|
optimizeCss: false,
|
|
scrollRestoration: false,
|
|
stats: false,
|
|
externalDir: false,
|
|
reactRoot: Number(process.env.NEXT_PRIVATE_REACT_ROOT) > 0,
|
|
disableOptimizedLoading: false,
|
|
gzipSize: true,
|
|
craCompat: false,
|
|
esmExternals: false,
|
|
},
|
|
webpack5:
|
|
Number(process.env.NEXT_PRIVATE_TEST_WEBPACK4_MODE) > 0 ? false : undefined,
|
|
excludeDefaultMomentLocales: true,
|
|
future: {
|
|
strictPostcssConfiguration: false,
|
|
},
|
|
serverRuntimeConfig: {},
|
|
publicRuntimeConfig: {},
|
|
reactStrictMode: false,
|
|
}
|
|
|
|
export function normalizeConfig(phase: string, config: any) {
|
|
if (typeof config === 'function') {
|
|
config = config(phase, { defaultConfig })
|
|
|
|
if (typeof config.then === 'function') {
|
|
throw new Error(
|
|
'> Promise returned in next config. https://nextjs.org/docs/messages/promise-in-next-config'
|
|
)
|
|
}
|
|
}
|
|
return config
|
|
}
|