expo-router 5.1.2 → 5.2.0-canary-20250611-f0afe80

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 (54) hide show
  1. package/build/fork/getStateFromPath-forks.d.ts.map +1 -1
  2. package/build/fork/getStateFromPath-forks.js +1 -4
  3. package/build/fork/getStateFromPath-forks.js.map +1 -1
  4. package/build/getRoutes.d.ts +1 -1
  5. package/build/getRoutes.d.ts.map +1 -1
  6. package/build/getRoutes.js +6 -14
  7. package/build/getRoutes.js.map +1 -1
  8. package/build/getRoutesCore.d.ts +2 -7
  9. package/build/getRoutesCore.d.ts.map +1 -1
  10. package/build/getRoutesCore.js +58 -86
  11. package/build/getRoutesCore.js.map +1 -1
  12. package/build/getRoutesRedirects.d.ts +2 -2
  13. package/build/getRoutesRedirects.d.ts.map +1 -1
  14. package/build/getRoutesRedirects.js +24 -18
  15. package/build/getRoutesRedirects.js.map +1 -1
  16. package/build/getRoutesSSR.d.ts +1 -1
  17. package/build/getRoutesSSR.d.ts.map +1 -1
  18. package/build/getRoutesSSR.js +3 -2
  19. package/build/getRoutesSSR.js.map +1 -1
  20. package/build/global-state/router-store.d.ts.map +1 -1
  21. package/build/global-state/router-store.js +0 -1
  22. package/build/global-state/router-store.js.map +1 -1
  23. package/build/link/Link.d.ts +56 -1
  24. package/build/link/Link.d.ts.map +1 -1
  25. package/build/link/Link.js +39 -3
  26. package/build/link/Link.js.map +1 -1
  27. package/build/typed-routes/generate.js +1 -1
  28. package/build/typed-routes/generate.js.map +1 -1
  29. package/build/useFocusEffect.d.ts.map +1 -1
  30. package/build/useFocusEffect.js +3 -5
  31. package/build/useFocusEffect.js.map +1 -1
  32. package/build/useScreens.js +1 -1
  33. package/build/useScreens.js.map +1 -1
  34. package/build/views/Screen.d.ts.map +1 -1
  35. package/build/views/Screen.js +40 -13
  36. package/build/views/Screen.js.map +1 -1
  37. package/build/views/Unmatched.d.ts.map +1 -1
  38. package/build/views/Unmatched.js +3 -9
  39. package/build/views/Unmatched.js.map +1 -1
  40. package/package.json +8 -9
  41. package/plugin/options.json +1 -29
  42. package/build/link/Redirect.d.ts +0 -59
  43. package/build/link/Redirect.d.ts.map +0 -1
  44. package/build/link/Redirect.js +0 -43
  45. package/build/link/Redirect.js.map +0 -1
  46. package/build/utils/stack.d.ts +0 -5
  47. package/build/utils/stack.d.ts.map +0 -1
  48. package/build/utils/stack.js +0 -10
  49. package/build/utils/stack.js.map +0 -1
  50. package/build/views/useSafeLayoutEffect.d.ts +0 -3
  51. package/build/views/useSafeLayoutEffect.d.ts.map +0 -1
  52. package/build/views/useSafeLayoutEffect.js +0 -6
  53. package/build/views/useSafeLayoutEffect.js.map +0 -1
  54. package/plugin/tsconfig.tsbuildinfo +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromPath-forks.d.ts","sourceRoot":"","sources":["../../src/fork/getStateFromPath-forks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getStateFromPath-forks.d.ts","sourceRoot":"","sources":["../../src/fork/getStateFromPath-forks.ts"],"names":[],"mappings":"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"}
