UNPKG

next

Version:

The React Framework

327 lines (326 loc) • 11.2 kB
import { RenderingMode } from '../rendering-mode'; import type { RouteHas } from '../../lib/load-custom-routes'; import type { Revalidate } from '../../server/lib/cache-control'; import type { NextConfigComplete } from '../../server/config-shared'; import { AdapterOutputType, type PHASE_TYPE } from '../../shared/lib/constants'; import type { MiddlewareManifest } from '../webpack/plugins/middleware-plugin'; import type { RoutesManifest, PrerenderManifest, FunctionsConfigManifest, DynamicPrerenderManifestRoute } from '..'; interface SharedRouteFields { /** * id is the unique identifier of the output */ id: string; /** * filePath is the location on disk of the built entrypoint asset */ filePath: string; /** * pathname is the URL pathname the asset should be served at */ pathname: string; /** * sourcePage is the original source in the app or pages folder */ sourcePage: string; /** * runtime is which runtime the entrypoint is built for */ runtime: 'nodejs' | 'edge'; /** * 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. * The key is the relative path from the repo root and the value * is the absolute path to the file */ assets: Record<string, string>; /** * wasmAssets are bundled wasm files with mapping of name * to filePath on disk */ wasmAssets?: Record<string, string>; /** * 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[]; /** * env is the environment variables to expose, this is only * populated for edge runtime currently */ env?: Record<string, string>; }; } export interface AdapterOutput { /** * `PAGES` represents all the React pages that are under `pages/`. */ PAGES: SharedRouteFields & { type: AdapterOutputType.PAGES; }; /** * `PAGES_API` represents all the API routes under `pages/api/`. */ PAGES_API: SharedRouteFields & { type: AdapterOutputType.PAGES_API; }; /** * `APP_PAGE` represents all the React pages that are under `app/` with the * filename of `page.{j,t}s{,x}`. */ APP_PAGE: SharedRouteFields & { type: AdapterOutputType.APP_PAGE; }; /** * `APP_ROUTE` represents all the API routes and metadata routes that are under `app/` with the * filename of `route.{j,t}s{,x}`. */ APP_ROUTE: SharedRouteFields & { type: AdapterOutputType.APP_ROUTE; }; /** * `PRERENDER` represents an ISR enabled route that might * have a seeded cache entry or fallback generated during build */ PRERENDER: { id: string; pathname: string; type: AdapterOutputType.PRERENDER; /** * For prerenders the parent output is the originating * page that the prerender is created from */ parentOutputId: string; /** * groupId is the identifier for a group of prerenders that should be * revalidated together */ groupId: number; pprChain?: { headers: Record<string, string>; }; /** * parentFallbackMode signals whether additional routes can be generated * e.g. fallback: false or 'blocking' in getStaticPaths in pages router */ parentFallbackMode?: DynamicPrerenderManifestRoute['fallback']; /** * 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<string, string | string[]>; /** * 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; /** * postponedState is the PPR state when it postponed and is used for resuming */ postponedState?: string; }; /** * config related to the route */ config: { /** * 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; /** * bypassToken is the generated token that signals a prerender cache * should be bypassed */ bypassToken?: string; }; }; /** * `STATIC_FILE` represents a static file (ie /_next/static) or a purely * static HTML asset e.g. an automatically statically optimized page * that does not use ISR */ STATIC_FILE: { id: string; filePath: string; pathname: string; type: AdapterOutputType.STATIC_FILE; }; /** * `MIDDLEWARE` represents the middleware output if present */ MIDDLEWARE: SharedRouteFields & { type: AdapterOutputType.MIDDLEWARE; /** * config related to the route */ config: SharedRouteFields['config'] & { /** * matchers are the configured matchers for middleware */ matchers?: Array<{ source: string; sourceRegex: string; has: RouteHas[] | undefined; missing: RouteHas[] | undefined; }>; }; }; } export interface AdapterOutputs { pages: Array<AdapterOutput['PAGES']>; middleware?: AdapterOutput['MIDDLEWARE']; appPages: Array<AdapterOutput['APP_PAGE']>; pagesApi: Array<AdapterOutput['PAGES_API']>; appRoutes: Array<AdapterOutput['APP_ROUTE']>; prerenders: Array<AdapterOutput['PRERENDER']>; staticFiles: Array<AdapterOutput['STATIC_FILE']>; } type RewriteItem = { source: string; sourceRegex: string; destination: string; has: RouteHas[] | undefined; missing: RouteHas[] | undefined; }; type DynamicRouteItem = { source: string; sourceRegex: string; destination: string; has: RouteHas[] | undefined; missing: RouteHas[] | undefined; }; export interface NextAdapter { name: string; /** * modifyConfig is called for any CLI command that loads the next.config * to only apply for specific commands the "phase" should be used * @param config * @param ctx * @returns */ modifyConfig?: (config: NextConfigComplete, ctx: { phase: PHASE_TYPE; }) => Promise<NextConfigComplete> | NextConfigComplete; onBuildComplete?: (ctx: { routes: { headers: Array<{ source: string; sourceRegex: string; headers: Record<string, string>; has: RouteHas[] | undefined; missing: RouteHas[] | undefined; priority?: boolean; }>; redirects: Array<{ source: string; sourceRegex: string; destination: string; statusCode: number; has: RouteHas[] | undefined; missing: RouteHas[] | undefined; priority?: boolean; }>; rewrites: { beforeFiles: RewriteItem[]; afterFiles: RewriteItem[]; fallback: RewriteItem[]; }; dynamicRoutes: Array<DynamicRouteItem>; }; outputs: AdapterOutputs; /** * projectDir is the absolute directory the Next.js application is in */ projectDir: string; /** * repoRoot is the absolute path of the detected root of the repo */ repoRoot: string; /** * distDir is the absolute path to the dist directory */ distDir: string; /** * config is the loaded next.config (has modifyConfig applied) */ config: NextConfigComplete; /** * nextVersion is the current version of Next.js being used */ nextVersion: string; /** * buildId is the current unique ID for the build, this can be * influenced by NextConfig.generateBuildId */ buildId: string; }) => Promise<void> | void; } export declare function handleBuildComplete({ dir, config, buildId, configOutDir, distDir, pageKeys, tracingRoot, adapterPath, appPageKeys, staticPages, nextVersion, hasStatic404, hasStatic500, routesManifest, serverPropsPages, hasNodeMiddleware, prerenderManifest, middlewareManifest, requiredServerFiles, hasInstrumentationHook, functionsConfigManifest, }: { dir: string; distDir: string; buildId: string; configOutDir: string; adapterPath: string; tracingRoot: string; nextVersion: string; hasStatic404: boolean; hasStatic500: boolean; staticPages: Set<string>; hasNodeMiddleware: boolean; config: NextConfigComplete; pageKeys: readonly string[]; serverPropsPages: Set<string>; requiredServerFiles: string[]; routesManifest: RoutesManifest; hasInstrumentationHook: boolean; prerenderManifest: PrerenderManifest; middlewareManifest: MiddlewareManifest; appPageKeys?: readonly string[] | undefined; functionsConfigManifest: FunctionsConfigManifest; }): Promise<void>; export {};