diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts index 09b4cc2d59253..e78d81044d435 100644 --- a/packages/next/src/server/base-server.ts +++ b/packages/next/src/server/base-server.ts @@ -138,6 +138,7 @@ import { } from './request-adapter/x-invoke-path-request-adapter' import { BaseRequestAdapter } from './request-adapter/base-request-adapter' import { BubbledError, isBubbledError } from './lib/trace/bubble-error' +import { StandaloneRequestAdapter } from './request-adapter/standalone-request-adapter' export type FindComponentsResult = { components: LoadComponentsReturnType @@ -550,7 +551,27 @@ export default abstract class Server< this.responseCache = this.getResponseCache({ dev }) // Setup the request adapter. - if (this.minimalMode && process.env.NEXT_RUNTIME !== 'edge') { + if ( + this.minimalMode && + process.env.NEXT_RUNTIME !== 'edge' && + this.nextConfig.output === 'standalone' + ) { + this.requestAdapter = new StandaloneRequestAdapter( + new XMatchedPathRequestAdapter( + this.buildId, + this.enabledDirectories, + this.i18nProvider, + this.matchers, + this.nextConfig, + this.getRoutesManifest.bind(this) + ), + new XInvokePathRequestAdapter( + this.enabledDirectories, + this.i18nProvider, + this.nextConfig + ) + ) + } else if (this.minimalMode && process.env.NEXT_RUNTIME !== 'edge') { this.requestAdapter = new XMatchedPathRequestAdapter( this.buildId, this.enabledDirectories, diff --git a/packages/next/src/server/request-adapter/standalone-request-adapter.ts b/packages/next/src/server/request-adapter/standalone-request-adapter.ts new file mode 100644 index 0000000000000..81659d03a2d7f --- /dev/null +++ b/packages/next/src/server/request-adapter/standalone-request-adapter.ts @@ -0,0 +1,32 @@ +import type { BaseNextRequest } from '../base-http' +import type { NextUrlWithParsedQuery } from '../request-meta' +import type { RequestAdapter } from './request-adapter' +import type { XInvokePathRequestAdapter } from './x-invoke-path-request-adapter' +import type { XMatchedPathRequestAdapter } from './x-matched-path-request-adapter' + +export class StandaloneRequestAdapter + implements RequestAdapter +{ + constructor( + private readonly xMatchedPathRequestAdapter: XMatchedPathRequestAdapter, + private readonly xInvokePathRequestAdapter: XInvokePathRequestAdapter + ) {} + + public async adapt( + req: ServerRequest, + parsedURL: NextUrlWithParsedQuery + ): Promise { + // Today, standalone mode is used to test the x-matched-path support as + // well. + + // FIXME: remove this fallback when the tests are updated. + if ( + req.headers['x-matched-path'] && + typeof req.headers['x-matched-path'] === 'string' + ) { + return this.xMatchedPathRequestAdapter.adapt(req, parsedURL) + } + + return this.xInvokePathRequestAdapter.adapt(req, parsedURL) + } +}