{"version":3,"sources":["../../lib/load-custom-routes.ts"],"names":["allowedStatusCodes","Set","allowedHasTypes","namedGroupsRegex","getRedirectStatus","route","statusCode","permanent","PERMANENT_REDIRECT_STATUS","TEMPORARY_REDIRECT_STATUS","normalizeRouteRegex","regex","replace","checkRedirect","invalidParts","hadInvalidStatus","has","push","checkHeader","Array","isArray","headers","header","key","value","tryParsePath","handleUrl","result","routePath","parsedDestination","pathname","hash","tokens","pathToRegexp","parse","tokensToRegexp","err","errMatches","message","match","position","parseInt","console","error","fill","join","checkCustomRoutes","routes","type","process","exit","numInvalidRoutes","hadInvalidHas","allowedKeys","add","JSON","stringify","basePath","destination","startsWith","source","keys","Object","invalidKeys","filter","locale","invalidHasItems","hasItem","invalidHasParts","length","itemStr","_route","sourceTokens","hasSegments","matchAll","unnamedInDest","token","name","unnamedIndex","RegExp","size","destTokens","destinationParseFailed","sourceSegments","map","item","Boolean","invalidDestSegments","hasInvalidKeys","hasInvalidParts","processRoutes","config","_routes","newRoutes","defaultLocales","i18n","domains","defaultLocale","base","http","domain","r","srcBasePath","isExternal","destBasePath","forEach","locales","trailingSlash","loadRedirects","redirects","loadRewrites","rewrites","beforeFiles","afterFiles","fallback","_rewrites","every","loadHeaders","loadCustomRoutes","Promise","all","unshift","undefined","internal"],"mappings":"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","sourcesContent":["import { parse as parseUrl } from 'url'\nimport { NextConfig } from '../next-server/server/config'\nimport * as pathToRegexp from 'next/dist/compiled/path-to-regexp'\nimport escapeStringRegexp from 'next/dist/compiled/escape-string-regexp'\nimport {\n PERMANENT_REDIRECT_STATUS,\n TEMPORARY_REDIRECT_STATUS,\n} from '../next-server/lib/constants'\n\nexport type RouteHas =\n | {\n type: 'header' | 'query' | 'cookie'\n key: string\n value?: string\n }\n | {\n type: 'host'\n key?: undefined\n value: string\n }\n\nexport type Rewrite = {\n source: string\n destination: string\n basePath?: false\n locale?: false\n has?: RouteHas[]\n}\n\nexport type Header = {\n source: string\n basePath?: false\n locale?: false\n headers: Array<{ key: string; value: string }>\n has?: RouteHas[]\n}\n\n// internal type used for validation (not user facing)\nexport type Redirect = {\n source: string\n destination: string\n basePath?: false\n locale?: false\n has?: RouteHas[]\n statusCode?: number\n permanent?: boolean\n}\n\nexport const allowedStatusCodes = new Set([301, 302, 303, 307, 308])\nconst allowedHasTypes = new Set(['header', 'cookie', 'query', 'host'])\nconst namedGroupsRegex = /\\(\\?<([a-zA-Z][a-zA-Z0-9]*)>/g\n\nexport function getRedirectStatus(route: {\n statusCode?: number\n permanent?: boolean\n}): number {\n return (\n route.statusCode ||\n (route.permanent ? PERMANENT_REDIRECT_STATUS : TEMPORARY_REDIRECT_STATUS)\n )\n}\n\nexport function normalizeRouteRegex(regex: string) {\n // clean up un-necessary escaping from regex.source which turns / into \\\\/\n return regex.replace(/\\\\\\//g, '/')\n}\n\nfunction checkRedirect(\n route: Redirect\n): { invalidParts: string[]; hadInvalidStatus: boolean } {\n const invalidParts: string[] = []\n let hadInvalidStatus: boolean = false\n\n if (route.statusCode && !allowedStatusCodes.has(route.statusCode)) {\n hadInvalidStatus = true\n invalidParts.push(`\\`statusCode\\` is not undefined or valid statusCode`)\n }\n if (typeof route.permanent !== 'boolean' && !route.statusCode) {\n invalidParts.push(`\\`permanent\\` is not set to \\`true\\` or \\`false\\``)\n }\n\n return {\n invalidParts,\n hadInvalidStatus,\n }\n}\n\nfunction checkHeader(route: Header): string[] {\n const invalidParts: string[] = []\n\n if (!Array.isArray(route.headers)) {\n invalidParts.push('`headers` field must be an array')\n } else {\n for (const header of route.headers) {\n if (!header || typeof header !== 'object') {\n invalidParts.push(\n \"`headers` items must be object with { key: '', value: '' }\"\n )\n break\n }\n if (typeof header.key !== 'string') {\n invalidParts.push('`key` in header item must be string')\n break\n }\n if (typeof header.value !== 'string') {\n invalidParts.push('`value` in header item must be string')\n break\n }\n }\n }\n return invalidParts\n}\n\ntype ParseAttemptResult = {\n error?: boolean\n tokens?: pathToRegexp.Token[]\n}\n\nfunction tryParsePath(route: string, handleUrl?: boolean): ParseAttemptResult {\n const result: ParseAttemptResult = {}\n let routePath = route\n\n try {\n if (handleUrl) {\n const parsedDestination = parseUrl(route, true)\n routePath = `${parsedDestination.pathname!}${\n parsedDestination.hash || ''\n }`\n }\n\n // Make sure we can parse the source properly\n result.tokens = pathToRegexp.parse(routePath)\n pathToRegexp.tokensToRegexp(result.tokens)\n } catch (err) {\n // If there is an error show our error link but still show original error or a formatted one if we can\n const errMatches = err.message.match(/at (\\d{0,})/)\n\n if (errMatches) {\n const position = parseInt(errMatches[1], 10)\n console.error(\n `\\nError parsing \\`${route}\\` ` +\n `https://nextjs.org/docs/messages/invalid-route-source\\n` +\n `Reason: ${err.message}\\n\\n` +\n ` ${routePath}\\n` +\n ` ${new Array(position).fill(' ').join('')}^\\n`\n )\n } else {\n console.error(\n `\\nError parsing ${route} https://nextjs.org/docs/messages/invalid-route-source`,\n err\n )\n }\n result.error = true\n }\n\n return result\n}\n\nexport type RouteType = 'rewrite' | 'redirect' | 'header'\n\nfunction checkCustomRoutes(\n routes: Redirect[] | Header[] | Rewrite[],\n type: RouteType\n): void {\n if (!Array.isArray(routes)) {\n console.error(\n `Error: ${type}s must return an array, received ${typeof routes}.\\n` +\n `See here for more info: https://nextjs.org/docs/messages/routes-must-be-array`\n )\n process.exit(1)\n }\n\n let numInvalidRoutes = 0\n let hadInvalidStatus = false\n let hadInvalidHas = false\n\n const allowedKeys = new Set<string>(['source', 'basePath', 'locale', 'has'])\n\n if (type === 'rewrite') {\n allowedKeys.add('destination')\n }\n if (type === 'redirect') {\n allowedKeys.add('statusCode')\n allowedKeys.add('permanent')\n allowedKeys.add('destination')\n }\n if (type === 'header') {\n allowedKeys.add('headers')\n }\n\n for (const route of routes) {\n if (!route || typeof route !== 'object') {\n console.error(\n `The route ${JSON.stringify(\n route\n )} is not a valid object with \\`source\\` and \\`${\n type === 'header' ? 'headers' : 'destination'\n }\\``\n )\n numInvalidRoutes++\n continue\n }\n\n if (\n type === 'rewrite' &&\n (route as Rewrite).basePath === false &&\n !(\n (route as Rewrite).destination.startsWith('http://') ||\n (route as Rewrite).destination.startsWith('https://')\n )\n ) {\n console.error(\n `The route ${\n (route as Rewrite).source\n } rewrites urls outside of the basePath. Please use a destination that starts with \\`http://\\` or \\`https://\\` https://nextjs.org/docs/messages/invalid-external-rewrite`\n )\n numInvalidRoutes++\n continue\n }\n\n const keys = Object.keys(route)\n const invalidKeys = keys.filter((key) => !allowedKeys.has(key))\n const invalidParts: string[] = []\n\n if (typeof route.basePath !== 'undefined' && route.basePath !== false) {\n invalidParts.push('`basePath` must be undefined or false')\n }\n\n if (typeof route.locale !== 'undefined' && route.locale !== false) {\n invalidParts.push('`locale` must be undefined or false')\n }\n\n if (typeof route.has !== 'undefined' && !Array.isArray(route.has)) {\n invalidParts.push('`has` must be undefined or valid has object')\n hadInvalidHas = true\n } else if (route.has) {\n const invalidHasItems = []\n\n for (const hasItem of route.has) {\n let invalidHasParts = []\n\n if (!allowedHasTypes.has(hasItem.type)) {\n invalidHasParts.push(`invalid type \"${hasItem.type}\"`)\n }\n if (typeof hasItem.key !== 'string' && hasItem.type !== 'host') {\n invalidHasParts.push(`invalid key \"${hasItem.key}\"`)\n }\n if (\n typeof hasItem.value !== 'undefined' &&\n typeof hasItem.value !== 'string'\n ) {\n invalidHasParts.push(`invalid value \"${hasItem.value}\"`)\n }\n if (typeof hasItem.value === 'undefined' && hasItem.type === 'host') {\n invalidHasParts.push(`value is required for \"host\" type`)\n }\n\n if (invalidHasParts.length > 0) {\n invalidHasItems.push(\n `${invalidHasParts.join(', ')} for ${JSON.stringify(hasItem)}`\n )\n }\n }\n\n if (invalidHasItems.length > 0) {\n hadInvalidHas = true\n const itemStr = `item${invalidHasItems.length === 1 ? '' : 's'}`\n\n console.error(\n `Invalid \\`has\\` ${itemStr}:\\n` + invalidHasItems.join('\\n')\n )\n console.error()\n invalidParts.push(`invalid \\`has\\` ${itemStr} found`)\n }\n }\n\n if (!route.source) {\n invalidParts.push('`source` is missing')\n } else if (typeof route.source !== 'string') {\n invalidParts.push('`source` is not a string')\n } else if (!route.source.startsWith('/')) {\n invalidParts.push('`source` does not start with /')\n }\n\n if (type === 'header') {\n invalidParts.push(...checkHeader(route as Header))\n } else {\n let _route = route as Rewrite | Redirect\n if (!_route.destination) {\n invalidParts.push('`destination` is missing')\n } else if (typeof _route.destination !== 'string') {\n invalidParts.push('`destination` is not a string')\n } else if (\n type === 'rewrite' &&\n !_route.destination.match(/^(\\/|https:\\/\\/|http:\\/\\/)/)\n ) {\n invalidParts.push(\n '`destination` does not start with `/`, `http://`, or `https://`'\n )\n }\n }\n\n if (type === 'redirect') {\n const result = checkRedirect(route as Redirect)\n hadInvalidStatus = hadInvalidStatus || result.hadInvalidStatus\n invalidParts.push(...result.invalidParts)\n }\n\n let sourceTokens: pathToRegexp.Token[] | undefined\n\n if (typeof route.source === 'string' && route.source.startsWith('/')) {\n // only show parse error if we didn't already show error\n // for not being a string\n const { tokens, error } = tryParsePath(route.source)\n\n if (error) {\n invalidParts.push('`source` parse failed')\n }\n sourceTokens = tokens\n }\n const hasSegments = new Set<string>()\n\n if (route.has) {\n for (const hasItem of route.has) {\n if (!hasItem.value && hasItem.key) {\n hasSegments.add(hasItem.key)\n }\n\n if (hasItem.value) {\n for (const match of hasItem.value.matchAll(namedGroupsRegex)) {\n if (match[1]) {\n hasSegments.add(match[1])\n }\n }\n\n if (hasItem.type === 'host') {\n hasSegments.add('host')\n }\n }\n }\n }\n\n // make sure no unnamed patterns are attempted to be used in the\n // destination as this can cause confusion and is not allowed\n if (typeof (route as Rewrite).destination === 'string') {\n if (\n (route as Rewrite).destination.startsWith('/') &&\n Array.isArray(sourceTokens)\n ) {\n const unnamedInDest = new Set()\n\n for (const token of sourceTokens) {\n if (typeof token === 'object' && typeof token.name === 'number') {\n const unnamedIndex = new RegExp(`:${token.name}(?!\\\\d)`)\n if ((route as Rewrite).destination.match(unnamedIndex)) {\n unnamedInDest.add(`:${token.name}`)\n }\n }\n }\n\n if (unnamedInDest.size > 0) {\n invalidParts.push(\n `\\`destination\\` has unnamed params ${[...unnamedInDest].join(\n ', '\n )}`\n )\n } else {\n const {\n tokens: destTokens,\n error: destinationParseFailed,\n } = tryParsePath((route as Rewrite).destination, true)\n\n if (destinationParseFailed) {\n invalidParts.push('`destination` parse failed')\n } else {\n const sourceSegments = new Set(\n sourceTokens\n .map((item) => typeof item === 'object' && item.name)\n .filter(Boolean)\n )\n const invalidDestSegments = new Set()\n\n for (const token of destTokens!) {\n if (\n typeof token === 'object' &&\n !sourceSegments.has(token.name) &&\n !hasSegments.has(token.name as string)\n ) {\n invalidDestSegments.add(token.name)\n }\n }\n\n if (invalidDestSegments.size) {\n invalidParts.push(\n `\\`destination\\` has segments not in \\`source\\` or \\`has\\` (${[\n ...invalidDestSegments,\n ].join(', ')})`\n )\n }\n }\n }\n }\n }\n\n const hasInvalidKeys = invalidKeys.length > 0\n const hasInvalidParts = invalidParts.length > 0\n\n if (hasInvalidKeys || hasInvalidParts) {\n console.error(\n `${invalidParts.join(', ')}${\n invalidKeys.length\n ? (hasInvalidParts ? ',' : '') +\n ` invalid field${invalidKeys.length === 1 ? '' : 's'}: ` +\n invalidKeys.join(',')\n : ''\n } for route ${JSON.stringify(route)}`\n )\n console.error()\n numInvalidRoutes++\n }\n }\n\n if (numInvalidRoutes > 0) {\n if (hadInvalidStatus) {\n console.error(\n `\\nValid redirect statusCode values are ${[...allowedStatusCodes].join(\n ', '\n )}`\n )\n }\n if (hadInvalidHas) {\n console.error(\n `\\nValid \\`has\\` object shape is ${JSON.stringify(\n {\n type: [...allowedHasTypes].join(', '),\n key: 'the key to check for',\n value: 'undefined or a value string to match against',\n },\n null,\n 2\n )}`\n )\n }\n console.error()\n console.error(\n `Error: Invalid ${type}${numInvalidRoutes === 1 ? '' : 's'} found`\n )\n process.exit(1)\n }\n}\n\nexport interface CustomRoutes {\n headers: Header[]\n rewrites: {\n fallback: Rewrite[]\n afterFiles: Rewrite[]\n beforeFiles: Rewrite[]\n }\n redirects: Redirect[]\n}\n\nfunction processRoutes<T>(\n routes: T,\n config: NextConfig,\n type: 'redirect' | 'rewrite' | 'header'\n): T {\n const _routes = (routes as any) as Array<{\n source: string\n locale?: false\n basePath?: false\n destination?: string\n }>\n const newRoutes: typeof _routes = []\n const defaultLocales: Array<{\n locale: string\n base: string\n }> = []\n\n if (config.i18n && type === 'redirect') {\n for (const item of config.i18n?.domains || []) {\n defaultLocales.push({\n locale: item.defaultLocale,\n base: `http${item.http ? '' : 's'}://${item.domain}`,\n })\n }\n\n defaultLocales.push({\n locale: config.i18n.defaultLocale,\n base: '',\n })\n }\n\n for (const r of _routes) {\n const srcBasePath =\n config.basePath && r.basePath !== false ? config.basePath : ''\n const isExternal = !r.destination?.startsWith('/')\n const destBasePath = srcBasePath && !isExternal ? srcBasePath : ''\n\n if (config.i18n && r.locale !== false) {\n defaultLocales.forEach((item) => {\n let destination\n\n if (r.destination) {\n destination = item.base\n ? `${item.base}${destBasePath}${r.destination}`\n : `${destBasePath}${r.destination}`\n }\n\n newRoutes.push({\n ...r,\n destination,\n source: `${srcBasePath}/${item.locale}${r.source}`,\n })\n })\n\n r.source = `/:nextInternalLocale(${config.i18n.locales\n .map((locale: string) => escapeStringRegexp(locale))\n .join('|')})${\n r.source === '/' && !config.trailingSlash ? '' : r.source\n }`\n\n if (r.destination && r.destination?.startsWith('/')) {\n r.destination = `/:nextInternalLocale${\n r.destination === '/' && !config.trailingSlash ? '' : r.destination\n }`\n }\n }\n r.source = `${srcBasePath}${r.source}`\n\n if (r.destination) {\n r.destination = `${destBasePath}${r.destination}`\n }\n newRoutes.push(r)\n }\n return (newRoutes as any) as T\n}\n\nasync function loadRedirects(config: NextConfig) {\n if (typeof config.redirects !== 'function') {\n return []\n }\n let redirects = await config.redirects()\n checkCustomRoutes(redirects, 'redirect')\n return processRoutes(redirects, config, 'redirect')\n}\n\nasync function loadRewrites(config: NextConfig) {\n if (typeof config.rewrites !== 'function') {\n return {\n beforeFiles: [],\n afterFiles: [],\n fallback: [],\n }\n }\n const _rewrites = await config.rewrites()\n let beforeFiles: Rewrite[] = []\n let afterFiles: Rewrite[] = []\n let fallback: Rewrite[] = []\n\n if (\n !Array.isArray(_rewrites) &&\n typeof _rewrites === 'object' &&\n Object.keys(_rewrites).every(\n (key) =>\n key === 'beforeFiles' || key === 'afterFiles' || key === 'fallback'\n )\n ) {\n beforeFiles = _rewrites.beforeFiles || []\n afterFiles = _rewrites.afterFiles || []\n fallback = _rewrites.fallback || []\n } else {\n afterFiles = _rewrites as any\n }\n\n checkCustomRoutes(beforeFiles, 'rewrite')\n checkCustomRoutes(afterFiles, 'rewrite')\n checkCustomRoutes(fallback, 'rewrite')\n\n return {\n beforeFiles: processRoutes(beforeFiles, config, 'rewrite'),\n afterFiles: processRoutes(afterFiles, config, 'rewrite'),\n fallback: processRoutes(fallback, config, 'rewrite'),\n }\n}\n\nasync function loadHeaders(config: NextConfig) {\n if (typeof config.headers !== 'function') {\n return []\n }\n let headers = await config.headers()\n checkCustomRoutes(headers, 'header')\n return processRoutes(headers, config, 'header')\n}\n\nexport default async function loadCustomRoutes(\n config: NextConfig\n): Promise<CustomRoutes> {\n const [headers, rewrites, redirects] = await Promise.all([\n loadHeaders(config),\n loadRewrites(config),\n loadRedirects(config),\n ])\n\n if (config.trailingSlash) {\n redirects.unshift(\n {\n source: '/:file((?!\\\\.well-known(?:/.*)?)(?:[^/]+/)*[^/]+\\\\.\\\\w+)/',\n destination: '/:file',\n permanent: true,\n locale: config.i18n ? false : undefined,\n internal: true,\n } as Redirect,\n {\n source: '/:notfile((?!\\\\.well-known(?:/.*)?)(?:[^/]+/)*[^/\\\\.]+)',\n destination: '/:notfile/',\n permanent: true,\n locale: config.i18n ? false : undefined,\n internal: true,\n } as Redirect\n )\n if (config.basePath) {\n redirects.unshift({\n source: config.basePath,\n destination: config.basePath + '/',\n permanent: true,\n basePath: false,\n locale: config.i18n ? false : undefined,\n internal: true,\n } as Redirect)\n }\n } else {\n redirects.unshift({\n source: '/:path+/',\n destination: '/:path+',\n permanent: true,\n locale: config.i18n ? false : undefined,\n internal: true,\n } as Redirect)\n if (config.basePath) {\n redirects.unshift({\n source: config.basePath + '/',\n destination: config.basePath,\n permanent: true,\n basePath: false,\n locale: config.i18n ? false : undefined,\n internal: true,\n } as Redirect)\n }\n }\n\n return {\n headers,\n rewrites,\n redirects,\n }\n}\n"]}