next 15.4.6 → 15.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +2 -2
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack-config.js +2 -2
  5. package/dist/client/app-bootstrap.js +1 -1
  6. package/dist/client/index.js +1 -1
  7. package/dist/compiled/next-server/pages-api-turbo.runtime.dev.js +1 -1
  8. package/dist/compiled/next-server/pages-api-turbo.runtime.dev.js.map +1 -1
  9. package/dist/compiled/next-server/pages-api-turbo.runtime.prod.js +1 -1
  10. package/dist/compiled/next-server/pages-api-turbo.runtime.prod.js.map +1 -1
  11. package/dist/compiled/next-server/pages-api.runtime.dev.js +1 -1
  12. package/dist/compiled/next-server/pages-api.runtime.dev.js.map +1 -1
  13. package/dist/compiled/next-server/pages-api.runtime.prod.js +1 -1
  14. package/dist/compiled/next-server/pages-api.runtime.prod.js.map +1 -1
  15. package/dist/compiled/next-server/pages-turbo.runtime.dev.js +1 -1
  16. package/dist/compiled/next-server/pages-turbo.runtime.dev.js.map +1 -1
  17. package/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  18. package/dist/compiled/next-server/pages-turbo.runtime.prod.js.map +1 -1
  19. package/dist/compiled/next-server/pages.runtime.dev.js +1 -1
  20. package/dist/compiled/next-server/pages.runtime.dev.js.map +1 -1
  21. package/dist/compiled/next-server/pages.runtime.prod.js +1 -1
  22. package/dist/compiled/next-server/pages.runtime.prod.js.map +1 -1
  23. package/dist/esm/build/index.js +2 -2
  24. package/dist/esm/build/swc/index.js +1 -1
  25. package/dist/esm/build/webpack-config.js +2 -2
  26. package/dist/esm/client/app-bootstrap.js +1 -1
  27. package/dist/esm/client/index.js +1 -1
  28. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  29. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  30. package/dist/esm/server/lib/app-info-log.js +1 -1
  31. package/dist/esm/server/lib/router-utils/resolve-routes.js +26 -10
  32. package/dist/esm/server/lib/router-utils/resolve-routes.js.map +1 -1
  33. package/dist/esm/server/lib/start-server.js +1 -1
  34. package/dist/esm/shared/lib/canary-only.js +1 -1
  35. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  36. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  37. package/dist/server/lib/app-info-log.js +1 -1
  38. package/dist/server/lib/router-utils/resolve-routes.js +25 -9
  39. package/dist/server/lib/router-utils/resolve-routes.js.map +1 -1
  40. package/dist/server/lib/start-server.js +1 -1
  41. package/dist/shared/lib/canary-only.js +1 -1
  42. package/dist/telemetry/anonymous-meta.js +1 -1
  43. package/dist/telemetry/events/session-stopped.js +2 -2
  44. package/dist/telemetry/events/version.js +2 -2
  45. package/package.json +15 -15
@@ -320,7 +320,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
320
320
  const nextBuildSpan = trace('next-build', undefined, {
321
321
  buildMode: experimentalBuildMode,
322
322
  isTurboBuild: String(isTurbopack),
323
- version: "15.4.6"
323
+ version: "15.4.7"
324
324
  });
325
325
  NextBuildContext.nextBuildSpan = nextBuildSpan;
326
326
  NextBuildContext.dir = dir;
@@ -707,7 +707,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
707
707
  // Files outside of the distDir can be "type": "module"
708
708
  await writeFileUtf8(path.join(distDir, 'package.json'), '{"type": "commonjs"}');
709
709
  // These are written to distDir, so they need to come after creating and cleaning distDr.
710
- await recordFrameworkVersion("15.4.6");
710
+ await recordFrameworkVersion("15.4.7");
711
711
  await updateBuildDiagnostics({
712
712
  buildStage: 'start'
713
713
  });
@@ -11,7 +11,7 @@ import { isDeepStrictEqual } from 'util';
11
11
  import { getDefineEnv } from '../define-env';
12
12
  import { getReactCompilerLoader } from '../get-babel-loader-config';
13
13
  import { TurbopackInternalError } from '../../shared/lib/turbopack/utils';
14
- const nextVersion = "15.4.6";
14
+ const nextVersion = "15.4.7";
15
15
  const ArchName = arch();
16
16
  const PlatformName = platform();
