expo-router 5.0.0-sdk-52-router-patches → 5.0.1-preview.0-canary-20250408-7f0ab53

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 (85) hide show
  1. package/_async-server-import.js +11 -7
  2. package/build/Route.d.ts +7 -1
  3. package/build/Route.d.ts.map +1 -1
  4. package/build/Route.js.map +1 -1
  5. package/build/exports.d.ts +1 -0
  6. package/build/exports.d.ts.map +1 -1
  7. package/build/exports.js.map +1 -1
  8. package/build/fork/getStateFromPath-forks.d.ts +3 -2
  9. package/build/fork/getStateFromPath-forks.d.ts.map +1 -1
  10. package/build/fork/getStateFromPath-forks.js +24 -27
  11. package/build/fork/getStateFromPath-forks.js.map +1 -1
  12. package/build/fork/getStateFromPath.js +24 -19
  13. package/build/fork/getStateFromPath.js.map +1 -1
  14. package/build/getLinkingConfig.d.ts +3 -1
  15. package/build/getLinkingConfig.d.ts.map +1 -1
  16. package/build/getLinkingConfig.js +11 -7
  17. package/build/getLinkingConfig.js.map +1 -1
  18. package/build/getReactNavigationConfig.d.ts +1 -0
  19. package/build/getReactNavigationConfig.d.ts.map +1 -1
  20. package/build/getReactNavigationConfig.js +2 -1
  21. package/build/getReactNavigationConfig.js.map +1 -1
  22. package/build/getRoutes.d.ts.map +1 -1
  23. package/build/getRoutes.js +9 -1
  24. package/build/getRoutes.js.map +1 -1
  25. package/build/getRoutesCore.d.ts +16 -1
  26. package/build/getRoutesCore.d.ts.map +1 -1
  27. package/build/getRoutesCore.js +134 -11
  28. package/build/getRoutesCore.js.map +1 -1
  29. package/build/getRoutesRedirects.d.ts +12 -0
  30. package/build/getRoutesRedirects.d.ts.map +1 -0
  31. package/build/getRoutesRedirects.js +71 -0
  32. package/build/getRoutesRedirects.js.map +1 -0
  33. package/build/getRoutesSSR.d.ts.map +1 -1
  34. package/build/getRoutesSSR.js +9 -1
  35. package/build/getRoutesSSR.js.map +1 -1
  36. package/build/getServerManifest.d.ts +13 -1
  37. package/build/getServerManifest.d.ts.map +1 -1
  38. package/build/getServerManifest.js +27 -2
  39. package/build/getServerManifest.js.map +1 -1
  40. package/build/global-state/router-store.d.ts +4 -0
  41. package/build/global-state/router-store.d.ts.map +1 -1
  42. package/build/global-state/router-store.js +44 -2
  43. package/build/global-state/router-store.js.map +1 -1
  44. package/build/global-state/routing.d.ts +1 -1
  45. package/build/global-state/routing.d.ts.map +1 -1
  46. package/build/global-state/routing.js +7 -1
  47. package/build/global-state/routing.js.map +1 -1
  48. package/build/link/linking.d.ts +2 -1
  49. package/build/link/linking.d.ts.map +1 -1
  50. package/build/link/linking.js +14 -8
  51. package/build/link/linking.js.map +1 -1
  52. package/build/matchers.d.ts +3 -1
  53. package/build/matchers.d.ts.map +1 -1
  54. package/build/matchers.js +7 -2
  55. package/build/matchers.js.map +1 -1
  56. package/build/routes-manifest.d.ts +6 -2
  57. package/build/routes-manifest.d.ts.map +1 -1
  58. package/build/routes-manifest.js +1 -0
  59. package/build/routes-manifest.js.map +1 -1
  60. package/build/rsc/middleware.d.ts.map +1 -1
  61. package/build/rsc/middleware.js +6 -1
  62. package/build/rsc/middleware.js.map +1 -1
  63. package/build/rsc/router/create-expo-pages.d.ts +20 -0
  64. package/build/rsc/router/create-expo-pages.d.ts.map +1 -0
  65. package/build/rsc/router/create-expo-pages.js +22 -0
  66. package/build/rsc/router/create-expo-pages.js.map +1 -0
  67. package/build/rsc/router/expo-definedRouter.d.ts +1 -5
  68. package/build/rsc/router/expo-definedRouter.d.ts.map +1 -1
  69. package/build/rsc/router/expo-definedRouter.js +3 -2
  70. package/build/rsc/router/expo-definedRouter.js.map +1 -1
  71. package/build/rsc/router/noopRouter.d.ts +1 -5
  72. package/build/rsc/router/noopRouter.d.ts.map +1 -1
  73. package/build/rsc/router/noopRouter.js +2 -2
  74. package/build/rsc/router/noopRouter.js.map +1 -1
  75. package/build/static/getServerManifest.d.ts.map +1 -1
  76. package/build/static/getServerManifest.js +1 -0
  77. package/build/static/getServerManifest.js.map +1 -1
  78. package/build/useScreens.d.ts +4 -1
  79. package/build/useScreens.d.ts.map +1 -1
  80. package/build/useScreens.js +39 -34
  81. package/build/useScreens.js.map +1 -1
  82. package/build/views/Navigator.d.ts +1 -1
  83. package/build/views/Navigator.d.ts.map +1 -1
  84. package/package.json +13 -14
  85. package/plugin/options.json +33 -0
