300 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
import type { __ApiPreviewProps } from './api-utils';
 | 
						|
import type { LoadComponentsReturnType } from './load-components';
 | 
						|
import type { MiddlewareRouteMatch } from '../shared/lib/router/utils/middleware-route-matcher';
 | 
						|
import type { Params } from './request/params';
 | 
						|
import type { NextConfig, NextConfigComplete } from './config-shared';
 | 
						|
import type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta';
 | 
						|
import type { ParsedUrlQuery } from 'querystring';
 | 
						|
import type { RenderOptsPartial as PagesRenderOptsPartial } from './render';
 | 
						|
import type { RenderOptsPartial as AppRenderOptsPartial, ServerOnInstrumentationRequestError } from './app-render/types';
 | 
						|
import type { ServerComponentsHmrCache, ResponseCacheBase } from './response-cache';
 | 
						|
import type { UrlWithParsedQuery } from 'url';
 | 
						|
import type { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin';
 | 
						|
import type { BaseNextRequest, BaseNextResponse } from './base-http';
 | 
						|
import type { ManifestRewriteRoute, ManifestRoute, PrerenderManifest } from '../build';
 | 
						|
import type { ClientReferenceManifest } from '../build/webpack/plugins/flight-manifest-plugin';
 | 
						|
import type { NextFontManifest } from '../build/webpack/plugins/next-font-manifest-plugin';
 | 
						|
import type { PagesAPIRouteMatch } from './route-matches/pages-api-route-match';
 | 
						|
import type { Server as HTTPServer, IncomingMessage, ServerResponse as HTTPServerResponse } from 'http';
 | 
						|
import type { MiddlewareMatcher } from '../build/analysis/get-page-static-info';
 | 
						|
import type { InstrumentationModule } from './instrumentation/types';
 | 
						|
import RenderResult from './render-result';
 | 
						|
import type { RouteMatcherManager } from './route-matcher-managers/route-matcher-manager';
 | 
						|
import { LocaleRouteNormalizer } from './normalizers/locale-route-normalizer';
 | 
						|
import { I18NProvider } from './lib/i18n-provider';
 | 
						|
import { RSCPathnameNormalizer } from './normalizers/request/rsc';
 | 
						|
import { PrefetchRSCPathnameNormalizer } from './normalizers/request/prefetch-rsc';
 | 
						|
import { NextDataPathnameNormalizer } from './normalizers/request/next-data';
 | 
						|
import type { DeepReadonly } from '../shared/lib/deep-readonly';
 | 
						|
import { type WaitUntil } from './after/builtin-request-context';
 | 
						|
import { type FallbackMode } from '../lib/fallback';
 | 
						|
import { SegmentPrefixRSCPathnameNormalizer } from './normalizers/request/segment-prefix-rsc';
 | 
						|
import type { CacheControl } from './lib/cache-control';
 | 
						|
import type { PrerenderedRoute } from '../build/static-paths/types';
 | 
						|
export type FindComponentsResult = {
 | 
						|
    components: LoadComponentsReturnType;
 | 
						|
    query: NextParsedUrlQuery;
 | 
						|
};
 | 
						|
export interface MiddlewareRoutingItem {
 | 
						|
    page: string;
 | 
						|
    match: MiddlewareRouteMatch;
 | 
						|
    matchers?: MiddlewareMatcher[];
 | 
						|
}
 | 
						|
export type RouteHandler<ServerRequest extends BaseNextRequest = BaseNextRequest, ServerResponse extends BaseNextResponse = BaseNextResponse> = (req: ServerRequest, res: ServerResponse, parsedUrl: NextUrlWithParsedQuery) => PromiseLike<boolean> | boolean;
 | 
						|
/**
 | 
						|
 * The normalized route manifest is the same as the route manifest, but with
 | 
						|
 * the rewrites normalized to the object shape that the router expects.
 | 
						|
 */
 | 
						|
export type NormalizedRouteManifest = {
 | 
						|
    readonly dynamicRoutes: ReadonlyArray<ManifestRoute>;
 | 
						|
    readonly rewrites: {
 | 
						|
        readonly beforeFiles: ReadonlyArray<ManifestRewriteRoute>;
 | 
						|
        readonly afterFiles: ReadonlyArray<ManifestRewriteRoute>;
 | 
						|
        readonly fallback: ReadonlyArray<ManifestRewriteRoute>;
 | 
						|
    };
 | 
						|
};
 | 
						|
export interface Options {
 | 
						|
    /**
 | 
						|
     * Object containing the configuration next.config.js
 | 
						|
     */
 | 
						|
    conf: NextConfig;
 | 
						|
    /**
 | 
						|
     * Set to false when the server was created by Next.js
 | 
						|
     */
 | 
						|
    customServer?: boolean;
 | 
						|
    /**
 | 
						|
     * Tells if Next.js is running in dev mode
 | 
						|
     */
 | 
						|
    dev?: boolean;
 | 
						|
    /**
 | 
						|
     * Enables the experimental testing mode.
 | 
						|
     */
 | 
						|
    experimentalTestProxy?: boolean;
 | 
						|
    /**
 | 
						|
     * Whether or not the dev server is running in experimental HTTPS mode
 | 
						|
     */
 | 
						|
    experimentalHttpsServer?: boolean;
 | 
						|
    /**
 | 
						|
     * Where the Next project is located
 | 
						|
     */
 | 
						|
    dir?: string;
 | 
						|
    /**
 | 
						|
     * Tells if Next.js is at the platform-level
 | 
						|
     */
 | 
						|
    minimalMode?: boolean;
 | 
						|
    /**
 | 
						|
     * Hide error messages containing server information
 | 
						|
     */
 | 
						|
    quiet?: boolean;
 | 
						|
    /**
 | 
						|
     * The hostname the server is running behind
 | 
						|
     */
 | 
						|
    hostname?: string;
 | 
						|
    /**
 | 
						|
     * The port the server is running behind
 | 
						|
     */
 | 
						|
    port?: number;
 | 
						|
    /**
 | 
						|
     * The HTTP Server that Next.js is running behind
 | 
						|
     */
 | 
						|
    httpServer?: HTTPServer;
 | 
						|
}
 | 
						|
export type RenderOpts = PagesRenderOptsPartial & AppRenderOptsPartial;
 | 
						|
export type LoadedRenderOpts = RenderOpts & LoadComponentsReturnType & RequestLifecycleOpts;
 | 
						|
export type RequestLifecycleOpts = {
 | 
						|
    waitUntil: ((promise: Promise<any>) => void) | undefined;
 | 
						|
    onClose: (callback: () => void) => void;
 | 
						|
    onAfterTaskError: ((error: unknown) => void) | undefined;
 | 
						|
};
 | 
						|
type BaseRenderOpts = RenderOpts & {
 | 
						|
    poweredByHeader: boolean;
 | 
						|
    generateEtags: boolean;
 | 
						|
    previewProps: __ApiPreviewProps;
 | 
						|
};
 | 
						|
/**
 | 
						|
 * The public interface for rendering with the server programmatically. This
 | 
						|
 * would typically only allow the base request or response to extend it, but
 | 
						|
 * because this can be programmatically accessed, we assume that it could also
 | 
						|
 * be the base Node.js request and response types.
 | 
						|
 */
 | 
						|
export interface BaseRequestHandler<ServerRequest extends BaseNextRequest | IncomingMessage = BaseNextRequest, ServerResponse extends BaseNextResponse | HTTPServerResponse = BaseNextResponse> {
 | 
						|
    (req: ServerRequest, res: ServerResponse, parsedUrl?: NextUrlWithParsedQuery | undefined): Promise<void> | void;
 | 
						|
}
 | 
						|
export type RequestContext<ServerRequest extends BaseNextRequest = BaseNextRequest, ServerResponse extends BaseNextResponse = BaseNextResponse> = {
 | 
						|
    req: ServerRequest;
 | 
						|
    res: ServerResponse;
 | 
						|
    pathname: string;
 | 
						|
    query: NextParsedUrlQuery;
 | 
						|
    renderOpts: RenderOpts;
 | 
						|
};
 | 
						|
export declare class WrappedBuildError extends Error {
 | 
						|
    innerError: Error;
 | 
						|
    constructor(innerError: Error);
 | 
						|
}
 | 
						|
type ResponsePayload = {
 | 
						|
    body: RenderResult;
 | 
						|
    cacheControl?: CacheControl;
 | 
						|
};
 | 
						|
export type NextEnabledDirectories = {
 | 
						|
    readonly pages: boolean;
 | 
						|
    readonly app: boolean;
 | 
						|
};
 | 
						|
export default abstract class Server<ServerOptions extends Options = Options, ServerRequest extends BaseNextRequest = BaseNextRequest, ServerResponse extends BaseNextResponse = BaseNextResponse> {
 | 
						|
    readonly hostname?: string;
 | 
						|
    readonly fetchHostname?: string;
 | 
						|
    readonly port?: number;
 | 
						|
    protected readonly dir: string;
 | 
						|
    protected readonly quiet: boolean;
 | 
						|
    protected readonly nextConfig: NextConfigComplete;
 | 
						|
    protected readonly distDir: string;
 | 
						|
    protected readonly publicDir: string;
 | 
						|
    protected readonly hasStaticDir: boolean;
 | 
						|
    protected readonly pagesManifest?: PagesManifest;
 | 
						|
    protected readonly appPathsManifest?: PagesManifest;
 | 
						|
    protected readonly buildId: string;
 | 
						|
    protected readonly minimalMode: boolean;
 | 
						|
    protected readonly renderOpts: BaseRenderOpts;
 | 
						|
    protected readonly serverOptions: Readonly<ServerOptions>;
 | 
						|
    protected readonly appPathRoutes?: Record<string, string[]>;
 | 
						|
    protected readonly clientReferenceManifest?: DeepReadonly<ClientReferenceManifest>;
 | 
						|
    protected interceptionRoutePatterns: RegExp[];
 | 
						|
    protected nextFontManifest?: DeepReadonly<NextFontManifest>;
 | 
						|
    protected instrumentation: InstrumentationModule | undefined;
 | 
						|
    private readonly responseCache;
 | 
						|
    protected abstract getPublicDir(): string;
 | 
						|
    protected abstract getHasStaticDir(): boolean;
 | 
						|
    protected abstract getPagesManifest(): PagesManifest | undefined;
 | 
						|
    protected abstract getAppPathsManifest(): PagesManifest | undefined;
 | 
						|
    protected abstract getBuildId(): string;
 | 
						|
    protected abstract getinterceptionRoutePatterns(): RegExp[];
 | 
						|
    protected readonly enabledDirectories: NextEnabledDirectories;
 | 
						|
    protected abstract getEnabledDirectories(dev: boolean): NextEnabledDirectories;
 | 
						|
    protected readonly experimentalTestProxy?: boolean;
 | 
						|
    protected abstract findPageComponents(params: {
 | 
						|
        locale: string | undefined;
 | 
						|
        page: string;
 | 
						|
        query: NextParsedUrlQuery;
 | 
						|
        params: Params;
 | 
						|
        isAppPath: boolean;
 | 
						|
        sriEnabled?: boolean;
 | 
						|
        appPaths?: ReadonlyArray<string> | null;
 | 
						|
        shouldEnsure?: boolean;
 | 
						|
        url?: string;
 | 
						|
    }): Promise<FindComponentsResult | null>;
 | 
						|
    protected abstract getPrerenderManifest(): DeepReadonly<PrerenderManifest>;
 | 
						|
    protected abstract getNextFontManifest(): DeepReadonly<NextFontManifest> | undefined;
 | 
						|
    protected abstract attachRequestMeta(req: ServerRequest, parsedUrl: NextUrlWithParsedQuery): void;
 | 
						|
    protected abstract hasPage(pathname: string): Promise<boolean>;
 | 
						|
    protected abstract sendRenderResult(req: ServerRequest, res: ServerResponse, options: {
 | 
						|
        result: RenderResult;
 | 
						|
        generateEtags: boolean;
 | 
						|
        poweredByHeader: boolean;
 | 
						|
        cacheControl: CacheControl | undefined;
 | 
						|
    }): Promise<void>;
 | 
						|
    protected abstract runApi(req: ServerRequest, res: ServerResponse, query: ParsedUrlQuery, match: PagesAPIRouteMatch): Promise<boolean>;
 | 
						|
    protected abstract renderHTML(req: ServerRequest, res: ServerResponse, pathname: string, query: NextParsedUrlQuery, renderOpts: LoadedRenderOpts): Promise<RenderResult>;
 | 
						|
    protected abstract getIncrementalCache(options: {
 | 
						|
        requestHeaders: Record<string, undefined | string | string[]>;
 | 
						|
    }): Promise<import('./lib/incremental-cache').IncrementalCache>;
 | 
						|
    protected abstract getResponseCache(options: {
 | 
						|
        dev: boolean;
 | 
						|
    }): ResponseCacheBase;
 | 
						|
    protected getServerComponentsHmrCache(): ServerComponentsHmrCache | undefined;
 | 
						|
    protected abstract loadEnvConfig(params: {
 | 
						|
        dev: boolean;
 | 
						|
        forceReload?: boolean;
 | 
						|
    }): void;
 | 
						|
    readonly matchers: RouteMatcherManager;
 | 
						|
    protected readonly i18nProvider?: I18NProvider;
 | 
						|
    protected readonly localeNormalizer?: LocaleRouteNormalizer;
 | 
						|
    protected readonly normalizers: {
 | 
						|
        readonly rsc: RSCPathnameNormalizer | undefined;
 | 
						|
        readonly prefetchRSC: PrefetchRSCPathnameNormalizer | undefined;
 | 
						|
        readonly segmentPrefetchRSC: SegmentPrefixRSCPathnameNormalizer | undefined;
 | 
						|
        readonly data: NextDataPathnameNormalizer | undefined;
 | 
						|
    };
 | 
						|
    private readonly isAppPPREnabled;
 | 
						|
    private readonly isAppSegmentPrefetchEnabled;
 | 
						|
    /**
 | 
						|
     * This is used to persist cache scopes across
 | 
						|
     * prefetch -> full route requests for cache components
 | 
						|
     * it's only fully used in dev
 | 
						|
     */
 | 
						|
    constructor(options: ServerOptions);
 | 
						|
    private handleRSCRequest;
 | 
						|
    private handleNextDataRequest;
 | 
						|
    protected handleNextImageRequest: RouteHandler<ServerRequest, ServerResponse>;
 | 
						|
    protected handleCatchallRenderRequest: RouteHandler<ServerRequest, ServerResponse>;
 | 
						|
    protected handleCatchallMiddlewareRequest: RouteHandler<ServerRequest, ServerResponse>;
 | 
						|
    protected getRouteMatchers(): RouteMatcherManager;
 | 
						|
    protected instrumentationOnRequestError(...args: Parameters<ServerOnInstrumentationRequestError>): Promise<void>;
 | 
						|
    logError(err: Error): void;
 | 
						|
    handleRequest(req: ServerRequest, res: ServerResponse, parsedUrl?: NextUrlWithParsedQuery): Promise<void>;
 | 
						|
    private handleRequestImpl;
 | 
						|
    /**
 | 
						|
     * Normalizes a pathname without attaching any metadata from any matched
 | 
						|
     * normalizer.
 | 
						|
     *
 | 
						|
     * @param pathname the pathname to normalize
 | 
						|
     * @returns the normalized pathname
 | 
						|
     */
 | 
						|
    private normalize;
 | 
						|
    private normalizeAndAttachMetadata;
 | 
						|
    getRequestHandler(): BaseRequestHandler<ServerRequest, ServerResponse>;
 | 
						|
    protected abstract handleUpgrade(req: ServerRequest, socket: any, head?: any): Promise<void>;
 | 
						|
    setAssetPrefix(prefix?: string): void;
 | 
						|
    protected prepared: boolean;
 | 
						|
    protected preparedPromise: Promise<void> | null;
 | 
						|
    /**
 | 
						|
     * Runs async initialization of server.
 | 
						|
     * It is idempotent, won't fire underlying initialization more than once.
 | 
						|
     */
 | 
						|
    prepare(): Promise<void>;
 | 
						|
    protected prepareImpl(): Promise<void>;
 | 
						|
    protected loadInstrumentationModule(): Promise<any>;
 | 
						|
    close(): Promise<void>;
 | 
						|
    protected getAppPathRoutes(): Record<string, string[]>;
 | 
						|
    protected run(req: ServerRequest, res: ServerResponse, parsedUrl: UrlWithParsedQuery): Promise<void>;
 | 
						|
    private runImpl;
 | 
						|
    private pipe;
 | 
						|
    private pipeImpl;
 | 
						|
    private getStaticHTML;
 | 
						|
    render(req: ServerRequest, res: ServerResponse, pathname: string, query?: NextParsedUrlQuery, parsedUrl?: NextUrlWithParsedQuery, internalRender?: boolean): Promise<void>;
 | 
						|
    protected getWaitUntil(): WaitUntil | undefined;
 | 
						|
    protected getInternalWaitUntil(): WaitUntil | undefined;
 | 
						|
    private renderImpl;
 | 
						|
    protected getStaticPaths({ pathname, }: {
 | 
						|
        pathname: string;
 | 
						|
        urlPathname: string;
 | 
						|
        requestHeaders: import('./lib/incremental-cache').IncrementalCache['requestHeaders'];
 | 
						|
        page: string;
 | 
						|
        isAppPath: boolean;
 | 
						|
    }): Promise<{
 | 
						|
        staticPaths?: string[];
 | 
						|
        prerenderedRoutes?: PrerenderedRoute[];
 | 
						|
        fallbackMode?: FallbackMode;
 | 
						|
    }>;
 | 
						|
    private renderToResponseWithComponents;
 | 
						|
    protected pathCouldBeIntercepted(resolvedPathname: string): boolean;
 | 
						|
    protected setVaryHeader(req: ServerRequest, res: ServerResponse, isAppPath: boolean, resolvedPathname: string): void;
 | 
						|
    private renderToResponseWithComponentsImpl;
 | 
						|
    private stripNextDataPath;
 | 
						|
    protected getOriginalAppPaths(route: string): string[] | null;
 | 
						|
    protected renderPageComponent(ctx: RequestContext<ServerRequest, ServerResponse>, bubbleNoFallback: boolean): Promise<false | ResponsePayload | null>;
 | 
						|
    private renderToResponse;
 | 
						|
    protected abstract getMiddleware(): Promise<MiddlewareRoutingItem | undefined>;
 | 
						|
    protected abstract getFallbackErrorComponents(url?: string): Promise<LoadComponentsReturnType | null>;
 | 
						|
    protected abstract getRoutesManifest(): NormalizedRouteManifest | undefined;
 | 
						|
    private renderToResponseImpl;
 | 
						|
    renderToHTML(req: ServerRequest, res: ServerResponse, pathname: string, query?: ParsedUrlQuery): Promise<string | null>;
 | 
						|
    private renderToHTMLImpl;
 | 
						|
    renderError(err: Error | null, req: ServerRequest, res: ServerResponse, pathname: string, query?: NextParsedUrlQuery, setHeaders?: boolean): Promise<void>;
 | 
						|
    private renderErrorImpl;
 | 
						|
    private customErrorNo404Warn;
 | 
						|
    private renderErrorToResponse;
 | 
						|
    protected renderErrorToResponseImpl(ctx: RequestContext<ServerRequest, ServerResponse>, err: Error | null): Promise<ResponsePayload | null>;
 | 
						|
    renderErrorToHTML(err: Error | null, req: ServerRequest, res: ServerResponse, pathname: string, query?: ParsedUrlQuery): Promise<string | null>;
 | 
						|
    render404(req: ServerRequest, res: ServerResponse, parsedUrl?: Pick<NextUrlWithParsedQuery, 'pathname' | 'query'>, setHeaders?: boolean): Promise<void>;
 | 
						|
}
 | 
						|
export {};
 |