17
17
  function infoLog(...args) {
@@ -1587,7 +1587,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1587
1587
  isClient && new CopyFilePlugin({
1588
1588
  // file path to build output of `@next/polyfill-nomodule`
1589
1589
  filePath: require.resolve('./polyfills/polyfill-nomodule'),
1590
- cacheKey: "15.4.6",
1590
+ cacheKey: "15.4.7",
1591
1591
  name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
1592
1592
  minimize: false,
1593
1593
  info: {
@@ -1767,7 +1767,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1767
1767
  // - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
1768
1768
  // - Next.js version
1769
1769
  // - next.config.js keys that affect compilation
1770
- version: `${__dirname}|${"15.4.6"}|${configVars}`,
1770
+ version: `${__dirname}|${"15.4.7"}|${configVars}`,
1771
1771
  cacheDirectory: path.join(distDir, 'cache', 'webpack'),
1772
1772
  // For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
1773
1773
  // So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
@@ -3,7 +3,7 @@
3
3
  * sure the following scripts are executed in the correct order:
4
4
  * - Polyfills
5
5
  * - next/script with `beforeInteractive` strategy
6
- */ const version = "15.4.6";
6
+ */ const version = "15.4.7";
7
7
  window.next = {
8
8
  version,
9
9
  appDir: true
@@ -26,7 +26,7 @@ import { SearchParamsContext, PathParamsContext } from '../shared/lib/hooks-clie
26
26
  import { onRecoverableError } from './react-client-callbacks/on-recoverable-error';
27
27
  import tracer from './tracing/tracer';
28
28
  import { isNextRouterError } from './components/is-next-router-error';
29
- export const version = "15.4.6";
29
+ export const version = "15.4.7";
30
30
  export let router;
31
31
  export const emitter = mitt();
32
32
  const looseToArray = (input)=>[].slice.call(input);
@@ -88,7 +88,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
88
88
  }
89
89
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
90
90
  const hotReloaderSpan = trace('hot-reloader', undefined, {
91
- version: "15.4.6"
91
+ version: "15.4.7"
92
92
  });
93
93
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
94
94
  // of the current `next dev` invocation.
@@ -185,7 +185,7 @@ export default class HotReloaderWebpack {
185
185
  this.previewProps = previewProps;
186
186
  this.rewrites = rewrites;
187
187
  this.hotReloaderSpan = trace('hot-reloader', undefined, {
188
- version: "15.4.6"
188
+ version: "15.4.7"
189
189
  });
190
190
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
191
191
  // of the current `next dev` invocation.
@@ -12,7 +12,7 @@ export function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures
12
12
  } else {
13
13
  bundlerSuffix = '';
14
14
  }
15
- Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.4.6"}`))}${bundlerSuffix}`);
15
+ Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.4.7"}`))}${bundlerSuffix}`);
16
16
  if (appUrl) {
17
17
  Log.bootstrap(`- Local: ${appUrl}`);
18
18
  }
@@ -8,7 +8,7 @@ import { formatHostname } from '../format-hostname';
8
8
  import { toNodeOutgoingHttpHeaders } from '../../web/utils';
9
9
  import { isAbortError } from '../../pipe-readable';
10
10
  import { getHostname } from '../../../shared/lib/get-hostname';
11
- import { getRedirectStatus } from '../../../lib/redirect-status';
11
+ import { getRedirectStatus, allowedStatusCodes } from '../../../lib/redirect-status';
12
12
  import { normalizeRepeatedSlashes } from '../../../shared/lib/utils';
13
13
  import { getRelativeURL } from '../../../shared/lib/router/utils/relativize-url';
14
14
  import { addPathPrefix } from '../../../shared/lib/router/utils/add-path-prefix';
@@ -419,15 +419,31 @@ export function getResolveRoutes(fsChecker, config, opts, renderServer, renderSe
419
419
  }
420
420
  if (middlewareHeaders['location']) {
421
421
  const value = middlewareHeaders['location'];
422
- const rel = getRelativeURL(value, initUrl);
423
- resHeaders['location'] = rel;
424
- parsedUrl = url.parse(rel, true);
425
- return {
426
- parsedUrl,
427
- resHeaders,
428
- finished: true,
429
- statusCode: middlewareRes.status
430
- };
422
+ // Only process Location header as a redirect if it has a proper redirect status
423
+ // This prevents a Location header with non-redirect status from being treated as a redirect
424
+ const isRedirectStatus = allowedStatusCodes.has(middlewareRes.status);
425
+ if (isRedirectStatus) {
426
+ // Process as redirect: update parsedUrl and convert to relative URL
427
+ const rel = getRelativeURL(value, initUrl);
428
+ resHeaders['location'] = rel;
429
+ parsedUrl = url.parse(rel, true);
430
+ return {
431
+ parsedUrl,
432
+ resHeaders,
433
+ finished: true,
434
+ statusCode: middlewareRes.status
435
+ };
436
+ } else {
437
+ // Not a redirect: just pass through the Location header
438
+ resHeaders['location'] = value;
439
+ return {
440
+ parsedUrl,
441
+ resHeaders,
442
+ finished: true,
443
+ bodyStream,
444
+ statusCode: middlewareRes.status
445
+ };
446
+ }
431
447
  }
432
448
  if (middlewareHeaders['x-middleware-refresh']) {
433
449
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/lib/router-utils/resolve-routes.ts"],"sourcesContent":["import type { FsOutput } from './filesystem'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextConfigComplete } from '../../config-shared'\nimport type { RenderServer, initialize } from '../router-server'\nimport type { PatchMatcher } from '../../../shared/lib/router/utils/path-match'\nimport type { Redirect } from '../../../types'\nimport type { Header, Rewrite } from '../../../lib/load-custom-routes'\nimport type { UnwrapPromise } from '../../../lib/coalesced-function'\nimport type { NextUrlWithParsedQuery } from '../../request-meta'\n\nimport url from 'url'\nimport path from 'node:path'\nimport setupDebug from 'next/dist/compiled/debug'\nimport { getCloneableBody } from '../../body-streams'\nimport { filterReqHeaders, ipcForbiddenHeaders } from '../server-ipc/utils'\nimport { stringifyQuery } from '../../server-route-utils'\nimport { formatHostname } from '../format-hostname'\nimport { toNodeOutgoingHttpHeaders } from '../../web/utils'\nimport { isAbortError } from '../../pipe-readable'\nimport { getHostname } from '../../../shared/lib/get-hostname'\nimport { getRedirectStatus } from '../../../lib/redirect-status'\nimport { normalizeRepeatedSlashes } from '../../../shared/lib/utils'\nimport { getRelativeURL } from '../../../shared/lib/router/utils/relativize-url'\nimport { addPathPrefix } from '../../../shared/lib/router/utils/add-path-prefix'\nimport { pathHasPrefix } from '../../../shared/lib/router/utils/path-has-prefix'\nimport { detectDomainLocale } from '../../../shared/lib/i18n/detect-domain-locale'\nimport { normalizeLocalePath } from '../../../shared/lib/i18n/normalize-locale-path'\nimport { removePathPrefix } from '../../../shared/lib/router/utils/remove-path-prefix'\nimport { NextDataPathnameNormalizer } from '../../normalizers/request/next-data'\nimport { BasePathPathnameNormalizer } from '../../normalizers/request/base-path'\n\nimport { addRequestMeta } from '../../request-meta'\nimport {\n compileNonPath,\n matchHas,\n parseDestination,\n prepareDestination,\n} from '../../../shared/lib/router/utils/prepare-destination'\nimport type { TLSSocket } from 'tls'\nimport {\n NEXT_REWRITTEN_PATH_HEADER,\n NEXT_REWRITTEN_QUERY_HEADER,\n NEXT_ROUTER_STATE_TREE_HEADER,\n RSC_HEADER,\n} from '../../../client/components/app-router-headers'\nimport { getSelectedParams } from '../../../client/components/router-reducer/compute-changed-path'\nimport { isInterceptionRouteRewrite } from '../../../lib/generate-interception-routes-rewrites'\nimport { parseAndValidateFlightRouterState } from '../../app-render/parse-and-validate-flight-router-state'\n\nconst debug = setupDebug('next:router-server:resolve-routes')\n\nexport function getResolveRoutes(\n fsChecker: UnwrapPromise<\n ReturnType<typeof import('./filesystem').setupFsCheck>\n >,\n config: NextConfigComplete,\n opts: Parameters<typeof initialize>[0],\n renderServer: RenderServer,\n renderServerOpts: Parameters<RenderServer['initialize']>[0],\n ensureMiddleware?: (url?: string) => Promise<void>\n) {\n type Route = {\n /**\n * The path matcher to check if this route applies to this request.\n */\n match: PatchMatcher\n check?: boolean\n name?: string\n } & Partial<Header> &\n Partial<Redirect>\n\n const routes: Route[] = [\n // _next/data with middleware handling\n { match: () => ({}), name: 'middleware_next_data' },\n\n ...(opts.minimalMode ? [] : fsChecker.headers),\n ...(opts.minimalMode ? [] : fsChecker.redirects),\n\n // check middleware (using matchers)\n { match: () => ({}), name: 'middleware' },\n\n ...(opts.minimalMode ? [] : fsChecker.rewrites.beforeFiles),\n\n // check middleware (using matchers)\n { match: () => ({}), name: 'before_files_end' },\n\n // we check exact matches on fs before continuing to\n // after files rewrites\n { match: () => ({}), name: 'check_fs' },\n\n ...(opts.minimalMode ? [] : fsChecker.rewrites.afterFiles),\n\n // we always do the check: true handling before continuing to\n // fallback rewrites\n {\n check: true,\n match: () => ({}),\n name: 'after files check: true',\n },\n\n ...(opts.minimalMode ? [] : fsChecker.rewrites.fallback),\n ]\n\n async function resolveRoutes({\n req,\n res,\n isUpgradeReq,\n invokedOutputs,\n }: {\n req: IncomingMessage\n res: ServerResponse\n isUpgradeReq: boolean\n signal: AbortSignal\n invokedOutputs?: Set<string>\n }): Promise<{\n finished: boolean\n statusCode?: number\n bodyStream?: ReadableStream | null\n resHeaders: Record<string, string | string[]>\n parsedUrl: NextUrlWithParsedQuery\n matchedOutput?: FsOutput | null\n }> {\n let finished = false\n let resHeaders: Record<string, string | string[]> = {}\n let matchedOutput: FsOutput | null = null\n let parsedUrl = url.parse(req.url || '', true) as NextUrlWithParsedQuery\n let didRewrite = false\n\n const urlParts = (req.url || '').split('?', 1)\n const urlNoQuery = urlParts[0]\n\n // this normalizes repeated slashes in the path e.g. hello//world ->\n // hello/world or backslashes to forward slashes, this does not\n // handle trailing slash as that is handled the same as a next.config.js\n // redirect\n if (urlNoQuery?.match(/(\\\\|\\/\\/)/)) {\n parsedUrl = url.parse(normalizeRepeatedSlashes(req.url!), true)\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n statusCode: 308,\n }\n }\n // TODO: inherit this from higher up\n const protocol =\n (req?.socket as TLSSocket)?.encrypted ||\n req.headers['x-forwarded-proto']?.includes('https')\n ? 'https'\n : 'http'\n\n // When there are hostname and port we build an absolute URL\n const initUrl = (config.experimental as any).trustHostHeader\n ? `https://${req.headers.host || 'localhost'}${req.url}`\n : opts.port\n ? `${protocol}://${formatHostname(opts.hostname || 'localhost')}:${\n opts.port\n }${req.url}`\n : req.url || ''\n\n addRequestMeta(req, 'initURL', initUrl)\n addRequestMeta(req, 'initQuery', { ...parsedUrl.query })\n addRequestMeta(req, 'initProtocol', protocol)\n\n if (!isUpgradeReq) {\n addRequestMeta(req, 'clonableBody', getCloneableBody(req))\n }\n\n const maybeAddTrailingSlash = (pathname: string) => {\n if (\n config.trailingSlash &&\n !config.skipMiddlewareUrlNormalize &&\n !pathname.endsWith('/')\n ) {\n return `${pathname}/`\n }\n return pathname\n }\n\n let domainLocale: ReturnType<typeof detectDomainLocale> | undefined\n let defaultLocale: string | undefined\n let initialLocaleResult:\n | ReturnType<typeof normalizeLocalePath>\n | undefined = undefined\n\n if (config.i18n) {\n const hadTrailingSlash = parsedUrl.pathname?.endsWith('/')\n const hadBasePath = pathHasPrefix(\n parsedUrl.pathname || '',\n config.basePath\n )\n let normalizedPath = parsedUrl.pathname || '/'\n\n if (config.basePath && pathHasPrefix(normalizedPath, config.basePath)) {\n normalizedPath = removePathPrefix(normalizedPath, config.basePath)\n } else if (\n config.assetPrefix &&\n pathHasPrefix(normalizedPath, config.assetPrefix)\n ) {\n normalizedPath = removePathPrefix(normalizedPath, config.assetPrefix)\n }\n\n initialLocaleResult = normalizeLocalePath(\n normalizedPath,\n config.i18n.locales\n )\n\n domainLocale = detectDomainLocale(\n config.i18n.domains,\n getHostname(parsedUrl, req.headers)\n )\n defaultLocale = domainLocale?.defaultLocale || config.i18n.defaultLocale\n\n addRequestMeta(req, 'defaultLocale', defaultLocale)\n addRequestMeta(\n req,\n 'locale',\n initialLocaleResult.detectedLocale || defaultLocale\n )\n\n // ensure locale is present for resolving routes\n if (\n !initialLocaleResult.detectedLocale &&\n !initialLocaleResult.pathname.startsWith('/_next/')\n ) {\n parsedUrl.pathname = addPathPrefix(\n initialLocaleResult.pathname === '/'\n ? `/${defaultLocale}`\n : addPathPrefix(\n initialLocaleResult.pathname || '',\n `/${defaultLocale}`\n ),\n hadBasePath ? config.basePath : ''\n )\n\n if (hadTrailingSlash) {\n parsedUrl.pathname = maybeAddTrailingSlash(parsedUrl.pathname)\n }\n }\n }\n\n const checkLocaleApi = (pathname: string) => {\n if (\n config.i18n &&\n pathname === urlNoQuery &&\n initialLocaleResult?.detectedLocale &&\n pathHasPrefix(initialLocaleResult.pathname, '/api')\n ) {\n return true\n }\n }\n\n async function checkTrue() {\n const pathname = parsedUrl.pathname || '/'\n\n if (checkLocaleApi(pathname)) {\n return\n }\n if (!invokedOutputs?.has(pathname)) {\n const output = await fsChecker.getItem(pathname)\n\n if (output) {\n if (\n config.useFileSystemPublicRoutes ||\n didRewrite ||\n (output.type !== 'appFile' && output.type !== 'pageFile')\n ) {\n return output\n }\n }\n }\n const dynamicRoutes = fsChecker.getDynamicRoutes()\n let curPathname = parsedUrl.pathname\n\n if (config.basePath) {\n if (!pathHasPrefix(curPathname || '', config.basePath)) {\n return\n }\n curPathname = curPathname?.substring(config.basePath.length) || '/'\n }\n const localeResult = fsChecker.handleLocale(curPathname || '')\n\n for (const route of dynamicRoutes) {\n // when resolving fallback: false the\n // render worker may return a no-fallback response\n // which signals we need to continue resolving.\n // TODO: optimize this to collect static paths\n // to use at the routing layer\n if (invokedOutputs?.has(route.page)) {\n continue\n }\n const params = route.match(localeResult.pathname)\n\n if (params) {\n const pageOutput = await fsChecker.getItem(\n addPathPrefix(route.page, config.basePath || '')\n )\n\n // i18n locales aren't matched for app dir\n if (\n pageOutput?.type === 'appFile' &&\n initialLocaleResult?.detectedLocale\n ) {\n continue\n }\n\n if (pageOutput && curPathname?.startsWith('/_next/data')) {\n addRequestMeta(req, 'isNextDataReq', true)\n }\n\n if (config.useFileSystemPublicRoutes || didRewrite) {\n return pageOutput\n }\n }\n }\n }\n\n const normalizers = {\n basePath:\n config.basePath && config.basePath !== '/'\n ? new BasePathPathnameNormalizer(config.basePath)\n : undefined,\n data: new NextDataPathnameNormalizer(fsChecker.buildId),\n }\n\n async function handleRoute(\n route: (typeof routes)[0]\n ): Promise<UnwrapPromise<ReturnType<typeof resolveRoutes>> | void> {\n let curPathname = parsedUrl.pathname || '/'\n\n if (config.i18n && route.internal) {\n const hadTrailingSlash = curPathname.endsWith('/')\n\n if (config.basePath) {\n curPathname = removePathPrefix(curPathname, config.basePath)\n }\n const hadBasePath = curPathname !== parsedUrl.pathname\n\n const localeResult = normalizeLocalePath(\n curPathname,\n config.i18n.locales\n )\n const isDefaultLocale = localeResult.detectedLocale === defaultLocale\n\n if (isDefaultLocale) {\n curPathname =\n localeResult.pathname === '/' && hadBasePath\n ? config.basePath\n : addPathPrefix(\n localeResult.pathname,\n hadBasePath ? config.basePath : ''\n )\n } else if (hadBasePath) {\n curPathname =\n curPathname === '/'\n ? config.basePath\n : addPathPrefix(curPathname, config.basePath)\n }\n\n if ((isDefaultLocale || hadBasePath) && hadTrailingSlash) {\n curPathname = maybeAddTrailingSlash(curPathname)\n }\n }\n let params = route.match(curPathname)\n\n if ((route.has || route.missing) && params) {\n const hasParams = matchHas(\n req,\n parsedUrl.query,\n route.has,\n route.missing\n )\n if (hasParams) {\n Object.assign(params, hasParams)\n } else {\n params = false\n }\n }\n\n if (params) {\n if (\n fsChecker.exportPathMapRoutes &&\n route.name === 'before_files_end'\n ) {\n for (const exportPathMapRoute of fsChecker.exportPathMapRoutes) {\n const result = await handleRoute(exportPathMapRoute)\n\n if (result) {\n return result\n }\n }\n }\n\n if (route.name === 'middleware_next_data' && parsedUrl.pathname) {\n if (fsChecker.getMiddlewareMatchers()?.length) {\n let normalized = parsedUrl.pathname\n\n // Remove the base path if it exists.\n const hadBasePath = normalizers.basePath?.match(parsedUrl.pathname)\n if (hadBasePath && normalizers.basePath) {\n normalized = normalizers.basePath.normalize(normalized, true)\n }\n\n let updated = false\n if (normalizers.data.match(normalized)) {\n updated = true\n addRequestMeta(req, 'isNextDataReq', true)\n normalized = normalizers.data.normalize(normalized, true)\n }\n\n if (config.i18n) {\n const curLocaleResult = normalizeLocalePath(\n normalized,\n config.i18n.locales\n )\n\n if (curLocaleResult.detectedLocale) {\n addRequestMeta(req, 'locale', curLocaleResult.detectedLocale)\n }\n }\n\n // If we updated the pathname, and it had a base path, re-add the\n // base path.\n if (updated) {\n if (hadBasePath) {\n normalized = path.posix.join(config.basePath, normalized)\n }\n\n // Re-add the trailing slash (if required).\n normalized = maybeAddTrailingSlash(normalized)\n\n parsedUrl.pathname = normalized\n }\n }\n }\n\n if (route.name === 'check_fs') {\n const pathname = parsedUrl.pathname || '/'\n\n if (invokedOutputs?.has(pathname) || checkLocaleApi(pathname)) {\n return\n }\n const output = await fsChecker.getItem(pathname)\n\n if (\n output &&\n !(\n config.i18n &&\n initialLocaleResult?.detectedLocale &&\n pathHasPrefix(pathname, '/api')\n )\n ) {\n if (\n config.useFileSystemPublicRoutes ||\n didRewrite ||\n (output.type !== 'appFile' && output.type !== 'pageFile')\n ) {\n matchedOutput = output\n\n if (output.locale) {\n addRequestMeta(req, 'locale', output.locale)\n }\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n matchedOutput,\n }\n }\n }\n }\n\n if (!opts.minimalMode && route.name === 'middleware') {\n const match = fsChecker.getMiddlewareMatchers()\n let maybeDecodedPathname = parsedUrl.pathname || '/'\n\n try {\n maybeDecodedPathname = decodeURIComponent(maybeDecodedPathname)\n } catch {\n /* non-fatal we can't decode so can't match it */\n }\n\n if (\n // @ts-expect-error BaseNextRequest stuff\n match?.(parsedUrl.pathname, req, parsedUrl.query) ||\n match?.(\n maybeDecodedPathname,\n // @ts-expect-error BaseNextRequest stuff\n req,\n parsedUrl.query\n )\n ) {\n if (ensureMiddleware) {\n await ensureMiddleware(req.url)\n }\n\n const serverResult =\n await renderServer?.initialize(renderServerOpts)\n\n if (!serverResult) {\n throw new Error(`Failed to initialize render server \"middleware\"`)\n }\n\n addRequestMeta(req, 'invokePath', '')\n addRequestMeta(req, 'invokeOutput', '')\n addRequestMeta(req, 'invokeQuery', {})\n addRequestMeta(req, 'middlewareInvoke', true)\n debug('invoking middleware', req.url, req.headers)\n\n let middlewareRes: Response | undefined = undefined\n let bodyStream: ReadableStream | undefined = undefined\n try {\n try {\n await serverResult.requestHandler(req, res, parsedUrl)\n } catch (err: any) {\n if (!('result' in err) || !('response' in err.result)) {\n throw err\n }\n middlewareRes = err.result.response as Response\n res.statusCode = middlewareRes.status\n\n if (middlewareRes.body) {\n bodyStream = middlewareRes.body\n } else if (middlewareRes.status) {\n bodyStream = new ReadableStream({\n start(controller) {\n controller.enqueue('')\n controller.close()\n },\n })\n }\n }\n } catch (e) {\n // If the client aborts before we can receive a response object\n // (when the headers are flushed), then we can early exit without\n // further processing.\n if (isAbortError(e)) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n }\n }\n throw e\n }\n\n if (res.closed || res.finished || !middlewareRes) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n }\n }\n\n const middlewareHeaders = toNodeOutgoingHttpHeaders(\n middlewareRes.headers\n ) as Record<string, string | string[] | undefined>\n\n debug('middleware res', middlewareRes.status, middlewareHeaders)\n\n if (middlewareHeaders['x-middleware-override-headers']) {\n const overriddenHeaders: Set<string> = new Set()\n let overrideHeaders: string | string[] =\n middlewareHeaders['x-middleware-override-headers']\n\n if (typeof overrideHeaders === 'string') {\n overrideHeaders = overrideHeaders.split(',')\n }\n\n for (const key of overrideHeaders) {\n overriddenHeaders.add(key.trim())\n }\n delete middlewareHeaders['x-middleware-override-headers']\n\n // Delete headers.\n for (const key of Object.keys(req.headers)) {\n if (!overriddenHeaders.has(key)) {\n delete req.headers[key]\n }\n }\n\n // Update or add headers.\n for (const key of overriddenHeaders.keys()) {\n const valueKey = 'x-middleware-request-' + key\n const newValue = middlewareHeaders[valueKey]\n const oldValue = req.headers[key]\n\n if (oldValue !== newValue) {\n req.headers[key] = newValue === null ? undefined : newValue\n }\n delete middlewareHeaders[valueKey]\n }\n }\n\n if (\n !middlewareHeaders['x-middleware-rewrite'] &&\n !middlewareHeaders['x-middleware-next'] &&\n !middlewareHeaders['location']\n ) {\n middlewareHeaders['x-middleware-refresh'] = '1'\n }\n delete middlewareHeaders['x-middleware-next']\n\n for (const [key, value] of Object.entries({\n ...filterReqHeaders(middlewareHeaders, ipcForbiddenHeaders),\n })) {\n if (\n [\n 'content-length',\n 'x-middleware-rewrite',\n 'x-middleware-redirect',\n 'x-middleware-refresh',\n ].includes(key)\n ) {\n continue\n }\n\n // for set-cookie, the header shouldn't be added to the response\n // as it's only needed for the request to the middleware function.\n if (key === 'x-middleware-set-cookie') {\n req.headers[key] = value\n continue\n }\n\n if (value) {\n resHeaders[key] = value\n req.headers[key] = value\n }\n }\n\n if (middlewareHeaders['x-middleware-rewrite']) {\n const value = middlewareHeaders['x-middleware-rewrite'] as string\n const destination = getRelativeURL(value, initUrl)\n resHeaders['x-middleware-rewrite'] = destination\n\n parsedUrl = url.parse(destination, true)\n\n if (parsedUrl.protocol) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n }\n }\n\n if (config.i18n) {\n const curLocaleResult = normalizeLocalePath(\n parsedUrl.pathname || '',\n config.i18n.locales\n )\n\n if (curLocaleResult.detectedLocale) {\n addRequestMeta(req, 'locale', curLocaleResult.detectedLocale)\n }\n }\n }\n\n if (middlewareHeaders['location']) {\n const value = middlewareHeaders['location'] as string\n const rel = getRelativeURL(value, initUrl)\n resHeaders['location'] = rel\n parsedUrl = url.parse(rel, true)\n\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n statusCode: middlewareRes.status,\n }\n }\n\n if (middlewareHeaders['x-middleware-refresh']) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n bodyStream,\n statusCode: middlewareRes.status,\n }\n }\n }\n }\n\n // handle redirect\n if (\n ('statusCode' in route || 'permanent' in route) &&\n route.destination\n ) {\n const { parsedDestination } = prepareDestination({\n appendParamsToQuery: false,\n destination: route.destination,\n params: params,\n query: parsedUrl.query,\n })\n\n const { query } = parsedDestination\n delete (parsedDestination as any).query\n\n parsedDestination.search = stringifyQuery(req as any, query)\n\n parsedDestination.pathname = normalizeRepeatedSlashes(\n parsedDestination.pathname\n )\n\n return {\n finished: true,\n // @ts-expect-error custom ParsedUrl\n parsedUrl: parsedDestination,\n statusCode: getRedirectStatus(route),\n }\n }\n\n // handle headers\n if (route.headers) {\n const hasParams = Object.keys(params).length > 0\n for (const header of route.headers) {\n let { key, value } = header\n if (hasParams) {\n key = compileNonPath(key, params)\n value = compileNonPath(value, params)\n }\n\n if (key.toLowerCase() === 'set-cookie') {\n if (!Array.isArray(resHeaders[key])) {\n const val = resHeaders[key]\n resHeaders[key] = typeof val === 'string' ? [val] : []\n }\n ;(resHeaders[key] as string[]).push(value)\n } else {\n resHeaders[key] = value\n }\n }\n }\n\n // handle rewrite\n if (route.destination) {\n let rewriteParams = params\n\n try {\n // An interception rewrite might reference a dynamic param for a route the user\n // is currently on, which wouldn't be extractable from the matched route params.\n // This attempts to extract the dynamic params from the provided router state.\n if (isInterceptionRouteRewrite(route as Rewrite)) {\n const stateHeader =\n req.headers[NEXT_ROUTER_STATE_TREE_HEADER.toLowerCase()]\n\n if (stateHeader) {\n rewriteParams = {\n ...getSelectedParams(\n parseAndValidateFlightRouterState(stateHeader)\n ),\n ...params,\n }\n }\n }\n } catch (err) {\n // this is a no-op -- we couldn't extract dynamic params from the provided router state,\n // so we'll just use the params from the route matcher\n }\n\n // We extract the search params of the destination so we can set it on\n // the response headers. We don't want to use the following\n // `parsedDestination` as the query object is mutated.\n const { search: destinationSearch, pathname: destinationPathname } =\n parseDestination({\n destination: route.destination,\n params: rewriteParams,\n query: parsedUrl.query,\n })\n\n const { parsedDestination } = prepareDestination({\n appendParamsToQuery: true,\n destination: route.destination,\n params: rewriteParams,\n query: parsedUrl.query,\n })\n\n if (parsedDestination.protocol) {\n return {\n // @ts-expect-error custom ParsedUrl\n parsedUrl: parsedDestination,\n finished: true,\n }\n }\n\n // Set the rewrite headers only if this is a RSC request.\n if (req.headers[RSC_HEADER.toLowerCase()] === '1') {\n // We set the rewritten path and query headers on the response now\n // that we know that the it's not an external rewrite.\n if (parsedUrl.pathname !== destinationPathname) {\n res.setHeader(NEXT_REWRITTEN_PATH_HEADER, destinationPathname)\n }\n if (destinationSearch) {\n res.setHeader(\n NEXT_REWRITTEN_QUERY_HEADER,\n // remove the leading ? from the search\n destinationSearch.slice(1)\n )\n }\n }\n\n if (config.i18n) {\n const curLocaleResult = normalizeLocalePath(\n removePathPrefix(parsedDestination.pathname, config.basePath),\n config.i18n.locales\n )\n\n if (curLocaleResult.detectedLocale) {\n addRequestMeta(req, 'locale', curLocaleResult.detectedLocale)\n }\n }\n didRewrite = true\n parsedUrl.pathname = parsedDestination.pathname\n Object.assign(parsedUrl.query, parsedDestination.query)\n }\n\n // handle check: true\n if (route.check) {\n const output = await checkTrue()\n\n if (output) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n matchedOutput: output,\n }\n }\n }\n }\n }\n\n for (const route of routes) {\n const result = await handleRoute(route)\n if (result) {\n return result\n }\n }\n\n return {\n finished,\n parsedUrl,\n resHeaders,\n matchedOutput,\n }\n }\n\n return resolveRoutes\n}\n"],"names":["url","path","setupDebug","getCloneableBody","filterReqHeaders","ipcForbiddenHeaders","stringifyQuery","formatHostname","toNodeOutgoingHttpHeaders","isAbortError","getHostname","getRedirectStatus","normalizeRepeatedSlashes","getRelativeURL","addPathPrefix","pathHasPrefix","detectDomainLocale","normalizeLocalePath","removePathPrefix","NextDataPathnameNormalizer","BasePathPathnameNormalizer","addRequestMeta","compileNonPath","matchHas","parseDestination","prepareDestination","NEXT_REWRITTEN_PATH_HEADER","NEXT_REWRITTEN_QUERY_HEADER","NEXT_ROUTER_STATE_TREE_HEADER","RSC_HEADER","getSelectedParams","isInterceptionRouteRewrite","parseAndValidateFlightRouterState","debug","getResolveRoutes","fsChecker","config","opts","renderServer","renderServerOpts","ensureMiddleware","routes","match","name","minimalMode","headers","redirects","rewrites","beforeFiles","afterFiles","check","fallback","resolveRoutes","req","res","isUpgradeReq","invokedOutputs","finished","resHeaders","matchedOutput","parsedUrl","parse","didRewrite","urlParts","split","urlNoQuery","statusCode","protocol","socket","encrypted","includes","initUrl","experimental","trustHostHeader","host","port","hostname","query","maybeAddTrailingSlash","pathname","trailingSlash","skipMiddlewareUrlNormalize","endsWith","domainLocale","defaultLocale","initialLocaleResult","undefined","i18n","hadTrailingSlash","hadBasePath","basePath","normalizedPath","assetPrefix","locales","domains","detectedLocale","startsWith","checkLocaleApi","checkTrue","has","output","getItem","useFileSystemPublicRoutes","type","dynamicRoutes","getDynamicRoutes","curPathname","substring","length","localeResult","handleLocale","route","page","params","pageOutput","normalizers","data","buildId","handleRoute","internal","isDefaultLocale","missing","hasParams","Object","assign","exportPathMapRoutes","exportPathMapRoute","result","getMiddlewareMatchers","normalized","normalize","updated","curLocaleResult","posix","join","locale","maybeDecodedPathname","decodeURIComponent","serverResult","initialize","Error","middlewareRes","bodyStream","requestHandler","err","response","status","body","ReadableStream","start","controller","enqueue","close","e","closed","middlewareHeaders","overriddenHeaders","Set","overrideHeaders","key","add","trim","keys","valueKey","newValue","oldValue","value","entries","destination","rel","parsedDestination","appendParamsToQuery","search","header","toLowerCase","Array","isArray","val","push","rewriteParams","stateHeader","destinationSearch","destinationPathname","setHeader","slice"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../src/server/lib/router-utils/resolve-routes.ts"],"sourcesContent":["import type { FsOutput } from './filesystem'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { NextConfigComplete } from '../../config-shared'\nimport type { RenderServer, initialize } from '../router-server'\nimport type { PatchMatcher } from '../../../shared/lib/router/utils/path-match'\nimport type { Redirect } from '../../../types'\nimport type { Header, Rewrite } from '../../../lib/load-custom-routes'\nimport type { UnwrapPromise } from '../../../lib/coalesced-function'\nimport type { NextUrlWithParsedQuery } from '../../request-meta'\n\nimport url from 'url'\nimport path from 'node:path'\nimport setupDebug from 'next/dist/compiled/debug'\nimport { getCloneableBody } from '../../body-streams'\nimport { filterReqHeaders, ipcForbiddenHeaders } from '../server-ipc/utils'\nimport { stringifyQuery } from '../../server-route-utils'\nimport { formatHostname } from '../format-hostname'\nimport { toNodeOutgoingHttpHeaders } from '../../web/utils'\nimport { isAbortError } from '../../pipe-readable'\nimport { getHostname } from '../../../shared/lib/get-hostname'\nimport {\n getRedirectStatus,\n allowedStatusCodes,\n} from '../../../lib/redirect-status'\nimport { normalizeRepeatedSlashes } from '../../../shared/lib/utils'\nimport { getRelativeURL } from '../../../shared/lib/router/utils/relativize-url'\nimport { addPathPrefix } from '../../../shared/lib/router/utils/add-path-prefix'\nimport { pathHasPrefix } from '../../../shared/lib/router/utils/path-has-prefix'\nimport { detectDomainLocale } from '../../../shared/lib/i18n/detect-domain-locale'\nimport { normalizeLocalePath } from '../../../shared/lib/i18n/normalize-locale-path'\nimport { removePathPrefix } from '../../../shared/lib/router/utils/remove-path-prefix'\nimport { NextDataPathnameNormalizer } from '../../normalizers/request/next-data'\nimport { BasePathPathnameNormalizer } from '../../normalizers/request/base-path'\n\nimport { addRequestMeta } from '../../request-meta'\nimport {\n compileNonPath,\n matchHas,\n parseDestination,\n prepareDestination,\n} from '../../../shared/lib/router/utils/prepare-destination'\nimport type { TLSSocket } from 'tls'\nimport {\n NEXT_REWRITTEN_PATH_HEADER,\n NEXT_REWRITTEN_QUERY_HEADER,\n NEXT_ROUTER_STATE_TREE_HEADER,\n RSC_HEADER,\n} from '../../../client/components/app-router-headers'\nimport { getSelectedParams } from '../../../client/components/router-reducer/compute-changed-path'\nimport { isInterceptionRouteRewrite } from '../../../lib/generate-interception-routes-rewrites'\nimport { parseAndValidateFlightRouterState } from '../../app-render/parse-and-validate-flight-router-state'\n\nconst debug = setupDebug('next:router-server:resolve-routes')\n\nexport function getResolveRoutes(\n fsChecker: UnwrapPromise<\n ReturnType<typeof import('./filesystem').setupFsCheck>\n >,\n config: NextConfigComplete,\n opts: Parameters<typeof initialize>[0],\n renderServer: RenderServer,\n renderServerOpts: Parameters<RenderServer['initialize']>[0],\n ensureMiddleware?: (url?: string) => Promise<void>\n) {\n type Route = {\n /**\n * The path matcher to check if this route applies to this request.\n */\n match: PatchMatcher\n check?: boolean\n name?: string\n } & Partial<Header> &\n Partial<Redirect>\n\n const routes: Route[] = [\n // _next/data with middleware handling\n { match: () => ({}), name: 'middleware_next_data' },\n\n ...(opts.minimalMode ? [] : fsChecker.headers),\n ...(opts.minimalMode ? [] : fsChecker.redirects),\n\n // check middleware (using matchers)\n { match: () => ({}), name: 'middleware' },\n\n ...(opts.minimalMode ? [] : fsChecker.rewrites.beforeFiles),\n\n // check middleware (using matchers)\n { match: () => ({}), name: 'before_files_end' },\n\n // we check exact matches on fs before continuing to\n // after files rewrites\n { match: () => ({}), name: 'check_fs' },\n\n ...(opts.minimalMode ? [] : fsChecker.rewrites.afterFiles),\n\n // we always do the check: true handling before continuing to\n // fallback rewrites\n {\n check: true,\n match: () => ({}),\n name: 'after files check: true',\n },\n\n ...(opts.minimalMode ? [] : fsChecker.rewrites.fallback),\n ]\n\n async function resolveRoutes({\n req,\n res,\n isUpgradeReq,\n invokedOutputs,\n }: {\n req: IncomingMessage\n res: ServerResponse\n isUpgradeReq: boolean\n signal: AbortSignal\n invokedOutputs?: Set<string>\n }): Promise<{\n finished: boolean\n statusCode?: number\n bodyStream?: ReadableStream | null\n resHeaders: Record<string, string | string[]>\n parsedUrl: NextUrlWithParsedQuery\n matchedOutput?: FsOutput | null\n }> {\n let finished = false\n let resHeaders: Record<string, string | string[]> = {}\n let matchedOutput: FsOutput | null = null\n let parsedUrl = url.parse(req.url || '', true) as NextUrlWithParsedQuery\n let didRewrite = false\n\n const urlParts = (req.url || '').split('?', 1)\n const urlNoQuery = urlParts[0]\n\n // this normalizes repeated slashes in the path e.g. hello//world ->\n // hello/world or backslashes to forward slashes, this does not\n // handle trailing slash as that is handled the same as a next.config.js\n // redirect\n if (urlNoQuery?.match(/(\\\\|\\/\\/)/)) {\n parsedUrl = url.parse(normalizeRepeatedSlashes(req.url!), true)\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n statusCode: 308,\n }\n }\n // TODO: inherit this from higher up\n const protocol =\n (req?.socket as TLSSocket)?.encrypted ||\n req.headers['x-forwarded-proto']?.includes('https')\n ? 'https'\n : 'http'\n\n // When there are hostname and port we build an absolute URL\n const initUrl = (config.experimental as any).trustHostHeader\n ? `https://${req.headers.host || 'localhost'}${req.url}`\n : opts.port\n ? `${protocol}://${formatHostname(opts.hostname || 'localhost')}:${\n opts.port\n }${req.url}`\n : req.url || ''\n\n addRequestMeta(req, 'initURL', initUrl)\n addRequestMeta(req, 'initQuery', { ...parsedUrl.query })\n addRequestMeta(req, 'initProtocol', protocol)\n\n if (!isUpgradeReq) {\n addRequestMeta(req, 'clonableBody', getCloneableBody(req))\n }\n\n const maybeAddTrailingSlash = (pathname: string) => {\n if (\n config.trailingSlash &&\n !config.skipMiddlewareUrlNormalize &&\n !pathname.endsWith('/')\n ) {\n return `${pathname}/`\n }\n return pathname\n }\n\n let domainLocale: ReturnType<typeof detectDomainLocale> | undefined\n let defaultLocale: string | undefined\n let initialLocaleResult:\n | ReturnType<typeof normalizeLocalePath>\n | undefined = undefined\n\n if (config.i18n) {\n const hadTrailingSlash = parsedUrl.pathname?.endsWith('/')\n const hadBasePath = pathHasPrefix(\n parsedUrl.pathname || '',\n config.basePath\n )\n let normalizedPath = parsedUrl.pathname || '/'\n\n if (config.basePath && pathHasPrefix(normalizedPath, config.basePath)) {\n normalizedPath = removePathPrefix(normalizedPath, config.basePath)\n } else if (\n config.assetPrefix &&\n pathHasPrefix(normalizedPath, config.assetPrefix)\n ) {\n normalizedPath = removePathPrefix(normalizedPath, config.assetPrefix)\n }\n\n initialLocaleResult = normalizeLocalePath(\n normalizedPath,\n config.i18n.locales\n )\n\n domainLocale = detectDomainLocale(\n config.i18n.domains,\n getHostname(parsedUrl, req.headers)\n )\n defaultLocale = domainLocale?.defaultLocale || config.i18n.defaultLocale\n\n addRequestMeta(req, 'defaultLocale', defaultLocale)\n addRequestMeta(\n req,\n 'locale',\n initialLocaleResult.detectedLocale || defaultLocale\n )\n\n // ensure locale is present for resolving routes\n if (\n !initialLocaleResult.detectedLocale &&\n !initialLocaleResult.pathname.startsWith('/_next/')\n ) {\n parsedUrl.pathname = addPathPrefix(\n initialLocaleResult.pathname === '/'\n ? `/${defaultLocale}`\n : addPathPrefix(\n initialLocaleResult.pathname || '',\n `/${defaultLocale}`\n ),\n hadBasePath ? config.basePath : ''\n )\n\n if (hadTrailingSlash) {\n parsedUrl.pathname = maybeAddTrailingSlash(parsedUrl.pathname)\n }\n }\n }\n\n const checkLocaleApi = (pathname: string) => {\n if (\n config.i18n &&\n pathname === urlNoQuery &&\n initialLocaleResult?.detectedLocale &&\n pathHasPrefix(initialLocaleResult.pathname, '/api')\n ) {\n return true\n }\n }\n\n async function checkTrue() {\n const pathname = parsedUrl.pathname || '/'\n\n if (checkLocaleApi(pathname)) {\n return\n }\n if (!invokedOutputs?.has(pathname)) {\n const output = await fsChecker.getItem(pathname)\n\n if (output) {\n if (\n config.useFileSystemPublicRoutes ||\n didRewrite ||\n (output.type !== 'appFile' && output.type !== 'pageFile')\n ) {\n return output\n }\n }\n }\n const dynamicRoutes = fsChecker.getDynamicRoutes()\n let curPathname = parsedUrl.pathname\n\n if (config.basePath) {\n if (!pathHasPrefix(curPathname || '', config.basePath)) {\n return\n }\n curPathname = curPathname?.substring(config.basePath.length) || '/'\n }\n const localeResult = fsChecker.handleLocale(curPathname || '')\n\n for (const route of dynamicRoutes) {\n // when resolving fallback: false the\n // render worker may return a no-fallback response\n // which signals we need to continue resolving.\n // TODO: optimize this to collect static paths\n // to use at the routing layer\n if (invokedOutputs?.has(route.page)) {\n continue\n }\n const params = route.match(localeResult.pathname)\n\n if (params) {\n const pageOutput = await fsChecker.getItem(\n addPathPrefix(route.page, config.basePath || '')\n )\n\n // i18n locales aren't matched for app dir\n if (\n pageOutput?.type === 'appFile' &&\n initialLocaleResult?.detectedLocale\n ) {\n continue\n }\n\n if (pageOutput && curPathname?.startsWith('/_next/data')) {\n addRequestMeta(req, 'isNextDataReq', true)\n }\n\n if (config.useFileSystemPublicRoutes || didRewrite) {\n return pageOutput\n }\n }\n }\n }\n\n const normalizers = {\n basePath:\n config.basePath && config.basePath !== '/'\n ? new BasePathPathnameNormalizer(config.basePath)\n : undefined,\n data: new NextDataPathnameNormalizer(fsChecker.buildId),\n }\n\n async function handleRoute(\n route: (typeof routes)[0]\n ): Promise<UnwrapPromise<ReturnType<typeof resolveRoutes>> | void> {\n let curPathname = parsedUrl.pathname || '/'\n\n if (config.i18n && route.internal) {\n const hadTrailingSlash = curPathname.endsWith('/')\n\n if (config.basePath) {\n curPathname = removePathPrefix(curPathname, config.basePath)\n }\n const hadBasePath = curPathname !== parsedUrl.pathname\n\n const localeResult = normalizeLocalePath(\n curPathname,\n config.i18n.locales\n )\n const isDefaultLocale = localeResult.detectedLocale === defaultLocale\n\n if (isDefaultLocale) {\n curPathname =\n localeResult.pathname === '/' && hadBasePath\n ? config.basePath\n : addPathPrefix(\n localeResult.pathname,\n hadBasePath ? config.basePath : ''\n )\n } else if (hadBasePath) {\n curPathname =\n curPathname === '/'\n ? config.basePath\n : addPathPrefix(curPathname, config.basePath)\n }\n\n if ((isDefaultLocale || hadBasePath) && hadTrailingSlash) {\n curPathname = maybeAddTrailingSlash(curPathname)\n }\n }\n let params = route.match(curPathname)\n\n if ((route.has || route.missing) && params) {\n const hasParams = matchHas(\n req,\n parsedUrl.query,\n route.has,\n route.missing\n )\n if (hasParams) {\n Object.assign(params, hasParams)\n } else {\n params = false\n }\n }\n\n if (params) {\n if (\n fsChecker.exportPathMapRoutes &&\n route.name === 'before_files_end'\n ) {\n for (const exportPathMapRoute of fsChecker.exportPathMapRoutes) {\n const result = await handleRoute(exportPathMapRoute)\n\n if (result) {\n return result\n }\n }\n }\n\n if (route.name === 'middleware_next_data' && parsedUrl.pathname) {\n if (fsChecker.getMiddlewareMatchers()?.length) {\n let normalized = parsedUrl.pathname\n\n // Remove the base path if it exists.\n const hadBasePath = normalizers.basePath?.match(parsedUrl.pathname)\n if (hadBasePath && normalizers.basePath) {\n normalized = normalizers.basePath.normalize(normalized, true)\n }\n\n let updated = false\n if (normalizers.data.match(normalized)) {\n updated = true\n addRequestMeta(req, 'isNextDataReq', true)\n normalized = normalizers.data.normalize(normalized, true)\n }\n\n if (config.i18n) {\n const curLocaleResult = normalizeLocalePath(\n normalized,\n config.i18n.locales\n )\n\n if (curLocaleResult.detectedLocale) {\n addRequestMeta(req, 'locale', curLocaleResult.detectedLocale)\n }\n }\n\n // If we updated the pathname, and it had a base path, re-add the\n // base path.\n if (updated) {\n if (hadBasePath) {\n normalized = path.posix.join(config.basePath, normalized)\n }\n\n // Re-add the trailing slash (if required).\n normalized = maybeAddTrailingSlash(normalized)\n\n parsedUrl.pathname = normalized\n }\n }\n }\n\n if (route.name === 'check_fs') {\n const pathname = parsedUrl.pathname || '/'\n\n if (invokedOutputs?.has(pathname) || checkLocaleApi(pathname)) {\n return\n }\n const output = await fsChecker.getItem(pathname)\n\n if (\n output &&\n !(\n config.i18n &&\n initialLocaleResult?.detectedLocale &&\n pathHasPrefix(pathname, '/api')\n )\n ) {\n if (\n config.useFileSystemPublicRoutes ||\n didRewrite ||\n (output.type !== 'appFile' && output.type !== 'pageFile')\n ) {\n matchedOutput = output\n\n if (output.locale) {\n addRequestMeta(req, 'locale', output.locale)\n }\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n matchedOutput,\n }\n }\n }\n }\n\n if (!opts.minimalMode && route.name === 'middleware') {\n const match = fsChecker.getMiddlewareMatchers()\n let maybeDecodedPathname = parsedUrl.pathname || '/'\n\n try {\n maybeDecodedPathname = decodeURIComponent(maybeDecodedPathname)\n } catch {\n /* non-fatal we can't decode so can't match it */\n }\n\n if (\n // @ts-expect-error BaseNextRequest stuff\n match?.(parsedUrl.pathname, req, parsedUrl.query) ||\n match?.(\n maybeDecodedPathname,\n // @ts-expect-error BaseNextRequest stuff\n req,\n parsedUrl.query\n )\n ) {\n if (ensureMiddleware) {\n await ensureMiddleware(req.url)\n }\n\n const serverResult =\n await renderServer?.initialize(renderServerOpts)\n\n if (!serverResult) {\n throw new Error(`Failed to initialize render server \"middleware\"`)\n }\n\n addRequestMeta(req, 'invokePath', '')\n addRequestMeta(req, 'invokeOutput', '')\n addRequestMeta(req, 'invokeQuery', {})\n addRequestMeta(req, 'middlewareInvoke', true)\n debug('invoking middleware', req.url, req.headers)\n\n let middlewareRes: Response | undefined = undefined\n let bodyStream: ReadableStream | undefined = undefined\n try {\n try {\n await serverResult.requestHandler(req, res, parsedUrl)\n } catch (err: any) {\n if (!('result' in err) || !('response' in err.result)) {\n throw err\n }\n middlewareRes = err.result.response as Response\n res.statusCode = middlewareRes.status\n\n if (middlewareRes.body) {\n bodyStream = middlewareRes.body\n } else if (middlewareRes.status) {\n bodyStream = new ReadableStream({\n start(controller) {\n controller.enqueue('')\n controller.close()\n },\n })\n }\n }\n } catch (e) {\n // If the client aborts before we can receive a response object\n // (when the headers are flushed), then we can early exit without\n // further processing.\n if (isAbortError(e)) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n }\n }\n throw e\n }\n\n if (res.closed || res.finished || !middlewareRes) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n }\n }\n\n const middlewareHeaders = toNodeOutgoingHttpHeaders(\n middlewareRes.headers\n ) as Record<string, string | string[] | undefined>\n\n debug('middleware res', middlewareRes.status, middlewareHeaders)\n\n if (middlewareHeaders['x-middleware-override-headers']) {\n const overriddenHeaders: Set<string> = new Set()\n let overrideHeaders: string | string[] =\n middlewareHeaders['x-middleware-override-headers']\n\n if (typeof overrideHeaders === 'string') {\n overrideHeaders = overrideHeaders.split(',')\n }\n\n for (const key of overrideHeaders) {\n overriddenHeaders.add(key.trim())\n }\n delete middlewareHeaders['x-middleware-override-headers']\n\n // Delete headers.\n for (const key of Object.keys(req.headers)) {\n if (!overriddenHeaders.has(key)) {\n delete req.headers[key]\n }\n }\n\n // Update or add headers.\n for (const key of overriddenHeaders.keys()) {\n const valueKey = 'x-middleware-request-' + key\n const newValue = middlewareHeaders[valueKey]\n const oldValue = req.headers[key]\n\n if (oldValue !== newValue) {\n req.headers[key] = newValue === null ? undefined : newValue\n }\n delete middlewareHeaders[valueKey]\n }\n }\n\n if (\n !middlewareHeaders['x-middleware-rewrite'] &&\n !middlewareHeaders['x-middleware-next'] &&\n !middlewareHeaders['location']\n ) {\n middlewareHeaders['x-middleware-refresh'] = '1'\n }\n delete middlewareHeaders['x-middleware-next']\n\n for (const [key, value] of Object.entries({\n ...filterReqHeaders(middlewareHeaders, ipcForbiddenHeaders),\n })) {\n if (\n [\n 'content-length',\n 'x-middleware-rewrite',\n 'x-middleware-redirect',\n 'x-middleware-refresh',\n ].includes(key)\n ) {\n continue\n }\n\n // for set-cookie, the header shouldn't be added to the response\n // as it's only needed for the request to the middleware function.\n if (key === 'x-middleware-set-cookie') {\n req.headers[key] = value\n continue\n }\n\n if (value) {\n resHeaders[key] = value\n req.headers[key] = value\n }\n }\n\n if (middlewareHeaders['x-middleware-rewrite']) {\n const value = middlewareHeaders['x-middleware-rewrite'] as string\n const destination = getRelativeURL(value, initUrl)\n resHeaders['x-middleware-rewrite'] = destination\n\n parsedUrl = url.parse(destination, true)\n\n if (parsedUrl.protocol) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n }\n }\n\n if (config.i18n) {\n const curLocaleResult = normalizeLocalePath(\n parsedUrl.pathname || '',\n config.i18n.locales\n )\n\n if (curLocaleResult.detectedLocale) {\n addRequestMeta(req, 'locale', curLocaleResult.detectedLocale)\n }\n }\n }\n\n if (middlewareHeaders['location']) {\n const value = middlewareHeaders['location'] as string\n\n // Only process Location header as a redirect if it has a proper redirect status\n // This prevents a Location header with non-redirect status from being treated as a redirect\n const isRedirectStatus = allowedStatusCodes.has(\n middlewareRes.status\n )\n\n if (isRedirectStatus) {\n // Process as redirect: update parsedUrl and convert to relative URL\n const rel = getRelativeURL(value, initUrl)\n resHeaders['location'] = rel\n parsedUrl = url.parse(rel, true)\n\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n statusCode: middlewareRes.status,\n }\n } else {\n // Not a redirect: just pass through the Location header\n resHeaders['location'] = value\n\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n bodyStream,\n statusCode: middlewareRes.status,\n }\n }\n }\n\n if (middlewareHeaders['x-middleware-refresh']) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n bodyStream,\n statusCode: middlewareRes.status,\n }\n }\n }\n }\n\n // handle redirect\n if (\n ('statusCode' in route || 'permanent' in route) &&\n route.destination\n ) {\n const { parsedDestination } = prepareDestination({\n appendParamsToQuery: false,\n destination: route.destination,\n params: params,\n query: parsedUrl.query,\n })\n\n const { query } = parsedDestination\n delete (parsedDestination as any).query\n\n parsedDestination.search = stringifyQuery(req as any, query)\n\n parsedDestination.pathname = normalizeRepeatedSlashes(\n parsedDestination.pathname\n )\n\n return {\n finished: true,\n // @ts-expect-error custom ParsedUrl\n parsedUrl: parsedDestination,\n statusCode: getRedirectStatus(route),\n }\n }\n\n // handle headers\n if (route.headers) {\n const hasParams = Object.keys(params).length > 0\n for (const header of route.headers) {\n let { key, value } = header\n if (hasParams) {\n key = compileNonPath(key, params)\n value = compileNonPath(value, params)\n }\n\n if (key.toLowerCase() === 'set-cookie') {\n if (!Array.isArray(resHeaders[key])) {\n const val = resHeaders[key]\n resHeaders[key] = typeof val === 'string' ? [val] : []\n }\n ;(resHeaders[key] as string[]).push(value)\n } else {\n resHeaders[key] = value\n }\n }\n }\n\n // handle rewrite\n if (route.destination) {\n let rewriteParams = params\n\n try {\n // An interception rewrite might reference a dynamic param for a route the user\n // is currently on, which wouldn't be extractable from the matched route params.\n // This attempts to extract the dynamic params from the provided router state.\n if (isInterceptionRouteRewrite(route as Rewrite)) {\n const stateHeader =\n req.headers[NEXT_ROUTER_STATE_TREE_HEADER.toLowerCase()]\n\n if (stateHeader) {\n rewriteParams = {\n ...getSelectedParams(\n parseAndValidateFlightRouterState(stateHeader)\n ),\n ...params,\n }\n }\n }\n } catch (err) {\n // this is a no-op -- we couldn't extract dynamic params from the provided router state,\n // so we'll just use the params from the route matcher\n }\n\n // We extract the search params of the destination so we can set it on\n // the response headers. We don't want to use the following\n // `parsedDestination` as the query object is mutated.\n const { search: destinationSearch, pathname: destinationPathname } =\n parseDestination({\n destination: route.destination,\n params: rewriteParams,\n query: parsedUrl.query,\n })\n\n const { parsedDestination } = prepareDestination({\n appendParamsToQuery: true,\n destination: route.destination,\n params: rewriteParams,\n query: parsedUrl.query,\n })\n\n if (parsedDestination.protocol) {\n return {\n // @ts-expect-error custom ParsedUrl\n parsedUrl: parsedDestination,\n finished: true,\n }\n }\n\n // Set the rewrite headers only if this is a RSC request.\n if (req.headers[RSC_HEADER.toLowerCase()] === '1') {\n // We set the rewritten path and query headers on the response now\n // that we know that the it's not an external rewrite.\n if (parsedUrl.pathname !== destinationPathname) {\n res.setHeader(NEXT_REWRITTEN_PATH_HEADER, destinationPathname)\n }\n if (destinationSearch) {\n res.setHeader(\n NEXT_REWRITTEN_QUERY_HEADER,\n // remove the leading ? from the search\n destinationSearch.slice(1)\n )\n }\n }\n\n if (config.i18n) {\n const curLocaleResult = normalizeLocalePath(\n removePathPrefix(parsedDestination.pathname, config.basePath),\n config.i18n.locales\n )\n\n if (curLocaleResult.detectedLocale) {\n addRequestMeta(req, 'locale', curLocaleResult.detectedLocale)\n }\n }\n didRewrite = true\n parsedUrl.pathname = parsedDestination.pathname\n Object.assign(parsedUrl.query, parsedDestination.query)\n }\n\n // handle check: true\n if (route.check) {\n const output = await checkTrue()\n\n if (output) {\n return {\n parsedUrl,\n resHeaders,\n finished: true,\n matchedOutput: output,\n }\n }\n }\n }\n }\n\n for (const route of routes) {\n const result = await handleRoute(route)\n if (result) {\n return result\n }\n }\n\n return {\n finished,\n parsedUrl,\n resHeaders,\n matchedOutput,\n }\n }\n\n return resolveRoutes\n}\n"],"names":["url","path","setupDebug","getCloneableBody","filterReqHeaders","ipcForbiddenHeaders","stringifyQuery","formatHostname","toNodeOutgoingHttpHeaders","isAbortError","getHostname","getRedirectStatus","allowedStatusCodes","normalizeRepeatedSlashes","getRelativeURL","addPathPrefix","pathHasPrefix","detectDomainLocale","normalizeLocalePath","removePathPrefix","NextDataPathnameNormalizer","BasePathPathnameNormalizer","addRequestMeta","compileNonPath","matchHas","parseDestination","prepareDestination","NEXT_REWRITTEN_PATH_HEADER","NEXT_REWRITTEN_QUERY_HEADER","NEXT_ROUTER_STATE_TREE_HEADER","RSC_HEADER","getSelectedParams","isInterceptionRouteRewrite","parseAndValidateFlightRouterState","debug","getResolveRoutes","fsChecker","config","opts","renderServer","renderServerOpts","ensureMiddleware","routes","match","name","minimalMode","headers","redirects","rewrites","beforeFiles","afterFiles","check","fallback","resolveRoutes","req","res","isUpgradeReq","invokedOutputs","finished","resHeaders","matchedOutput","parsedUrl","parse","didRewrite","urlParts","split","urlNoQuery","statusCode","protocol","socket","encrypted","includes","initUrl","experimental","trustHostHeader","host","port","hostname","query","maybeAddTrailingSlash","pathname","trailingSlash","skipMiddlewareUrlNormalize","endsWith","domainLocale","defaultLocale","initialLocaleResult","undefined","i18n","hadTrailingSlash","hadBasePath","basePath","normalizedPath","assetPrefix","locales","domains","detectedLocale","startsWith","checkLocaleApi","checkTrue","has","output","getItem","useFileSystemPublicRoutes","type","dynamicRoutes","getDynamicRoutes","curPathname","substring","length","localeResult","handleLocale","route","page","params","pageOutput","normalizers","data","buildId","handleRoute","internal","isDefaultLocale","missing","hasParams","Object","assign","exportPathMapRoutes","exportPathMapRoute","result","getMiddlewareMatchers","normalized","normalize","updated","curLocaleResult","posix","join","locale","maybeDecodedPathname","decodeURIComponent","serverResult","initialize","Error","middlewareRes","bodyStream","requestHandler","err","response","status","body","ReadableStream","start","controller","enqueue","close","e","closed","middlewareHeaders","overriddenHeaders","Set","overrideHeaders","key","add","trim","keys","valueKey","newValue","oldValue","value","entries","destination","isRedirectStatus","rel","parsedDestination","appendParamsToQuery","search","header","toLowerCase","Array","isArray","val","push","rewriteParams","stateHeader","destinationSearch","destinationPathname","setHeader","slice"],"mappings":"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","ignoreList":[0]}
@@ -103,7 +103,7 @@ export async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup,
103
103
  export async function startServer(serverOptions) {
104
104
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
105
105
  let { port } = serverOptions;
106
- process.title = `next-server (v${"15.4.6"})`;
106
+ process.title = `next-server (v${"15.4.7"})`;
107
107
  let handlersReady = ()=>{};
108
108
  let handlersError = ()=>{};
109
109
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -1,6 +1,6 @@
1
1
  export function isStableBuild() {
2
2
  var _process_env___NEXT_VERSION;
3
- return !((_process_env___NEXT_VERSION = "15.4.6") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
3
+ return !((_process_env___NEXT_VERSION = "15.4.7") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
4
4
  }
5
5
  export class CanaryOnlyError extends Error {
6
6
  constructor(arg){
@@ -144,7 +144,7 @@ async function createHotReloaderTurbopack(opts, serverFields, distDir, resetFetc
144
144
  }
145
145
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
146
146
  const hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
147
- version: "15.4.6"
147
+ version: "15.4.7"
148
148
  });
149
149
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
150
150
  // of the current `next dev` invocation.
@@ -261,7 +261,7 @@ class HotReloaderWebpack {
261
261
  this.previewProps = previewProps;
262
262
  this.rewrites = rewrites;
263
263
  this.hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
264
- version: "15.4.6"
264
+ version: "15.4.7"
265
265
  });
266
266
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
267
267
  // of the current `next dev` invocation.
@@ -80,7 +80,7 @@ function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures, maxEx
80
80
  } else {
81
81
  bundlerSuffix = '';
82
82
  }
83
- _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.4.6"}`))}${bundlerSuffix}`);
83
+ _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.4.7"}`))}${bundlerSuffix}`);
84
84
  if (appUrl) {
85
85
  _log.bootstrap(`- Local: ${appUrl}`);
86
86
  }
@@ -434,15 +434,31 @@ function getResolveRoutes(fsChecker, config, opts, renderServer, renderServerOpt
434
434
  }
435
435
  if (middlewareHeaders['location']) {
436
436
  const value = middlewareHeaders['location'];
437
- const rel = (0, _relativizeurl.getRelativeURL)(value, initUrl);
438
- resHeaders['location'] = rel;
439
- parsedUrl = _url.default.parse(rel, true);
440
- return {
441
- parsedUrl,
442
- resHeaders,
443
- finished: true,
444
- statusCode: middlewareRes.status
445
- };
437
+ // Only process Location header as a redirect if it has a proper redirect status
438
+ // This prevents a Location header with non-redirect status from being treated as a redirect
439
+ const isRedirectStatus = _redirectstatus.allowedStatusCodes.has(middlewareRes.status);
440
+ if (isRedirectStatus) {
441
+ // Process as redirect: update parsedUrl and convert to relative URL
442
+ const rel = (0, _relativizeurl.getRelativeURL)(value, initUrl);
443
+ resHeaders['location'] = rel;
444
+ parsedUrl = _url.default.parse(rel, true);
445
+ return {
446
+ parsedUrl,
447
+ resHeaders,
448
+ finished: true,
449
+ statusCode: middlewareRes.status
450
+ };
451
+ } else {
452
+ // Not a redirect: just pass through the Location header
453
+ resHeaders['location'] = value;
454
+ return {
455
+ parsedUrl,
456
+ resHeaders,
457
+ finished: true,
458
+ bodyStream,
459
+ statusCode: middlewareRes.status
460
+ };
461
+ }
446
462
  }
447
463
  if (middlewareHeaders['x-middleware-refresh']) {
448
464
  return {