@@ -1 +1 @@
1
- {"version":3,"file":"getStateFromPath.js","sourceRoot":"","sources":["../../src/fork/getStateFromPath.ts"],"names":[],"mappings":"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","sourcesContent":["import { PathConfigMap, validatePathConfig } from '@react-navigation/native';\nimport type { InitialState, NavigationState, PartialState } from '@react-navigation/routers';\nimport escape from 'escape-string-regexp';\n\nimport { findFocusedRoute } from './findFocusedRoute';\nimport type { ExpoOptions, ExpoRouteConfig } from './getStateFromPath-forks';\nimport * as expo from './getStateFromPath-forks';\nimport { INTERNAL_SLOT_NAME } from '../getLinkingConfig';\nimport { RouterStore } from '../global-state/router-store';\n\nexport type Options<ParamList extends object> = ExpoOptions & {\n path?: string;\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype ParseConfig = Record<string, (value: string) => any>;\n\nexport type RouteConfig = ExpoRouteConfig & {\n screen: string;\n regex?: RegExp;\n path: string;\n pattern: string;\n routeNames: string[];\n parse?: ParseConfig;\n};\n\nexport type InitialRouteConfig = {\n initialRouteName: string;\n parentScreens: string[];\n};\n\nexport type ResultState = PartialState<NavigationState> & {\n state?: ResultState;\n};\n\nexport type ParsedRoute = {\n name: string;\n path?: string;\n params?: Record<string, any> | undefined;\n};\n\ntype ConfigResources = {\n initialRoutes: InitialRouteConfig[];\n configs: RouteConfig[];\n configWithRegexes: RouteConfig[];\n};\n\n/**\n * Utility to parse a path string to initial state object accepted by the container.\n * This is useful for deep linking when we need to handle the incoming URL.\n *\n * @example\n * ```js\n * getStateFromPath(\n * '/chat/jane/42',\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * parse: { id: Number }\n * }\n * }\n * }\n * )\n * ```\n * @param path Path string to parse and convert, e.g. /foo/bar?count=42.\n * @param options Extra options to fine-tune how to parse the path.\n */\nexport function getStateFromPath<ParamList extends object>(\n // START FORK\n this: RouterStore | undefined | void,\n // END FORK\n path: string,\n options?: Options<ParamList>\n): ResultState | undefined {\n const { initialRoutes, configs, configWithRegexes } = getConfigResources(\n options,\n this?.routeInfo?.segments\n );\n\n const screens = options?.screens;\n\n // START FORK\n const expoPath = expo.getUrlWithReactNavigationConcessions(path);\n // END FORK\n\n // START FORK\n let remaining = expoPath.nonstandardPathname\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 remaining = remaining.endsWith('/') ? remaining : `${remaining}/`;\n\n const prefix = options?.path?.replace(/^\\//, ''); // Remove extra leading slash\n\n if (prefix) {\n // Make sure there is a trailing slash\n const normalizedPrefix = prefix.endsWith('/') ? prefix : `${prefix}/`;\n\n // If the path doesn't start with the prefix, it's not a match\n if (!remaining.startsWith(normalizedPrefix)) {\n return undefined;\n }\n\n // Remove the prefix from the path\n remaining = remaining.replace(normalizedPrefix, '');\n }\n\n if (screens === undefined) {\n // When no config is specified, use the path segments as route names\n const routes = remaining\n .split('/')\n .filter(Boolean)\n .map((segment) => {\n const name = decodeURIComponent(segment);\n return { name };\n });\n\n if (routes.length) {\n return createNestedStateObject(expoPath, routes, initialRoutes, [], expoPath.url.hash);\n }\n\n return undefined;\n }\n\n if (remaining === '/') {\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 // START FORK\n const match = expo.matchForEmptyPath(configWithRegexes);\n // const match = configs.find(\n // (config) =>\n // config.path === '' &&\n // config.routeNames.every(\n // // Make sure that none of the parent configs have a non-empty path defined\n // (name) => !configs.find((c) => c.screen === name)?.path\n // )\n // );\n // END FORK\n\n if (match) {\n return createNestedStateObject(\n expoPath,\n match.routeNames.map((name) => ({ name })),\n initialRoutes,\n configs,\n expoPath.url.hash\n );\n }\n\n return undefined;\n }\n\n let result: PartialState<NavigationState> | undefined;\n let current: PartialState<NavigationState> | undefined;\n\n // We match the whole path against the regex instead of segments\n // This makes sure matches such as wildcard will catch any unmatched routes, even if nested\n const { routes, remainingPath } = matchAgainstConfigs(remaining, configWithRegexes);\n\n if (routes !== undefined) {\n // This will always be empty if full path matched\n current = createNestedStateObject(expoPath, routes, initialRoutes, configs, expoPath.url.hash);\n remaining = remainingPath;\n result = current;\n }\n\n if (current == null || result == null) {\n return undefined;\n }\n\n return result;\n}\n\n/**\n * Reference to the last used config resources. This is used to avoid recomputing the config resources when the options are the same.\n */\nlet cachedConfigResources: [Options<object> | undefined, ConfigResources] = [\n undefined,\n prepareConfigResources(),\n];\n\nfunction getConfigResources<ParamList extends object>(\n options: Options<ParamList> | undefined,\n // START FORK\n previousSegments?: string[]\n // END FORK\n) {\n // START FORK - We need to disable this caching as our configs can change based upon the current state\n // if (cachedConfigResources[0] !== options) {\n cachedConfigResources = [options, prepareConfigResources(options, previousSegments)];\n // }\n // END FORK FORK\n\n return cachedConfigResources[1];\n}\n\nfunction prepareConfigResources(options?: Options<object>, previousSegments?: string[]) {\n if (options) {\n validatePathConfig(options);\n }\n\n const initialRoutes = getInitialRoutes(options);\n\n const configs = getNormalizedConfigs(initialRoutes, options?.screens, previousSegments);\n\n checkForDuplicatedConfigs(configs);\n\n const configWithRegexes = getConfigsWithRegexes(configs);\n\n return {\n initialRoutes,\n configs,\n configWithRegexes,\n };\n}\n\nfunction getInitialRoutes(options?: Options<object>) {\n const initialRoutes: InitialRouteConfig[] = [];\n\n if (options?.initialRouteName) {\n initialRoutes.push({\n initialRouteName: options.initialRouteName,\n parentScreens: [],\n });\n }\n\n return initialRoutes;\n}\n\nfunction getNormalizedConfigs(\n initialRoutes: InitialRouteConfig[],\n screens: PathConfigMap<object> = {},\n // START FORK\n previousSegments?: string[]\n // END FORK\n) {\n // Create a normalized configs array which will be easier to use\n return ([] as RouteConfig[])\n .concat(\n ...Object.keys(screens).map((key) =>\n createNormalizedConfigs(key, screens as PathConfigMap<object>, [], initialRoutes, [])\n )\n )\n .map(expo.appendIsInitial(initialRoutes))\n .sort(expo.getRouteConfigSorter(previousSegments));\n // .sort((a, b) => {\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 // // If one of the patterns starts with the other, it's more exhaustive\n // // So move it up\n // if (a.pattern.startsWith(b.pattern)) {\n // return -1;\n // }\n\n // if (b.pattern.startsWith(a.pattern)) {\n // return 1;\n // }\n\n // const aParts = a.pattern.split('/');\n // const bParts = b.pattern.split('/');\n\n // for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n // // if b is longer, b get higher priority\n // if (aParts[i] == null) {\n // return 1;\n // }\n // // if a is longer, a get higher priority\n // if (bParts[i] == null) {\n // return -1;\n // }\n // const aWildCard = aParts[i] === '*' || aParts[i].startsWith(':');\n // const bWildCard = bParts[i] === '*' || bParts[i].startsWith(':');\n // // if both are wildcard we compare next component\n // if (aWildCard && bWildCard) {\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 // return bParts.length - aParts.length;\n // });\n}\n\nfunction checkForDuplicatedConfigs(configs: RouteConfig[]) {\n // Check for duplicate patterns in the config\n configs.reduce<Record<string, RouteConfig>>((acc, config) => {\n if (acc[config.pattern]) {\n const a = acc[config.pattern].routeNames;\n const b = config.routeNames;\n\n // It's not a problem if the path string omitted from a inner most screen\n // For example, it's ok if a path resolves to `A > B > C` or `A > B`\n const intersects =\n a.length > b.length ? b.every((it, i) => a[i] === it) : a.every((it, i) => b[i] === it);\n\n if (!intersects) {\n throw new Error(\n `Found conflicting screens with the same pattern. The pattern '${\n config.pattern\n }' resolves to both '${a.join(' > ')}' and '${b.join(\n ' > '\n )}'. Patterns must be unique and cannot resolve to more than one screen.`\n );\n }\n }\n\n return Object.assign(acc, {\n [config.pattern]: config,\n });\n }, {});\n}\n\nfunction getConfigsWithRegexes(configs: RouteConfig[]) {\n return configs.map((c) => ({\n ...c,\n // Add `$` to the regex to make sure it matches till end of the path and not just beginning\n // START FORK\n // regex: c.regex ? new RegExp(c.regex.source + '$') : undefined,\n regex: expo.configRegExp(c),\n // END FORK\n }));\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst matchAgainstConfigs = (remaining: string, configs: RouteConfig[]) => {\n let routes: ParsedRoute[] | undefined;\n let remainingPath = remaining;\n\n // START FORK\n const allParams = Object.create(null);\n // END FORK\n\n // Go through all configs, and see if the next path segment matches our regex\n for (const config of configs) {\n if (!config.regex) {\n continue;\n }\n\n const match = remainingPath.match(config.regex);\n\n // If our regex matches, we need to extract params from the path\n if (match) {\n const matchResult = config.pattern?.split('/').reduce<{\n pos: number; // Position of the current path param segment in the path (e.g in pattern `a/:b/:c`, `:a` is 0 and `:b` is 1)\n matchedParams: Record<string, Record<string, string>>; // The extracted params\n }>(\n (acc, p, index) => {\n if (!expo.isDynamicPart(p)) {\n return acc;\n }\n\n acc.pos += 1;\n\n // START FORK\n const decodedParamSegment = expo.safelyDecodeURIComponent(\n // const decodedParamSegment = decodeURIComponent(\n // The param segments appear every second item starting from 2 in the regex match result\n match![(acc.pos + 1) * 2]\n // Remove trailing slash\n .replace(/\\/$/, '')\n );\n // END FORK\n\n Object.assign(acc.matchedParams, {\n [p]: Object.assign(acc.matchedParams[p] || {}, {\n [index]: decodedParamSegment,\n }),\n });\n\n return acc;\n },\n { pos: -1, matchedParams: {} }\n );\n\n const matchedParams = matchResult.matchedParams || {};\n\n routes = config.routeNames.map((name) => {\n const routeConfig = configs.find((c) => {\n // Check matching name AND pattern in case same screen is used at different levels in config\n return c.screen === name && config.pattern.startsWith(c.pattern);\n });\n\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n const normalizedPath = routeConfig?.path.split('/').filter(Boolean).join('/');\n\n // Get the number of segments in the initial pattern\n const numInitialSegments = routeConfig?.pattern\n // Extract the prefix from the pattern by removing the ending path pattern (e.g pattern=`a/b/c/d` and normalizedPath=`c/d` becomes `a/b`)\n .replace(new RegExp(`${escape(normalizedPath!)}$`), '')\n ?.split('/').length;\n\n const params = normalizedPath\n ?.split('/')\n .reduce<Record<string, unknown>>((acc, p, index) => {\n if (!expo.isDynamicPart(p)) {\n return acc;\n }\n\n // Get the real index of the path parameter in the matched path\n // by offsetting by the number of segments in the initial pattern\n const offset = numInitialSegments ? numInitialSegments - 1 : 0;\n // START FORK\n // const value = matchedParams[p]?.[index + offset];\n const value = expo.getParamValue(p, matchedParams[p]?.[index + offset]);\n // END FORK\n\n if (value) {\n // START FORK\n // const key = p.replace(/^:/, '').replace(/\\?$/, '');\n const key = expo.replacePart(p);\n // END FORK\n acc[key] = routeConfig?.parse?.[key] ? routeConfig.parse[key](value as any) : value;\n }\n\n return acc;\n }, {});\n\n if (params && Object.keys(params).length) {\n Object.assign(allParams, params);\n return { name, params };\n }\n\n return { name };\n });\n\n remainingPath = remainingPath.replace(match[1], '');\n\n break;\n }\n }\n\n // START FORK\n expo.populateParams(routes, allParams);\n // END FORK\n\n return { routes, remainingPath };\n};\n\nconst createNormalizedConfigs = (\n screen: string,\n routeConfig: PathConfigMap<object>,\n routeNames: string[] = [],\n initials: InitialRouteConfig[],\n parentScreens: string[],\n parentPattern?: string\n): RouteConfig[] => {\n const configs: RouteConfig[] = [];\n\n routeNames.push(screen);\n\n parentScreens.push(screen);\n\n const config = routeConfig[screen];\n\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n configs.push(createConfigItem(screen, routeNames, pattern, config));\n } else if (typeof config === 'object') {\n let pattern: string | undefined;\n\n // if an object is specified as the value (e.g. Foo: { ... }),\n // it can have `path` property and\n // it could have `screens` prop which has nested configs\n if (typeof config.path === 'string') {\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n if (screen !== INTERNAL_SLOT_NAME) {\n configs.push(\n createConfigItem(screen, routeNames, pattern!, config.path, config.parse, config)\n );\n }\n }\n\n if (config.screens) {\n // property `initialRouteName` without `screens` has no purpose\n if (config.initialRouteName) {\n initials.push({\n initialRouteName: config.initialRouteName,\n parentScreens,\n });\n }\n\n Object.keys(config.screens).forEach((nestedConfig) => {\n const result = createNormalizedConfigs(\n nestedConfig,\n config.screens as PathConfigMap<object>,\n routeNames,\n initials,\n [...parentScreens],\n pattern ?? parentPattern\n );\n\n configs.push(...result);\n });\n }\n }\n\n routeNames.pop();\n\n return configs;\n};\n\nconst createConfigItem = (\n screen: string,\n routeNames: string[],\n pattern: string,\n path: string,\n parse: ParseConfig | undefined = undefined,\n config: Record<string, any> = {}\n): RouteConfig => {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern = pattern.split('/').filter(Boolean).join('/');\n\n const regex = pattern\n ? 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 : undefined;\n\n return {\n screen,\n regex,\n pattern,\n path,\n // The routeNames array is mutated, so copy it to keep the current state\n routeNames: [...routeNames],\n parse,\n // START FORK\n ...expo.createConfig(screen, pattern, routeNames, config),\n // END FORK\n };\n};\n\nconst findParseConfigForRoute = (\n routeName: string,\n flatConfig: RouteConfig[]\n): ParseConfig | undefined => {\n for (const config of flatConfig) {\n if (routeName === config.routeNames[config.routeNames.length - 1]) {\n return config.parse;\n }\n }\n\n return undefined;\n};\n\n// Try to find an initial route connected with the one passed\nconst findInitialRoute = (\n routeName: string,\n parentScreens: string[],\n initialRoutes: InitialRouteConfig[]\n): string | undefined => {\n for (const config of initialRoutes) {\n if (parentScreens.length === config.parentScreens.length) {\n let sameParents = true;\n for (let i = 0; i < parentScreens.length; i++) {\n if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {\n sameParents = false;\n break;\n }\n }\n if (sameParents) {\n return routeName !== config.initialRouteName ? config.initialRouteName : undefined;\n }\n }\n }\n return undefined;\n};\n\n// returns state object with values depending on whether\n// it is the end of state and if there is initialRoute for this level\nconst createStateObject = (\n initialRoute: string | undefined,\n route: ParsedRoute,\n isEmpty: boolean\n): InitialState => {\n if (isEmpty) {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute, params: route.params }, route],\n };\n } else {\n return {\n routes: [route],\n };\n }\n } else {\n if (initialRoute) {\n return {\n index: 1,\n routes: [\n { name: initialRoute, params: route.params },\n { ...route, state: { routes: [] } },\n ],\n };\n } else {\n return {\n routes: [{ ...route, state: { routes: [] } }],\n };\n }\n }\n};\n\nconst createNestedStateObject = (\n { path, ...expoURL }: ReturnType<typeof expo.getUrlWithReactNavigationConcessions>,\n routes: ParsedRoute[],\n initialRoutes: InitialRouteConfig[],\n flatConfig?: RouteConfig[],\n hash?: string\n) => {\n let route = routes.shift() as ParsedRoute;\n const parentScreens: string[] = [];\n\n let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n parentScreens.push(route.name);\n\n const state: InitialState = createStateObject(initialRoute, route, routes.length === 0);\n\n if (routes.length > 0) {\n let nestedState = state;\n\n while ((route = routes.shift() as ParsedRoute)) {\n initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n const nestedStateIndex = nestedState.index || nestedState.routes.length - 1;\n\n nestedState.routes[nestedStateIndex].state = createStateObject(\n initialRoute,\n route,\n routes.length === 0\n );\n\n if (routes.length > 0) {\n nestedState = nestedState.routes[nestedStateIndex].state as InitialState;\n }\n\n parentScreens.push(route.name);\n }\n }\n\n route = findFocusedRoute(state) as ParsedRoute;\n // START FORK\n route.path = expoURL.pathWithoutGroups;\n // route.path = path;\n // END FORK\n\n // START FORK\n // const params = parseQueryParams(\n const params = expo.parseQueryParams(\n path,\n route,\n flatConfig ? findParseConfigForRoute(route.name, flatConfig) : undefined,\n hash\n );\n // END FORK\n\n // START FORK\n // expo.handleUrlParams(route, params, hash);\n if (params) {\n route.params = { ...route.params, ...params };\n }\n // END FORK\n\n return state;\n};\n\n// START FORK\n// const parseQueryParams = (path: string, parseConfig?: Record<string, (value: string) => any>) => {\n// const query = path.split('?')[1];\n// const params = queryString.parse(query);\n\n// if (parseConfig) {\n// Object.keys(params).forEach((name) => {\n// if (Object.hasOwnProperty.call(parseConfig, name) && typeof params[name] === 'string') {\n// params[name] = parseConfig[name](params[name] as string);\n// }\n// });\n// }\n\n// return Object.keys(params).length ? params : undefined;\n// };\n// END FORK\n"]}
1
+ {"version":3,"file":"getStateFromPath.js","sourceRoot":"","sources":["../../src/fork/getStateFromPath.ts"],"names":[],"mappings":"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","sourcesContent":["import { PathConfigMap, validatePathConfig } from '@react-navigation/native';\nimport type { InitialState, NavigationState, PartialState } from '@react-navigation/routers';\nimport escape from 'escape-string-regexp';\n\nimport { findFocusedRoute } from './findFocusedRoute';\nimport type { ExpoOptions, ExpoRouteConfig } from './getStateFromPath-forks';\nimport * as expo from './getStateFromPath-forks';\nimport { INTERNAL_SLOT_NAME } from '../getLinkingConfig';\nimport { RouterStore } from '../global-state/router-store';\n\nexport type Options<ParamList extends object> = ExpoOptions & {\n path?: string;\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype ParseConfig = Record<string, (value: string) => any>;\n\nexport type RouteConfig = ExpoRouteConfig & {\n screen: string;\n regex?: RegExp;\n path: string;\n pattern: string;\n routeNames: string[];\n parse?: ParseConfig;\n};\n\nexport type InitialRouteConfig = {\n initialRouteName: string;\n parentScreens: string[];\n};\n\nexport type ResultState = PartialState<NavigationState> & {\n state?: ResultState;\n};\n\nexport type ParsedRoute = {\n name: string;\n path?: string;\n params?: Record<string, any> | undefined;\n};\n\ntype ConfigResources = {\n initialRoutes: InitialRouteConfig[];\n configs: RouteConfig[];\n configWithRegexes: RouteConfig[];\n};\n\n/**\n * Utility to parse a path string to initial state object accepted by the container.\n * This is useful for deep linking when we need to handle the incoming URL.\n *\n * @example\n * ```js\n * getStateFromPath(\n * '/chat/jane/42',\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * parse: { id: Number }\n * }\n * }\n * }\n * )\n * ```\n * @param path Path string to parse and convert, e.g. /foo/bar?count=42.\n * @param options Extra options to fine-tune how to parse the path.\n */\nexport function getStateFromPath<ParamList extends object>(\n // START FORK\n this: RouterStore | undefined | void,\n // END FORK\n path: string,\n options?: Options<ParamList>\n): ResultState | undefined {\n const { initialRoutes, configs, configWithRegexes } = getConfigResources(\n options,\n this?.routeInfo?.segments\n );\n\n const screens = options?.screens;\n\n // START FORK\n const expoPath = expo.getUrlWithReactNavigationConcessions(path);\n // END FORK\n\n // START FORK\n let remaining = expo.cleanPath(expoPath.nonstandardPathname);\n // let remaining = path\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 // remaining = remaining.endsWith('/') ? remaining : `${remaining}/`;\n // END FORK\n\n const prefix = options?.path?.replace(/^\\//, ''); // Remove extra leading slash\n\n if (prefix) {\n // Make sure there is a trailing slash\n const normalizedPrefix = prefix.endsWith('/') ? prefix : `${prefix}/`;\n\n // If the path doesn't start with the prefix, it's not a match\n if (!remaining.startsWith(normalizedPrefix)) {\n return undefined;\n }\n\n // Remove the prefix from the path\n remaining = remaining.replace(normalizedPrefix, '');\n }\n\n if (screens === undefined) {\n // When no config is specified, use the path segments as route names\n const routes = remaining\n .split('/')\n .filter(Boolean)\n .map((segment) => {\n const name = decodeURIComponent(segment);\n return { name };\n });\n\n if (routes.length) {\n return createNestedStateObject(expoPath, routes, initialRoutes, [], expoPath.url.hash);\n }\n\n return undefined;\n }\n\n if (remaining === '/') {\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 // START FORK\n const match = expo.matchForEmptyPath(configWithRegexes);\n // const match = configs.find(\n // (config) =>\n // config.path === '' &&\n // config.routeNames.every(\n // // Make sure that none of the parent configs have a non-empty path defined\n // (name) => !configs.find((c) => c.screen === name)?.path\n // )\n // );\n // END FORK\n\n if (match) {\n return createNestedStateObject(\n expoPath,\n match.routeNames.map((name) => ({ name })),\n initialRoutes,\n configs,\n expoPath.url.hash\n );\n }\n\n return undefined;\n }\n\n let result: PartialState<NavigationState> | undefined;\n let current: PartialState<NavigationState> | undefined;\n\n // We match the whole path against the regex instead of segments\n // This makes sure matches such as wildcard will catch any unmatched routes, even if nested\n const { routes, remainingPath } = matchAgainstConfigs(remaining, configWithRegexes);\n\n if (routes !== undefined) {\n // This will always be empty if full path matched\n current = createNestedStateObject(expoPath, routes, initialRoutes, configs, expoPath.url.hash);\n remaining = remainingPath;\n result = current;\n }\n\n if (current == null || result == null) {\n return undefined;\n }\n\n return result;\n}\n\n/**\n * Reference to the last used config resources. This is used to avoid recomputing the config resources when the options are the same.\n */\nlet cachedConfigResources: [Options<object> | undefined, ConfigResources] = [\n undefined,\n prepareConfigResources(),\n];\n\nfunction getConfigResources<ParamList extends object>(\n options: Options<ParamList> | undefined,\n // START FORK\n previousSegments?: string[]\n // END FORK\n) {\n // START FORK - We need to disable this caching as our configs can change based upon the current state\n // if (cachedConfigResources[0] !== options) {\n cachedConfigResources = [options, prepareConfigResources(options, previousSegments)];\n // }\n // END FORK FORK\n\n return cachedConfigResources[1];\n}\n\nfunction prepareConfigResources(options?: Options<object>, previousSegments?: string[]) {\n if (options) {\n validatePathConfig(options);\n }\n\n const initialRoutes = getInitialRoutes(options);\n\n const configs = getNormalizedConfigs(initialRoutes, options?.screens, previousSegments);\n\n checkForDuplicatedConfigs(configs);\n\n const configWithRegexes = getConfigsWithRegexes(configs);\n\n return {\n initialRoutes,\n configs,\n configWithRegexes,\n };\n}\n\nfunction getInitialRoutes(options?: Options<object>) {\n const initialRoutes: InitialRouteConfig[] = [];\n\n if (options?.initialRouteName) {\n initialRoutes.push({\n initialRouteName: options.initialRouteName,\n parentScreens: [],\n });\n }\n\n return initialRoutes;\n}\n\nfunction getNormalizedConfigs(\n initialRoutes: InitialRouteConfig[],\n screens: PathConfigMap<object> = {},\n // START FORK\n previousSegments?: string[]\n // END FORK\n) {\n // Create a normalized configs array which will be easier to use\n return ([] as RouteConfig[])\n .concat(\n ...Object.keys(screens).map((key) =>\n createNormalizedConfigs(key, screens as PathConfigMap<object>, [], initialRoutes, [])\n )\n )\n .map(expo.appendIsInitial(initialRoutes))\n .sort(expo.getRouteConfigSorter(previousSegments));\n // .sort((a, b) => {\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 // // If one of the patterns starts with the other, it's more exhaustive\n // // So move it up\n // if (a.pattern.startsWith(b.pattern)) {\n // return -1;\n // }\n\n // if (b.pattern.startsWith(a.pattern)) {\n // return 1;\n // }\n\n // const aParts = a.pattern.split('/');\n // const bParts = b.pattern.split('/');\n\n // for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n // // if b is longer, b get higher priority\n // if (aParts[i] == null) {\n // return 1;\n // }\n // // if a is longer, a get higher priority\n // if (bParts[i] == null) {\n // return -1;\n // }\n // const aWildCard = aParts[i] === '*' || aParts[i].startsWith(':');\n // const bWildCard = bParts[i] === '*' || bParts[i].startsWith(':');\n // // if both are wildcard we compare next component\n // if (aWildCard && bWildCard) {\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 // return bParts.length - aParts.length;\n // });\n}\n\nfunction checkForDuplicatedConfigs(configs: RouteConfig[]) {\n // Check for duplicate patterns in the config\n configs.reduce<Record<string, RouteConfig>>((acc, config) => {\n if (acc[config.pattern]) {\n const a = acc[config.pattern].routeNames;\n const b = config.routeNames;\n\n // It's not a problem if the path string omitted from a inner most screen\n // For example, it's ok if a path resolves to `A > B > C` or `A > B`\n const intersects =\n a.length > b.length ? b.every((it, i) => a[i] === it) : a.every((it, i) => b[i] === it);\n\n if (!intersects) {\n throw new Error(\n `Found conflicting screens with the same pattern. The pattern '${\n config.pattern\n }' resolves to both '${a.join(' > ')}' and '${b.join(\n ' > '\n )}'. Patterns must be unique and cannot resolve to more than one screen.`\n );\n }\n }\n\n return Object.assign(acc, {\n [config.pattern]: config,\n });\n }, {});\n}\n\nfunction getConfigsWithRegexes(configs: RouteConfig[]) {\n return configs.map((c) => ({\n ...c,\n // Add `$` to the regex to make sure it matches till end of the path and not just beginning\n // START FORK\n // regex: c.regex ? new RegExp(c.regex.source + '$') : undefined,\n regex: expo.configRegExp(c),\n // END FORK\n }));\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst matchAgainstConfigs = (remaining: string, configs: RouteConfig[]) => {\n let routes: ParsedRoute[] | undefined;\n let remainingPath = remaining;\n\n // START FORK\n const allParams = Object.create(null);\n // END FORK\n\n // Go through all configs, and see if the next path segment matches our regex\n for (const config of configs) {\n if (!config.regex) {\n continue;\n }\n\n const match = remainingPath.match(config.regex);\n\n // If our regex matches, we need to extract params from the path\n if (match) {\n const matchResult = config.pattern?.split('/').reduce<{\n pos: number; // Position of the current path param segment in the path (e.g in pattern `a/:b/:c`, `:a` is 0 and `:b` is 1)\n matchedParams: Record<string, Record<string, string>>; // The extracted params\n }>(\n (acc, p, index) => {\n if (!expo.isDynamicPart(p)) {\n return acc;\n }\n\n acc.pos += 1;\n\n // START FORK\n const decodedParamSegment = expo.safelyDecodeURIComponent(\n // const decodedParamSegment = decodeURIComponent(\n // The param segments appear every second item starting from 2 in the regex match result\n match![(acc.pos + 1) * 2]\n // Remove trailing slash\n .replace(/\\/$/, '')\n );\n // END FORK\n\n Object.assign(acc.matchedParams, {\n [p]: Object.assign(acc.matchedParams[p] || {}, {\n [index]: decodedParamSegment,\n }),\n });\n\n return acc;\n },\n { pos: -1, matchedParams: {} }\n );\n\n const matchedParams = matchResult.matchedParams || {};\n\n routes = config.routeNames.map((name) => {\n const routeConfig = configs.find((c) => {\n // Check matching name AND pattern in case same screen is used at different levels in config\n return c.screen === name && config.pattern.startsWith(c.pattern);\n });\n\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n const normalizedPath = routeConfig?.path.split('/').filter(Boolean).join('/');\n\n // Get the number of segments in the initial pattern\n const numInitialSegments = routeConfig?.pattern\n // Extract the prefix from the pattern by removing the ending path pattern (e.g pattern=`a/b/c/d` and normalizedPath=`c/d` becomes `a/b`)\n .replace(new RegExp(`${escape(normalizedPath!)}$`), '')\n ?.split('/').length;\n\n const params = normalizedPath\n ?.split('/')\n .reduce<Record<string, unknown>>((acc, p, index) => {\n if (!expo.isDynamicPart(p)) {\n return acc;\n }\n\n // Get the real index of the path parameter in the matched path\n // by offsetting by the number of segments in the initial pattern\n const offset = numInitialSegments ? numInitialSegments - 1 : 0;\n // START FORK\n // const value = matchedParams[p]?.[index + offset];\n const value = expo.getParamValue(p, matchedParams[p]?.[index + offset]);\n // END FORK\n\n if (value) {\n // START FORK\n // const key = p.replace(/^:/, '').replace(/\\?$/, '');\n const key = expo.replacePart(p);\n // END FORK\n acc[key] = routeConfig?.parse?.[key] ? routeConfig.parse[key](value as any) : value;\n }\n\n return acc;\n }, {});\n\n if (params && Object.keys(params).length) {\n Object.assign(allParams, params);\n return { name, params };\n }\n\n return { name };\n });\n\n remainingPath = remainingPath.replace(match[1], '');\n\n break;\n }\n }\n\n // START FORK\n expo.populateParams(routes, allParams);\n // END FORK\n\n return { routes, remainingPath };\n};\n\nconst createNormalizedConfigs = (\n screen: string,\n routeConfig: PathConfigMap<object>,\n routeNames: string[] = [],\n initials: InitialRouteConfig[],\n parentScreens: string[],\n parentPattern?: string\n): RouteConfig[] => {\n const configs: RouteConfig[] = [];\n\n routeNames.push(screen);\n\n parentScreens.push(screen);\n\n const config = routeConfig[screen];\n\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n configs.push(createConfigItem(screen, routeNames, pattern, config));\n } else if (typeof config === 'object') {\n let pattern: string | undefined;\n\n // if an object is specified as the value (e.g. Foo: { ... }),\n // it can have `path` property and\n // it could have `screens` prop which has nested configs\n if (typeof config.path === 'string') {\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n if (screen !== INTERNAL_SLOT_NAME) {\n configs.push(\n createConfigItem(screen, routeNames, pattern!, config.path, config.parse, config)\n );\n }\n }\n\n if (config.screens) {\n // property `initialRouteName` without `screens` has no purpose\n if (config.initialRouteName) {\n initials.push({\n initialRouteName: config.initialRouteName,\n parentScreens,\n });\n }\n\n Object.keys(config.screens).forEach((nestedConfig) => {\n const result = createNormalizedConfigs(\n nestedConfig,\n config.screens as PathConfigMap<object>,\n routeNames,\n initials,\n [...parentScreens],\n pattern ?? parentPattern\n );\n\n configs.push(...result);\n });\n }\n }\n\n routeNames.pop();\n\n return configs;\n};\n\nconst createConfigItem = (\n screen: string,\n routeNames: string[],\n pattern: string,\n path: string,\n parse: ParseConfig | undefined = undefined,\n config: Record<string, any> = {}\n): RouteConfig => {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern = pattern.split('/').filter(Boolean).join('/');\n\n // START FORK\n const regex = pattern ? expo.routePatternToRegex(pattern) : undefined;\n // const regex = pattern\n // ? 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 // : undefined;\n // END FORK\n\n return {\n screen,\n regex,\n pattern,\n path,\n // The routeNames array is mutated, so copy it to keep the current state\n routeNames: [...routeNames],\n parse,\n // START FORK\n ...expo.createConfig(screen, pattern, routeNames, config),\n // END FORK\n };\n};\n\nconst findParseConfigForRoute = (\n routeName: string,\n flatConfig: RouteConfig[]\n): ParseConfig | undefined => {\n for (const config of flatConfig) {\n if (routeName === config.routeNames[config.routeNames.length - 1]) {\n return config.parse;\n }\n }\n\n return undefined;\n};\n\n// Try to find an initial route connected with the one passed\nconst findInitialRoute = (\n routeName: string,\n parentScreens: string[],\n initialRoutes: InitialRouteConfig[]\n): string | undefined => {\n for (const config of initialRoutes) {\n if (parentScreens.length === config.parentScreens.length) {\n let sameParents = true;\n for (let i = 0; i < parentScreens.length; i++) {\n if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {\n sameParents = false;\n break;\n }\n }\n if (sameParents) {\n return routeName !== config.initialRouteName ? config.initialRouteName : undefined;\n }\n }\n }\n return undefined;\n};\n\n// returns state object with values depending on whether\n// it is the end of state and if there is initialRoute for this level\nconst createStateObject = (\n initialRoute: string | undefined,\n route: ParsedRoute,\n isEmpty: boolean\n): InitialState => {\n if (isEmpty) {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute, params: route.params }, route],\n };\n } else {\n return {\n routes: [route],\n };\n }\n } else {\n if (initialRoute) {\n return {\n index: 1,\n routes: [\n { name: initialRoute, params: route.params },\n { ...route, state: { routes: [] } },\n ],\n };\n } else {\n return {\n routes: [{ ...route, state: { routes: [] } }],\n };\n }\n }\n};\n\nconst createNestedStateObject = (\n { path, ...expoURL }: ReturnType<typeof expo.getUrlWithReactNavigationConcessions>,\n routes: ParsedRoute[],\n initialRoutes: InitialRouteConfig[],\n flatConfig?: RouteConfig[],\n hash?: string\n) => {\n let route = routes.shift() as ParsedRoute;\n const parentScreens: string[] = [];\n\n let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n parentScreens.push(route.name);\n\n const state: InitialState = createStateObject(initialRoute, route, routes.length === 0);\n\n if (routes.length > 0) {\n let nestedState = state;\n\n while ((route = routes.shift() as ParsedRoute)) {\n initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n const nestedStateIndex = nestedState.index || nestedState.routes.length - 1;\n\n nestedState.routes[nestedStateIndex].state = createStateObject(\n initialRoute,\n route,\n routes.length === 0\n );\n\n if (routes.length > 0) {\n nestedState = nestedState.routes[nestedStateIndex].state as InitialState;\n }\n\n parentScreens.push(route.name);\n }\n }\n\n route = findFocusedRoute(state) as ParsedRoute;\n // START FORK\n route.path = expoURL.pathWithoutGroups;\n // route.path = path;\n // END FORK\n\n // START FORK\n // const params = parseQueryParams(\n const params = expo.parseQueryParams(\n path,\n route,\n flatConfig ? findParseConfigForRoute(route.name, flatConfig) : undefined,\n hash\n );\n // END FORK\n\n // START FORK\n // expo.handleUrlParams(route, params, hash);\n if (params) {\n route.params = { ...route.params, ...params };\n }\n // END FORK\n\n return state;\n};\n\n// START FORK\n// const parseQueryParams = (path: string, parseConfig?: Record<string, (value: string) => any>) => {\n// const query = path.split('?')[1];\n// const params = queryString.parse(query);\n\n// if (parseConfig) {\n// Object.keys(params).forEach((name) => {\n// if (Object.hasOwnProperty.call(parseConfig, name) && typeof params[name] === 'string') {\n// params[name] = parseConfig[name](params[name] as string);\n// }\n// });\n// }\n\n// return Object.keys(params).length ? params : undefined;\n// };\n// END FORK\n"]}
@@ -1,5 +1,6 @@
1
1
  import { LinkingOptions } from '@react-navigation/native';
