{"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 { NextConfigRuntime } 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 } from '../../../lib/load-custom-routes'\nimport type { UnwrapPromise } from '../../../lib/coalesced-function'\nimport type { NextUrlWithParsedQuery } from '../../request-meta'\n\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 { parseUrl } from '../../../shared/lib/router/utils/parse-url'\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  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  RSC_HEADER,\n} from '../../../client/components/app-router-headers'\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: NextConfigRuntime,\n  opts: Parameters<typeof initialize>[0],\n  renderServer: RenderServer,\n  renderServerOpts: Parameters<RenderServer['initialize']>[0],\n  ensureMiddleware?: (url?: string) => Promise<void>\n) {\n  let clientHashes: Record<string, string> | undefined = undefined\n  if (process.env.__NEXT_TEST_MODE && process.env.IS_TURBOPACK_TEST) {\n    try {\n      clientHashes = JSON.parse(\n        (require('fs') as typeof import('fs')).readFileSync(\n          path.join(opts.dir, config.distDir, 'immutable-static-hashes.json'),\n          'utf8'\n        )\n      )\n    } catch {}\n  }\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  let routes: Route[] | null = null\n  const calculateRoutes = () => {\n    return [\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\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[]> | null\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 = parseUrl(req.url || '') as NextUrlWithParsedQuery\n    let didRewrite = false\n\n    const urlParts = (req.url || '').split('?', 1)\n    const urlNoQuery = urlParts[0]\n\n    // Refresh the routes every time in development mode, but only initialize them\n    // once in production. We don't need to recompute these every time unless the routes\n    // are changing like in development, and the performance can be costly.\n    if (!routes || opts.dev) {\n      routes = calculateRoutes()\n    }\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 = parseUrl(normalizeRepeatedSlashes(req.url!))\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      const bodySizeLimit = config.experimental.proxyClientMaxBodySize as\n        | number\n        | undefined\n      addRequestMeta(req, 'clonableBody', getCloneableBody(req, bodySizeLimit))\n    }\n\n    const maybeAddTrailingSlash = (pathname: string) => {\n      if (\n        config.trailingSlash &&\n        !config.skipProxyUrlNormalize &&\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: Route\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 =\n                  normalized === '/'\n                    ? config.basePath\n                    : 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\n              if (\n                process.env.__NEXT_TEST_MODE &&\n                process.env.IS_TURBOPACK_TEST &&\n                output.type === 'nextStaticFolder' &&\n                config.deploymentId\n              ) {\n                let useImmutableToken =\n                  config.experimental.immutableAssetToken &&\n                  clientHashes![`static${decodeURI(output.itemPath)}`]\n\n                const expectedToken = useImmutableToken\n                  ? config.experimental.immutableAssetToken\n                  : config.deploymentId\n                if (parsedUrl.query.dpl !== expectedToken) {\n                  console.error(\n                    `Invalid dpl query param: ${req.url}, expected: ${expectedToken}`\n                  )\n                  return {\n                    finished: true,\n                    parsedUrl,\n                    resHeaders,\n                    matchedOutput: null,\n                  }\n                }\n              }\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            if (opts.dev) {\n              addRequestMeta(\n                req,\n                'devRequestTimingMiddlewareStart',\n                process.hrtime.bigint()\n              )\n            }\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              } finally {\n                if (opts.dev) {\n                  addRequestMeta(\n                    req,\n                    'devRequestTimingMiddlewareEnd',\n                    process.hrtime.bigint()\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 = parseUrl(destination)\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 = parseUrl(rel)\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            parsedUrl: parsedDestination,\n            resHeaders: null,\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          const { parsedDestination } = prepareDestination({\n            appendParamsToQuery: true,\n            destination: route.destination,\n            params: rewriteParams,\n            query: parsedUrl.query,\n          })\n\n          // Check to see if this is a non-relative rewrite. If it is, we need\n          // to check to see if it's an allowed origin to receive the rewritten\n          // headers.\n          const parsedDestinationOrigin = parsedDestination.origin\n          const isAllowedOrigin = parsedDestinationOrigin\n            ? config.experimental.clientParamParsingOrigins?.some((origin) =>\n                new RegExp(origin).test(parsedDestinationOrigin)\n              )\n            : false\n\n          // Set the rewrite headers only if this is a RSC request.\n          if (\n            req.headers[RSC_HEADER] === '1' &&\n            (!parsedDestination.origin || isAllowedOrigin)\n          ) {\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 !== parsedDestination.pathname) {\n              res.setHeader(\n                NEXT_REWRITTEN_PATH_HEADER,\n                parsedDestination.pathname\n              )\n            }\n            if (parsedUrl.search !== parsedDestination.search) {\n              res.setHeader(\n                NEXT_REWRITTEN_QUERY_HEADER,\n                // remove the leading ? from the search\n                parsedDestination.search.slice(1)\n              )\n            }\n          }\n\n          if (parsedDestination.protocol) {\n            return {\n              parsedUrl: parsedDestination,\n              resHeaders: null,\n              finished: true,\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        if (result.matchedOutput) {\n          // handle onMatchHeaders\n          for (const onMatchHeaders of fsChecker.onMatchHeaders) {\n            await handleRoute(onMatchHeaders)\n          }\n        }\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":["path","setupDebug","getCloneableBody","filterReqHeaders","ipcForbiddenHeaders","stringifyQuery","formatHostname","toNodeOutgoingHttpHeaders","isAbortError","getHostname","getRedirectStatus","allowedStatusCodes","normalizeRepeatedSlashes","getRelativeURL","addPathPrefix","pathHasPrefix","parseUrl","detectDomainLocale","normalizeLocalePath","removePathPrefix","NextDataPathnameNormalizer","BasePathPathnameNormalizer","addRequestMeta","compileNonPath","matchHas","prepareDestination","NEXT_REWRITTEN_PATH_HEADER","NEXT_REWRITTEN_QUERY_HEADER","RSC_HEADER","debug","getResolveRoutes","fsChecker","config","opts","renderServer","renderServerOpts","ensureMiddleware","clientHashes","undefined","process","env","__NEXT_TEST_MODE","IS_TURBOPACK_TEST","JSON","parse","require","readFileSync","join","dir","distDir","routes","calculateRoutes","match","name","minimalMode","headers","redirects","rewrites","beforeFiles","afterFiles","check","fallback","resolveRoutes","req","res","isUpgradeReq","invokedOutputs","finished","resHeaders","matchedOutput","parsedUrl","url","didRewrite","urlParts","split","urlNoQuery","dev","statusCode","protocol","socket","encrypted","includes","initUrl","experimental","trustHostHeader","host","port","hostname","query","bodySizeLimit","proxyClientMaxBodySize","maybeAddTrailingSlash","pathname","trailingSlash","skipProxyUrlNormalize","endsWith","domainLocale","defaultLocale","initialLocaleResult","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","locale","deploymentId","useImmutableToken","immutableAssetToken","decodeURI","itemPath","expectedToken","dpl","console","error","maybeDecodedPathname","decodeURIComponent","serverResult","initialize","Error","hrtime","bigint","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","parsedDestinationOrigin","origin","isAllowedOrigin","clientParamParsingOrigins","some","RegExp","test","setHeader","slice","onMatchHeaders"],"mappings":"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","ignoreList":[0]}