///
import { __ApiPreviewProps } from './api-utils';
import type { CustomRoutes } from '../lib/load-custom-routes';
import type { DomainLocale } from './config';
import type { DynamicRoutes, PageChecker, Route } from './router';
import type { FontManifest } from './font-utils';
import type { LoadComponentsReturnType } from './load-components';
import type { RouteMatch } from '../shared/lib/router/utils/route-matcher';
import type { Params } from '../shared/lib/router/utils/route-matcher';
import type { NextConfig, NextConfigComplete, ServerRuntime } from './config-shared';
import type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta';
import type { ParsedUrlQuery } from 'querystring';
import type { RenderOpts, RenderOptsPartial } from './render';
import type { UrlWithParsedQuery } from 'url';
import { CacheFs } from '../shared/lib/utils';
import type { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin';
import type { BaseNextRequest, BaseNextResponse } from './base-http';
import type { PayloadOptions } from './send-payload';
import Router from './router';
import RenderResult from './render-result';
import { PrerenderManifest } from '../build';
import { ImageConfigComplete } from '../shared/lib/image-config';
export declare type FindComponentsResult = {
components: LoadComponentsReturnType;
query: NextParsedUrlQuery;
};
export interface RoutingItem {
page: string;
match: RouteMatch;
re?: RegExp;
}
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;
/**
* Where the Next project is located
*/
dir?: string;
/**
* Tells if Next.js is running in a Serverless platform
*/
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;
}
export interface BaseRequestHandler {
(req: BaseNextRequest, res: BaseNextResponse, parsedUrl?: NextUrlWithParsedQuery | undefined): Promise;
}
declare type RequestContext = {
req: BaseNextRequest;
res: BaseNextResponse;
pathname: string;
query: NextParsedUrlQuery;
renderOpts: RenderOptsPartial;
};
export default abstract class Server {
protected dir: string;
protected quiet: boolean;
protected nextConfig: NextConfigComplete;
protected distDir: string;
protected publicDir: string;
protected hasStaticDir: boolean;
protected pagesManifest?: PagesManifest;
protected appPathsManifest?: PagesManifest;
protected buildId: string;
protected minimalMode: boolean;
protected renderOpts: {
poweredByHeader: boolean;
buildId: string;
generateEtags: boolean;
runtimeConfig?: {
[key: string]: any;
};
assetPrefix?: string;
canonicalBase: string;
dev?: boolean;
previewProps: __ApiPreviewProps;
customServer?: boolean;
ampOptimizerConfig?: {
[key: string]: any;
};
basePath: string;
optimizeFonts: boolean;
images: ImageConfigComplete;
fontManifest?: FontManifest;
disableOptimizedLoading?: boolean;
optimizeCss: any;
nextScriptWorkers: any;
locale?: string;
locales?: string[];
defaultLocale?: string;
domainLocales?: DomainLocale[];
distDir: string;
runtime?: ServerRuntime;
serverComponents?: boolean;
crossOrigin?: string;
supportsDynamicHTML?: boolean;
serverComponentManifest?: any;
renderServerComponentData?: boolean;
serverComponentProps?: any;
largePageDataBytes?: number;
};
protected serverOptions: ServerOptions;
private incrementalCache;
private responseCache;
protected router: Router;
protected dynamicRoutes?: DynamicRoutes;
protected appPathRoutes?: Record;
protected customRoutes: CustomRoutes;
protected serverComponentManifest?: any;
readonly hostname?: string;
readonly port?: number;
protected abstract getPublicDir(): string;
protected abstract getHasStaticDir(): boolean;
protected abstract getPagesManifest(): PagesManifest | undefined;
protected abstract getAppPathsManifest(): PagesManifest | undefined;
protected abstract getBuildId(): string;
protected abstract generatePublicRoutes(): Route[];
protected abstract generateImageRoutes(): Route[];
protected abstract generateStaticRoutes(): Route[];
protected abstract generateFsStaticRoutes(): Route[];
protected abstract generateCatchAllMiddlewareRoute(): Route[];
protected abstract generateRewrites({ restrictedRedirectPaths, }: {
restrictedRedirectPaths: string[];
}): {
beforeFiles: Route[];
afterFiles: Route[];
fallback: Route[];
};
protected abstract getFilesystemPaths(): Set;
protected abstract findPageComponents(pathname: string, query?: NextParsedUrlQuery, params?: Params, isAppDir?: boolean): Promise;
protected abstract getPagePath(pathname: string, locales?: string[]): string;
protected abstract getFontManifest(): FontManifest | undefined;
protected abstract getRoutesManifest(): CustomRoutes;
protected abstract getPrerenderManifest(): PrerenderManifest;
protected abstract getServerComponentManifest(): any;
protected abstract attachRequestMeta(req: BaseNextRequest, parsedUrl: NextUrlWithParsedQuery): void;
protected abstract sendRenderResult(req: BaseNextRequest, res: BaseNextResponse, options: {
result: RenderResult;
type: 'html' | 'json';
generateEtags: boolean;
poweredByHeader: boolean;
options?: PayloadOptions;
}): Promise;
protected abstract runApi(req: BaseNextRequest, res: BaseNextResponse, query: ParsedUrlQuery, params: Params | undefined, page: string, builtPagePath: string): Promise;
protected abstract renderHTML(req: BaseNextRequest, res: BaseNextResponse, pathname: string, query: NextParsedUrlQuery, renderOpts: RenderOpts): Promise;
protected abstract handleCompression(req: BaseNextRequest, res: BaseNextResponse): void;
protected abstract loadEnvConfig(params: {
dev: boolean;
}): void;
constructor(options: ServerOptions);
logError(err: Error): void;
private handleRequest;
getRequestHandler(): BaseRequestHandler;
setAssetPrefix(prefix?: string): void;
prepare(): Promise;
protected close(): Promise;
protected getCustomRoutes(): CustomRoutes;
protected getFallback(page: string): Promise;
protected getPreviewProps(): __ApiPreviewProps;
protected generateRoutes(): {
headers: Route[];
rewrites: {
beforeFiles: Route[];
afterFiles: Route[];
fallback: Route[];
};
fsRoutes: Route[];
redirects: Route[];
catchAllRoute: Route;
catchAllMiddleware: Route[];
pageChecker: PageChecker;
useFileSystemPublicRoutes: boolean;
dynamicRoutes: DynamicRoutes | undefined;
nextConfig: NextConfig;
};
protected hasPage(pathname: string): Promise;
protected _beforeCatchAllRender(_req: BaseNextRequest, _res: BaseNextResponse, _params: Params, _parsedUrl: UrlWithParsedQuery): Promise;
protected ensureApiPage(_pathname: string): Promise;
/**
* Resolves `API` request, in development builds on demand
* @param req http request
* @param res http response
* @param pathname path of request
*/
private handleApiRequest;
protected getDynamicRoutes(): Array;
protected getAppPathRoutes(): Record;
protected run(req: BaseNextRequest, res: BaseNextResponse, parsedUrl: UrlWithParsedQuery): Promise;
private pipe;
private getStaticHTML;
render(req: BaseNextRequest, res: BaseNextResponse, pathname: string, query?: NextParsedUrlQuery, parsedUrl?: NextUrlWithParsedQuery, internalRender?: boolean): Promise;
protected getStaticPaths(pathname: string): Promise<{
staticPaths: string[] | undefined;
fallbackMode: 'static' | 'blocking' | false;
}>;
private renderToResponseWithComponents;
private stripNextDataPath;
protected renderPageComponent(ctx: RequestContext, bubbleNoFallback: boolean): Promise;
private renderToResponse;
renderToHTML(req: BaseNextRequest, res: BaseNextResponse, pathname: string, query?: ParsedUrlQuery): Promise;
renderError(err: Error | null, req: BaseNextRequest, res: BaseNextResponse, pathname: string, query?: NextParsedUrlQuery, setHeaders?: boolean): Promise;
private customErrorNo404Warn;
private renderErrorToResponse;
renderErrorToHTML(err: Error | null, req: BaseNextRequest, res: BaseNextResponse, pathname: string, query?: ParsedUrlQuery): Promise;
protected getCacheFilesystem(): CacheFs;
protected getFallbackErrorComponents(): Promise;
render404(req: BaseNextRequest, res: BaseNextResponse, parsedUrl?: NextUrlWithParsedQuery, setHeaders?: boolean): Promise;
protected get _isLikeServerless(): boolean;
protected get serverDistDir(): string;
}
export declare function prepareServerlessUrl(req: BaseNextRequest, query: ParsedUrlQuery): void;
export { stringifyQuery } from './server-route-utils';
export declare class WrappedBuildError extends Error {
innerError: Error;
constructor(innerError: Error);
}
declare type ResponsePayload = {
type: 'html' | 'json';
body: RenderResult;
revalidateOptions?: any;
};