import type { webpack } from 'next/dist/compiled/webpack/webpack'; import type { Header, Redirect, Rewrite, RouteHas } 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 { ManifestRewriteRoute, ManifestHeaderRoute, ManifestRedirectRoute, ManifestRoute } from '../build'; import type { RenderingMode } from '../build/rendering-mode'; import type { Revalidate } from './lib/cache-control'; import type { AdapterOutputType } from '../shared/lib/constants'; import type { MiddlewareMatcher } from '../build/analysis/get-page-static-info'; export type NextConfigComplete = Required & { images: Required; typescript: Required; configOrigin?: string; configFile?: string; configFileName: string; htmlLimitedBots: string | undefined; experimental: Omit; }; export type AdapterOutputs = Array<{ /** * id is a unique identifier for the output */ id: string; /** * pathname is the URL path that the output is meant to * be routable to at e.g. /blog/[slug] or /_next/static/chunks/chunk.js */ pathname: string; /** * runtime for the route, this doesn't apply for prerender or static */ runtime?: 'nodejs' | 'edge'; /** * config related to the route */ config?: { /** * maxDuration is a segment config to signal the max * execution duration a route should be allowed before * it's timed out */ maxDuration?: number; /** * preferredRegion is a segment config to signal deployment * region preferences to the provider being used */ preferredRegion?: string | string[]; /** * allowQuery is the allowed query values to be passed * to an ISR function and what should be considered for the cacheKey * e.g. for /blog/[slug], "slug" is the only allowQuery */ allowQuery?: string[]; /** * allowHeader is the allowed headers to be passed to an * ISR function to prevent accidentally poisoning the cache * from leaking additional information that can impact the render */ allowHeader?: string[]; /** * bypass for is a list of has conditions the cache * should be bypassed and invoked directly e.g. action header */ bypassFor?: RouteHas[]; /** * renderingMode signals PPR or not for a prerender */ renderingMode?: RenderingMode; /** * matchers are the configured matchers for middleware */ matchers?: MiddlewareMatcher[]; /** * bypassToken is the generated token that signals a prerender cache * should be bypassed */ bypassToken?: string; /** * postponed is the PPR state when it postponed and is used for resuming */ postponed?: string; }; /** * For prerenders the parent output is the originating * page that the prerender is created from */ parentOutputId?: string; /** * fallback is initial cache data generated during build for a prerender */ fallback?: { /** * path to the fallback file can be HTML/JSON/RSC */ filePath: string; /** * initialStatus is the status code that should be applied * when serving the fallback */ initialStatus?: number; /** * initialHeaders are the headers that should be sent when * serving the fallback */ initialHeaders?: Record; /** * initial expiration is how long until the fallback entry * is considered expired and no longer valid to serve */ initialExpiration?: number; /** * initial revalidate is how long until the fallback is * considered stale and should be revalidated */ initialRevalidate?: Revalidate; }; /** * assets are all necessary traced assets that could be * loaded by the output to handle a request e.g. traced * node_modules or necessary manifests for Next.js */ assets?: Record; /** * filePath is present for all cases except a Prerender * which may or may not have a fallback (initial cache entry). * The parent output will have a filePath for a prerender though */ filePath?: string; /** * type of output */ type: AdapterOutputType; }>; export interface NextAdapter { name: string; modifyConfig?: (config: NextConfigComplete) => Promise | NextConfigComplete; onBuildComplete?: (ctx: { routes: { headers: Array; redirects: Array; rewrites: { beforeFiles: Array; afterFiles: Array; fallback: Array; }; dynamicRoutes: ReadonlyArray; }; outputs: AdapterOutputs; }) => Promise | void; } 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 ESLintConfig { /** Only run ESLint on these directories with `next lint` and `next build`. */ dirs?: string[]; /** Do not run ESLint during production builds (`next build`). */ ignoreDuringBuilds?: boolean; } 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; } type JSONValue = string | number | boolean | JSONValue[] | { [k: string]: JSONValue; }; /** * @deprecated Use `TurbopackRuleConfigItem` instead. */ export type TurbopackLoaderItem = string | { loader: string; options: Record; }; export type TurbopackLoaderBuiltinCondition = 'default' | 'browser' | 'foreign' | 'development' | 'production' | 'node' | 'edge-light'; export type TurbopackRuleCondition = { path?: string | RegExp; content?: RegExp; }; export type TurbopackRuleConfigItemOrShortcut = TurbopackLoaderItem[] | TurbopackRuleConfigItem; export type TurbopackRuleConfigItemOptions = { loaders: TurbopackLoaderItem[]; as?: string; }; export type TurbopackRuleConfigItem = TurbopackRuleConfigItemOptions | { [condition in TurbopackLoaderBuiltinCondition]?: TurbopackRuleConfigItem; } | false; 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/next-config-js/turbo#resolve-alias) */ resolveAlias?: Record>; /** * (`next --turbopack` only) A list of extensions to resolve when importing files. * * @see [Resolve Extensions](https://nextjs.org/docs/app/api-reference/next-config-js/turbo#resolve-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/next-config-js/turbo#webpack-loaders) */ rules?: Record; /** * (`next --turbopack` only) A list of conditions to apply when running webpack loaders with Turbopack. * * @see [Turbopack Loaders](https://nextjs.org/docs/app/api-reference/next-config-js/turbo#webpack-loaders) */ conditions?: Record; /** * The module ID strategy to use for Turbopack. * If not set, the default is `'named'` for development and `'deterministic'` * for production. */ moduleIds?: 'named' | 'deterministic'; /** * This is the repo root usually and only files above this * directory can be resolved by turbopack. */ root?: string; } export interface DeprecatedExperimentalTurboOptions extends TurbopackOptions { /** * (`next --turbopack` only) A list of webpack loaders to apply when running with Turbopack. * * @deprecated Use `rules` instead. * @see [Turbopack Loaders](https://nextjs.org/docs/app/api-reference/next-config-js/turbo#webpack-loaders) */ loaders?: Record; /** * A target memory limit for turbo, in bytes. * @deprecated Use `experimental.turbopackMemoryLimit` instead. */ memoryLimit?: number; /** * Enable minification. Defaults to true in build mode and false in dev mode. * @deprecated Use `experimental.turbopackMinify` instead. */ minify?: boolean; /** * Enable tree shaking for the turbopack dev server and build. * @deprecated Use `experimental.turbopackTreeShaking` instead. */ treeShaking?: boolean; /** * Enable source maps. Defaults to true. * @deprecated Use `experimental.turbopackSourceMaps` instead. */ sourceMaps?: boolean; } 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 the react compiler next.js * currently supports. * * This can be changed without breaking changes while supporting * react compiler in the experimental phase. */ export interface ReactCompilerOptions { compilationMode?: 'infer' | 'annotation' | 'all'; panicThreshold?: 'ALL_ERRORS' | 'CRITICAL_ERRORS' | 'NONE'; } 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; } export interface ExperimentalConfig { adapterPath?: string; useSkewCookie?: boolean; cacheHandlers?: { default?: string; remote?: string; static?: string; [handlerName: string]: string | undefined; }; multiZoneDraftMode?: boolean; appNavFailHandling?: boolean; prerenderEarlyExit?: boolean; linkNoTouchStart?: boolean; caseSensitiveRoutes?: boolean; clientSegmentCache?: boolean | 'client-only'; clientParamParsing?: boolean; dynamicOnHover?: boolean; appDocumentPreloading?: boolean; 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; static?: number; }; cacheLife?: { [profile: string]: { stale?: number; revalidate?: number; expire?: number; }; }; clientRouterFilterAllowedRate?: number; externalMiddlewareRewritesResolve?: boolean; extensionAlias?: Record; allowedRevalidateHeaderKeys?: string[]; fetchCacheKeyPrefix?: string; imgOptConcurrency?: number | null; imgOptTimeoutInSeconds?: number; imgOptMaxInputPixels?: number; imgOptSequentialRead?: boolean | null; imgOptSkipMetadata?: boolean | null; optimisticClientCache?: boolean; /** * @deprecated use config.expireTime instead */ expireTime?: number; middlewarePrefetch?: 'strict' | 'flexible'; manualClientBasePath?: boolean; /** * CSS Chunking strategy. Defaults to `true` ("loose" mode), which guesses dependencies * between CSS files to keep ordering of them. * An alternative is 'strict', which will try to keep correct ordering as * much as possible, even when this leads to many requests. */ cssChunking?: boolean | 'strict'; disablePostcssPresetEnv?: boolean; cpus?: number; memoryBasedWorkersCount?: boolean; proxyTimeout?: number; isrFlushToDisk?: boolean; workerThreads?: boolean; optimizeCss?: boolean | Record; nextScriptWorkers?: boolean; scrollRestoration?: boolean; externalDir?: boolean; /** @deprecated built-in amp support will be removed in Next 16 */ amp?: { optimizer?: any; validator?: string; skipValidation?: boolean; }; disableOptimizedLoading?: boolean; gzipSize?: boolean; craCompat?: boolean; esmExternals?: boolean | 'loose'; fullySpecified?: boolean; urlImports?: NonNullable['buildHttp']; swcTraceProfiling?: boolean; forceSwcTransforms?: boolean; swcPlugins?: Array<[string, Record]>; 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; /** * @deprecated Use `config.turbopack` instead. */ turbo?: DeprecatedExperimentalTurboOptions; /** * A target memory limit for turbo, in bytes. */ turbopackMemoryLimit?: number; /** * Enable minification. Defaults to true in build mode and false in dev mode. */ turbopackMinify?: boolean; /** * Enable scope hoisting. Defaults to true in build mode. Always disabled in development mode. */ turbopackScopeHoisting?: boolean; /** * Enable persistent caching for the turbopack dev server and build. */ turbopackPersistentCaching?: boolean; /** * Enable source maps. Defaults to true. */ turbopackSourceMaps?: boolean; /** * Enable tree shaking for the turbopack dev server and build. */ turbopackTreeShaking?: boolean; /** * Enable removing unused exports for turbopack dev server and build. */ turbopackRemoveUnusedExports?: 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[]; /** * Enables experimental Partial Prerendering feature of Next.js. * Using this feature will enable the `react@experimental` for the `app` directory. */ ppr?: ExperimentalPPRConfig; /** * Enables experimental taint APIs in React. * Using this feature will enable the `react@experimental` for the `app` directory. */ taint?: boolean; /** * Enables the Back/Forward Cache for the router. */ routerBFCache?: 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[]; }; /** * enables the minification of server code. */ serverMinification?: boolean; /** * Enables source maps while generating static pages. * Helps with errors during the prerender phase in `next build`. */ enablePrerenderSourceMaps?: boolean; /** * Enables source maps generation for the server production bundle. */ serverSourceMaps?: boolean; useWasmBinary?: boolean; /** * Use lightningcss instead of postcss-loader */ useLightningcss?: boolean; /** * Enables view transitions by using the {@link https://github.com/facebook/react/pull/31975 unstable_ViewTransition} Component. */ viewTransition?: boolean; /** * 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[]; /** * Enable experimental React compiler optimization. * Configuration accepts partial config object to the compiler, if provided * compiler will be enabled. */ reactCompiler?: boolean | ReactCompilerOptions; /** * 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; /** * When enabled, will cause IO in App Router to be excluded from prerenders, * unless explicitly cached. This also enables the experimental Partial * Prerendering feature of Next.js, and it enables `react@experimental` being * used for the `app` directory. */ cacheComponents?: boolean; /** * @deprecated Use `experimental.cacheComponents` instead. */ dynamicIO?: boolean; /** * Render