@@ -404,10 +404,7 @@ function routePatternToRegex(pattern) {
404
404
  return new RegExp(`^(${pattern
405
405
  .split('/')
406
406
  .map((it) => {
407
- if (it.startsWith('(') && it.endsWith(')')) {
408
- return `${it}?`;
409
- }
410
- else if (it.startsWith(':')) {
407
+ if (it.startsWith(':')) {
411
408
  return `(([^/]+\\/)${it.endsWith('?') ? '?' : ''})`;
412
409
  }
413
410
  return `${it === '*' ? '.*' : (0, escape_string_regexp_1.default)(it)}\\/`;
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromPath-forks.js","sourceRoot":"","sources":["../../src/fork/getStateFromPath-forks.ts"],"names":[],"mappings":"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","sourcesContent":["import { InitialState } from '@react-navigation/native';\nimport escape from 'escape-string-regexp';\nimport * as queryString from 'query-string';\n\nimport type { InitialRouteConfig, Options, ParsedRoute, RouteConfig } from './getStateFromPath';\nimport { matchGroupName, stripGroupSegmentsFromPath } from '../matchers';\n\nexport type ExpoOptions = {\n previousSegments?: string[];\n};\n\nexport type ExpoRouteConfig = {\n type: 'static' | 'dynamic' | 'layout';\n userReadableName: string;\n isIndex: boolean;\n isInitial?: boolean;\n hasChildren: boolean;\n expandedRouteNames: string[];\n parts: string[];\n staticPartCount: number;\n};\n\n/**\n * In Expo Router, the params are available at all levels of the routing config\n * @param routes\n * @returns\n */\nexport function populateParams(routes?: ParsedRoute[], params?: Record<string, any>) {\n if (!routes || !params || Object.keys(params).length === 0) return;\n\n for (const route of routes) {\n Object.assign(route, { params });\n }\n\n return routes;\n}\n\nexport function safelyDecodeURIComponent(str: string) {\n try {\n return decodeURIComponent(str);\n } catch {\n return str;\n }\n}\n\nexport function getUrlWithReactNavigationConcessions(\n path: string,\n baseUrl: string | undefined = process.env.EXPO_BASE_URL\n) {\n let parsed: URL;\n try {\n parsed = new URL(path, 'https://phony.example');\n } catch {\n // Do nothing with invalid URLs.\n return {\n path,\n cleanUrl: '',\n nonstandardPathname: '',\n url: new URL('https://phony.example'),\n };\n }\n\n const pathname = parsed.pathname;\n const withoutBaseUrl = stripBaseUrl(pathname, baseUrl);\n const pathWithoutGroups = stripGroupSegmentsFromPath(stripBaseUrl(path, baseUrl));\n\n // Make sure there is a trailing slash\n return {\n // The slashes are at the end, not the beginning\n path,\n nonstandardPathname: withoutBaseUrl.replace(/^\\/+/g, '').replace(/\\/+$/g, '') + '/',\n url: parsed,\n pathWithoutGroups,\n };\n}\n\nexport function createConfig(\n screen: string,\n pattern: string,\n routeNames: string[],\n config: Record<string, any> = {}\n): Omit<ExpoRouteConfig, 'isInitial'> {\n const parts: string[] = [];\n let isDynamic = false;\n const isIndex = screen === 'index' || screen.endsWith('/index');\n let staticPartCount = 0;\n\n for (const part of pattern.split('/')) {\n if (part) {\n // If any part is dynamic, then the route is dynamic\n const isDynamicPart =\n part.startsWith(':') || part.startsWith('*') || part.includes('*not-found');\n\n isDynamic ||= isDynamicPart;\n\n if (!matchGroupName(part)) {\n parts.push(part);\n\n if (!isDynamicPart) {\n staticPartCount++;\n }\n }\n }\n }\n\n const hasChildren = config.screens ? !!Object.keys(config.screens)?.length : false;\n const type = hasChildren ? 'layout' : isDynamic ? 'dynamic' : 'static';\n\n if (isIndex) {\n parts.push('index');\n staticPartCount++;\n }\n\n return {\n type,\n isIndex,\n hasChildren,\n parts,\n staticPartCount,\n userReadableName: [...routeNames.slice(0, -1), config.path || screen].join('/'),\n // Don't include the __root route name\n expandedRouteNames: routeNames.slice(1).flatMap((name) => {\n return name.split('/');\n }),\n };\n}\n\nexport function assertScreens(options?: Options<object>): asserts options is Options<object> {\n if (!options?.screens) {\n throw Error(\"You must pass a 'screens' object to 'getStateFromPath' to generate a path.\");\n }\n}\n\nexport function configRegExp(config: RouteConfig) {\n return config.pattern\n ? new RegExp(`^(${config.pattern.split('/').map(formatRegexPattern).join('')})$`)\n : undefined;\n}\n\nexport function isDynamicPart(p: string) {\n return p.length > 1 && (p.startsWith(':') || p.startsWith('*'));\n}\n\nexport function replacePart(p: string) {\n return p.replace(/^[:*]/, '').replace(/\\?$/, '');\n}\n\nexport function getParamValue(p: string, value: string) {\n if (p.startsWith('*')) {\n const values = value.split('/').filter((v) => v !== '');\n return values.length === 0 && p.endsWith('?') ? undefined : values;\n } else {\n return value;\n }\n}\n\nfunction formatRegexPattern(it: string): string {\n // Allow spaces in file path names.\n it = it.replace(' ', '%20');\n\n if (it.startsWith(':')) {\n // TODO: Remove unused match group\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n } else if (it.startsWith('*')) {\n return `((.*\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n // Strip groups from the matcher\n if (matchGroupName(it) != null) {\n // Groups are optional segments\n // this enables us to match `/bar` and `/(foo)/bar` for the same route\n // NOTE(EvanBacon): Ignore this match in the regex to avoid capturing the group\n return `(?:${escape(it)}\\\\/)?`;\n }\n\n return escape(it) + `\\\\/`;\n}\n\nexport function handleUrlParams(route: ParsedRoute, params?: queryString.ParsedQuery) {\n if (params) {\n route.params = Object.assign(Object.create(null), route.params) as Record<string, any>;\n for (const [name, value] of Object.entries(params)) {\n if (route.params?.[name]) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Route '/${route.name}' with param '${name}' was specified both in the path and as a param, removing from path`\n );\n }\n }\n\n if (!route.params?.[name]) {\n route.params[name] = value;\n continue;\n }\n }\n\n if (Object.keys(route.params).length === 0) {\n delete route.params;\n }\n }\n}\n\nexport function spreadParamsAcrossAllStates(state: InitialState, params?: Record<string, any>) {\n while (state) {\n const route = state.routes[0];\n (route as any).params = Object.assign({}, route.params, params);\n }\n}\n\nexport function stripBaseUrl(\n path: string,\n baseUrl: string | undefined = process.env.EXPO_BASE_URL\n) {\n if (process.env.NODE_ENV !== 'development') {\n if (baseUrl) {\n return path.replace(/^\\/+/g, '/').replace(new RegExp(`^\\\\/?${escape(baseUrl)}`, 'g'), '');\n }\n }\n return path;\n}\n\nexport function matchForEmptyPath(configs: RouteConfig[]) {\n // We need to add special handling of empty path so navigation to empty path also works\n // When handling empty path, we should only look at the root level config\n\n // NOTE(EvanBacon): We only care about matching leaf nodes.\n const leafNodes = configs\n .filter((config) => !config.hasChildren)\n .map((value) => {\n return {\n ...value,\n // Collapse all levels of group segments before testing.\n // This enables `app/(one)/(two)/index.js` to be matched.\n path: stripGroupSegmentsFromPath(value.path),\n };\n });\n\n const match =\n leafNodes.find(\n (config) =>\n // NOTE(EvanBacon): Test leaf node index routes that either don't have a regex or match an empty string.\n config.path === '' && (!config.regex || config.regex.test(''))\n ) ??\n leafNodes.find(\n (config) =>\n // NOTE(EvanBacon): Test leaf node dynamic routes that match an empty string.\n config.path.startsWith(':') && config.regex!.test('')\n ) ??\n // NOTE(EvanBacon): Test leaf node deep dynamic routes that match a slash.\n // This should be done last to enable dynamic routes having a higher priority.\n leafNodes.find((config) => config.path.startsWith('*') && config.regex!.test('/'));\n\n return match;\n}\n\nexport function appendIsInitial(initialRoutes: InitialRouteConfig[]) {\n const resolvedInitialPatterns = initialRoutes.map((route) =>\n joinPaths(...route.parentScreens, route.initialRouteName)\n );\n\n return function (config: RouteConfig) {\n // TODO(EvanBacon): Probably a safer way to do this\n // Mark initial routes to give them potential priority over other routes that match.\n config.isInitial = resolvedInitialPatterns.includes(config.routeNames.join('/'));\n return config;\n };\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nexport function getRouteConfigSorter(previousSegments: string[] = []) {\n return function sortConfigs(a: RouteConfig, b: RouteConfig) {\n // Sort config so that:\n // - the most exhaustive ones are always at the beginning\n // - patterns with wildcard are always at the end\n\n // If 2 patterns are same, move the one with less route names up\n // This is an error state, so it's only useful for consistent error messages\n if (a.pattern === b.pattern) {\n return b.routeNames.join('>').localeCompare(a.routeNames.join('>'));\n }\n\n /*\n * If one of the patterns starts with the other, it is earlier in the config sorting.\n * However, configs are a mix of route configs and layout configs\n * e.g There will be a config for `/(group)`, but maybe there isn't a `/(group)/index.tsx`\n *\n * This is because you can navigate to a directory and its navigator will determine the route\n * These routes should be later in the config sorting, as their patterns are very open\n * and will prevent routes from being matched\n *\n * Therefore before we compare segment parts, we force these layout configs later in the sorting\n *\n * NOTE(marklawlor): Is this a feature we want? I'm unsure if this is a gimmick or a feature.\n */\n if (a.pattern.startsWith(b.pattern) && !b.isIndex) {\n return -1;\n }\n\n if (b.pattern.startsWith(a.pattern) && !a.isIndex) {\n return 1;\n }\n\n /*\n * Static routes should always be higher than dynamic and layout routes.\n */\n if (a.type === 'static' && b.type !== 'static') {\n return -1;\n } else if (a.type !== 'static' && b.type === 'static') {\n return 1;\n }\n\n /*\n * If the routes have any static segments, the one the most static segments should be higher\n */\n if (a.staticPartCount !== b.staticPartCount) {\n return b.staticPartCount - a.staticPartCount;\n }\n\n /*\n * If both are static/dynamic or a layout file, then we check group similarity\n */\n const similarToPreviousA = previousSegments.filter((value, index) => {\n return value === a.expandedRouteNames[index] && value.startsWith('(') && value.endsWith(')');\n });\n\n const similarToPreviousB = previousSegments.filter((value, index) => {\n return value === b.expandedRouteNames[index] && value.startsWith('(') && value.endsWith(')');\n });\n\n if (\n (similarToPreviousA.length > 0 || similarToPreviousB.length > 0) &&\n similarToPreviousA.length !== similarToPreviousB.length\n ) {\n // One matches more than the other, so pick the one that matches more\n return similarToPreviousB.length - similarToPreviousA.length;\n }\n\n /*\n * If there is not difference in similarity, then each non-group segment is compared against each other\n */\n for (let i = 0; i < Math.max(a.parts.length, b.parts.length); i++) {\n // if b is longer, b get higher priority\n if (a.parts[i] == null) {\n return 1;\n }\n // if a is longer, a get higher priority\n if (b.parts[i] == null) {\n return -1;\n }\n\n const aWildCard = a.parts[i].startsWith('*');\n const bWildCard = b.parts[i].startsWith('*');\n // if both are wildcard we compare next component\n if (aWildCard && bWildCard) {\n const aNotFound = a.parts[i].match(/^[*]not-found$/);\n const bNotFound = b.parts[i].match(/^[*]not-found$/);\n\n if (aNotFound && bNotFound) {\n continue;\n } else if (aNotFound) {\n return 1;\n } else if (bNotFound) {\n return -1;\n }\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aWildCard) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bWildCard) {\n return -1;\n }\n\n const aSlug = a.parts[i].startsWith(':');\n const bSlug = b.parts[i].startsWith(':');\n // if both are wildcard we compare next component\n if (aSlug && bSlug) {\n const aNotFound = a.parts[i].match(/^[*]not-found$/);\n const bNotFound = b.parts[i].match(/^[*]not-found$/);\n\n if (aNotFound && bNotFound) {\n continue;\n } else if (aNotFound) {\n return 1;\n } else if (bNotFound) {\n return -1;\n }\n\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aSlug) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bSlug) {\n return -1;\n }\n }\n\n /*\n * Both configs are identical in specificity and segments count/type\n * Try and sort by initial instead.\n *\n * TODO: We don't differentiate between the default initialRoute and group specific default routes\n *\n * const unstable_settings = {\n * \"group\": {\n * initialRouteName: \"article\"\n * }\n * }\n *\n * \"article\" will be ranked higher because its an initialRoute for a group - even if not your not currently in\n * that group. The current work around is to ways provide initialRouteName for all groups\n */\n if (a.isInitial && !b.isInitial) {\n return -1;\n } else if (!a.isInitial && b.isInitial) {\n return 1;\n }\n\n return b.parts.length - a.parts.length;\n };\n}\n\nexport function parseQueryParams(\n path: string,\n route: ParsedRoute,\n parseConfig?: Record<string, (value: string) => any>,\n hash?: string\n) {\n const searchParams = new URL(path, 'https://phony.example').searchParams;\n const params: Record<string, string | string[]> = Object.create(null);\n\n if (hash) {\n params['#'] = hash.slice(1);\n }\n\n for (const name of searchParams.keys()) {\n if (route.params?.[name]) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Route '/${route.name}' with param '${name}' was specified both in the path and as a param, removing from path`\n );\n }\n } else {\n const values = parseConfig?.hasOwnProperty(name)\n ? searchParams.getAll(name).map((value) => parseConfig[name](value))\n : searchParams.getAll(name);\n\n // searchParams.getAll returns an array.\n // if we only have a single value, and its not an array param, we need to extract the value\n params[name] = values.length === 1 ? values[0] : values;\n }\n }\n\n return Object.keys(params).length ? params : undefined;\n}\n\nexport function cleanPath(path: string) {\n path = path\n // let remaining = path\n // END FORK\n .replace(/\\/+/g, '/') // Replace multiple slash (//) with single ones\n .replace(/^\\//, '') // Remove extra leading slash\n .replace(/\\?.*$/, ''); // Remove query params which we will handle later\n\n // Make sure there is a trailing slash\n return path.endsWith('/') ? path : `${path}/`;\n}\n\nexport function routePatternToRegex(pattern: string) {\n return new RegExp(\n `^(${pattern\n .split('/')\n .map((it) => {\n if (it.startsWith('(') && it.endsWith(')')) {\n return `${it}?`;\n } else if (it.startsWith(':')) {\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n return `${it === '*' ? '.*' : escape(it)}\\\\/`;\n })\n .join('')})`\n );\n}\n"]}
1
+ {"version":3,"file":"getStateFromPath-forks.js","sourceRoot":"","sources":["../../src/fork/getStateFromPath-forks.ts"],"names":[],"mappings":"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","sourcesContent":["import { InitialState } from '@react-navigation/native';\nimport escape from 'escape-string-regexp';\nimport * as queryString from 'query-string';\n\nimport type { InitialRouteConfig, Options, ParsedRoute, RouteConfig } from './getStateFromPath';\nimport { matchGroupName, stripGroupSegmentsFromPath } from '../matchers';\n\nexport type ExpoOptions = {\n previousSegments?: string[];\n};\n\nexport type ExpoRouteConfig = {\n type: 'static' | 'dynamic' | 'layout';\n userReadableName: string;\n isIndex: boolean;\n isInitial?: boolean;\n hasChildren: boolean;\n expandedRouteNames: string[];\n parts: string[];\n staticPartCount: number;\n};\n\n/**\n * In Expo Router, the params are available at all levels of the routing config\n * @param routes\n * @returns\n */\nexport function populateParams(routes?: ParsedRoute[], params?: Record<string, any>) {\n if (!routes || !params || Object.keys(params).length === 0) return;\n\n for (const route of routes) {\n Object.assign(route, { params });\n }\n\n return routes;\n}\n\nexport function safelyDecodeURIComponent(str: string) {\n try {\n return decodeURIComponent(str);\n } catch {\n return str;\n }\n}\n\nexport function getUrlWithReactNavigationConcessions(\n path: string,\n baseUrl: string | undefined = process.env.EXPO_BASE_URL\n) {\n let parsed: URL;\n try {\n parsed = new URL(path, 'https://phony.example');\n } catch {\n // Do nothing with invalid URLs.\n return {\n path,\n cleanUrl: '',\n nonstandardPathname: '',\n url: new URL('https://phony.example'),\n };\n }\n\n const pathname = parsed.pathname;\n const withoutBaseUrl = stripBaseUrl(pathname, baseUrl);\n const pathWithoutGroups = stripGroupSegmentsFromPath(stripBaseUrl(path, baseUrl));\n\n // Make sure there is a trailing slash\n return {\n // The slashes are at the end, not the beginning\n path,\n nonstandardPathname: withoutBaseUrl.replace(/^\\/+/g, '').replace(/\\/+$/g, '') + '/',\n url: parsed,\n pathWithoutGroups,\n };\n}\n\nexport function createConfig(\n screen: string,\n pattern: string,\n routeNames: string[],\n config: Record<string, any> = {}\n): Omit<ExpoRouteConfig, 'isInitial'> {\n const parts: string[] = [];\n let isDynamic = false;\n const isIndex = screen === 'index' || screen.endsWith('/index');\n let staticPartCount = 0;\n\n for (const part of pattern.split('/')) {\n if (part) {\n // If any part is dynamic, then the route is dynamic\n const isDynamicPart =\n part.startsWith(':') || part.startsWith('*') || part.includes('*not-found');\n\n isDynamic ||= isDynamicPart;\n\n if (!matchGroupName(part)) {\n parts.push(part);\n\n if (!isDynamicPart) {\n staticPartCount++;\n }\n }\n }\n }\n\n const hasChildren = config.screens ? !!Object.keys(config.screens)?.length : false;\n const type = hasChildren ? 'layout' : isDynamic ? 'dynamic' : 'static';\n\n if (isIndex) {\n parts.push('index');\n staticPartCount++;\n }\n\n return {\n type,\n isIndex,\n hasChildren,\n parts,\n staticPartCount,\n userReadableName: [...routeNames.slice(0, -1), config.path || screen].join('/'),\n // Don't include the __root route name\n expandedRouteNames: routeNames.slice(1).flatMap((name) => {\n return name.split('/');\n }),\n };\n}\n\nexport function assertScreens(options?: Options<object>): asserts options is Options<object> {\n if (!options?.screens) {\n throw Error(\"You must pass a 'screens' object to 'getStateFromPath' to generate a path.\");\n }\n}\n\nexport function configRegExp(config: RouteConfig) {\n return config.pattern\n ? new RegExp(`^(${config.pattern.split('/').map(formatRegexPattern).join('')})$`)\n : undefined;\n}\n\nexport function isDynamicPart(p: string) {\n return p.length > 1 && (p.startsWith(':') || p.startsWith('*'));\n}\n\nexport function replacePart(p: string) {\n return p.replace(/^[:*]/, '').replace(/\\?$/, '');\n}\n\nexport function getParamValue(p: string, value: string) {\n if (p.startsWith('*')) {\n const values = value.split('/').filter((v) => v !== '');\n return values.length === 0 && p.endsWith('?') ? undefined : values;\n } else {\n return value;\n }\n}\n\nfunction formatRegexPattern(it: string): string {\n // Allow spaces in file path names.\n it = it.replace(' ', '%20');\n\n if (it.startsWith(':')) {\n // TODO: Remove unused match group\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n } else if (it.startsWith('*')) {\n return `((.*\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n // Strip groups from the matcher\n if (matchGroupName(it) != null) {\n // Groups are optional segments\n // this enables us to match `/bar` and `/(foo)/bar` for the same route\n // NOTE(EvanBacon): Ignore this match in the regex to avoid capturing the group\n return `(?:${escape(it)}\\\\/)?`;\n }\n\n return escape(it) + `\\\\/`;\n}\n\nexport function handleUrlParams(route: ParsedRoute, params?: queryString.ParsedQuery) {\n if (params) {\n route.params = Object.assign(Object.create(null), route.params) as Record<string, any>;\n for (const [name, value] of Object.entries(params)) {\n if (route.params?.[name]) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Route '/${route.name}' with param '${name}' was specified both in the path and as a param, removing from path`\n );\n }\n }\n\n if (!route.params?.[name]) {\n route.params[name] = value;\n continue;\n }\n }\n\n if (Object.keys(route.params).length === 0) {\n delete route.params;\n }\n }\n}\n\nexport function spreadParamsAcrossAllStates(state: InitialState, params?: Record<string, any>) {\n while (state) {\n const route = state.routes[0];\n (route as any).params = Object.assign({}, route.params, params);\n }\n}\n\nexport function stripBaseUrl(\n path: string,\n baseUrl: string | undefined = process.env.EXPO_BASE_URL\n) {\n if (process.env.NODE_ENV !== 'development') {\n if (baseUrl) {\n return path.replace(/^\\/+/g, '/').replace(new RegExp(`^\\\\/?${escape(baseUrl)}`, 'g'), '');\n }\n }\n return path;\n}\n\nexport function matchForEmptyPath(configs: RouteConfig[]) {\n // We need to add special handling of empty path so navigation to empty path also works\n // When handling empty path, we should only look at the root level config\n\n // NOTE(EvanBacon): We only care about matching leaf nodes.\n const leafNodes = configs\n .filter((config) => !config.hasChildren)\n .map((value) => {\n return {\n ...value,\n // Collapse all levels of group segments before testing.\n // This enables `app/(one)/(two)/index.js` to be matched.\n path: stripGroupSegmentsFromPath(value.path),\n };\n });\n\n const match =\n leafNodes.find(\n (config) =>\n // NOTE(EvanBacon): Test leaf node index routes that either don't have a regex or match an empty string.\n config.path === '' && (!config.regex || config.regex.test(''))\n ) ??\n leafNodes.find(\n (config) =>\n // NOTE(EvanBacon): Test leaf node dynamic routes that match an empty string.\n config.path.startsWith(':') && config.regex!.test('')\n ) ??\n // NOTE(EvanBacon): Test leaf node deep dynamic routes that match a slash.\n // This should be done last to enable dynamic routes having a higher priority.\n leafNodes.find((config) => config.path.startsWith('*') && config.regex!.test('/'));\n\n return match;\n}\n\nexport function appendIsInitial(initialRoutes: InitialRouteConfig[]) {\n const resolvedInitialPatterns = initialRoutes.map((route) =>\n joinPaths(...route.parentScreens, route.initialRouteName)\n );\n\n return function (config: RouteConfig) {\n // TODO(EvanBacon): Probably a safer way to do this\n // Mark initial routes to give them potential priority over other routes that match.\n config.isInitial = resolvedInitialPatterns.includes(config.routeNames.join('/'));\n return config;\n };\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nexport function getRouteConfigSorter(previousSegments: string[] = []) {\n return function sortConfigs(a: RouteConfig, b: RouteConfig) {\n // Sort config so that:\n // - the most exhaustive ones are always at the beginning\n // - patterns with wildcard are always at the end\n\n // If 2 patterns are same, move the one with less route names up\n // This is an error state, so it's only useful for consistent error messages\n if (a.pattern === b.pattern) {\n return b.routeNames.join('>').localeCompare(a.routeNames.join('>'));\n }\n\n /*\n * If one of the patterns starts with the other, it is earlier in the config sorting.\n * However, configs are a mix of route configs and layout configs\n * e.g There will be a config for `/(group)`, but maybe there isn't a `/(group)/index.tsx`\n *\n * This is because you can navigate to a directory and its navigator will determine the route\n * These routes should be later in the config sorting, as their patterns are very open\n * and will prevent routes from being matched\n *\n * Therefore before we compare segment parts, we force these layout configs later in the sorting\n *\n * NOTE(marklawlor): Is this a feature we want? I'm unsure if this is a gimmick or a feature.\n */\n if (a.pattern.startsWith(b.pattern) && !b.isIndex) {\n return -1;\n }\n\n if (b.pattern.startsWith(a.pattern) && !a.isIndex) {\n return 1;\n }\n\n /*\n * Static routes should always be higher than dynamic and layout routes.\n */\n if (a.type === 'static' && b.type !== 'static') {\n return -1;\n } else if (a.type !== 'static' && b.type === 'static') {\n return 1;\n }\n\n /*\n * If the routes have any static segments, the one the most static segments should be higher\n */\n if (a.staticPartCount !== b.staticPartCount) {\n return b.staticPartCount - a.staticPartCount;\n }\n\n /*\n * If both are static/dynamic or a layout file, then we check group similarity\n */\n const similarToPreviousA = previousSegments.filter((value, index) => {\n return value === a.expandedRouteNames[index] && value.startsWith('(') && value.endsWith(')');\n });\n\n const similarToPreviousB = previousSegments.filter((value, index) => {\n return value === b.expandedRouteNames[index] && value.startsWith('(') && value.endsWith(')');\n });\n\n if (\n (similarToPreviousA.length > 0 || similarToPreviousB.length > 0) &&\n similarToPreviousA.length !== similarToPreviousB.length\n ) {\n // One matches more than the other, so pick the one that matches more\n return similarToPreviousB.length - similarToPreviousA.length;\n }\n\n /*\n * If there is not difference in similarity, then each non-group segment is compared against each other\n */\n for (let i = 0; i < Math.max(a.parts.length, b.parts.length); i++) {\n // if b is longer, b get higher priority\n if (a.parts[i] == null) {\n return 1;\n }\n // if a is longer, a get higher priority\n if (b.parts[i] == null) {\n return -1;\n }\n\n const aWildCard = a.parts[i].startsWith('*');\n const bWildCard = b.parts[i].startsWith('*');\n // if both are wildcard we compare next component\n if (aWildCard && bWildCard) {\n const aNotFound = a.parts[i].match(/^[*]not-found$/);\n const bNotFound = b.parts[i].match(/^[*]not-found$/);\n\n if (aNotFound && bNotFound) {\n continue;\n } else if (aNotFound) {\n return 1;\n } else if (bNotFound) {\n return -1;\n }\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aWildCard) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bWildCard) {\n return -1;\n }\n\n const aSlug = a.parts[i].startsWith(':');\n const bSlug = b.parts[i].startsWith(':');\n // if both are wildcard we compare next component\n if (aSlug && bSlug) {\n const aNotFound = a.parts[i].match(/^[*]not-found$/);\n const bNotFound = b.parts[i].match(/^[*]not-found$/);\n\n if (aNotFound && bNotFound) {\n continue;\n } else if (aNotFound) {\n return 1;\n } else if (bNotFound) {\n return -1;\n }\n\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aSlug) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bSlug) {\n return -1;\n }\n }\n\n /*\n * Both configs are identical in specificity and segments count/type\n * Try and sort by initial instead.\n *\n * TODO: We don't differentiate between the default initialRoute and group specific default routes\n *\n * const unstable_settings = {\n * \"group\": {\n * initialRouteName: \"article\"\n * }\n * }\n *\n * \"article\" will be ranked higher because its an initialRoute for a group - even if not your not currently in\n * that group. The current work around is to ways provide initialRouteName for all groups\n */\n if (a.isInitial && !b.isInitial) {\n return -1;\n } else if (!a.isInitial && b.isInitial) {\n return 1;\n }\n\n return b.parts.length - a.parts.length;\n };\n}\n\nexport function parseQueryParams(\n path: string,\n route: ParsedRoute,\n parseConfig?: Record<string, (value: string) => any>,\n hash?: string\n) {\n const searchParams = new URL(path, 'https://phony.example').searchParams;\n const params: Record<string, string | string[]> = Object.create(null);\n\n if (hash) {\n params['#'] = hash.slice(1);\n }\n\n for (const name of searchParams.keys()) {\n if (route.params?.[name]) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Route '/${route.name}' with param '${name}' was specified both in the path and as a param, removing from path`\n );\n }\n } else {\n const values = parseConfig?.hasOwnProperty(name)\n ? searchParams.getAll(name).map((value) => parseConfig[name](value))\n : searchParams.getAll(name);\n\n // searchParams.getAll returns an array.\n // if we only have a single value, and its not an array param, we need to extract the value\n params[name] = values.length === 1 ? values[0] : values;\n }\n }\n\n return Object.keys(params).length ? params : undefined;\n}\n\nexport function cleanPath(path: string) {\n path = path\n // let remaining = path\n // END FORK\n .replace(/\\/+/g, '/') // Replace multiple slash (//) with single ones\n .replace(/^\\//, '') // Remove extra leading slash\n .replace(/\\?.*$/, ''); // Remove query params which we will handle later\n\n // Make sure there is a trailing slash\n return path.endsWith('/') ? path : `${path}/`;\n}\n\nexport function routePatternToRegex(pattern: string) {\n return new RegExp(\n `^(${pattern\n .split('/')\n .map((it) => {\n if (it.startsWith(':')) {\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n return `${it === '*' ? '.*' : escape(it)}\\\\/`;\n })\n .join('')})`\n );\n}\n"]}
@@ -16,5 +16,5 @@ export type Options = Omit<OptionsCore, 'getSystemRoute'>;
16
16
  */
17
17
  export declare function getRoutes(contextModule: RequireContext, options?: Options): RouteNode | null;
18
18
  export declare function getExactRoutes(contextModule: RequireContext, options?: Options): RouteNode | null;
19
- export { generateDynamic, extrapolateGroups } from './getRoutesCore';
19
+ export { generateDynamic, extrapolateGroups, getIgnoreList } from './getRoutesCore';
20
20
  //# sourceMappingURL=getRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getRoutes.d.ts","sourceRoot":"","sources":["../src/getRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAA8B,KAAK,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAC1D;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,GAAE,OAAY,GAAG,SAAS,GAAG,IAAI,CAmEhG;AAED,wBAAgB,cAAc,CAC5B,aAAa,EAAE,cAAc,EAC7B,OAAO,GAAE,OAAY,GACpB,SAAS,GAAG,IAAI,CAKlB;AAED,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"getRoutes.d.ts","sourceRoot":"","sources":["../src/getRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAA8B,KAAK,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;AAC1D;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,GAAE,OAAY,GAAG,SAAS,GAAG,IAAI,CAyDhG;AAED,wBAAgB,cAAc,CAC5B,aAAa,EAAE,cAAc,EAC7B,OAAO,GAAE,OAAY,GACpB,SAAS,GAAG,IAAI,CAKlB;AAED,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extrapolateGroups = exports.generateDynamic = void 0;
3
+ exports.getIgnoreList = exports.extrapolateGroups = exports.generateDynamic = void 0;
4
4
  exports.getRoutes = getRoutes;
5
5
  exports.getExactRoutes = getExactRoutes;
6
6
  const getRoutesCore_1 = require("./getRoutesCore");
@@ -18,7 +18,7 @@ const getRoutesCore_1 = require("./getRoutesCore");
18
18
  */
19
19
  function getRoutes(contextModule, options = {}) {
20
20
  return (0, getRoutesCore_1.getRoutes)(contextModule, {
21
- getSystemRoute({ route, type, defaults, redirectConfig, rewriteConfig }) {
21
+ getSystemRoute({ route, type }, defaults) {
22
22
  if (route === '' && type === 'layout') {
23
23
  // Root layout when no layout is defined.
24
24
  return {
@@ -64,24 +64,15 @@ function getRoutes(contextModule, options = {}) {
64
64
  children: [],
65
65
  };
66
66
  }
67
- else if (type === 'redirect' && redirectConfig && defaults) {
67
+ else if ((type === 'redirect' || type === 'rewrite') && defaults) {
68
68
  return {
69
69
  ...defaults,
70
70
  loadRoute() {
71
- return require('./getRoutesRedirects').getRedirectModule(redirectConfig);
71
+ return require('./getRoutesRedirects').getRedirectModule(route);
72
72
  },
73
73
  };
74
74
  }
75
- else if (type === 'rewrite' && rewriteConfig && defaults) {
76
- return {
77
- ...defaults,
78
- loadRoute() {
79
- // TODO: Replace with rewrite module
80
- return require('./getRoutesRedirects').getRedirectModule(rewriteConfig);
81
- },
82
- };
83
- }
84
- throw new Error(`Unknown system route: ${route} and type: ${type} and redirectConfig: ${redirectConfig} and rewriteConfig: ${rewriteConfig}`);
75
+ throw new Error(`Unknown system route: ${route} and type: ${type}`);
85
76
  },
86
77
  ...options,
87
78
  });
@@ -95,4 +86,5 @@ function getExactRoutes(contextModule, options = {}) {
95
86
  var getRoutesCore_2 = require("./getRoutesCore");
96
87
  Object.defineProperty(exports, "generateDynamic", { enumerable: true, get: function () { return getRoutesCore_2.generateDynamic; } });
97
88
  Object.defineProperty(exports, "extrapolateGroups", { enumerable: true, get: function () { return getRoutesCore_2.extrapolateGroups; } });
89
+ Object.defineProperty(exports, "getIgnoreList", { enumerable: true, get: function () { return getRoutesCore_2.getIgnoreList; } });
98
90
  //# sourceMappingURL=getRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getRoutes.js","sourceRoot":"","sources":["../src/getRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RouteNode } from './Route';\nimport { getRoutes as getRoutesCore, type Options as OptionsCore } from './getRoutesCore';\nimport type { RequireContext } from './types';\n\nexport type Options = Omit<OptionsCore, 'getSystemRoute'>;\n/**\n * Given a Metro context module, return an array of nested routes.\n *\n * This is a two step process:\n * 1. Convert the RequireContext keys (file paths) into a directory tree.\n * - This should extrapolate array syntax into multiple routes\n * - Routes are given a specificity score\n * 2. Flatten the directory tree into routes\n * - Routes in directories without _layout files are hoisted to the nearest _layout\n * - The name of the route is relative to the nearest _layout\n * - If multiple routes have the same name, the most specific route is used\n */\nexport function getRoutes(contextModule: RequireContext, options: Options = {}): RouteNode | null {\n return getRoutesCore(contextModule, {\n getSystemRoute({ route, type, defaults, redirectConfig, rewriteConfig }) {\n if (route === '' && type === 'layout') {\n // Root layout when no layout is defined.\n return {\n type: 'layout',\n loadRoute: () => ({\n default: (require('./views/Navigator') as typeof import('./views/Navigator'))\n .DefaultNavigator,\n }),\n // Generate a fake file name for the directory\n contextKey: 'expo-router/build/views/Navigator.js',\n route: '',\n generated: true,\n dynamic: null,\n children: [],\n };\n } else if (route === '_sitemap' && type === 'route') {\n return {\n loadRoute() {\n const { Sitemap, getNavOptions } = require('./views/Sitemap');\n return { default: Sitemap, getNavOptions };\n },\n route: '_sitemap',\n type: 'route',\n contextKey: 'expo-router/build/views/Sitemap.js',\n generated: true,\n internal: true,\n dynamic: null,\n children: [],\n };\n } else if (route === '+not-found' && type === 'route') {\n return {\n loadRoute() {\n return { default: require('./views/Unmatched').Unmatched };\n },\n type: 'route',\n route: '+not-found',\n contextKey: 'expo-router/build/views/Unmatched.js',\n generated: true,\n internal: true,\n dynamic: [{ name: '+not-found', deep: true, notFound: true }],\n children: [],\n };\n } else if (type === 'redirect' && redirectConfig && defaults) {\n return {\n ...defaults,\n loadRoute() {\n return require('./getRoutesRedirects').getRedirectModule(redirectConfig);\n },\n };\n } else if (type === 'rewrite' && rewriteConfig && defaults) {\n return {\n ...defaults,\n loadRoute() {\n // TODO: Replace with rewrite module\n return require('./getRoutesRedirects').getRedirectModule(rewriteConfig);\n },\n };\n }\n throw new Error(\n `Unknown system route: ${route} and type: ${type} and redirectConfig: ${redirectConfig} and rewriteConfig: ${rewriteConfig}`\n );\n },\n ...options,\n });\n}\n\nexport function getExactRoutes(\n contextModule: RequireContext,\n options: Options = {}\n): RouteNode | null {\n return getRoutes(contextModule, {\n ...options,\n skipGenerated: true,\n });\n}\n\nexport { generateDynamic, extrapolateGroups } from './getRoutesCore';\n"]}
1
+ {"version":3,"file":"getRoutes.js","sourceRoot":"","sources":["../src/getRoutes.ts"],"names":[],"mappings":";;;AAiBA,8BAyDC;AAED,wCAQC;AAnFD,mDAA0F;AAI1F;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CAAC,aAA6B,EAAE,UAAmB,EAAE;IAC5E,OAAO,IAAA,yBAAa,EAAC,aAAa,EAAE;QAClC,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ;YACtC,IAAI,KAAK,KAAK,EAAE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,yCAAyC;gBACzC,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;wBAChB,OAAO,EAAG,OAAO,CAAC,mBAAmB,CAAwC;6BAC1E,gBAAgB;qBACpB,CAAC;oBACF,8CAA8C;oBAC9C,UAAU,EAAE,sCAAsC;oBAClD,KAAK,EAAE,EAAE;oBACT,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACpD,OAAO;oBACL,SAAS;wBACP,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;wBAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;oBAC7C,CAAC;oBACD,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,OAAO;oBACb,UAAU,EAAE,oCAAoC;oBAChD,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,KAAK,YAAY,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,OAAO;oBACL,SAAS;wBACP,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC,SAAS,EAAE,CAAC;oBAC7D,CAAC;oBACD,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,YAAY;oBACnB,UAAU,EAAE,sCAAsC;oBAClD,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;oBAC7D,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;iBAAM,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACnE,OAAO;oBACL,GAAG,QAAQ;oBACX,SAAS;wBACP,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAClE,CAAC;iBACF,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAC5B,aAA6B,EAC7B,UAAmB,EAAE;IAErB,OAAO,SAAS,CAAC,aAAa,EAAE;QAC9B,GAAG,OAAO;QACV,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;AACL,CAAC;AAED,iDAAoF;AAA3E,gHAAA,eAAe,OAAA;AAAE,kHAAA,iBAAiB,OAAA;AAAE,8GAAA,aAAa,OAAA","sourcesContent":["import type { RouteNode } from './Route';\nimport { getRoutes as getRoutesCore, type Options as OptionsCore } from './getRoutesCore';\nimport type { RequireContext } from './types';\n\nexport type Options = Omit<OptionsCore, 'getSystemRoute'>;\n/**\n * Given a Metro context module, return an array of nested routes.\n *\n * This is a two step process:\n * 1. Convert the RequireContext keys (file paths) into a directory tree.\n * - This should extrapolate array syntax into multiple routes\n * - Routes are given a specificity score\n * 2. Flatten the directory tree into routes\n * - Routes in directories without _layout files are hoisted to the nearest _layout\n * - The name of the route is relative to the nearest _layout\n * - If multiple routes have the same name, the most specific route is used\n */\nexport function getRoutes(contextModule: RequireContext, options: Options = {}): RouteNode | null {\n return getRoutesCore(contextModule, {\n getSystemRoute({ route, type }, defaults) {\n if (route === '' && type === 'layout') {\n // Root layout when no layout is defined.\n return {\n type: 'layout',\n loadRoute: () => ({\n default: (require('./views/Navigator') as typeof import('./views/Navigator'))\n .DefaultNavigator,\n }),\n // Generate a fake file name for the directory\n contextKey: 'expo-router/build/views/Navigator.js',\n route: '',\n generated: true,\n dynamic: null,\n children: [],\n };\n } else if (route === '_sitemap' && type === 'route') {\n return {\n loadRoute() {\n const { Sitemap, getNavOptions } = require('./views/Sitemap');\n return { default: Sitemap, getNavOptions };\n },\n route: '_sitemap',\n type: 'route',\n contextKey: 'expo-router/build/views/Sitemap.js',\n generated: true,\n internal: true,\n dynamic: null,\n children: [],\n };\n } else if (route === '+not-found' && type === 'route') {\n return {\n loadRoute() {\n return { default: require('./views/Unmatched').Unmatched };\n },\n type: 'route',\n route: '+not-found',\n contextKey: 'expo-router/build/views/Unmatched.js',\n generated: true,\n internal: true,\n dynamic: [{ name: '+not-found', deep: true, notFound: true }],\n children: [],\n };\n } else if ((type === 'redirect' || type === 'rewrite') && defaults) {\n return {\n ...defaults,\n loadRoute() {\n return require('./getRoutesRedirects').getRedirectModule(route);\n },\n };\n }\n throw new Error(`Unknown system route: ${route} and type: ${type}`);\n },\n ...options,\n });\n}\n\nexport function getExactRoutes(\n contextModule: RequireContext,\n options: Options = {}\n): RouteNode | null {\n return getRoutes(contextModule, {\n ...options,\n skipGenerated: true,\n });\n}\n\nexport { generateDynamic, extrapolateGroups, getIgnoreList } from './getRoutesCore';\n"]}
@@ -16,16 +16,11 @@ export type Options = {
16
16
  rewrites?: RewriteConfig[];
17
17
  preserveRedirectAndRewrites?: boolean;
18
18
  /** Get the system route for a location. Useful for shimming React Native imports in SSR environments. */
19
- getSystemRoute: (route: Pick<RouteNode, 'route' | 'type'> & {
20
- defaults?: RouteNode;
21
- redirectConfig?: RedirectConfig;
22
- rewriteConfig?: RewriteConfig;
23
- }) => RouteNode;
19
+ getSystemRoute: (route: Pick<RouteNode, 'route' | 'type'>, defaults?: RouteNode) => RouteNode;
24
20
  };
25
21
  export type RedirectConfig = {
26
22
  source: string;
27
23
  destination: string;
28
- destinationContextKey: string;
29
24
  permanent?: boolean;
30
25
  methods?: string[];
31
26
  external?: boolean;
@@ -33,7 +28,6 @@ export type RedirectConfig = {
33
28
  export type RewriteConfig = {
34
29
  source: string;
35
30
  destination: string;
36
- destinationContextKey: string;
37
31
  methods?: string[];
38
32
  };
39
33
  /**
@@ -49,6 +43,7 @@ export type RewriteConfig = {
49
43
  * - If multiple routes have the same name, the most specific route is used
50
44
  */
51
45
  export declare function getRoutes(contextModule: RequireContext, options: Options): RouteNode | null;
46
+ export declare function getIgnoreList(options?: Options): RegExp[];
52
47
  /**
53
48
  * Generates a set of strings which have the router array syntax extrapolated.
54
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"getRoutesCore.d.ts","sourceRoot":"","sources":["../src/getRoutesCore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAW5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAE3B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC,yGAAyG;IACzG,cAAc,EAAE,CACd,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,GAAG;QACzC,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B,KACE,SAAS,CAAC;CAChB,CAAC;AAQF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe3F;AA8iBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAwBzF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,IAAI,CAgBxE"}
1
+ {"version":3,"file":"getRoutesCore.d.ts","sourceRoot":"","sources":["../src/getRoutesCore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAW5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAE3B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IAEtC,yGAAyG;IACzG,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC;CAC/F,CAAC;AAQF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAIF;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe3F;AA2gBD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,YAM9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAwBzF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,IAAI,CAgBxE"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRoutes = getRoutes;
4
+ exports.getIgnoreList = getIgnoreList;
4
5
  exports.extrapolateGroups = extrapolateGroups;
5
6
  exports.generateDynamic = generateDynamic;
6
7
  const matchers_1 = require("./matchers");
@@ -52,40 +53,32 @@ function getDirectoryTree(contextModule, options) {
52
53
  const redirects = {};
53
54
  const rewrites = {};
54
55
  let validRedirectDestinations;
55
- const getValidDestinations = () => {
56
- // Loop over contexts once and cache the valid destinations
57
- validRedirectDestinations ??= contextKeys.map((key) => {
58
- return {
59
- contextKey: key,
60
- nameWithoutInvisible: getNameWithoutInvisibleSegmentsFromRedirectPath((0, matchers_1.removeSupportedExtensions)(key)),
61
- };
62
- });
63
- return validRedirectDestinations;
64
- };
65
56
  // If we are keeping redirects as valid routes, then we need to add them to the contextKeys
66
57
  // This is useful for generating a sitemap with redirects, or static site generation that includes redirects
67
58
  if (options.preserveRedirectAndRewrites) {
68
59
  if (options.redirects) {
69
60
  for (const redirect of options.redirects) {
70
- const sourceContextKey = getSourceContextKeyFromRedirectSource(redirect.source);
71
- const sourceName = getNameFromRedirectPath(redirect.source);
61
+ // Remove the leading `./` or `/`
62
+ const source = redirect.source.replace(/^\.?\//, '');
72
63
  const isExternalRedirect = (0, url_1.shouldLinkExternally)(redirect.destination);
73
- const targetDestinationName = isExternalRedirect
64
+ const targetDestination = isExternalRedirect
74
65
  ? redirect.destination
75
- : getNameWithoutInvisibleSegmentsFromRedirectPath(redirect.destination);
76
- if (ignoreList.some((regex) => regex.test(sourceContextKey))) {
66
+ : (0, matchers_1.stripInvisibleSegmentsFromPath)((0, matchers_1.removeFileSystemDots)((0, matchers_1.removeFileSystemExtensions)(redirect.destination.replace(/^\.?\/?/, ''))));
67
+ const normalizedSource = (0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(source));
68
+ if (ignoreList.some((regex) => regex.test(normalizedSource))) {
77
69
  continue;
78
70
  }
79
- const validDestination = isExternalRedirect
80
- ? undefined
81
- : getValidDestinations().find((key) => key.nameWithoutInvisible === targetDestinationName);
71
+ // Loop over this once and cache the valid destinations
72
+ validRedirectDestinations ??= contextKeys.map((key) => {
73
+ return [
74
+ (0, matchers_1.stripInvisibleSegmentsFromPath)((0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(key))),
75
+ key,
76
+ ];
77
+ });
82
78
  const destination = isExternalRedirect
83
- ? targetDestinationName
84
- : validDestination?.nameWithoutInvisible;
85
- const destinationContextKey = isExternalRedirect
86
- ? targetDestinationName
87
- : validDestination?.contextKey;
88
- if (!destinationContextKey || destination === undefined) {
79
+ ? targetDestination
80
+ : validRedirectDestinations.find((key) => key[0] === targetDestination)?.[1];
81
+ if (!destination) {
89
82
  /*
90
83
  * Only throw the error when we are preserving the api routes
91
84
  * When doing a static export, API routes will not exist so the redirect destination may not exist.
@@ -97,11 +90,11 @@ function getDirectoryTree(contextModule, options) {
97
90
  }
98
91
  continue;
99
92
  }
100
- contextKeys.push(sourceContextKey);
101
- redirects[sourceName] = {
102
- source: sourceName,
93
+ const fakeContextKey = (0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(source));
94
+ contextKeys.push(fakeContextKey);
95
+ redirects[fakeContextKey] = {
96
+ source,
103
97
  destination,
104
- destinationContextKey,
105
98
  permanent: Boolean(redirect.permanent),
106
99
  external: isExternalRedirect,
107
100
  methods: redirect.methods,
@@ -110,16 +103,22 @@ function getDirectoryTree(contextModule, options) {
110
103
  }
111
104
  if (options.rewrites) {
112
105
  for (const rewrite of options.rewrites) {
113
- const sourceContextKey = getSourceContextKeyFromRedirectSource(rewrite.source);
114
- const sourceName = getNameFromRedirectPath(rewrite.source);
115
- const targetDestinationName = getNameFromRedirectPath(rewrite.destination);
116
- if (ignoreList.some((regex) => regex.test(sourceContextKey))) {
106
+ // Remove the leading `./` or `/`
107
+ const source = rewrite.source.replace(/^\.?\//, '');
108
+ const targetDestination = (0, matchers_1.stripInvisibleSegmentsFromPath)((0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(rewrite.destination)));
109
+ const normalizedSource = (0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(source));
110
+ if (ignoreList.some((regex) => regex.test(normalizedSource))) {
117
111
  continue;
118
112
  }
119
- const validDestination = getValidDestinations().find((key) => key.nameWithoutInvisible === targetDestinationName);
120
- const destination = validDestination?.nameWithoutInvisible;
121
- const destinationContextKey = validDestination?.contextKey;
122
- if (!destinationContextKey || destination === undefined) {
113
+ // Loop over this once and cache the valid destinations
114
+ validRedirectDestinations ??= contextKeys.map((key) => {
115
+ return [
116
+ (0, matchers_1.stripInvisibleSegmentsFromPath)((0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(key))),
117
+ key,
118
+ ];
119
+ });
120
+ const destination = validRedirectDestinations.find((key) => key[0] === targetDestination)?.[1];
121
+ if (!destination) {
123
122
  /*
124
123
  * Only throw the error when we are preserving the api routes
125
124
  * When doing a static export, API routes will not exist so the redirect destination may not exist.
@@ -127,21 +126,17 @@ function getDirectoryTree(contextModule, options) {
127
126
  * `expo export` swallows this error.
128
127
  */
129
128
  if (options.preserveApiRoutes) {
130
- throw new Error(`Rewrite destination "${rewrite.destination}" does not exist.`);
129
+ throw new Error(`Redirect destination "${rewrite.destination}" does not exist.`);
131
130
  }
132
131
  continue;
133
132
  }
134
- contextKeys.push(sourceContextKey);
135
- rewrites[sourceName] = {
136
- source: sourceName,
137
- destination,
138
- destinationContextKey,
139
- methods: rewrite.methods,
140
- };
133
+ // Add a fake context key
134
+ const fakeContextKey = `./${source}.tsx`;
135
+ contextKeys.push(fakeContextKey);
136
+ rewrites[fakeContextKey] = { source, destination, methods: rewrite.methods };
141
137
  }
142
138
  }
143
139
  }
144
- const processedRedirectsRewrites = new Set();
145
140
  for (const filePath of contextKeys) {
146
141
  if (ignoreList.some((regex) => regex.test(filePath))) {
147
142
  continue;
@@ -192,47 +187,33 @@ function getDirectoryTree(contextModule, options) {
192
187
  children: [], // While we are building the directory tree, we don't know the node's children just yet. This is added during hoisting
193
188
  };
194
189
  if (meta.isRedirect) {
195
- if (processedRedirectsRewrites.has(meta.route)) {
196
- continue;
197
- }
198
- const redirect = redirects[meta.route];
199
- node.destinationContextKey = redirect.destinationContextKey;
200
- node.permanent = redirect.permanent;
190
+ node.destinationContextKey = redirects[filePath].destination;
191
+ node.permanent = redirects[filePath].permanent;
201
192
  node.generated = true;
202
193
  if (node.type === 'route') {
203
194
  node = options.getSystemRoute({
204
195
  type: 'redirect',
205
- route: redirect.destination,
206
- defaults: node,
207
- redirectConfig: redirect,
208
- });
196
+ route: (0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(node.destinationContextKey)),
197
+ }, node);
209
198
  }
210
- if (redirect.methods) {
211
- node.methods = redirect.methods;
199
+ if (redirects[filePath].methods) {
200
+ node.methods = redirects[filePath].methods;
212
201
  }
213
202
  node.type = 'redirect';
214
- processedRedirectsRewrites.add(meta.route);
215
203
  }
216
204
  if (meta.isRewrite) {
217
- if (processedRedirectsRewrites.has(meta.route)) {
218
- continue;
219
- }
220
- const rewrite = rewrites[meta.route];
221
- node.destinationContextKey = rewrite.destinationContextKey;
205
+ node.destinationContextKey = rewrites[filePath].destination;
222
206
  node.generated = true;
223
207
  if (node.type === 'route') {
224
208
  node = options.getSystemRoute({
225
209
  type: 'rewrite',
226
- route: rewrite.destination,
227
- defaults: node,
228
- rewriteConfig: rewrite,
229
- });
210
+ route: (0, matchers_1.removeFileSystemDots)((0, matchers_1.removeSupportedExtensions)(node.destinationContextKey)),
211
+ }, node);
230
212
  }
231
- if (rewrite.methods) {
232
- node.methods = rewrite.methods;
213
+ if (redirects[filePath].methods) {
214
+ node.methods = redirects[filePath].methods;
233
215
  }
234
216
  node.type = 'rewrite';
235
- processedRedirectsRewrites.add(meta.route);
236
217
  }
237
218
  if (process.env.NODE_ENV === 'development') {
238
219
  // If the user has set the `EXPO_ROUTER_IMPORT_MODE` to `sync` then we should
@@ -360,22 +341,6 @@ function getDirectoryTree(contextModule, options) {
360
341
  }
361
342
  return rootDirectory;
362
343
  }
363
- function getNameFromRedirectPath(path) {
364
- // Removing only the filesystem extensions, to be able to handle +api, +html
365
- return ((0, matchers_1.removeFileSystemExtensions)((0, matchers_1.removeFileSystemDots)(path))
366
- // Remove the leading `/`
367
- .replace(/^\//, ''));
368
- }
369
- function getNameWithoutInvisibleSegmentsFromRedirectPath(path) {
370
- return (0, matchers_1.stripInvisibleSegmentsFromPath)(getNameFromRedirectPath(path));
371
- }
372
- // Creates fake context key for redirects and rewrites
373
- function getSourceContextKeyFromRedirectSource(source) {
374
- const name = getNameFromRedirectPath(source);
375
- const prefix = './';
376
- const suffix = /\.[tj]sx?$/.test(name) ? '' : '.js'; // Ensure it has a file extension
377
- return `${prefix}${name}${suffix}`;
378
- }
379
344
  /**
380
345
  * Flatten the directory tree into routes, hoisting routes to the nearest _layout.
381
346
  */
@@ -480,6 +445,13 @@ function getFileMeta(originalKey, options, redirects, rewrites) {
480
445
  isRewrite: key in rewrites,
481
446
  };
482
447
  }
448
+ function getIgnoreList(options) {
449
+ const ignore = [/^\.\/\+html\.[tj]sx?$/, ...(options?.ignore ?? [])];
450
+ if (options?.preserveApiRoutes !== true) {
451
+ ignore.push(/\+api\.[tj]sx?$/);
452
+ }
453
+ return ignore;
454
+ }
483
455
  /**
484
456
  * Generates a set of strings which have the router array syntax extrapolated.
485
457
  *