2
2
  import { RouteNode } from './Route';
3
+ import { type RedirectConfig } from './getRoutesCore';
3
4
  import { RouterStore } from './global-state/router-store';
4
5
  import { getInitialURL, getPathFromState, getStateFromPath } from './link/linking';
5
6
  import { RequireContext } from './types';
@@ -21,6 +22,7 @@ export type LinkingConfigOptions = {
21
22
  metaOnly?: boolean;
22
23
  serverUrl?: string;
23
24
  getInitialURL?: typeof getInitialURL;
25
+ redirects?: RedirectConfig[];
24
26
  };
25
- export declare function getLinkingConfig(store: RouterStore, routes: RouteNode, context: RequireContext, { metaOnly, serverUrl }?: LinkingConfigOptions): ExpoLinkingOptions;
27
+ export declare function getLinkingConfig(store: RouterStore, routes: RouteNode, context: RequireContext, { metaOnly, serverUrl, redirects }?: LinkingConfigOptions): ExpoLinkingOptions;
26
28
  //# sourceMappingURL=getLinkingConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getLinkingConfig.d.ts","sourceRoot":"","sources":["../src/getLinkingConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAEL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAE,OAAc;;;;;;;;EAS9E;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAC/F,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC;CACtC,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,EAAE,QAAe,EAAE,SAAS,EAAE,GAAE,oBAAyB,GACxD,kBAAkB,CA6DpB"}
