Capítulo 438 de 456
Use the @next/routing package's resolveRoutes() to reproduce Next.js's exact route matching behavior inside an adapter, using the routing data captured from onBuildComplete.
resolveRoutes(): takes { url, buildId, basePath, i18n, headers, requestBody, pathnames, routes, invokeMiddleware } and returns resolution results.middlewareResponded (adapter shouldn't invoke entrypoint if true), externalRewrite (URL), redirect ({url, status}), resolvedPathname (route template, e.g. /blog/[slug]), resolvedQuery, invocationTarget (concrete pathname/query to invoke), resolvedHeaders, status, routeMatches.import { resolveRoutes } from '@next/routing'
const pathnames = [
...outputs.pages,
...outputs.pagesApi,
...outputs.appPages,
...outputs.appRoutes,
...outputs.staticFiles,
].map((output) => output.pathname)
const result = await resolveRoutes({
url: new URL(requestUrl),
buildId,
basePath: config.basePath || '',
i18n: config.i18n,
headers: new Headers(requestHeaders),
requestBody,
pathnames,
routes: routing,
invokeMiddleware: async (ctx) => {
return {}
},
})
if (result.resolvedPathname) {
console.log('Resolved pathname:', result.resolvedPathname)
console.log('Invocation target:', result.invocationTarget)
}
routing do adapter, obtendo o alvo concreto a invocar.resolvedPathname fica no template dinâmico (/blog/[slug]); invocationTarget.pathname é o path concreto (/blog/post-1).invokeMiddleware é injetado pelo adapter, permitindo invocação de middleware específica da plataforma.outputs.pages/appPages/etc. alimentam a lista de pathnames.routing (de onBuildComplete) é passado diretamente como routes.