Skip to content

Commit 7241962

Browse files
committed
Pages API handler interface follow-ups
1 parent 6bfe6cd commit 7241962

File tree

3 files changed

+40
-24
lines changed

3 files changed

+40
-24
lines changed

packages/next/src/build/templates/pages-api.ts

+18-17
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,35 @@
11
import type { NextApiResponse } from '../../types'
22
import type { IncomingMessage, ServerResponse } from 'node:http'
3+
import type { PrerenderManifest } from '..'
4+
import type { DevRoutesManifest } from '../../server/lib/router-utils/setup-dev-bundler'
5+
import type { InstrumentationOnRequestError } from '../../server/instrumentation/types'
36

47
import { parse } from 'node:url'
5-
import { RouteKind } from '../../server/route-kind'
68
import { sendError } from '../../server/api-utils'
9+
import { RouteKind } from '../../server/route-kind'
10+
import type { Span } from '../../server/lib/trace/tracer'
11+
import type { BaseNextRequest } from '../../server/base-http'
712
import { PagesAPIRouteModule } from '../../server/route-modules/pages-api/module.compiled'
813

914
import { hoist } from './helpers'
1015

1116
// Import the userland code.
1217
import * as userland from 'VAR_USERLAND'
1318
import { getTracer, SpanKind } from '../../server/lib/trace/tracer'
14-
import type { Span } from '../../server/lib/trace/tracer'
1519
import { BaseServerSpan } from '../../server/lib/trace/constants'
1620
import {
1721
ensureInstrumentationRegistered,
1822
instrumentationOnRequestError,
1923
} from '../../server/lib/router-utils/instrumentation-globals.external'
20-
import type { InstrumentationOnRequestError } from '../../server/instrumentation/types'
2124
import { getUtils } from '../../server/server-utils'
2225
import { PRERENDER_MANIFEST, ROUTES_MANIFEST } from '../../api/constants'
2326
import { isDynamicRoute } from '../../shared/lib/router/utils'
24-
import type { BaseNextRequest } from '../../server/base-http'
2527
import {
2628
RouterServerContextSymbol,
2729
routerServerGlobal,
2830
} from '../../server/lib/router-utils/router-server-context'
2931
import { removePathPrefix } from '../../shared/lib/router/utils/remove-path-prefix'
3032
import { normalizeLocalePath } from '../../shared/lib/i18n/normalize-locale-path'
31-
import type { PrerenderManifest, RoutesManifest } from '..'
3233
import { loadManifestFromRelativePath } from '../../server/load-manifest.external'
3334

