UNPKG

next

Version:

The React Framework

1,204 lines 77.4 kB
import type { webpack } from 'next/dist/compiled/webpack/webpack'; import type { Header, Redirect, Rewrite } from '../lib/load-custom-routes'; import type { ImageConfig, ImageConfigComplete } from '../shared/lib/image-config'; import type { SubresourceIntegrityAlgorithm } from '../build/webpack/plugins/subresource-integrity-plugin'; import type { WEB_VITALS } from '../shared/lib/utils'; import type { NextParsedUrlQuery } from './request-meta'; import type { SizeLimit } from '../types'; import type { SupportedTestRunners } from '../cli/next-test'; import type { ExperimentalPPRConfig } from './lib/experimental/ppr'; import type { MemoryEvictionMode } from '../build/swc/types'; import type { CacheLife } from './use-cache/cache-life'; /** * The `cacheLife` profiles after config normalization. `config.ts` always * backfills the `default` profile so that its `stale`, `revalidate`, and * `expire` are all defined, which is why `default` is `Required<CacheLife>` * here while other profiles may still be partial. Runtime `"use cache"` code * can therefore read `cacheLifeProfiles.default` without re-validating it. */ export interface ResolvedCacheLifeProfiles { default: Required<CacheLife>; [profile: string]: CacheLife; } /** * Resolved form of the prefetchInlining config after normalization in * config.ts. User input (true, partial objects) is converted to this shape. */ export type PrefetchInliningConfig = false | { maxSize: number; maxBundleSize: number; }; export type NextConfigComplete = Required<Omit<NextConfig, 'configFile' | 'cacheLife'>> & { images: Required<ImageConfigComplete>; typescript: TypeScriptConfig; configFile: string | undefined; configFileName: string; cacheLife: ResolvedCacheLifeProfiles; htmlLimitedBots: string | undefined; experimental: ExperimentalConfig & { prefetchInlining?: PrefetchInliningConfig; useCacheTimeout: number; instantInsights: { validationLevel: ValidationLevel; }; turbopackMemoryEvictionMode: MemoryEvictionMode; }; distDirRoot: string; repoRoot: string; }; export type I18NDomains = readonly DomainLocale[]; export interface I18NConfig { defaultLocale: string; domains?: I18NDomains; localeDetection?: false; locales: readonly string[]; } export interface DomainLocale { defaultLocale: string; domain: string; http?: true; locales?: readonly string[]; } export interface TypeScriptConfig { /** Do not run TypeScript during production builds (`next build`). */ ignoreBuildErrors?: boolean; /** Relative path to a custom tsconfig file */ tsconfigPath?: string; } export interface EmotionConfig { sourceMap?: boolean; autoLabel?: 'dev-only' | 'always' | 'never'; labelFormat?: string; importMap?: { [importName: string]: { [exportName: string]: { canonicalImport?: [string, string]; styledBaseImport?: [string, string]; }; }; }; } export interface StyledComponentsConfig { /** * Enabled by default in development, disabled in production to reduce file size, * setting this will override the default for all environments. */ displayName?: boolean; topLevelImportPaths?: string[]; ssr?: boolean; fileName?: boolean; meaninglessFileNames?: string[]; minify?: boolean; transpileTemplateLiterals?: boolean; namespace?: string; pure?: boolean; cssProp?: boolean; } export type JSONValue = string | number | boolean | JSONValue[] | { [k: string]: JSONValue; }; export type TurbopackLoaderOptions = Record<string, JSONValue>; export type TurbopackLoaderItem = string | { loader: string; options?: TurbopackLoaderOptions; }; export type TurbopackLoaderBuiltinCondition = 'browser' | 'foreign' | 'development' | 'production' | 'node' | 'edge-light'; export type TurbopackRuleCondition = { all: TurbopackRuleCondition[]; } | { any: TurbopackRuleCondition[]; } | { not: TurbopackRuleCondition; } | TurbopackLoaderBuiltinCondition | { path?: string | RegExp; content?: RegExp; query?: string | RegExp; contentType?: string | RegExp; }; /** * The module type to use for matched files. This determines how files are * processed without requiring a custom loader. * * - `'asset'` - Emit the file and return its URL (like webpack's `asset/resource`) * - `'ecmascript'` - Process as JavaScript module * - `'typescript'` - Process as TypeScript module * - `'css'` - Process as CSS file * - `'css-module'` - Process as CSS module * - `'wasm'` - Process as WebAssembly module * - `'raw'` - Return raw file contents as a string * - `'node'` - Process as native Node.js addon * - `'bytes'` - Inline file contents as bytes in JavaScript * * @see [Module Types](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#module-types) */ export type TurbopackModuleType = 'asset' | 'ecmascript' | 'typescript' | 'css' | 'css-module' | 'wasm' | 'raw' | 'node' | 'bytes' | 'text'; export type TurbopackRuleConfigItem = { /** Loaders to apply to matched files. */ loaders?: TurbopackLoaderItem[]; /** Rename the file extension for loader output (e.g., `'*.js'`). */ as?: string; /** Additional conditions for when this rule applies. */ condition?: TurbopackRuleCondition; /** * Set the module type directly without using a loader. * @see [Module Types](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#module-types) */ type?: TurbopackModuleType; }; /** * This can be an object representing a single configuration, or a list of * loaders and/or rule configuration objects. * * - A list of loader path strings or objects is the "shorthand" syntax. * - A list of rule configuration objects can be useful when each configuration * object has different `condition` fields, but still match the same top-level * path glob. */ export type TurbopackRuleConfigCollection = TurbopackRuleConfigItem | (TurbopackLoaderItem | TurbopackRuleConfigItem)[]; export interface TurbopackOptions { /** * (`next --turbopack` only) A mapping of aliased imports to modules to load in their place. * * @see [Resolve Alias](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#resolving-aliases) */ resolveAlias?: Record<string, string | string[] | Record<string, string | string[]>>; /** * (`next --turbopack` only) A list of extensions to resolve when importing files. * * @see [Resolve Extensions](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#resolving-custom-extensions) */ resolveExtensions?: string[]; /** * (`next --turbopack` only) A list of webpack loaders to apply when running with Turbopack. * * @see [Turbopack Loaders](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#configuring-webpack-loaders) */ rules?: Record<string, TurbopackRuleConfigCollection>; /** * This is the repo root usually and only files above this * directory can be resolved by turbopack. */ root?: string; /** * Enables generation of debug IDs in JavaScript bundles and source maps. * These debug IDs help with debugging and error tracking by providing stable identifiers. * * @see https://github.com/tc39/ecma426/blob/main/proposals/debug-id.md TC39 Debug ID Proposal */ debugIds?: boolean; /** * An array of issue filter rules to ignore specific Turbopack issues. * Each rule must have a `path` field (mandatory) and optionally `title` * and `description`. String paths are treated as glob patterns. String * titles/descriptions are exact matches. RegExp values match anywhere * within the string (use `^` and `$` anchors for full-string matching). */ ignoreIssue?: Array<{ path: string | RegExp; title?: string | RegExp; description?: string | RegExp; }>; /** * Override the global variable name used for * chunk loading. Useful when multiple Turbopack-built apps run on the same * page (e.g. horizontal micro-frontends) to avoid `globalThis.TURBOPACK` * conflicts. * * @see https://webpack.js.org/configuration/output/#outputchunkloadingglobal */ chunkLoadingGlobal?: string; } export interface WebpackConfigContext { /** Next.js root directory */ dir: string; /** Indicates if the compilation will be done in development */ dev: boolean; /** It's `true` for server-side compilation, and `false` for client-side compilation */ isServer: boolean; /** The build id, used as a unique identifier between builds */ buildId: string; /** The next.config.js merged with default values */ config: NextConfigComplete; /** Default loaders used internally by Next.js */ defaultLoaders: { /** Default babel-loader configuration */ babel: any; }; /** Number of total Next.js pages */ totalPages: number; /** The webpack configuration */ webpack: any; /** The current server runtime */ nextRuntime?: 'nodejs' | 'edge'; } export interface NextJsWebpackConfig { ( /** Existing Webpack config */ config: any, context: WebpackConfigContext): any; } /** * Set of options for React Compiler that Next.js currently supports. * * These options may be changed in breaking ways at any time without notice * while support for React Compiler is experimental. * * @see https://react.dev/reference/react-compiler/configuration */ export interface ReactCompilerOptions { /** * Controls the strategy for determining which functions the React Compiler * will optimize. * * The default is `'infer'`, which uses intelligent heuristics to identify * React components and hooks. * * When using `infer`, Next.js applies its own heuristics before calling * `react-compiler`. This improves compilation performance by avoiding extra * invocations of Babel and reducing redundant parsing of code. * * @see https://react.dev/reference/react-compiler/compilationMode */ compilationMode?: 'infer' | 'annotation' | 'all'; /** * Controls how the React Compiler handles errors during compilation. * * The default is `'none'`, which skips components which cannot be compiled. * * @see https://react.dev/reference/react-compiler/panicThreshold */ panicThreshold?: 'none' | 'critical_errors' | 'all_errors'; } export interface IncomingRequestLoggingConfig { /** * A regular expression array to match incoming requests that should not be logged. * You can specify multiple patterns to match incoming requests that should not be logged. */ ignore?: RegExp[]; } export interface LoggingConfig { fetches?: { fullUrl?: boolean; /** * If true, fetch requests that are restored from the HMR cache are logged * during an HMR refresh request, i.e. when editing a server component. */ hmrRefreshes?: boolean; }; /** * If set to false, incoming request logging is disabled. * You can specify a pattern to match incoming requests that should not be logged. */ incomingRequests?: boolean | IncomingRequestLoggingConfig; /** * If false, Server Function invocation logging is disabled. * @default true */ serverFunctions?: boolean; /** * Forward browser console logs to terminal. * - `false`: Disable browser log forwarding * - `true`: Forward all browser console output to terminal * - `'warn'`: Forward warnings and errors to terminal * - `'error'`: Forward only errors to terminal */ browserToTerminal?: boolean | 'error' | 'warn'; } /** * All recognized lightningcss feature names. * Individual features map 1:1 to lightningcss `Features` bitflags. * Composite names (`selectors`, `media-queries`, `colors`) enable a group of * related individual features at once. * * The name→bitmask mapping is duplicated in: * - JS: `packages/next/src/build/webpack/loaders/lightningcss-loader/src/features.ts` * - Rust: `crates/next-core/src/next_config.rs` (`lightningcss_feature_names_to_mask`) */ export declare const LIGHTNINGCSS_FEATURE_NAMES: readonly ["nesting", "not-selector-list", "dir-selector", "lang-selector-list", "is-selector", "text-decoration-thickness-percent", "media-interval-syntax", "media-range-syntax", "custom-media-queries", "clamp-function", "color-function", "oklab-colors", "lab-colors", "p3-colors", "hex-alpha-colors", "space-separated-color-notation", "font-family-system-ui", "double-position-gradients", "vendor-prefixes", "logical-properties", "light-dark", "selectors", "media-queries", "colors"]; export type LightningCssFeature = (typeof LIGHTNINGCSS_FEATURE_NAMES)[number]; export interface LightningCssFeatures { include?: LightningCssFeature[]; exclude?: LightningCssFeature[]; } /** * Accepted shapes for `experimental.cssChunking`. See [`ExperimentalConfig.cssChunking`] for the * accepted values; use [`resolveCssChunkingMode`] to normalize the value at runtime. */ export type CssChunkingConfig = boolean | 'strict' | 'loose' | 'graph' | { type: 'strict'; } | { type: 'loose'; } | { type: 'graph'; requestCost?: number; weightDistribution?: number; }; /** * Normalize any [`CssChunkingConfig`] value to one of the four modes the build pipeline cares * about: * - `'off'` — `false`/`undefined`: do not run a CSS chunking plugin. * - `'loose'` — `true` / `'loose'` / `{ type: 'loose' }`: heuristic-based chunking * (the default). * - `'strict'` — `'strict'` / `{ type: 'strict' }`: webpack-only ordered-chunking plugin. * - `'graph'` — `'graph'` / `{ type: 'graph', … }`: Turbopack-only graph algorithm. */ export declare function resolveCssChunkingMode(value: CssChunkingConfig | undefined): 'off' | 'loose' | 'strict' | 'graph'; export interface ExperimentalConfig { /** * @deprecated Use the top-level `outputHashSalt` option instead. */ outputHashSalt?: string; appNewScrollHandler?: boolean; /** * Shows a persistent "Cold cache" badge in the dev overlay after a load that * filled an empty cache while streaming. Off by default while the badge's * UI/UX is iterated on; the transient "Rendering (cold cache)" pill is shown * regardless of this flag. */ coldCacheBadge?: boolean; useSkewCookie?: boolean; /** @deprecated use top-level `cacheHandlers` instead */ cacheHandlers?: NextConfig['cacheHandlers']; multiZoneDraftMode?: boolean; appNavFailHandling?: boolean; prerenderEarlyExit?: boolean; linkNoTouchStart?: boolean; caseSensitiveRoutes?: boolean; /** * The origins that are allowed to write the rewritten headers when * performing a non-relative rewrite. When undefined, no non-relative * rewrites will get the rewrite headers. */ clientParamParsingOrigins?: string[]; /** * Caches subsets of a route, seeded from actual navigations, so subsequent * navigations to the same or similar pages can be served instantly. Requires * Cache Components. */ cachedNavigations?: boolean; dynamicOnHover?: boolean; useOffline?: boolean; optimisticRouting?: boolean; instrumentationClientRouterTransitionEvents?: boolean; varyParams?: boolean; prefetchInlining?: boolean | { maxSize?: number; maxBundleSize?: number; }; preloadEntriesOnStart?: boolean; clientRouterFilter?: boolean; clientRouterFilterRedirects?: boolean; /** * This config can be used to override the cache behavior for the client router. * These values indicate the time, in seconds, that the cache should be considered * reusable. When the `prefetch` Link prop is left unspecified, this will use the `dynamic` value. * When the `prefetch` Link prop is set to `true`, this will use the `static` value. */ staleTimes?: { dynamic?: number; /** Must be greater than or equal to 30 seconds, to ensure prefetching is not completely wasteful */ static?: number; }; /** * @deprecated use top-level `cacheLife` instead */ cacheLife?: NextConfig['cacheLife']; clientRouterFilterAllowedRate?: number; /** * @deprecated Use `externalProxyRewritesResolve` instead. */ externalMiddlewareRewritesResolve?: boolean; externalProxyRewritesResolve?: boolean; /** * Exposes the Instant Navigation Testing API in production builds. This * API is always available in development mode. * * The testing API allows e2e tests to control navigation timing, enabling * deterministic assertions on prefetched/cached UI before dynamic data * streams in. * * WARNING: This flag is intended for profiling and testing purposes only. * Do not enable in user-facing production deployments. */ exposeTestingApiInProductionBuild?: boolean; /** * Show Request Insights in the dev tools indicator. Request Insights records * the local framework spans needed to explain App Router request, render, * fetch, and cache behavior without requiring an external OTEL collector. */ requestInsights?: boolean; extensionAlias?: Record<string, any>; allowedRevalidateHeaderKeys?: string[]; fetchCacheKeyPrefix?: string; imgOptConcurrency?: number | null; imgOptOperationCache?: boolean | null; imgOptTimeoutInSeconds?: number; imgOptMaxInputPixels?: number; imgOptSequentialRead?: boolean | null; optimisticClientCache?: boolean; /** * @deprecated use config.expireTime instead */ expireTime?: number; /** * @deprecated Use `proxyPrefetch` instead. */ middlewarePrefetch?: 'strict' | 'flexible'; proxyPrefetch?: 'strict' | 'flexible'; manualClientBasePath?: boolean; /** * CSS Chunking strategy. Defaults to `true` (loose mode), which guesses dependencies between * CSS files to keep ordering of them. * * - `true` / `'loose'` / `{ type: 'loose' }` — default heuristic-based chunking. * - `'strict'` / `{ type: 'strict' }` — preserve correct ordering as much as possible, even * when this leads to many requests. Webpack only. * - `false` — disable chunking; emit one chunk per CSS module. Webpack only. * - `'graph'` / `{ type: 'graph', requestCost?, weightDistribution? }` — Turbopack only. * Selects a CSS chunking strategy that analyzes the most common style orderings across the * application and produces shared chunks accordingly. Compared to the default mode it * intentionally overships some styles in order to reduce the number of CSS requests per * page. Cost overrides: * - `requestCost` (bytes, default `100000`) — additional cost charged for every CSS * request a chunk group makes. Larger values bias the algorithm toward fewer, larger * shared chunks; smaller values toward more, smaller chunks. * - `weightDistribution` (default `0.1`) — controls how a chunk's cost is distributed across * the chunk groups that load it, via a per-group weight of * `groupSize ^ (-weightDistribution)`. `0` weights every chunk group equally; higher * values give smaller chunk groups more weight, so small pages ship fewer unrelated * styles at the expense of more requests overall. */ cssChunking?: CssChunkingConfig; /** * Controls whether the development server automatically restarts when its * heap usage exceeds the memory threshold. Defaults to `true`. */ devMemoryThresholdRestart?: boolean; disablePostcssPresetEnv?: boolean; cpus?: number; memoryBasedWorkersCount?: boolean; proxyTimeout?: number; isrFlushToDisk?: boolean; workerThreads?: boolean; optimizeCss?: boolean | Record<string, unknown>; nextScriptWorkers?: boolean; scrollRestoration?: boolean; externalDir?: boolean; disableOptimizedLoading?: boolean; /** @deprecated A no-op as of Next 16, size metrics were removed from the build output. */ gzipSize?: boolean; craCompat?: boolean; esmExternals?: boolean | 'loose'; fullySpecified?: boolean; urlImports?: NonNullable<webpack.Configuration['experiments']>['buildHttp']; swcTraceProfiling?: boolean; forceSwcTransforms?: boolean; swcPlugins?: Array<[string, Record<string, unknown>]>; /** * Additional options for SWC's preset-env (`env` configuration). * These are merged into the `env` block that Next.js passes to SWC, * alongside the browserslist-derived `targets`. * * See https://swc.rs/docs/configuration/supported-browsers for full details. * * @example * ```js * // next.config.js * module.exports = { * experimental: { * swcEnvOptions: { * mode: 'usage', * coreJs: '3.38', * }, * }, * } * ``` */ swcEnvOptions?: { /** * Polyfill injection mode, matching Babel's `useBuiltIns`. * - `'usage'`: Adds specific polyfill imports per file based on actual usage. * - `'entry'`: Replaces a single `import 'core-js'` with only the polyfills * needed for the target browsers. */ mode?: 'usage' | 'entry'; /** The core-js version to use (e.g. `'3.38'`). Required when `mode` is set. */ coreJs?: string; /** Core-js modules or SWC transform passes to skip. */ skip?: string[]; /** Core-js modules or SWC transform passes to always include. */ include?: string[]; /** Core-js modules or SWC transform passes to always exclude. */ exclude?: string[]; /** Enable shipped TC39 proposals. */ shippedProposals?: boolean; /** Force all transforms regardless of targets. */ forceAllTransforms?: boolean; /** Enable debug output for preset-env. */ debug?: boolean; /** Enable loose mode for transforms. */ loose?: boolean; }; largePageDataBytes?: number; /** * If set to `false`, webpack won't fall back to polyfill Node.js modules in the browser * Full list of old polyfills is accessible here: * [webpack/webpack#ModuleNotoundError.js#L13-L42](https://github.com/webpack/webpack/blob/2a0536cf510768111a3a6dceeb14cb79b9f59273/lib/ModuleNotFoundError.js#L13-L42) */ fallbackNodePolyfills?: false; sri?: { algorithm?: SubresourceIntegrityAlgorithm; }; webVitalsAttribution?: Array<(typeof WEB_VITALS)[number]>; /** * Automatically apply the "modularizeImports" optimization to imports of the specified packages. */ optimizePackageImports?: string[]; /** * Optimize React APIs for server builds. */ optimizeServerReact?: boolean; /** * Type-checks props and return values of pages. * Requires literal values for segment config (e.g. `export const dynamic = 'force-static' as const`). */ strictRouteTypes?: boolean; /** * Runs the project-local TypeScript CLI instead of using TypeScript's * programmatic API for build-time type checking and config loading. */ useTypeScriptCli?: boolean; /** * Displays an indicator when a React Transition has no other indicator rendered. * This includes displaying an indicator on client-side navigations. */ transitionIndicator?: boolean; /** * Enables experimental gesture transition APIs for optimistic client * navigations. Requires experimental React. */ gestureTransition?: boolean; /** * Controls Turbopack's memory eviction strategy for development sessions * * Only effective in dev sessions where * `experimental.turbopackFileSystemCacheForDev` is enabled (which it is by default). * * - `false`: disable eviction. * - `'full'`: after every snapshot, drop as much memory as possible. * - `'auto'`: evict after a snapshot when we expect to save a lot of memory or the system is under pressure * * Defaults to `'auto'` */ turbopackMemoryEviction?: false | 'full' | 'auto'; /** * Selects the backend used by Turbopack for Node.js evaluation, e.g. webpack * loaders, Babel, or PostCSS. * * This defaults to `'childProcesses'`, which creates a pool of child node.js * processes and communciates with them over sockets. * * `'workerThreads'` runs the same work in worker threads instead, which should * use less memory and CPU. It may become the default in a future version of * Next.js. */ turbopackPluginRuntimeStrategy?: 'workerThreads' | 'childProcesses'; /** * Enable minification. Defaults to true in build mode and false in dev mode. */ turbopackMinify?: boolean; /** * Enable support for `with {type: "bytes"}` for ESM imports. */ turbopackImportTypeBytes?: boolean; /** * Enable scope hoisting. Defaults to true in build mode. Always disabled in development mode. */ turbopackScopeHoisting?: boolean; /** * Share the browser runtime across routes in a single `runtime.js` asset and inline the * per-route chunk-group bootstrap into the HTML, dropping the per-route runtime. Defaults to * false. Only applies to production builds; has no effect in development mode. */ turbopackSharedRuntime?: boolean; /** * (`next --turbopack` only) These options change the assumptions Turbopack makes when * making chunk merging decisions and the raw size thresholds it uses. */ turbopackChunking?: { /** * This is a number between `0..1`, when higher, we weight the benefits of * merging chunks for a signal page load higher. If you don't know a good * number for this, your bounce rate is a good approximate for this value. */ firstPageLoadPriority?: number; /** * Regular expressions matching routes that are often the first page * visited and whose client-side bundles should be merged more eagerly to reduce the single-route * request cost (e.g. the homepage). This is at the cost of extra requests on other pages. */ priorityRoutes?: RegExp[]; /** * How much more eagerly to merge the client-side bundles of * `priorityRoutes` routes, as a multiplier on their single-request probability (default * `1.5`). Higher values merge more aggressively for those routes at the cost of extra requests * elsewhere. */ priorityBoost?: number; /** * Estimated cost of an additional request, in bytes (uncompressed * and unminfified bytes of code, default is 200 KB), used by the chunker to * trade off request count against preventing double-fetching. Uncompressed and unminfified code * is approximately 5x the size of compressed and minified code. */ requestCost?: number; /** * Avoid creating more than one chunk smaller than this size, in bytes. Smaller * chunks are merged into bigger ones to avoid that. Defaults to `50000` (50 KB). */ minChunkSize?: number; /** * Avoid creating more than this number of chunks per chunk group. Chunks are * merged into bigger ones to avoid that. Defaults to `40`. */ maxChunkCountPerGroup?: number; /** * Never merge chunks bigger than this size, in bytes, with other chunks. This keeps code * in big chunks from being duplicated across multiple chunks. Defaults to `200000` (200 KB). */ maxMergeChunkSize?: number; /** * Emit each merged production chunk's constituent component chunks alongside it, so the * browser runtime can load only the ones it doesn't already have. Defaults to `false`. */ generateComponentChunks?: boolean; /** * Minimum size, in bytes, for a component chunk to be emitted on its own when * `generateComponentChunks` is enabled. Component chunks smaller than this are folded into a * single remainder chunk. Defaults to `20000` (20 KB). */ minComponentChunkSize?: number; }; /** * (`next --turbopack` only) A custom URL prefix for Web Worker URLs * produced by `new Worker(new URL(..., import.meta.url))` — both the * entrypoint URL and the module chunks loaded inside the worker — * overriding `assetPrefix` for those URLs. * * Use this when `assetPrefix` points to a cross-origin CDN: browsers * reject cross-origin Worker construction, so the entrypoint must stay * same-origin. Module chunks loaded inside the worker are also routed * through this prefix because the worker bootstrap requires them to be * same-origin with the entrypoint. Mirrors webpack's * `output.workerPublicPath`. * * Like `assetPrefix`, the value is a prefix without a trailing slash and * without `/_next` — `/_next/` is appended automatically. An empty * string is treated as a literal empty prefix (resulting in same-origin * `/_next/...` URLs); only `undefined` falls back to `assetPrefix`. * * @example * ```js * // next.config.js * module.exports = { * assetPrefix: 'https://cdn.example.com', * experimental: { * turbopackWorkerAssetPrefix: '', * }, * } * ``` */ turbopackWorkerAssetPrefix?: string; /** * Enable nested async chunking for client side assets. Defaults to true in build mode and false in dev mode. * This optimization computes all possible paths through dynamic imports in the applications to figure out the modules needed at dynamic imports for every path. */ turbopackClientSideNestedAsyncChunking?: boolean; /** * Enable nested async chunking for server side assets. Defaults to false in dev and build mode. * This optimization computes all possible paths through dynamic imports in the applications to figure out the modules needed at dynamic imports for every path. */ turbopackServerSideNestedAsyncChunking?: boolean; /** * Enable filesystem cache for the turbopack dev server. * * Defaults to `true`. */ turbopackFileSystemCacheForDev?: boolean; /** * Enable filesystem cache for the turbopack build. * * Defaults to `true`. */ turbopackFileSystemCacheForBuild?: boolean; /** * When running inside a git worktree, warm-start this worktree's Turbopack * filesystem cache by seeding it from the main checkout's cache if the * worktree doesn't have one yet. This is best-effort and never fails a build. * * Defaults to `false`. */ turbopackSeedCacheFromWorktree?: boolean; /** * Enable source maps. Defaults to true. */ turbopackSourceMaps?: boolean; /** * Enable extraction of source maps from input files. Defaults to true. */ turbopackInputSourceMaps?: boolean; /** * Currently in active development. This splits modules into fragments and * chunks only import the used fragments of the modules. */ turbopackModuleFragments?: boolean; /** * Enable removing unused imports for turbopack dev server and build. */ turbopackRemoveUnusedImports?: boolean; /** * Enable removing unused exports for turbopack dev server and build. */ turbopackRemoveUnusedExports?: boolean; /** * Enable local analysis to infer side effect free modules. When enabled, Turbopack will * analyze module code to determine if it has side effects. This can improve tree shaking * and bundle size at the cost of some additional analysis. * * Defaults to `true` */ turbopackInferModuleSideEffects?: boolean; /** * Enable tree shaking of unused exports from analyzable CommonJS modules in Turbopack. * * Defaults to `false` */ turbopackCjsTreeShaking?: boolean; /** * Set this to `false` to disable the automatic configuration of the babel loader when a Babel * configuration file is present. This option is enabled by default. * * If this is set to `false`, but `reactCompiler` is `true`, the built-in Babel will * still be configured, but any Babel configuration files on disk will be ignored. If you wish to * use React Compiler with a different manually-configured `babel-loader`, you should disable both * this and `reactCompiler`. */ turbopackUseBuiltinBabel?: boolean; /** * Set this to `false` to disable the automatic configuration of the sass loader. The sass loader * configuration is enabled by default. */ turbopackUseBuiltinSass?: boolean; /** * Enable per-directory PostCSS config resolution for Turbopack. When enabled, * Turbopack searches for `postcss.config.js` starting from the CSS file's * parent directory first, then falls back to the project root. When disabled * (default), the project root is checked first, with the CSS file's directory * as a fallback. */ turbopackLocalPostcssConfig?: boolean; /** * The module ID strategy to use for Turbopack. * If not set, the default is `'named'` for development and `'deterministic'` * for production. */ turbopackModuleIds?: 'named' | 'deterministic'; /** * Enable server-side Fast Refresh (Hot Module Replacement) during development * with Turbopack. When set to `false`, server-side HMR is disabled and a full * restart is performed on server file changes. * * Can also be controlled via the `--no-server-fast-refresh` CLI flag. * If both are set, the CLI flag takes precedence. * * @default true */ turbopackServerFastRefresh?: boolean; /** * For use with `@next/mdx`. Compile MDX files using the new Rust compiler. * @see https://nextjs.org/docs/app/api-reference/next-config-js/mdxRs */ mdxRs?: boolean | { development?: boolean; jsx?: boolean; jsxRuntime?: string; jsxImportSource?: string; providerImportSource?: string; mdxType?: 'gfm' | 'commonmark'; }; /** * Enable type checking for Link and Router.push, etc. * @deprecated Use `typedRoutes` instead — this feature is now stable. * @see https://nextjs.org/docs/app/api-reference/config/typescript#statically-typed-links */ typedRoutes?: boolean; /** * Enable type-checking and autocompletion for environment variables. * * @default false */ typedEnv?: boolean; /** * Runs the compilations for server and edge in parallel instead of in serial. * This will make builds faster if there is enough server and edge functions * in the application at the cost of more memory. * * NOTE: This option is only valid when the build process can use workers. See * the documentation for `webpackBuildWorker` for more details. */ parallelServerCompiles?: boolean; /** * Runs the logic to collect build traces for the server routes in parallel * with other work during the compilation. This will increase the speed of * the build at the cost of more memory. This option may incur some additional * work compared to if the option was disabled since the work is started * before data from the client compilation is available to potentially reduce * the amount of code that needs to be traced. Despite that, this may still * result in faster builds for some applications. * * Valid values are: * - `true`: Collect the server build traces in parallel. * - `false`: Do not collect the server build traces in parallel. * - `undefined`: Collect server build traces in parallel only in the `experimental-compile` mode. * * NOTE: This option is only valid when the build process can use workers. See * the documentation for `webpackBuildWorker` for more details. */ parallelServerBuildTraces?: boolean; /** * Run the Webpack build in a separate process to optimize memory usage during build. * Valid values are: * - `false`: Disable the Webpack build worker * - `true`: Enable the Webpack build worker * - `undefined`: Enable the Webpack build worker only if the webpack config is not customized */ webpackBuildWorker?: boolean; /** * Enables optimizations to reduce memory usage in Webpack. This reduces the max size of the heap * but may increase compile times slightly. * Valid values are: * - `false`: Disable Webpack memory optimizations (default). * - `true`: Enables Webpack memory optimizations. */ webpackMemoryOptimizations?: boolean; /** * The array of the meta tags to the client injected by tracing propagation data. */ clientTraceMetadata?: string[]; /** * @deprecated This configuration option has been merged into `cacheComponents`. * The Partial Prerendering feature is still available via `cacheComponents`. */ ppr?: ExperimentalPPRConfig; /** * Enables experimental taint APIs in React. * Using this feature will enable the `react@experimental` for the `app` directory. */ taint?: boolean; /** * Enables blocking server-side rendering for the `app` directory: React emits * a `<link rel="expect">` tag that holds the browser's first paint until the * streamed shell is coherent, avoiding the layout shift / flicker that can * occur while a partially-streamed HTML document is painted. Note that * `rel="expect"` is currently only implemented by Chromium-based browsers. * * This feature is currently only available in React's experimental release * channel, so enabling it opts the `app` directory into `react@experimental` * (the same channel used by `taint`, `transitionIndicator`, and * `gestureTransition`). The name mirrors React's underlying feature flag. * * This is an opt-in only. Setting it to `false` does not disable the * experimental channel when another feature (such as `taint`, * `transitionIndicator`, or `gestureTransition`) requires it. */ blockingSSR?: boolean; /** * Uninstalls all "unhandledRejection" and "uncaughtException" listeners from * the global process so that we can override the behavior, which in some * runtimes is to exit the process. * * This is experimental until we've considered the impact in various * deployment environments. */ removeUncaughtErrorAndRejectionListeners?: boolean; /** * During an RSC request, validates that the request headers match the * cache-busting search parameter sent by the client. */ validateRSCRequestHeaders?: boolean; serverActions?: { /** * Allows adjusting body parser size limit for server actions. */ bodySizeLimit?: SizeLimit; /** * Allowed origins that can bypass Server Action's CSRF check. This is helpful * when you have reverse proxy in front of your app. * @example * ["my-app.com", "*.my-app.com"] */ allowedOrigins?: string[]; }; /** * Allows adjusting the maximum size of the postponed state body for PPR * resume requests. This includes the Resume Data Cache (RDC) which may grow * large for some applications. * @default '100 MB' */ maxPostponedStateSize?: SizeLimit; /** * enables the minification of server code. */ serverMinification?: boolean; /** * Enables source maps generation for the server production bundle. */ serverSourceMaps?: boolean; useWasmBinary?: boolean; /** * Use lightningcss instead of postcss-loader */ useLightningcss?: boolean; /** * Configure which CSS features lightningcss should always transpile * (include) or never transpile (exclude), regardless of browser targets. * Requires `useLightningcss: true`. */ lightningCssFeatures?: LightningCssFeatures; /** * Enables `fetch` requests to be proxied to the experimental test proxy server */ testProxy?: boolean; /** * Set a default test runner to be used by `next experimental-test`. */ defaultTestRunner?: SupportedTestRunners; /** * Allow NODE_ENV=development even for `next build`. */ allowDevelopmentBuild?: true; /** * @deprecated use `config.bundlePagesRouterDependencies` instead * */ bundlePagesExternals?: boolean; /** * @deprecated use `config.serverExternalPackages` instead * */ serverComponentsExternalPackages?: string[]; /** * When enabled, in dev mode, Next.js will send React's debug info through the * WebSocket connection, instead of including it in the main RSC payload. */ reactDebugChannel?: boolean; /** * @deprecated use top-level `cacheComponents` instead */ cacheComponents?: boolean; /** * Configuration for instant navigation validation. */ instantInsights?: { /** * Controls the validation behavior of Instant Insights * * - `'warning'` (default): Validates all navigations for Instant UI in development * - `'manual-warning'`: Validates navigations for Instant UI in development only when configured with `instant` in Pages and Layouts * - `'experimental-error'`: Validates all navigations for Instant in development and build. Use with caution. * - `'experimental-manual-error'`: Validates navigations for Instant UI in development and build when configured with `instant` in Pages and Layouts. Use with caution. */ validationLevel?: ValidationLevel; }; /** * Runs development Cache Components validation on a worker thread rather than * the main thread, keeping the dev server's event loop responsive during * rapid navigation. This covers static-shell validation (which runs on * initial load and HMR refresh) as well as instant-navigation validation * (when `instant` is configured). Enabled by default; set to `false` to run * validation in-process, as an escape hatch to isolate a problem or fall back * if the worker misbehaves. * * Has no effect with Webpack, where validation always runs in process. The * worker's thread cannot reach Webpack's dev source maps, so validation * errors would be reported without a source location. */ devValidationWorker?: boolean; /** * The number of times to retry static generation (per page) before giving up. */ staticGenerationRetryCount?: number; /** * The amount of pages to export per worker during static generation. */ staticGenerationMaxConcurrency?: number; /** * The minimum number of pages to be chunked into each export worker. */ staticGenerationMinPagesPerWorker?: number; /** * Allows previously fetched data to be re-used when editing server components. */ serverComponentsHmrCache?: boolean; /** * Cancels the render and validation work for a Server Components HMR refresh * once a newer refresh supersedes it. Development only. */ serverComponentsHmrCancellation?: boolean; /** * Render <style> tags inline in the HTML for imported CSS assets. * Supports app-router in production mode only. */ inlineCss?: boolean; /** * This config allows you to enable the experimental navigation API `forbidden` and `unauthorized`. */ authInterrupts?: boolean; /** * Seconds before a `'use cache'` fill is considered stalled. Defaults to * 90% of `staticPageGenerationTimeout`. In prerender it's clamped to that * ceiling so errors surface before the build worker kills the page. */ useCacheTimeout?: number; /** * Enables the use of the `"use cache"` directive. * @deprecated use top-level `cacheComponents` instead */ useCache?: boolean; /** * Enables durable `"use cache"` remote cache entries across deployments. Only implemented for * Turbopack. */ durableUseCacheEntries?: boolean; /** * Enables detection and reporting of slow modules during development builds. * Enabling this may impact build performance to ensure accurate measurements. */ slowModuleDetection?: { /** * The time threshold in milliseconds for identifying slow modules. * Modules taking longer than this build time threshold will be reported. */ buildTimeThresholdMs: number; }; /** * Enables using the global-not-found.js file in the app directory * */ globalNotFound?: boolean; /** * @experimental Use the Rust port of the React compiler (Turbopack only). * Requires `reactCompiler` to be enabled. */ turbopackRustReactCompiler?: boolean; /** * Enable debug information to be forwarded from browser to dev server stdout/stderr. * * - `'warn'` (default): Forward warnings and errors to terminal * - `'error'`: Forward only errors to terminal * - `'verbose'`: Forward all browser console output to terminal * - `true`: Same as 'verbose' - forward all browser console output to terminal * - `false`: Disable browser log forwarding to terminal * - Object: Enable with custom configuration * * @deprecated Use `logging.browserToTerminal` instead. */ browserDebugInfoInTerminal?: boolean | 'error' | 'warn' | 'verbose' | { /** * Minimum log level to show in terminal. * @default 'verbose' (for object config, to preserve backward compatibility) */ level?: 'error' | 'warn' | 'verbose'; /** * Option to limit stringification at a specific nesting depth when logging circular objects. * @default 5 */ depthLimit?: number; /** * Maximum number of properties/elements to stringify when logging objects/arrays with circular references. * @default 100 */ edgeLimit?: number; /** * Whether to include source location information in debug output when available */ showSourceLocation?: boolean; }; /** * Body size limit for request bodies with middleware configured. * Defaults to 10MB. Can be specified as a number (bytes) or string (e.g. '5mb'). * * @deprecated Use `proxyClientMaxBodySize` instead. */ middlewareClientMaxBodySize?: SizeLimit; /** * Body size limit for request bodies with proxy configured. * Defaults to 10MB. Can be specified as a number (bytes) or string (e.g. '5mb'). */ proxyClientMaxBodySize?: SizeLimit; /** * Enable the Model Context Protocol (MCP) server for AI-assisted development. * When enabled, Next.js will expose an MCP server at `/_next/mcp` that provides * code intelligence and project context to AI assistants. * * @default true */ mcpServer?: boolean; /** * Acquires a lockfile at `<distDir>/lock` when starting `next dev` or `next * build`. Failing to acquire the lock causes the process to exit with an * error message. * * This is because if multiple processes write to the same `distDir` at the * same time, it can mangle the state of the directory. Disabling this option * is not recommended. * * @default true */ lockDistDir?: boolean; /** * Hide logs that occur after a render has already aborted. * This can help reduce noise in the console when dealing with aborted renders. * * @default false */ hideLogsAfterAbort?: boolean; /** * Whether `process.env.NEXT_DEPLOYMENT_ID` is available at runtime in the server (and `next * build` doesn't need to embed the deployment ID value into the build output). * * @default false */ runtimeServerDeploymentId?: boolean; /** * @deprecated Use the top-level `supportsImmutableAssets` option instead. */ supportsImmutableAssets?: boolean; /** * An array of paths in app or pages directories that should wait to be processed * until all other entries have been processed. This is useful for deferring * compilation of certain routes during development and build. */ deferredEntries?: string[]; /** * An async function that is called and awaited before processing deferred entries. * This callback runs after all non-deferred entries have been compiled. */ onBeforeDeferredEntries?: () => Promise<void>; /** * Whether to report inlined system environment variables as warnings or errors. * Only supported for Turbopack. */ reportSystemEnvInlining?: 'error' | 'warn'; } export type ExportPathMap = { [path: string]: { page: string; query?: NextParsedUrlQuery; }; }; /** * Next.js can be configured through a `next.config.js` file in the root of your project directory. * * This can change the behavior, enable experimental features, and configure other advanced options. * * Read more: [Next.js Docs: `next.config.js`](https://nextjs.o