1
+ {"version":3,"file":"getLinkingConfig.d.ts","sourceRoot":"","sources":["../src/getLinkingConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAEL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAE,OAAc;;;;;;;;EAS9E;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAC/F,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC;IACrC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,EAAE,QAAe,EAAE,SAAS,EAAE,SAAS,EAAE,GAAE,oBAAyB,GACnE,kBAAkB,CAkEpB"}
@@ -17,7 +17,7 @@ function getNavigationConfig(routes, metaOnly = true) {
17
17
  };
18
18
  }
19
19
  exports.getNavigationConfig = getNavigationConfig;
20
- function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl } = {}) {
20
+ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl, redirects } = {}) {
21
21
  // Returning `undefined` / `null from `getInitialURL` are valid values, so we need to track if it's been called.
22
22
  let hasCachedInitialUrl = false;
23
23
  let initialUrl;
@@ -27,9 +27,11 @@ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl }
27
27
  const nativeLinking = nativeLinkingKey
28
28
  ? context(nativeLinkingKey)
29
29
  : undefined;
30
+ const config = getNavigationConfig(routes, metaOnly);
31
+ const boundGetStateFromPath = linking_1.getStateFromPath.bind(store);
30
32
  return {
31
33
  prefixes: [],
32
- config: getNavigationConfig(routes, metaOnly),
34
+ config,
33
35
  // A custom getInitialURL is used on native to ensure the app always starts at
34
36
  // the root path if it's launched from something other than a deep link.
35
37
  // This helps keep the native functionality working like the web functionality.
@@ -45,12 +47,14 @@ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl }
45
47
  else {
46
48
  initialUrl = serverUrl ?? (0, linking_1.getInitialURL)();
47
49
  if (typeof initialUrl === 'string') {
48
- if (typeof nativeLinking?.redirectSystemPath === 'function') {
50
+ initialUrl = store.applyRedirects(initialUrl);
51
+ if (initialUrl && typeof nativeLinking?.redirectSystemPath === 'function') {
49
52
  initialUrl = nativeLinking.redirectSystemPath({ path: initialUrl, initial: true });
50
53
  }
51
54
  }
52
55
  else if (initialUrl) {
53
56
  initialUrl = initialUrl.then((url) => {
57
+ url = store.applyRedirects(url);
54
58
  if (url && typeof nativeLinking?.redirectSystemPath === 'function') {
55
59
  return nativeLinking.redirectSystemPath({ path: url, initial: true });
56
60
  }
@@ -62,13 +66,13 @@ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl }
62
66
  }
63
67
  return initialUrl;
64
68
  },
65
- subscribe: (0, linking_1.addEventListener)(nativeLinking),
66
- getStateFromPath: linking_1.getStateFromPath.bind(store),
69
+ subscribe: (0, linking_1.addEventListener)(nativeLinking, store),
70
+ getStateFromPath: boundGetStateFromPath,
67
71
  getPathFromState(state, options) {
68
72
  return ((0, linking_1.getPathFromState)(state, {
69
- screens: {},
70
- ...this.config,
73
+ ...config,
71
74
  ...options,
75
+ screens: config.screens ?? options?.screens ?? {},
72
76
  }) ?? '/');
73
77
  },
74
78
  // Add all functions to ensure the types never need to fallback.
@@ -1 +1 @@
1
- {"version":3,"file":"getLinkingConfig.js","sourceRoot":"","sources":["../src/getLinkingConfig.ts"],"names":[],"mappings":";;;AAAA,qDAA8E;AAC9E,yDAA6C;AAI7C,yEAAsE;AAEtE,4CAKwB;AAGX,QAAA,kBAAkB,GAAG,QAAQ,CAAC;AAE3C,SAAgB,mBAAmB,CAAC,MAAiB,EAAE,WAAoB,IAAI;IAC7E,OAAO;QACL,OAAO,EAAE;YACP,CAAC,0BAAkB,CAAC,EAAE;gBACpB,IAAI,EAAE,EAAE;gBACR,GAAG,IAAA,mDAAwB,EAAC,MAAM,EAAE,QAAQ,CAAC;aAC9C;SACF;KACF,CAAC;AACJ,CAAC;AATD,kDASC;AAaD,SAAgB,gBAAgB,CAC9B,KAAkB,EAClB,MAAiB,EACjB,OAAuB,EACvB,EAAE,QAAQ,GAAG,IAAI,EAAE,SAAS,KAA2B,EAAE;IAEzD,gHAAgH;IAChH,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,UAAwD,CAAC;IAE7D,MAAM,gBAAgB,GAAG,OAAO;SAC7B,IAAI,EAAE;SACN,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC9D,MAAM,aAAa,GAA6B,gBAAgB;QAC9D,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC3B,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC7C,8EAA8E;QAC9E,wEAAwE;QACxE,+EAA+E;QAC/E,8GAA8G;QAC9G,8EAA8E;QAC9E,aAAa;YACX,gHAAgH;YAChH,kCAAkC;YAClC,IAAI,CAAC,mBAAmB,EAAE;gBACxB,IAAI,4BAAQ,CAAC,EAAE,KAAK,KAAK,EAAE;oBACzB,UAAU,GAAG,SAAS,IAAI,IAAA,uBAAa,GAAE,CAAC;iBAC3C;qBAAM;oBACL,UAAU,GAAG,SAAS,IAAI,IAAA,uBAAa,GAAE,CAAC;oBAE1C,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;wBAClC,IAAI,OAAO,aAAa,EAAE,kBAAkB,KAAK,UAAU,EAAE;4BAC3D,UAAU,GAAG,aAAa,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;yBACpF;qBACF;yBAAM,IAAI,UAAU,EAAE;wBACrB,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;4BACnC,IAAI,GAAG,IAAI,OAAO,aAAa,EAAE,kBAAkB,KAAK,UAAU,EAAE;gCAClE,OAAO,aAAa,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;6BACvE;4BACD,OAAO,GAAG,CAAC;wBACb,CAAC,CAAC,CAAC;qBACJ;iBACF;gBACD,mBAAmB,GAAG,IAAI,CAAC;aAC5B;YACD,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,SAAS,EAAE,IAAA,0BAAgB,EAAC,aAAa,CAAC;QAC1C,gBAAgB,EAAE,0BAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9C,gBAAgB,CAAC,KAAY,EAAE,OAA+C;YAC5E,OAAO,CACL,IAAA,0BAAgB,EAAC,KAAK,EAAE;gBACtB,OAAO,EAAE,EAAE;gBACX,GAAG,IAAI,CAAC,MAAM;gBACd,GAAG,OAAO;aACX,CAAC,IAAI,GAAG,CACV,CAAC;QACJ,CAAC;QACD,gEAAgE;QAChE,kDAAkD;QAClD,kBAAkB,EAAlB,2BAAkB;KACnB,CAAC;AACJ,CAAC;AAlED,4CAkEC","sourcesContent":["import { getActionFromState, LinkingOptions } from '@react-navigation/native';\nimport { Platform } from 'expo-modules-core';\n\nimport { RouteNode } from './Route';\nimport { State } from './fork/getPathFromState';\nimport { getReactNavigationConfig } from './getReactNavigationConfig';\nimport { RouterStore } from './global-state/router-store';\nimport {\n addEventListener,\n getInitialURL,\n getPathFromState,\n getStateFromPath,\n} from './link/linking';\nimport { NativeIntent, RequireContext } from './types';\n\nexport const INTERNAL_SLOT_NAME = '__root';\n\nexport function getNavigationConfig(routes: RouteNode, metaOnly: boolean = true) {\n return {\n screens: {\n [INTERNAL_SLOT_NAME]: {\n path: '',\n ...getReactNavigationConfig(routes, metaOnly),\n },\n },\n };\n}\n\nexport type ExpoLinkingOptions<T extends object = Record<string, unknown>> = LinkingOptions<T> & {\n getPathFromState?: typeof getPathFromState;\n getStateFromPath?: typeof getStateFromPath;\n};\n\nexport type LinkingConfigOptions = {\n metaOnly?: boolean;\n serverUrl?: string;\n getInitialURL?: typeof getInitialURL;\n};\n\nexport function getLinkingConfig(\n store: RouterStore,\n routes: RouteNode,\n context: RequireContext,\n { metaOnly = true, serverUrl }: LinkingConfigOptions = {}\n): ExpoLinkingOptions {\n // Returning `undefined` / `null from `getInitialURL` are valid values, so we need to track if it's been called.\n let hasCachedInitialUrl = false;\n let initialUrl: ReturnType<typeof getInitialURL> | undefined;\n\n const nativeLinkingKey = context\n .keys()\n .find((key) => key.match(/^\\.\\/\\+native-intent\\.[tj]sx?$/));\n const nativeLinking: NativeIntent | undefined = nativeLinkingKey\n ? context(nativeLinkingKey)\n : undefined;\n\n return {\n prefixes: [],\n config: getNavigationConfig(routes, metaOnly),\n // A custom getInitialURL is used on native to ensure the app always starts at\n // the root path if it's launched from something other than a deep link.\n // This helps keep the native functionality working like the web functionality.\n // For example, if you had a root navigator where the first screen was `/settings` and the second was `/index`\n // then `/index` would be used on web and `/settings` would be used on native.\n getInitialURL() {\n // Expo Router calls `getInitialURL` twice, which may confuse the user if they provide a custom `getInitialURL`.\n // Therefor we memoize the result.\n if (!hasCachedInitialUrl) {\n if (Platform.OS === 'web') {\n initialUrl = serverUrl ?? getInitialURL();\n } else {\n initialUrl = serverUrl ?? getInitialURL();\n\n if (typeof initialUrl === 'string') {\n if (typeof nativeLinking?.redirectSystemPath === 'function') {\n initialUrl = nativeLinking.redirectSystemPath({ path: initialUrl, initial: true });\n }\n } else if (initialUrl) {\n initialUrl = initialUrl.then((url) => {\n if (url && typeof nativeLinking?.redirectSystemPath === 'function') {\n return nativeLinking.redirectSystemPath({ path: url, initial: true });\n }\n return url;\n });\n }\n }\n hasCachedInitialUrl = true;\n }\n return initialUrl;\n },\n subscribe: addEventListener(nativeLinking),\n getStateFromPath: getStateFromPath.bind(store),\n getPathFromState(state: State, options: Parameters<typeof getPathFromState>[1]) {\n return (\n getPathFromState(state, {\n screens: {},\n ...this.config,\n ...options,\n }) ?? '/'\n );\n },\n // Add all functions to ensure the types never need to fallback.\n // This is a convenience for usage in the package.\n getActionFromState,\n };\n}\n"]}
1
+ {"version":3,"file":"getLinkingConfig.js","sourceRoot":"","sources":["../src/getLinkingConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import { getActionFromState, LinkingOptions } from '@react-navigation/native';\nimport { Platform } from 'expo-modules-core';\n\nimport { RouteNode } from './Route';\nimport { State } from './fork/getPathFromState';\nimport { getReactNavigationConfig } from './getReactNavigationConfig';\nimport { type RedirectConfig } from './getRoutesCore';\nimport { RouterStore } from './global-state/router-store';\nimport {\n addEventListener,\n getInitialURL,\n getPathFromState,\n getStateFromPath,\n} from './link/linking';\nimport { NativeIntent, RequireContext } from './types';\n\nexport const INTERNAL_SLOT_NAME = '__root';\n\nexport function getNavigationConfig(routes: RouteNode, metaOnly: boolean = true) {\n return {\n screens: {\n [INTERNAL_SLOT_NAME]: {\n path: '',\n ...getReactNavigationConfig(routes, metaOnly),\n },\n },\n };\n}\n\nexport type ExpoLinkingOptions<T extends object = Record<string, unknown>> = LinkingOptions<T> & {\n getPathFromState?: typeof getPathFromState;\n getStateFromPath?: typeof getStateFromPath;\n};\n\nexport type LinkingConfigOptions = {\n metaOnly?: boolean;\n serverUrl?: string;\n getInitialURL?: typeof getInitialURL;\n redirects?: RedirectConfig[];\n};\n\nexport function getLinkingConfig(\n store: RouterStore,\n routes: RouteNode,\n context: RequireContext,\n { metaOnly = true, serverUrl, redirects }: LinkingConfigOptions = {}\n): ExpoLinkingOptions {\n // Returning `undefined` / `null from `getInitialURL` are valid values, so we need to track if it's been called.\n let hasCachedInitialUrl = false;\n let initialUrl: ReturnType<typeof getInitialURL> | undefined;\n\n const nativeLinkingKey = context\n .keys()\n .find((key) => key.match(/^\\.\\/\\+native-intent\\.[tj]sx?$/));\n const nativeLinking: NativeIntent | undefined = nativeLinkingKey\n ? context(nativeLinkingKey)\n : undefined;\n\n const config = getNavigationConfig(routes, metaOnly);\n const boundGetStateFromPath = getStateFromPath.bind(store);\n\n return {\n prefixes: [],\n config,\n // A custom getInitialURL is used on native to ensure the app always starts at\n // the root path if it's launched from something other than a deep link.\n // This helps keep the native functionality working like the web functionality.\n // For example, if you had a root navigator where the first screen was `/settings` and the second was `/index`\n // then `/index` would be used on web and `/settings` would be used on native.\n getInitialURL() {\n // Expo Router calls `getInitialURL` twice, which may confuse the user if they provide a custom `getInitialURL`.\n // Therefor we memoize the result.\n if (!hasCachedInitialUrl) {\n if (Platform.OS === 'web') {\n initialUrl = serverUrl ?? getInitialURL();\n } else {\n initialUrl = serverUrl ?? getInitialURL();\n\n if (typeof initialUrl === 'string') {\n initialUrl = store.applyRedirects(initialUrl);\n if (initialUrl && typeof nativeLinking?.redirectSystemPath === 'function') {\n initialUrl = nativeLinking.redirectSystemPath({ path: initialUrl, initial: true });\n }\n } else if (initialUrl) {\n initialUrl = initialUrl.then((url) => {\n url = store.applyRedirects(url);\n if (url && typeof nativeLinking?.redirectSystemPath === 'function') {\n return nativeLinking.redirectSystemPath({ path: url, initial: true });\n }\n return url;\n });\n }\n }\n hasCachedInitialUrl = true;\n }\n return initialUrl;\n },\n subscribe: addEventListener(nativeLinking, store),\n getStateFromPath: boundGetStateFromPath,\n getPathFromState(state: State, options: Parameters<typeof getPathFromState>[1]) {\n return (\n getPathFromState(state, {\n ...config,\n ...options,\n screens: config.screens ?? options?.screens ?? {},\n }) ?? '/'\n );\n },\n // Add all functions to ensure the types never need to fallback.\n // This is a convenience for usage in the package.\n getActionFromState,\n };\n}\n"]}
@@ -5,6 +5,7 @@ export type Screen = string | {
5
5
  _route?: RouteNode;
6
6
  initialRouteName?: string;
7
7
  };
8
+ export declare function parseRouteSegments(segments: string): string;
8
9
  export declare function getReactNavigationScreensConfig(nodes: RouteNode[], metaOnly: boolean): Record<string, Screen>;
9
10
  export declare function getReactNavigationConfig(routes: RouteNode, metaOnly: boolean): {
10
11
  initialRouteName: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"getReactNavigationConfig.d.ts","sourceRoot":"","sources":["../src/getReactNavigationConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,MAAM,MAAM,GACd,MAAM,GACN;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AA4EN,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,OAAO,GAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;;;EAY5E"}
1
+ {"version":3,"file":"getReactNavigationConfig.d.ts","sourceRoot":"","sources":["../src/getReactNavigationConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,MAAM,MAAM,GACd,MAAM,GACN;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AA0BN,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc3D;AAoCD,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,OAAO,GAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO;;;EAY5E"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getReactNavigationConfig = exports.getReactNavigationScreensConfig = void 0;
3
+ exports.getReactNavigationConfig = exports.getReactNavigationScreensConfig = exports.parseRouteSegments = void 0;
4
4
  const matchers_1 = require("./matchers");
5
5
  // `[page]` -> `:page`
6
6
  // `page` -> `page`
@@ -36,6 +36,7 @@ function parseRouteSegments(segments) {
36
36
  // Join to return as a path.
37
37
  .join('/'));
38
38
  }
39
+ exports.parseRouteSegments = parseRouteSegments;
39
40
  function convertRouteNodeToScreen(node, metaOnly) {
40
41
  const path = parseRouteSegments(node.route);
41
42
  if (!node.children.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"getReactNavigationConfig.js","sourceRoot":"","sources":["../src/getReactNavigationConfig.ts"],"names":[],"mappings":";;;AACA,yCAAyE;AAWzE,sBAAsB;AACtB,mBAAmB;AACnB,SAAS,oCAAoC,CAAC,OAAe;IAC3D,wEAAwE;IACxE,IAAI,OAAO,KAAK,OAAO,EAAE;QACvB,OAAO,EAAE,CAAC;KACX;IACD,IAAI,OAAO,KAAK,YAAY,EAAE;QAC5B,OAAO,YAAY,CAAC;KACrB;IAED,MAAM,IAAI,GAAG,IAAA,oCAAyB,EAAC,OAAO,CAAC,CAAC;IAChD,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,OAAO,GAAG,GAAG,IAAI,CAAC;KACnB;IACD,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,WAAW,IAAI,IAAI,EAAE;QACvB,OAAO,IAAI,WAAW,EAAE,CAAC;KAC1B;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,OAAO;IACL,gEAAgE;IAChE,yDAAyD;IACzD,qEAAqE;IACrE,QAAQ;SACL,KAAK,CAAC,GAAG,CAAC;QACX,qDAAqD;SACpD,GAAG,CAAC,oCAAoC,CAAC;QAC1C,sDAAsD;SACrD,MAAM,CAAC,OAAO,CAAC;QAChB,4BAA4B;SAC3B,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAe,EAAE,QAAiB;IAClE,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;gBACL,IAAI;gBACJ,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,IAAI;aACb,CAAC;SACH;QACD,OAAO,IAAI,CAAC;KACb;IACD,MAAM,OAAO,GAAG,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAW;QACrB,IAAI;QACJ,OAAO;KACR,CAAC;IAEF,IAAI,IAAI,CAAC,gBAAgB,EAAE;QACzB,mEAAmE;QACnE,kEAAkE;QAClE,6EAA6E;QAC7E,2CAA2C;QAC3C,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;KACjD;IAED,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;KACtB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,+BAA+B,CAC7C,KAAkB,EAClB,QAAiB;IAEjB,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAU,CAAC,CACrF,CAAC;AACJ,CAAC;AAPD,0EAOC;AAED,SAAgB,wBAAwB,CAAC,MAAiB,EAAE,QAAiB;IAC3E,MAAM,MAAM,GAAG;QACb,gBAAgB,EAAE,SAAS;QAC3B,OAAO,EAAE,+BAA+B,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;KACpE,CAAC;IAEF,IAAI,MAAM,CAAC,gBAAgB,EAAE;QAC3B,yFAAyF;QACzF,yEAAyE;QACzE,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAuB,CAAC;KAC1D;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAZD,4DAYC","sourcesContent":["import type { RouteNode } from './Route';\nimport { matchDeepDynamicRouteName, matchDynamicName } from './matchers';\n\nexport type Screen =\n | string\n | {\n path: string;\n screens: Record<string, Screen>;\n _route?: RouteNode;\n initialRouteName?: string;\n };\n\n// `[page]` -> `:page`\n// `page` -> `page`\nfunction convertDynamicRouteToReactNavigation(segment: string): string {\n // NOTE(EvanBacon): To support shared routes we preserve group segments.\n if (segment === 'index') {\n return '';\n }\n if (segment === '+not-found') {\n return '*not-found';\n }\n\n const rest = matchDeepDynamicRouteName(segment);\n if (rest != null) {\n return '*' + rest;\n }\n const dynamicName = matchDynamicName(segment);\n\n if (dynamicName != null) {\n return `:${dynamicName}`;\n }\n\n return segment;\n}\n\nfunction parseRouteSegments(segments: string): string {\n return (\n // NOTE(EvanBacon): When there are nested routes without layouts\n // the node.route will be something like `app/home/index`\n // this needs to be split to ensure each segment is parsed correctly.\n segments\n .split('/')\n // Convert each segment to a React Navigation format.\n .map(convertDynamicRouteToReactNavigation)\n // Remove any empty paths from groups or index routes.\n .filter(Boolean)\n // Join to return as a path.\n .join('/')\n );\n}\n\nfunction convertRouteNodeToScreen(node: RouteNode, metaOnly: boolean): Screen {\n const path = parseRouteSegments(node.route);\n if (!node.children.length) {\n if (!metaOnly) {\n return {\n path,\n screens: {},\n _route: node,\n };\n }\n return path;\n }\n const screens = getReactNavigationScreensConfig(node.children, metaOnly);\n\n const screen: Screen = {\n path,\n screens,\n };\n\n if (node.initialRouteName) {\n // NOTE(EvanBacon): This is bad because it forces all Layout Routes\n // to be loaded into memory. We should move towards a system where\n // the initial route name is either loaded asynchronously in the Layout Route\n // or defined via a file system convention.\n screen.initialRouteName = node.initialRouteName;\n }\n\n if (!metaOnly) {\n screen._route = node;\n }\n\n return screen;\n}\n\nexport function getReactNavigationScreensConfig(\n nodes: RouteNode[],\n metaOnly: boolean\n): Record<string, Screen> {\n return Object.fromEntries(\n nodes.map((node) => [node.route, convertRouteNodeToScreen(node, metaOnly)] as const)\n );\n}\n\nexport function getReactNavigationConfig(routes: RouteNode, metaOnly: boolean) {\n const config = {\n initialRouteName: undefined,\n screens: getReactNavigationScreensConfig(routes.children, metaOnly),\n };\n\n if (routes.initialRouteName) {\n // We're using LinkingOptions the generic type is `object` instead of a proper ParamList.\n // So we need to cast the initialRouteName to `any` to avoid type errors.\n config.initialRouteName = routes.initialRouteName as any;\n }\n return config;\n}\n"]}
1
+ {"version":3,"file":"getReactNavigationConfig.js","sourceRoot":"","sources":["../src/getReactNavigationConfig.ts"],"names":[],"mappings":";;;AACA,yCAAyE;AAWzE,sBAAsB;AACtB,mBAAmB;AACnB,SAAS,oCAAoC,CAAC,OAAe;IAC3D,wEAAwE;IACxE,IAAI,OAAO,KAAK,OAAO,EAAE;QACvB,OAAO,EAAE,CAAC;KACX;IACD,IAAI,OAAO,KAAK,YAAY,EAAE;QAC5B,OAAO,YAAY,CAAC;KACrB;IAED,MAAM,IAAI,GAAG,IAAA,oCAAyB,EAAC,OAAO,CAAC,CAAC;IAChD,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,OAAO,GAAG,GAAG,IAAI,CAAC;KACnB;IACD,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,WAAW,IAAI,IAAI,EAAE;QACvB,OAAO,IAAI,WAAW,EAAE,CAAC;KAC1B;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,OAAO;IACL,gEAAgE;IAChE,yDAAyD;IACzD,qEAAqE;IACrE,QAAQ;SACL,KAAK,CAAC,GAAG,CAAC;QACX,qDAAqD;SACpD,GAAG,CAAC,oCAAoC,CAAC;QAC1C,sDAAsD;SACrD,MAAM,CAAC,OAAO,CAAC;QAChB,4BAA4B;SAC3B,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAdD,gDAcC;AAED,SAAS,wBAAwB,CAAC,IAAe,EAAE,QAAiB;IAClE,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO;gBACL,IAAI;gBACJ,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,IAAI;aACb,CAAC;SACH;QACD,OAAO,IAAI,CAAC;KACb;IACD,MAAM,OAAO,GAAG,+BAA+B,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAW;QACrB,IAAI;QACJ,OAAO;KACR,CAAC;IAEF,IAAI,IAAI,CAAC,gBAAgB,EAAE;QACzB,mEAAmE;QACnE,kEAAkE;QAClE,6EAA6E;QAC7E,2CAA2C;QAC3C,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;KACjD;IAED,IAAI,CAAC,QAAQ,EAAE;QACb,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;KACtB;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,+BAA+B,CAC7C,KAAkB,EAClB,QAAiB;IAEjB,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAU,CAAC,CACrF,CAAC;AACJ,CAAC;AAPD,0EAOC;AAED,SAAgB,wBAAwB,CAAC,MAAiB,EAAE,QAAiB;IAC3E,MAAM,MAAM,GAAG;QACb,gBAAgB,EAAE,SAAS;QAC3B,OAAO,EAAE,+BAA+B,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;KACpE,CAAC;IAEF,IAAI,MAAM,CAAC,gBAAgB,EAAE;QAC3B,yFAAyF;QACzF,yEAAyE;QACzE,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAuB,CAAC;KAC1D;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAZD,4DAYC","sourcesContent":["import type { RouteNode } from './Route';\nimport { matchDeepDynamicRouteName, matchDynamicName } from './matchers';\n\nexport type Screen =\n | string\n | {\n path: string;\n screens: Record<string, Screen>;\n _route?: RouteNode;\n initialRouteName?: string;\n };\n\n// `[page]` -> `:page`\n// `page` -> `page`\nfunction convertDynamicRouteToReactNavigation(segment: string): string {\n // NOTE(EvanBacon): To support shared routes we preserve group segments.\n if (segment === 'index') {\n return '';\n }\n if (segment === '+not-found') {\n return '*not-found';\n }\n\n const rest = matchDeepDynamicRouteName(segment);\n if (rest != null) {\n return '*' + rest;\n }\n const dynamicName = matchDynamicName(segment);\n\n if (dynamicName != null) {\n return `:${dynamicName}`;\n }\n\n return segment;\n}\n\nexport function parseRouteSegments(segments: string): string {\n return (\n // NOTE(EvanBacon): When there are nested routes without layouts\n // the node.route will be something like `app/home/index`\n // this needs to be split to ensure each segment is parsed correctly.\n segments\n .split('/')\n // Convert each segment to a React Navigation format.\n .map(convertDynamicRouteToReactNavigation)\n // Remove any empty paths from groups or index routes.\n .filter(Boolean)\n // Join to return as a path.\n .join('/')\n );\n}\n\nfunction convertRouteNodeToScreen(node: RouteNode, metaOnly: boolean): Screen {\n const path = parseRouteSegments(node.route);\n if (!node.children.length) {\n if (!metaOnly) {\n return {\n path,\n screens: {},\n _route: node,\n };\n }\n return path;\n }\n const screens = getReactNavigationScreensConfig(node.children, metaOnly);\n\n const screen: Screen = {\n path,\n screens,\n };\n\n if (node.initialRouteName) {\n // NOTE(EvanBacon): This is bad because it forces all Layout Routes\n // to be loaded into memory. We should move towards a system where\n // the initial route name is either loaded asynchronously in the Layout Route\n // or defined via a file system convention.\n screen.initialRouteName = node.initialRouteName;\n }\n\n if (!metaOnly) {\n screen._route = node;\n }\n\n return screen;\n}\n\nexport function getReactNavigationScreensConfig(\n nodes: RouteNode[],\n metaOnly: boolean\n): Record<string, Screen> {\n return Object.fromEntries(\n nodes.map((node) => [node.route, convertRouteNodeToScreen(node, metaOnly)] as const)\n );\n}\n\nexport function getReactNavigationConfig(routes: RouteNode, metaOnly: boolean) {\n const config = {\n initialRouteName: undefined,\n screens: getReactNavigationScreensConfig(routes.children, metaOnly),\n };\n\n if (routes.initialRouteName) {\n // We're using LinkingOptions the generic type is `object` instead of a proper ParamList.\n // So we need to cast the initialRouteName to `any` to avoid type errors.\n config.initialRouteName = routes.initialRouteName as any;\n }\n return config;\n}\n"]}
@@ -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,CAkDhG;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
+ {"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"}
@@ -16,7 +16,7 @@ const getRoutesCore_1 = require("./getRoutesCore");
16
16
  */
17
17
  function getRoutes(contextModule, options = {}) {
18
18
  return (0, getRoutesCore_1.getRoutes)(contextModule, {
19
- getSystemRoute({ route, type }) {
19
+ getSystemRoute({ route, type }, defaults) {
20
20
  if (route === '' && type === 'layout') {
21
21
  // Root layout when no layout is defined.
22
22
  return {
@@ -62,6 +62,14 @@ function getRoutes(contextModule, options = {}) {
62
62
  children: [],
63
63
  };
64
64
  }
65
+ else if ((type === 'redirect' || type === 'rewrite') && defaults) {
66
+ return {
67
+ ...defaults,
68
+ loadRoute() {
69
+ return require('./getRoutesRedirects').getRedirectModule(route);
70
+ },
71
+ };
72
+ }
65
73
  throw new Error(`Unknown system route: ${route} and type: ${type}`);
66
74
  },
67
75
  ...options,
@@ -1 +1 @@
1
- {"version":3,"file":"getRoutes.js","sourceRoot":"","sources":["../src/getRoutes.ts"],"names":[],"mappings":";;;AACA,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;YAC5B,IAAI,KAAK,KAAK,EAAE,IAAI,IAAI,KAAK,QAAQ,EAAE;gBACrC,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;aACH;iBAAM,IAAI,KAAK,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,EAAE;gBACnD,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;aACH;iBAAM,IAAI,KAAK,KAAK,YAAY,IAAI,IAAI,KAAK,OAAO,EAAE;gBACrD,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;aACH;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAlDD,8BAkDC;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;AARD,wCAQC;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 }) {\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 }\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"]}
1
+ {"version":3,"file":"getRoutes.js","sourceRoot":"","sources":["../src/getRoutes.ts"],"names":[],"mappings":";;;AACA,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;gBACrC,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;aACH;iBAAM,IAAI,KAAK,KAAK,UAAU,IAAI,IAAI,KAAK,OAAO,EAAE;gBACnD,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;aACH;iBAAM,IAAI,KAAK,KAAK,YAAY,IAAI,IAAI,KAAK,OAAO,EAAE;gBACrD,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;aACH;iBAAM,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,QAAQ,EAAE;gBAClE,OAAO;oBACL,GAAG,QAAQ;oBACX,SAAS;wBACP,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAClE,CAAC;iBACF,CAAC;aACH;YACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,cAAc,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAzDD,8BAyDC;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;AARD,wCAQC;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"]}
@@ -12,8 +12,23 @@ export type Options = {
12
12
  platformRoutes?: boolean;
13
13
  sitemap?: boolean;
14
14
  platform?: string;
15
+ redirects?: RedirectConfig[];
16
+ rewrites?: RewriteConfig[];
17
+ preserveRedirectAndRewrites?: boolean;
15
18
  /** Get the system route for a location. Useful for shimming React Native imports in SSR environments. */
16
- getSystemRoute: (route: Pick<RouteNode, 'route' | 'type'>) => RouteNode;
19
+ getSystemRoute: (route: Pick<RouteNode, 'route' | 'type'>, defaults?: RouteNode) => RouteNode;
20
+ };
21
+ export type RedirectConfig = {
22
+ source: string;
23
+ destination: string;
24
+ permanent?: boolean;
25
+ methods?: string[];
26
+ external?: boolean;
27
+ };
28
+ export type RewriteConfig = {
29
+ source: string;
30
+ destination: string;
31
+ methods?: string[];
17
32
  };
18
33
  /**
19
34
  * Given a Metro context module, return an array of nested routes.
@@ -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;AAS5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,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;IAElB,yGAAyG;IACzG,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,SAAS,CAAC;CACzE,CAAC;AAUF;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe3F;AA0WD,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,CAqBxE"}
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;AAY5D,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,CAqBxE"}