3435
// Re-export the handler (should be the default export).
@@ -62,17 +63,18 @@ export async function handler(
6263
const distDir = process.env.__NEXT_RELATIVE_DIST_DIR || ''
6364
const isDev = process.env.NODE_ENV === 'development'
6465

65-
const routesManifest = await loadManifestFromRelativePath<RoutesManifest>(
66-
projectDir,
67-
distDir,
68-
ROUTES_MANIFEST
69-
)
70-
const prerenderManifest =
71-
await loadManifestFromRelativePath<PrerenderManifest>(
66+
const [routesManifest, prerenderManifest] = await Promise.all([
67+
loadManifestFromRelativePath<DevRoutesManifest>(
68+
projectDir,
69+
distDir,
70+
ROUTES_MANIFEST
71+
),
72+
loadManifestFromRelativePath<PrerenderManifest>(
7273
projectDir,
7374
distDir,
7475
PRERENDER_MANIFEST
75-
)
76+
),
77+
])
7678
let srcPage = 'VAR_DEFINITION_PAGE'
7779

7880
// turbopack doesn't normalize `/index` in the page name
@@ -114,7 +116,7 @@ export async function handler(
114116
caseSensitive: Boolean(routesManifest.caseSensitive),
115117
})
116118
const rewriteParamKeys = Object.keys(
117-
serverUtils.handleRewrites(req as any as BaseNextRequest, parsedUrl)
119+
serverUtils.handleRewrites(req, parsedUrl)
118120
)
119121
serverUtils.normalizeCdnUrl(req as any as BaseNextRequest, [
120122
...rewriteParamKeys,
@@ -150,8 +152,8 @@ export async function handler(
150152

151153
const activeSpan = tracer.getActiveScopeSpan()
152154

153-
const invokeRouteModule = async (span?: Span) => {
154-
await routeModule
155+
const invokeRouteModule = async (span?: Span) =>
156+
routeModule
155157
.render(req, res, {
156158
query,
157159
params,
@@ -210,7 +212,6 @@ export async function handler(
210212
span.updateName(`${method} ${req.url}`)
211213
}
212214
})
213-
}
214215

215216
// TODO: activeSpan code path is for when wrapped by
216217
// next-server can be removed when this is no longer used

packages/next/src/server/lib/router-utils/setup-dev-bundler.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ export type SetupOpts = {
101101
resetFetch: () => void
102102
}
103103

104+
export interface DevRoutesManifest {
105+
version: number
106+
caseSensitive: RoutesManifest['caseSensitive']
107+
basePath: RoutesManifest['basePath']
108+
rewrites: RoutesManifest['rewrites']
109+
redirects: RoutesManifest['redirects']
110+
headers: RoutesManifest['headers']
111+
i18n: RoutesManifest['i18n']
112+
skipMiddlewareUrlNormalize: RoutesManifest['skipMiddlewareUrlNormalize']
113+
}
114+
104115
export type ServerFields = {
105116
actualMiddlewareFile?: string | undefined
106117
actualInstrumentationHookFile?: string | undefined
@@ -200,14 +211,13 @@ async function startWatcher(opts: SetupOpts) {
200211
// have to write this after starting hot-reloader since that
201212
// cleans the dist dir
202213
const routesManifestPath = path.join(distDir, ROUTES_MANIFEST)
203-
const routesManifest: Partial<RoutesManifest> = {
214+
const routesManifest: DevRoutesManifest = {
204215
version: 3,
205216
caseSensitive: !!nextConfig.experimental.caseSensitiveRoutes,
206217
basePath: nextConfig.basePath,
207218
rewrites: opts.fsChecker.rewrites,
208219
redirects: opts.fsChecker.redirects,
209220
headers: opts.fsChecker.headers,
210-
dataRoutes: [],
211221
i18n: nextConfig.i18n || undefined,
212222
skipMiddlewareUrlNormalize: nextConfig.skipMiddlewareUrlNormalize,
213223
}

packages/next/src/server/server-utils.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ import {
2323
NEXT_QUERY_PARAM_PREFIX,
2424
} from '../lib/constants'
2525
import { normalizeNextQueryParam } from './web/utils'
26-
import type { IncomingHttpHeaders } from 'http'
26+
import type { IncomingHttpHeaders, IncomingMessage } from 'http'
2727
import { decodeQueryPathParameter } from './lib/decode-query-path-parameter'
2828
import type { DeepReadonly } from '../shared/lib/deep-readonly'
2929

3030
export function normalizeCdnUrl(
31-
req: BaseNextRequest,
31+
req: BaseNextRequest | IncomingMessage,
3232
paramKeys: string[],
3333
defaultRouteRegex: ReturnType<typeof getNamedRouteRegex> | undefined
3434
) {
@@ -198,7 +198,10 @@ export function getUtils({
198198
defaultRouteMatches = dynamicRouteMatcher(page) as ParsedUrlQuery
199199
}
200200

201-
function handleRewrites(req: BaseNextRequest, parsedUrl: UrlWithParsedQuery) {
201+
function handleRewrites(
202+
req: BaseNextRequest | IncomingMessage,
203+
parsedUrl: UrlWithParsedQuery
204+
) {
202205
const rewriteParams = {}
203206
let fsPathname = parsedUrl.pathname
204207

@@ -416,8 +419,10 @@ export function getUtils({
416419
ignoreMissingOptional
417420
)
418421
},
419-
normalizeCdnUrl: (req: BaseNextRequest, paramKeys: string[]) =>
420-
normalizeCdnUrl(req, paramKeys, defaultRouteRegex),
422+
normalizeCdnUrl: (
423+
req: BaseNextRequest | IncomingMessage,
424+
paramKeys: string[]
425+
) => normalizeCdnUrl(req, paramKeys, defaultRouteRegex),
421426
interpolateDynamicPath: (
422427
pathname: string,
423428
params: Record<string, undefined | string | string[]>

0 commit comments

Comments
 (0)