expo-router 5.2.0-canary-20250729-d8899ae → 5.2.0-canary-20250811-5c940c0

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 (182) hide show
  1. package/_ctx.android.js +1 -1
  2. package/_ctx.ios.js +1 -1
  3. package/_ctx.web.js +1 -1
  4. package/assets/modal.module.css +12 -3
  5. package/build/ExpoRoot.d.ts.map +1 -1
  6. package/build/ExpoRoot.js +12 -2
  7. package/build/ExpoRoot.js.map +1 -1
  8. package/build/Route.d.ts +9 -0
  9. package/build/Route.d.ts.map +1 -1
  10. package/build/Route.js.map +1 -1
  11. package/build/constants.d.ts +2 -0
  12. package/build/constants.d.ts.map +1 -1
  13. package/build/constants.js +3 -1
  14. package/build/constants.js.map +1 -1
  15. package/build/doctor/index.d.ts +1 -1
  16. package/build/doctor/index.d.ts.map +1 -1
  17. package/build/doctor/index.js +4 -1
  18. package/build/doctor/index.js.map +1 -1
  19. package/build/exports.d.ts +2 -2
  20. package/build/exports.d.ts.map +1 -1
  21. package/build/exports.js +6 -6
  22. package/build/exports.js.map +1 -1
  23. package/build/fork/native-stack/createNativeStackNavigator.d.ts +2 -2
  24. package/build/fork/native-stack/createNativeStackNavigator.d.ts.map +1 -1
  25. package/build/fork/native-stack/createNativeStackNavigator.js +82 -2
  26. package/build/fork/native-stack/createNativeStackNavigator.js.map +1 -1
  27. package/build/fork/useLinking.js +2 -2
  28. package/build/fork/useLinking.js.map +1 -1
  29. package/build/getLinkingConfig.d.ts +29 -2
  30. package/build/getLinkingConfig.d.ts.map +1 -1
  31. package/build/getLinkingConfig.js +35 -4
  32. package/build/getLinkingConfig.js.map +1 -1
  33. package/build/getRoutesCore.d.ts +1 -0
  34. package/build/getRoutesCore.d.ts.map +1 -1
  35. package/build/getRoutesCore.js +60 -0
  36. package/build/getRoutesCore.js.map +1 -1
  37. package/build/getServerManifest.d.ts +20 -1
  38. package/build/getServerManifest.d.ts.map +1 -1
  39. package/build/getServerManifest.js +8 -1
  40. package/build/getServerManifest.js.map +1 -1
  41. package/build/global-state/routeInfo.d.ts.map +1 -1
  42. package/build/global-state/routeInfo.js +12 -1
  43. package/build/global-state/routeInfo.js.map +1 -1
  44. package/build/global-state/router-store.d.ts.map +1 -1
  45. package/build/global-state/router-store.js +4 -0
  46. package/build/global-state/router-store.js.map +1 -1
  47. package/build/global-state/routing.d.ts +29 -1
  48. package/build/global-state/routing.d.ts.map +1 -1
  49. package/build/global-state/routing.js +78 -42
  50. package/build/global-state/routing.js.map +1 -1
  51. package/build/global-state/utils.d.ts +4 -0
  52. package/build/global-state/utils.d.ts.map +1 -0
  53. package/build/global-state/utils.js +29 -0
  54. package/build/global-state/utils.js.map +1 -0
  55. package/build/hooks.d.ts +1 -1
  56. package/build/hooks.d.ts.map +1 -1
  57. package/build/hooks.js +9 -4
  58. package/build/hooks.js.map +1 -1
  59. package/build/layouts/DrawerClient.d.ts +2 -2
  60. package/build/layouts/StackClient.d.ts +2 -2
  61. package/build/layouts/StackClient.d.ts.map +1 -1
  62. package/build/layouts/StackClient.js +11 -6
  63. package/build/layouts/StackClient.js.map +1 -1
  64. package/build/layouts/TabsClient.d.ts +3 -3
  65. package/build/layouts/withLayoutContext.d.ts.map +1 -1
  66. package/build/layouts/withLayoutContext.js +13 -0
  67. package/build/layouts/withLayoutContext.js.map +1 -1
  68. package/build/link/ExpoLink.d.ts.map +1 -1
  69. package/build/link/ExpoLink.js +3 -2
  70. package/build/link/ExpoLink.js.map +1 -1
  71. package/build/link/InternalLinkPreviewContext.d.ts +6 -0
  72. package/build/link/InternalLinkPreviewContext.d.ts.map +1 -0
  73. package/build/link/InternalLinkPreviewContext.js +6 -0
  74. package/build/link/InternalLinkPreviewContext.js.map +1 -0
  75. package/build/link/Link.d.ts +2 -67
  76. package/build/link/Link.d.ts.map +1 -1
  77. package/build/link/Link.js +5 -70
  78. package/build/link/Link.js.map +1 -1
  79. package/build/link/LinkWithPreview.d.ts +1 -46
  80. package/build/link/LinkWithPreview.d.ts.map +1 -1
  81. package/build/link/LinkWithPreview.js +20 -113
  82. package/build/link/LinkWithPreview.js.map +1 -1
  83. package/build/link/elements.d.ts +166 -0
  84. package/build/link/elements.d.ts.map +1 -0
  85. package/build/link/elements.js +172 -0
  86. package/build/link/elements.js.map +1 -0
  87. package/build/link/preview/HrefPreview.d.ts +1 -1
  88. package/build/link/preview/HrefPreview.d.ts.map +1 -1
  89. package/build/link/preview/HrefPreview.js +43 -7
  90. package/build/link/preview/HrefPreview.js.map +1 -1
  91. package/build/link/preview/LinkPreviewContext.d.ts +3 -2
  92. package/build/link/preview/LinkPreviewContext.d.ts.map +1 -1
  93. package/build/link/preview/LinkPreviewContext.js +3 -2
  94. package/build/link/preview/LinkPreviewContext.js.map +1 -1
  95. package/build/link/preview/native.d.ts +14 -6
  96. package/build/link/preview/native.d.ts.map +1 -1
  97. package/build/link/preview/native.js.map +1 -1
  98. package/build/link/preview/useNextScreenId.d.ts +8 -1
  99. package/build/link/preview/useNextScreenId.d.ts.map +1 -1
  100. package/build/link/preview/useNextScreenId.js +37 -32
  101. package/build/link/preview/useNextScreenId.js.map +1 -1
  102. package/build/link/preview/utils.d.ts +12 -0
  103. package/build/link/preview/utils.d.ts.map +1 -0
  104. package/build/link/preview/utils.js +66 -0
  105. package/build/link/preview/utils.js.map +1 -0
  106. package/build/modal/Modal.js +1 -1
  107. package/build/modal/Modal.js.map +1 -1
  108. package/build/modal/ModalsRenderer.js +1 -1
  109. package/build/modal/ModalsRenderer.js.map +1 -1
  110. package/build/modal/web/ModalStackRouteDrawer.web.d.ts.map +1 -1
  111. package/build/modal/web/ModalStackRouteDrawer.web.js +0 -1
  112. package/build/modal/web/ModalStackRouteDrawer.web.js.map +1 -1
  113. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.d.ts +25 -0
  114. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.d.ts.map +1 -0
  115. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.js +27 -0
  116. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsNavigator.js.map +1 -0
  117. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.d.ts +3 -0
  118. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.d.ts.map +1 -0
  119. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.js +65 -0
  120. package/build/native-tabs/NativeBottomTabs/NativeBottomTabsRouter.js.map +1 -0
  121. package/build/native-tabs/NativeBottomTabs/NativeTabs.d.ts +7 -0
  122. package/build/native-tabs/NativeBottomTabs/NativeTabs.d.ts.map +1 -0
  123. package/build/native-tabs/NativeBottomTabs/NativeTabs.js +9 -0
  124. package/build/native-tabs/NativeBottomTabs/NativeTabs.js.map +1 -0
  125. package/build/native-tabs/NativeBottomTabs/NativeTabsView.d.ts +103 -0
  126. package/build/native-tabs/NativeBottomTabs/NativeTabsView.d.ts.map +1 -0
  127. package/build/native-tabs/NativeBottomTabs/NativeTabsView.js +69 -0
  128. package/build/native-tabs/NativeBottomTabs/NativeTabsView.js.map +1 -0
  129. package/build/native-tabs/NativeBottomTabs/TabOptions.d.ts +40 -0
  130. package/build/native-tabs/NativeBottomTabs/TabOptions.d.ts.map +1 -0
  131. package/build/native-tabs/NativeBottomTabs/TabOptions.js +103 -0
  132. package/build/native-tabs/NativeBottomTabs/TabOptions.js.map +1 -0
  133. package/build/native-tabs/NativeBottomTabs/utils.d.ts +7 -0
  134. package/build/native-tabs/NativeBottomTabs/utils.d.ts.map +1 -0
  135. package/build/native-tabs/NativeBottomTabs/utils.js +21 -0
  136. package/build/native-tabs/NativeBottomTabs/utils.js.map +1 -0
  137. package/build/native-tabs/common/elements.d.ts +59 -0
  138. package/build/native-tabs/common/elements.d.ts.map +1 -0
  139. package/build/native-tabs/common/elements.js +15 -0
  140. package/build/native-tabs/common/elements.js.map +1 -0
  141. package/build/native-tabs/index.d.ts +3 -0
  142. package/build/native-tabs/index.d.ts.map +1 -0
  143. package/build/native-tabs/index.js +10 -0
  144. package/build/native-tabs/index.js.map +1 -0
  145. package/build/routes-manifest.d.ts +42 -0
  146. package/build/routes-manifest.d.ts.map +1 -1
  147. package/build/routes-manifest.js.map +1 -1
  148. package/build/testing-library/mock-config.d.ts +18 -0
  149. package/build/testing-library/mock-config.d.ts.map +1 -1
  150. package/build/testing-library/mock-config.js +4 -1
  151. package/build/testing-library/mock-config.js.map +1 -1
  152. package/build/ui/common.d.ts.map +1 -1
  153. package/build/ui/common.js +7 -6
  154. package/build/ui/common.js.map +1 -1
  155. package/build/useNavigation.d.ts.map +1 -1
  156. package/build/useNavigation.js +8 -5
  157. package/build/useNavigation.js.map +1 -1
  158. package/build/views/NoSSR.d.ts +5 -0
  159. package/build/views/NoSSR.d.ts.map +1 -0
  160. package/build/views/NoSSR.js +22 -0
  161. package/build/views/NoSSR.js.map +1 -0
  162. package/build/views/Screen.d.ts.map +1 -1
  163. package/build/views/Screen.js +4 -1
  164. package/build/views/Screen.js.map +1 -1
  165. package/build/views/Sitemap.d.ts.map +1 -1
  166. package/build/views/Sitemap.js +75 -2
  167. package/build/views/Sitemap.js.map +1 -1
  168. package/build/views/Unmatched.d.ts.map +1 -1
  169. package/build/views/Unmatched.js +14 -4
  170. package/build/views/Unmatched.js.map +1 -1
  171. package/ios/ExpoHead.podspec +10 -1
  172. package/ios/LinkPreview/LinkPreviewNativeActionView.swift +159 -21
  173. package/ios/LinkPreview/LinkPreviewNativeModule.swift +37 -5
  174. package/ios/LinkPreview/LinkPreviewNativeNavigation.h +37 -11
  175. package/ios/LinkPreview/LinkPreviewNativeNavigation.mm +110 -87
  176. package/ios/LinkPreview/LinkPreviewNativeNavigation.swift +136 -0
  177. package/ios/LinkPreview/LinkPreviewNativeView.swift +70 -70
  178. package/package.json +38 -9
  179. package/plugin/build/index.d.ts +2 -0
  180. package/plugin/options.json +5 -0
  181. package/plugin/src/index.ts +2 -0
  182. package/server.d.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useLinking.js","sourceRoot":"","sources":["../../src/fork/useLinking.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LinkingOptions,\n findFocusedRoute,\n getActionFromState as getActionFromStateDefault,\n getPathFromState as getPathFromStateDefault,\n getStateFromPath as getStateFromPathDefault,\n type NavigationContainerRef,\n type NavigationState,\n type ParamListBase,\n useNavigationIndependentTree,\n} from '@react-navigation/native';\nimport isEqual from 'fast-deep-equal';\nimport * as React from 'react';\n\nimport { createMemoryHistory } from './createMemoryHistory';\nimport { appendBaseUrl } from './getPathFromState';\nimport { INTERNAL_SLOT_NAME } from '../constants';\nimport { ServerContext } from '../global-state/serverLocationContext';\nimport { useExpoRouterStore } from '../global-state/storeContext';\n\ntype ResultState = ReturnType<typeof getStateFromPathDefault>;\n\n/**\n * Find the matching navigation state that changed between 2 navigation states\n * e.g.: a -> b -> c -> d and a -> b -> c -> e -> f, if history in b changed, b is the matching state\n */\nconst findMatchingState = <T extends NavigationState>(\n a: T | undefined,\n b: T | undefined\n): [T | undefined, T | undefined] => {\n if (a === undefined || b === undefined || a.key !== b.key) {\n return [undefined, undefined];\n }\n\n // Tab and drawer will have `history` property, but stack will have history in `routes`\n const aHistoryLength = a.history ? a.history.length : a.routes.length;\n const bHistoryLength = b.history ? b.history.length : b.routes.length;\n\n const aRoute = a.routes[a.index];\n const bRoute = b.routes[b.index];\n\n const aChildState = aRoute.state as T | undefined;\n const bChildState = bRoute.state as T | undefined;\n\n // Stop here if this is the state object that changed:\n // - history length is different\n // - focused routes are different\n // - one of them doesn't have child state\n // - child state keys are different\n if (\n aHistoryLength !== bHistoryLength ||\n aRoute.key !== bRoute.key ||\n aChildState === undefined ||\n bChildState === undefined ||\n aChildState.key !== bChildState.key\n ) {\n return [a, b];\n }\n\n return findMatchingState(aChildState, bChildState);\n};\n\n/**\n * Run async function in series as it's called.\n */\nexport const series = (cb: () => Promise<void>) => {\n let queue = Promise.resolve();\n const callback = () => {\n queue = queue.then(cb);\n };\n return callback;\n};\n\nconst linkingHandlers: symbol[] = [];\n\ntype Options = LinkingOptions<ParamListBase>;\n\nexport function useLinking(\n ref: React.RefObject<NavigationContainerRef<ParamListBase> | null>,\n {\n enabled = true,\n config,\n getStateFromPath = getStateFromPathDefault,\n getPathFromState = getPathFromStateDefault,\n getActionFromState = getActionFromStateDefault,\n }: Options,\n onUnhandledLinking: (lastUnhandledLining: string | undefined) => void\n) {\n const independent = useNavigationIndependentTree();\n\n const store = useExpoRouterStore();\n\n React.useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n return undefined;\n }\n\n if (independent) {\n return undefined;\n }\n\n if (enabled !== false && linkingHandlers.length) {\n console.error(\n [\n 'Looks like you have configured linking in multiple places. This is likely an error since deep links should only be handled in one place to avoid conflicts. Make sure that:',\n \"- You don't have multiple NavigationContainers in the app each with 'linking' enabled\",\n '- Only a single instance of the root component is rendered',\n ]\n .join('\\n')\n .trim()\n );\n }\n\n const handler = Symbol();\n\n if (enabled !== false) {\n linkingHandlers.push(handler);\n }\n\n return () => {\n const index = linkingHandlers.indexOf(handler);\n\n if (index > -1) {\n linkingHandlers.splice(index, 1);\n }\n };\n }, [enabled, independent]);\n\n const [history] = React.useState(createMemoryHistory);\n\n // We store these options in ref to avoid re-creating getInitialState and re-subscribing listeners\n // This lets user avoid wrapping the items in `React.useCallback` or `React.useMemo`\n // Not re-creating `getInitialState` is important coz it makes it easier for the user to use in an effect\n const enabledRef = React.useRef(enabled);\n const configRef = React.useRef(config);\n const getStateFromPathRef = React.useRef(getStateFromPath);\n const getPathFromStateRef = React.useRef(getPathFromState);\n const getActionFromStateRef = React.useRef(getActionFromState);\n\n React.useEffect(() => {\n enabledRef.current = enabled;\n configRef.current = config;\n getStateFromPathRef.current = getStateFromPath;\n getPathFromStateRef.current = getPathFromState;\n getActionFromStateRef.current = getActionFromState;\n });\n\n const validateRoutesNotExistInRootState = React.useCallback(\n (state: ResultState) => {\n // START FORK\n // Instead of using the rootState, we use INTERNAL_SLOT_NAME, which is the only route in the root navigator in Expo Router\n // const navigation = ref.current;\n // const rootState = navigation?.getRootState();\n const routeNames = [INTERNAL_SLOT_NAME];\n // END FORK\n\n // Make sure that the routes in the state exist in the root navigator\n // Otherwise there's an error in the linking configuration\n // START FORK\n // return state?.routes.some((r) => !rootState?.routeNames?.includes(r.name));\n return state?.routes.some((r) => !routeNames.includes(r.name));\n // END FORK\n },\n [ref]\n );\n\n const server = React.use(ServerContext);\n\n const getInitialState = React.useCallback(() => {\n let value: ResultState | undefined;\n\n if (enabledRef.current) {\n const location =\n server?.location ?? (typeof window !== 'undefined' ? window.location : undefined);\n\n const path = location ? location.pathname + location.search : undefined;\n\n if (path) {\n value = getStateFromPathRef.current(path, configRef.current);\n }\n\n // If the link were handled, it gets cleared in NavigationContainer\n onUnhandledLinking(path);\n }\n\n const thenable = {\n then(onfulfilled?: (state: ResultState | undefined) => void) {\n return Promise.resolve(onfulfilled ? onfulfilled(value) : value);\n },\n catch() {\n return thenable;\n },\n };\n\n return thenable as PromiseLike<ResultState | undefined>;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const previousIndexRef = React.useRef<number | undefined>(undefined);\n const previousStateRef = React.useRef<NavigationState | undefined>(undefined);\n const pendingPopStatePathRef = React.useRef<string | undefined>(undefined);\n\n React.useEffect(() => {\n previousIndexRef.current = history.index;\n\n return history.listen(() => {\n const navigation = ref.current;\n\n if (!navigation || !enabled) {\n return;\n }\n\n const { location } = window;\n\n const path = location.pathname + location.search + location.hash;\n const index = history.index;\n\n const previousIndex = previousIndexRef.current ?? 0;\n\n previousIndexRef.current = index;\n pendingPopStatePathRef.current = path;\n\n // When browser back/forward is clicked, we first need to check if state object for this index exists\n // If it does we'll reset to that state object\n // Otherwise, we'll handle it like a regular deep link\n const record = history.get(index);\n\n if (record?.path === path && record?.state) {\n navigation.resetRoot(record.state);\n return;\n }\n\n const state = getStateFromPathRef.current(path, configRef.current);\n\n // We should only dispatch an action when going forward\n // Otherwise the action will likely add items to history, which would mess things up\n if (state) {\n // If the link were handled, it gets cleared in NavigationContainer\n onUnhandledLinking(path);\n // Make sure that the routes in the state exist in the root navigator\n // Otherwise there's an error in the linking configuration\n if (validateRoutesNotExistInRootState(state)) {\n return;\n }\n\n if (\n index > previousIndex ||\n /* START FORK\n *\n * This is a workaround for React Navigation's handling of hashes (it doesn't handle them)\n * When you click on <a href=\"#hash\">, the browser will first fire a popstate event\n * and this callback will be called.\n *\n * From React Navigation's perspective, it's treating the new hash change like a back/forward\n * button press, so it thinks it should reset the state. When we should\n * be to be pushing the new state\n *\n * Our fix is to check if the index is the same as the previous index\n * and if the incoming path is the same as the old path but with the hash added,\n * then treat it as a push instead of a reset\n *\n * This also works for subsequent hash changes, as internally RN\n * doesn't store the hash in the history state.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent\n */\n (index === previousIndex && (!record || `${record?.path}${location.hash}` === path))\n // END FORK\n ) {\n const action = getActionFromStateRef.current(state, configRef.current);\n\n if (action !== undefined) {\n try {\n navigation.dispatch(action);\n } catch (e) {\n // Ignore any errors from deep linking.\n // This could happen in case of malformed links, navigation object not being initialized etc.\n console.warn(\n `An error occurred when trying to handle the link '${path}': ${\n typeof e === 'object' && e != null && 'message' in e ? e.message : e\n }`\n );\n }\n } else {\n navigation.resetRoot(state);\n }\n } else {\n navigation.resetRoot(state);\n }\n } else {\n // if current path didn't return any state, we should revert to initial state\n navigation.resetRoot(state);\n }\n });\n }, [enabled, history, onUnhandledLinking, ref, validateRoutesNotExistInRootState]);\n\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const getPathForRoute = (\n route: ReturnType<typeof findFocusedRoute>,\n state: NavigationState\n ): string => {\n let path;\n\n // If the `route` object contains a `path`, use that path as long as `route.name` and `params` still match\n // This makes sure that we preserve the original URL for wildcard routes\n if (route?.path) {\n const stateForPath = getStateFromPathRef.current(route.path, configRef.current);\n\n if (stateForPath) {\n const focusedRoute = findFocusedRoute(stateForPath);\n\n if (\n focusedRoute &&\n focusedRoute.name === route.name &&\n isEqual({ ...focusedRoute.params }, { ...route.params })\n ) {\n // START FORK - Ensure paths coming from events (e.g refresh) have the base URL\n // path = route.path;\n path = appendBaseUrl(route.path);\n // END FORK\n }\n }\n }\n\n if (path == null) {\n path = getPathFromStateRef.current(state, configRef.current);\n }\n\n // START FORK - ExpoRouter manually handles hashes. This code is intentionally removed\n // const previousRoute = previousStateRef.current\n // ? findFocusedRoute(previousStateRef.current)\n // : undefined;\n\n // Preserve the hash if the route didn't change\n // if (\n // previousRoute &&\n // route &&\n // 'key' in previousRoute &&\n // 'key' in route &&\n // previousRoute.key === route.key\n // ) {\n // path = path + location.hash;\n // }\n // END FORK\n\n return path;\n };\n\n if (ref.current) {\n // We need to record the current metadata on the first render if they aren't set\n // This will allow the initial state to be in the history entry\n\n // START FORK\n // Instead of using the rootState (which might be stale) we should use the focused state\n // const state = ref.current.getRootState();\n const rootState = ref.current.getRootState();\n const state = store.state as NavigationState;\n\n // END FORK\n\n if (state) {\n const route = findFocusedRoute(state);\n const path = getPathForRoute(route, state);\n\n if (previousStateRef.current === undefined) {\n // START FORK\n // previousStateRef.current = state;\n previousStateRef.current = rootState;\n // END FORK\n }\n\n history.replace({ path, state });\n }\n }\n\n const onStateChange = async () => {\n const navigation = ref.current;\n\n if (!navigation || !enabled) {\n return;\n }\n\n const previousState = previousStateRef.current;\n // START FORK\n // Instead of using the rootState (which might be stale) we should use the focused state\n // const state = navigation.getRootState();\n const rootState = navigation.getRootState();\n const state = store.state as NavigationState;\n\n // END FORK\n\n // root state may not available, for example when root navigators switch inside the container\n if (!state) {\n return;\n }\n\n const pendingPath = pendingPopStatePathRef.current;\n const route = findFocusedRoute(state);\n const path = getPathForRoute(route, state);\n\n // START FORK\n // previousStateRef.current = state;\n previousStateRef.current = rootState;\n // END FORK\n pendingPopStatePathRef.current = undefined;\n\n // To detect the kind of state change, we need to:\n // - Find the common focused navigation state in previous and current state\n // - If only the route keys changed, compare history/routes.length to check if we go back/forward/replace\n // - If no common focused navigation state found, it's a replace\n const [previousFocusedState, focusedState] = findMatchingState(previousState, state);\n\n if (\n previousFocusedState &&\n focusedState &&\n // We should only handle push/pop if path changed from what was in last `popstate`\n // Otherwise it's likely a change triggered by `popstate`\n path !== pendingPath\n ) {\n const historyDelta =\n (focusedState.history ? focusedState.history.length : focusedState.routes.length) -\n (previousFocusedState.history\n ? previousFocusedState.history.length\n : previousFocusedState.routes.length);\n\n if (historyDelta > 0) {\n // If history length is increased, we should pushState\n // Note that path might not actually change here, for example, drawer open should pushState\n history.push({ path, state });\n } else if (historyDelta < 0) {\n // If history length is decreased, i.e. entries were removed, we want to go back\n\n const nextIndex = history.backIndex({ path });\n const currentIndex = history.index;\n\n try {\n if (\n nextIndex !== -1 &&\n nextIndex < currentIndex &&\n // We should only go back if the entry exists and it's less than current index\n history.get(nextIndex - currentIndex)\n ) {\n // An existing entry for this path exists and it's less than current index, go back to that\n await history.go(nextIndex - currentIndex);\n } else {\n // We couldn't find an existing entry to go back to, so we'll go back by the delta\n // This won't be correct if multiple routes were pushed in one go before\n // Usually this shouldn't happen and this is a fallback for that\n await history.go(historyDelta);\n }\n\n // Store the updated state as well as fix the path if incorrect\n history.replace({ path, state });\n } catch {\n // The navigation was interrupted\n }\n } else {\n // If history length is unchanged, we want to replaceState\n history.replace({ path, state });\n }\n } else {\n // If no common navigation state was found, assume it's a replace\n // This would happen if the user did a reset/conditionally changed navigators\n history.replace({ path, state });\n }\n };\n\n // We debounce onStateChange coz we don't want multiple state changes to be handled at one time\n // This could happen since `history.go(n)` is asynchronous\n // If `pushState` or `replaceState` were called before `history.go(n)` completes, it'll mess stuff up\n return ref.current?.addListener('state', series(onStateChange));\n }, [enabled, history, ref]);\n\n return {\n getInitialState,\n };\n}\n\nexport function getInitialURLWithTimeout(): string | null | Promise<string | null> {\n return typeof window === 'undefined' ? '' : window.location.href;\n}\n"]}
1
+ {"version":3,"file":"useLinking.js","sourceRoot":"","sources":["../../src/fork/useLinking.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LinkingOptions,\n findFocusedRoute,\n getActionFromState as getActionFromStateDefault,\n getPathFromState as getPathFromStateDefault,\n getStateFromPath as getStateFromPathDefault,\n type NavigationContainerRef,\n type NavigationState,\n type ParamListBase,\n useNavigationIndependentTree,\n} from '@react-navigation/native';\nimport isEqual from 'fast-deep-equal';\nimport * as React from 'react';\n\nimport { createMemoryHistory } from './createMemoryHistory';\nimport { appendBaseUrl } from './getPathFromState';\nimport { ServerContext } from '../global-state/serverLocationContext';\nimport { useExpoRouterStore } from '../global-state/storeContext';\nimport { getRootStackRouteNames } from '../global-state/utils';\n\ntype ResultState = ReturnType<typeof getStateFromPathDefault>;\n\n/**\n * Find the matching navigation state that changed between 2 navigation states\n * e.g.: a -> b -> c -> d and a -> b -> c -> e -> f, if history in b changed, b is the matching state\n */\nconst findMatchingState = <T extends NavigationState>(\n a: T | undefined,\n b: T | undefined\n): [T | undefined, T | undefined] => {\n if (a === undefined || b === undefined || a.key !== b.key) {\n return [undefined, undefined];\n }\n\n // Tab and drawer will have `history` property, but stack will have history in `routes`\n const aHistoryLength = a.history ? a.history.length : a.routes.length;\n const bHistoryLength = b.history ? b.history.length : b.routes.length;\n\n const aRoute = a.routes[a.index];\n const bRoute = b.routes[b.index];\n\n const aChildState = aRoute.state as T | undefined;\n const bChildState = bRoute.state as T | undefined;\n\n // Stop here if this is the state object that changed:\n // - history length is different\n // - focused routes are different\n // - one of them doesn't have child state\n // - child state keys are different\n if (\n aHistoryLength !== bHistoryLength ||\n aRoute.key !== bRoute.key ||\n aChildState === undefined ||\n bChildState === undefined ||\n aChildState.key !== bChildState.key\n ) {\n return [a, b];\n }\n\n return findMatchingState(aChildState, bChildState);\n};\n\n/**\n * Run async function in series as it's called.\n */\nexport const series = (cb: () => Promise<void>) => {\n let queue = Promise.resolve();\n const callback = () => {\n queue = queue.then(cb);\n };\n return callback;\n};\n\nconst linkingHandlers: symbol[] = [];\n\ntype Options = LinkingOptions<ParamListBase>;\n\nexport function useLinking(\n ref: React.RefObject<NavigationContainerRef<ParamListBase> | null>,\n {\n enabled = true,\n config,\n getStateFromPath = getStateFromPathDefault,\n getPathFromState = getPathFromStateDefault,\n getActionFromState = getActionFromStateDefault,\n }: Options,\n onUnhandledLinking: (lastUnhandledLining: string | undefined) => void\n) {\n const independent = useNavigationIndependentTree();\n\n const store = useExpoRouterStore();\n\n React.useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n return undefined;\n }\n\n if (independent) {\n return undefined;\n }\n\n if (enabled !== false && linkingHandlers.length) {\n console.error(\n [\n 'Looks like you have configured linking in multiple places. This is likely an error since deep links should only be handled in one place to avoid conflicts. Make sure that:',\n \"- You don't have multiple NavigationContainers in the app each with 'linking' enabled\",\n '- Only a single instance of the root component is rendered',\n ]\n .join('\\n')\n .trim()\n );\n }\n\n const handler = Symbol();\n\n if (enabled !== false) {\n linkingHandlers.push(handler);\n }\n\n return () => {\n const index = linkingHandlers.indexOf(handler);\n\n if (index > -1) {\n linkingHandlers.splice(index, 1);\n }\n };\n }, [enabled, independent]);\n\n const [history] = React.useState(createMemoryHistory);\n\n // We store these options in ref to avoid re-creating getInitialState and re-subscribing listeners\n // This lets user avoid wrapping the items in `React.useCallback` or `React.useMemo`\n // Not re-creating `getInitialState` is important coz it makes it easier for the user to use in an effect\n const enabledRef = React.useRef(enabled);\n const configRef = React.useRef(config);\n const getStateFromPathRef = React.useRef(getStateFromPath);\n const getPathFromStateRef = React.useRef(getPathFromState);\n const getActionFromStateRef = React.useRef(getActionFromState);\n\n React.useEffect(() => {\n enabledRef.current = enabled;\n configRef.current = config;\n getStateFromPathRef.current = getStateFromPath;\n getPathFromStateRef.current = getPathFromState;\n getActionFromStateRef.current = getActionFromState;\n });\n\n const validateRoutesNotExistInRootState = React.useCallback(\n (state: ResultState) => {\n // START FORK\n // Instead of using the rootState, we use INTERNAL_SLOT_NAME, which is the only route in the root navigator in Expo Router\n // const navigation = ref.current;\n // const rootState = navigation?.getRootState();\n const routeNames = getRootStackRouteNames();\n // END FORK\n\n // Make sure that the routes in the state exist in the root navigator\n // Otherwise there's an error in the linking configuration\n // START FORK\n // return state?.routes.some((r) => !rootState?.routeNames?.includes(r.name));\n return state?.routes.some((r) => !routeNames.includes(r.name));\n // END FORK\n },\n [ref]\n );\n\n const server = React.use(ServerContext);\n\n const getInitialState = React.useCallback(() => {\n let value: ResultState | undefined;\n\n if (enabledRef.current) {\n const location =\n server?.location ?? (typeof window !== 'undefined' ? window.location : undefined);\n\n const path = location ? location.pathname + location.search : undefined;\n\n if (path) {\n value = getStateFromPathRef.current(path, configRef.current);\n }\n\n // If the link were handled, it gets cleared in NavigationContainer\n onUnhandledLinking(path);\n }\n\n const thenable = {\n then(onfulfilled?: (state: ResultState | undefined) => void) {\n return Promise.resolve(onfulfilled ? onfulfilled(value) : value);\n },\n catch() {\n return thenable;\n },\n };\n\n return thenable as PromiseLike<ResultState | undefined>;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const previousIndexRef = React.useRef<number | undefined>(undefined);\n const previousStateRef = React.useRef<NavigationState | undefined>(undefined);\n const pendingPopStatePathRef = React.useRef<string | undefined>(undefined);\n\n React.useEffect(() => {\n previousIndexRef.current = history.index;\n\n return history.listen(() => {\n const navigation = ref.current;\n\n if (!navigation || !enabled) {\n return;\n }\n\n const { location } = window;\n\n const path = location.pathname + location.search + location.hash;\n const index = history.index;\n\n const previousIndex = previousIndexRef.current ?? 0;\n\n previousIndexRef.current = index;\n pendingPopStatePathRef.current = path;\n\n // When browser back/forward is clicked, we first need to check if state object for this index exists\n // If it does we'll reset to that state object\n // Otherwise, we'll handle it like a regular deep link\n const record = history.get(index);\n\n if (record?.path === path && record?.state) {\n navigation.resetRoot(record.state);\n return;\n }\n\n const state = getStateFromPathRef.current(path, configRef.current);\n\n // We should only dispatch an action when going forward\n // Otherwise the action will likely add items to history, which would mess things up\n if (state) {\n // If the link were handled, it gets cleared in NavigationContainer\n onUnhandledLinking(path);\n // Make sure that the routes in the state exist in the root navigator\n // Otherwise there's an error in the linking configuration\n if (validateRoutesNotExistInRootState(state)) {\n return;\n }\n\n if (\n index > previousIndex ||\n /* START FORK\n *\n * This is a workaround for React Navigation's handling of hashes (it doesn't handle them)\n * When you click on <a href=\"#hash\">, the browser will first fire a popstate event\n * and this callback will be called.\n *\n * From React Navigation's perspective, it's treating the new hash change like a back/forward\n * button press, so it thinks it should reset the state. When we should\n * be to be pushing the new state\n *\n * Our fix is to check if the index is the same as the previous index\n * and if the incoming path is the same as the old path but with the hash added,\n * then treat it as a push instead of a reset\n *\n * This also works for subsequent hash changes, as internally RN\n * doesn't store the hash in the history state.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event#when_popstate_is_sent\n */\n (index === previousIndex && (!record || `${record?.path}${location.hash}` === path))\n // END FORK\n ) {\n const action = getActionFromStateRef.current(state, configRef.current);\n\n if (action !== undefined) {\n try {\n navigation.dispatch(action);\n } catch (e) {\n // Ignore any errors from deep linking.\n // This could happen in case of malformed links, navigation object not being initialized etc.\n console.warn(\n `An error occurred when trying to handle the link '${path}': ${\n typeof e === 'object' && e != null && 'message' in e ? e.message : e\n }`\n );\n }\n } else {\n navigation.resetRoot(state);\n }\n } else {\n navigation.resetRoot(state);\n }\n } else {\n // if current path didn't return any state, we should revert to initial state\n navigation.resetRoot(state);\n }\n });\n }, [enabled, history, onUnhandledLinking, ref, validateRoutesNotExistInRootState]);\n\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n\n const getPathForRoute = (\n route: ReturnType<typeof findFocusedRoute>,\n state: NavigationState\n ): string => {\n let path;\n\n // If the `route` object contains a `path`, use that path as long as `route.name` and `params` still match\n // This makes sure that we preserve the original URL for wildcard routes\n if (route?.path) {\n const stateForPath = getStateFromPathRef.current(route.path, configRef.current);\n\n if (stateForPath) {\n const focusedRoute = findFocusedRoute(stateForPath);\n\n if (\n focusedRoute &&\n focusedRoute.name === route.name &&\n isEqual({ ...focusedRoute.params }, { ...route.params })\n ) {\n // START FORK - Ensure paths coming from events (e.g refresh) have the base URL\n // path = route.path;\n path = appendBaseUrl(route.path);\n // END FORK\n }\n }\n }\n\n if (path == null) {\n path = getPathFromStateRef.current(state, configRef.current);\n }\n\n // START FORK - ExpoRouter manually handles hashes. This code is intentionally removed\n // const previousRoute = previousStateRef.current\n // ? findFocusedRoute(previousStateRef.current)\n // : undefined;\n\n // Preserve the hash if the route didn't change\n // if (\n // previousRoute &&\n // route &&\n // 'key' in previousRoute &&\n // 'key' in route &&\n // previousRoute.key === route.key\n // ) {\n // path = path + location.hash;\n // }\n // END FORK\n\n return path;\n };\n\n if (ref.current) {\n // We need to record the current metadata on the first render if they aren't set\n // This will allow the initial state to be in the history entry\n\n // START FORK\n // Instead of using the rootState (which might be stale) we should use the focused state\n // const state = ref.current.getRootState();\n const rootState = ref.current.getRootState();\n const state = store.state as NavigationState;\n\n // END FORK\n\n if (state) {\n const route = findFocusedRoute(state);\n const path = getPathForRoute(route, state);\n\n if (previousStateRef.current === undefined) {\n // START FORK\n // previousStateRef.current = state;\n previousStateRef.current = rootState;\n // END FORK\n }\n\n history.replace({ path, state });\n }\n }\n\n const onStateChange = async () => {\n const navigation = ref.current;\n\n if (!navigation || !enabled) {\n return;\n }\n\n const previousState = previousStateRef.current;\n // START FORK\n // Instead of using the rootState (which might be stale) we should use the focused state\n // const state = navigation.getRootState();\n const rootState = navigation.getRootState();\n const state = store.state as NavigationState;\n\n // END FORK\n\n // root state may not available, for example when root navigators switch inside the container\n if (!state) {\n return;\n }\n\n const pendingPath = pendingPopStatePathRef.current;\n const route = findFocusedRoute(state);\n const path = getPathForRoute(route, state);\n\n // START FORK\n // previousStateRef.current = state;\n previousStateRef.current = rootState;\n // END FORK\n pendingPopStatePathRef.current = undefined;\n\n // To detect the kind of state change, we need to:\n // - Find the common focused navigation state in previous and current state\n // - If only the route keys changed, compare history/routes.length to check if we go back/forward/replace\n // - If no common focused navigation state found, it's a replace\n const [previousFocusedState, focusedState] = findMatchingState(previousState, state);\n\n if (\n previousFocusedState &&\n focusedState &&\n // We should only handle push/pop if path changed from what was in last `popstate`\n // Otherwise it's likely a change triggered by `popstate`\n path !== pendingPath\n ) {\n const historyDelta =\n (focusedState.history ? focusedState.history.length : focusedState.routes.length) -\n (previousFocusedState.history\n ? previousFocusedState.history.length\n : previousFocusedState.routes.length);\n\n if (historyDelta > 0) {\n // If history length is increased, we should pushState\n // Note that path might not actually change here, for example, drawer open should pushState\n history.push({ path, state });\n } else if (historyDelta < 0) {\n // If history length is decreased, i.e. entries were removed, we want to go back\n\n const nextIndex = history.backIndex({ path });\n const currentIndex = history.index;\n\n try {\n if (\n nextIndex !== -1 &&\n nextIndex < currentIndex &&\n // We should only go back if the entry exists and it's less than current index\n history.get(nextIndex - currentIndex)\n ) {\n // An existing entry for this path exists and it's less than current index, go back to that\n await history.go(nextIndex - currentIndex);\n } else {\n // We couldn't find an existing entry to go back to, so we'll go back by the delta\n // This won't be correct if multiple routes were pushed in one go before\n // Usually this shouldn't happen and this is a fallback for that\n await history.go(historyDelta);\n }\n\n // Store the updated state as well as fix the path if incorrect\n history.replace({ path, state });\n } catch {\n // The navigation was interrupted\n }\n } else {\n // If history length is unchanged, we want to replaceState\n history.replace({ path, state });\n }\n } else {\n // If no common navigation state was found, assume it's a replace\n // This would happen if the user did a reset/conditionally changed navigators\n history.replace({ path, state });\n }\n };\n\n // We debounce onStateChange coz we don't want multiple state changes to be handled at one time\n // This could happen since `history.go(n)` is asynchronous\n // If `pushState` or `replaceState` were called before `history.go(n)` completes, it'll mess stuff up\n return ref.current?.addListener('state', series(onStateChange));\n }, [enabled, history, ref]);\n\n return {\n getInitialState,\n };\n}\n\nexport function getInitialURLWithTimeout(): string | null | Promise<string | null> {\n return typeof window === 'undefined' ? '' : window.location.href;\n}\n"]}
@@ -4,13 +4,34 @@ import { UrlObject } from './global-state/routeInfo';
4
4
  import type { StoreRedirects } from './global-state/router-store';
5
5
  import { getInitialURL, getPathFromState, getStateFromPath } from './link/linking';
6
6
  import { RequireContext } from './types';
7
- export declare function getNavigationConfig(routes: RouteNode, metaOnly?: boolean): {
7
+ export declare function getNavigationConfig(routes: RouteNode, metaOnly: boolean, { sitemap, notFound }: {
8
+ sitemap: boolean;
9
+ notFound: boolean;
10
+ }): {
8
11
  screens: {
9
12
  __root: {
10
13
  initialRouteName: undefined;
11
14
  screens: Record<string, import("./getReactNavigationConfig").Screen>;
12
15
  path: string;
13
16
  };
17
+ } | {
18
+ __root: {
19
+ initialRouteName: undefined;
20
+ screens: Record<string, import("./getReactNavigationConfig").Screen>;
21
+ path: string;
22
+ };
23
+ } | {
24
+ __root: {
25
+ initialRouteName: undefined;
26
+ screens: Record<string, import("./getReactNavigationConfig").Screen>;
27
+ path: string;
28
+ };
29
+ } | {
30
+ __root: {
31
+ initialRouteName: undefined;
32
+ screens: Record<string, import("./getReactNavigationConfig").Screen>;
33
+ path: string;
34
+ };
14
35
  };
15
36
  };
16
37
  export type ExpoLinkingOptions<T extends object = Record<string, unknown>> = LinkingOptions<T> & {
@@ -23,5 +44,11 @@ export type LinkingConfigOptions = {
23
44
  getInitialURL?: typeof getInitialURL;
24
45
  redirects?: StoreRedirects[];
25
46
  };
26
- export declare function getLinkingConfig(routes: RouteNode, context: RequireContext, getRouteInfo: () => UrlObject, { metaOnly, serverUrl, redirects }?: LinkingConfigOptions): ExpoLinkingOptions;
47
+ interface RouterOptions {
48
+ skipGenerated: boolean;
49
+ sitemap: boolean;
50
+ notFound: boolean;
51
+ }
52
+ export declare function getLinkingConfig(routes: RouteNode, context: RequireContext, getRouteInfo: () => UrlObject, { metaOnly, serverUrl, redirects, skipGenerated, sitemap, notFound, }: LinkingConfigOptions & RouterOptions): ExpoLinkingOptions;
53
+ export {};
27
54
  //# 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;AAKpC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAa,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,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,EAAE,OAAO,gBAAgB,CAAC;IAC1C,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;CAC3C,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,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,SAAS,EAC7B,EAAE,QAAe,EAAE,SAAS,EAAE,SAAS,EAAE,GAAE,oBAAyB,GACnE,kBAAkB,CAmEpB"}
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;AAKpC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAa,MAAM,gBAAgB,CAAC;AAC9F,OAAO,EAAgB,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,OAAO,EACjB,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;EA6B/D;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG;IAC/F,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;IAC1C,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;CAC3C,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,UAAU,aAAa;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,SAAS,EAC7B,EACE,QAAe,EACf,SAAS,EACT,SAAS,EACT,aAAa,EACb,OAAO,EACP,QAAQ,GACT,EAAE,oBAAoB,GAAG,aAAa,GACtC,kBAAkB,CAsEpB"}
@@ -8,17 +8,34 @@ const constants_1 = require("./constants");
8
8
  const getReactNavigationConfig_1 = require("./getReactNavigationConfig");
9
9
  const getRoutesRedirects_1 = require("./getRoutesRedirects");
10
10
  const linking_1 = require("./link/linking");
11
- function getNavigationConfig(routes, metaOnly = true) {
11
+ function getNavigationConfig(routes, metaOnly, { sitemap, notFound }) {
12
+ const config = (0, getReactNavigationConfig_1.getReactNavigationConfig)(routes, metaOnly);
13
+ const sitemapRoute = (() => {
14
+ const path = '_sitemap';
15
+ if (sitemap === false || isPathInRootConfig(config, path)) {
16
+ return {};
17
+ }
18
+ return generateLinkingPathInRoot(constants_1.SITEMAP_ROUTE_NAME, path, metaOnly);
19
+ })();
20
+ const notFoundRoute = (() => {
21
+ const path = '*not-found';
22
+ if (notFound === false || isPathInRootConfig(config, path)) {
23
+ return {};
24
+ }
25
+ return generateLinkingPathInRoot(constants_1.NOT_FOUND_ROUTE_NAME, path, metaOnly);
26
+ })();
12
27
  return {
13
28
  screens: {
14
29
  [constants_1.INTERNAL_SLOT_NAME]: {
15
30
  path: '',
16
- ...(0, getReactNavigationConfig_1.getReactNavigationConfig)(routes, metaOnly),
31
+ ...config,
17
32
  },
33
+ ...sitemapRoute,
34
+ ...notFoundRoute,
18
35
  },
19
36
  };
20
37
  }
21
- function getLinkingConfig(routes, context, getRouteInfo, { metaOnly = true, serverUrl, redirects } = {}) {
38
+ function getLinkingConfig(routes, context, getRouteInfo, { metaOnly = true, serverUrl, redirects, skipGenerated, sitemap, notFound, }) {
22
39
  // Returning `undefined` / `null from `getInitialURL` are valid values, so we need to track if it's been called.
23
40
  let hasCachedInitialUrl = false;
24
41
  let initialUrl;
@@ -28,7 +45,10 @@ function getLinkingConfig(routes, context, getRouteInfo, { metaOnly = true, serv
28
45
  const nativeLinking = nativeLinkingKey
29
46
  ? context(nativeLinkingKey)
30
47
  : undefined;
31
- const config = getNavigationConfig(routes, metaOnly);
48
+ const config = getNavigationConfig(routes, metaOnly, {
49
+ sitemap: skipGenerated ? false : sitemap,
50
+ notFound: skipGenerated ? false : notFound,
51
+ });
32
52
  return {
33
53
  prefixes: [],
34
54
  config,
@@ -82,4 +102,15 @@ function getLinkingConfig(routes, context, getRouteInfo, { metaOnly = true, serv
82
102
  getActionFromState: native_1.getActionFromState,
83
103
  };
84
104
  }
105
+ function isPathInRootConfig(config, path) {
106
+ return Object.values(config.screens).some((screenConfig) => typeof screenConfig === 'string' ? screenConfig === path : screenConfig.path === path);
107
+ }
108
+ function generateLinkingPathInRoot(name, path, metaOnly) {
109
+ if (metaOnly) {
110
+ return { [name]: path };
111
+ }
112
+ return {
113
+ [name]: { path },
114
+ };
115
+ }
85
116
  //# sourceMappingURL=getLinkingConfig.js.map
@@ -1 +1 @@
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 { INTERNAL_SLOT_NAME } from './constants';\nimport { Options, State } from './fork/getPathFromState';\nimport { getReactNavigationConfig } from './getReactNavigationConfig';\nimport { applyRedirects } from './getRoutesRedirects';\nimport { UrlObject } from './global-state/routeInfo';\nimport type { StoreRedirects } from './global-state/router-store';\nimport { getInitialURL, getPathFromState, getStateFromPath, subscribe } from './link/linking';\nimport { NativeIntent, RequireContext } from './types';\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?: StoreRedirects[];\n};\n\nexport function getLinkingConfig(\n routes: RouteNode,\n context: RequireContext,\n getRouteInfo: () => UrlObject,\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\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 = applyRedirects(initialUrl, redirects);\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 = applyRedirects(url, redirects);\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: subscribe(nativeLinking, redirects),\n getStateFromPath: <ParamList extends object>(path: string, options?: Options<ParamList>) => {\n return getStateFromPath(path, options, getRouteInfo().segments);\n },\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"]}
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 { INTERNAL_SLOT_NAME, NOT_FOUND_ROUTE_NAME, SITEMAP_ROUTE_NAME } from './constants';\nimport { Options, State } from './fork/getPathFromState';\nimport { getReactNavigationConfig } from './getReactNavigationConfig';\nimport { applyRedirects } from './getRoutesRedirects';\nimport { UrlObject } from './global-state/routeInfo';\nimport type { StoreRedirects } from './global-state/router-store';\nimport { getInitialURL, getPathFromState, getStateFromPath, subscribe } from './link/linking';\nimport { NativeIntent, RequireContext } from './types';\n\nexport function getNavigationConfig(\n routes: RouteNode,\n metaOnly: boolean,\n { sitemap, notFound }: { sitemap: boolean; notFound: boolean }\n) {\n const config = getReactNavigationConfig(routes, metaOnly);\n const sitemapRoute = (() => {\n const path = '_sitemap';\n if (sitemap === false || isPathInRootConfig(config, path)) {\n return {};\n }\n return generateLinkingPathInRoot(SITEMAP_ROUTE_NAME, path, metaOnly);\n })();\n\n const notFoundRoute = (() => {\n const path = '*not-found';\n if (notFound === false || isPathInRootConfig(config, path)) {\n return {};\n }\n return generateLinkingPathInRoot(NOT_FOUND_ROUTE_NAME, path, metaOnly);\n })();\n\n return {\n screens: {\n [INTERNAL_SLOT_NAME]: {\n path: '',\n ...config,\n },\n ...sitemapRoute,\n ...notFoundRoute,\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?: StoreRedirects[];\n};\n\ninterface RouterOptions {\n skipGenerated: boolean;\n sitemap: boolean;\n notFound: boolean;\n}\n\nexport function getLinkingConfig(\n routes: RouteNode,\n context: RequireContext,\n getRouteInfo: () => UrlObject,\n {\n metaOnly = true,\n serverUrl,\n redirects,\n skipGenerated,\n sitemap,\n notFound,\n }: LinkingConfigOptions & RouterOptions\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 sitemap: skipGenerated ? false : sitemap,\n notFound: skipGenerated ? false : notFound,\n });\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 = applyRedirects(initialUrl, redirects);\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 = applyRedirects(url, redirects);\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: subscribe(nativeLinking, redirects),\n getStateFromPath: <ParamList extends object>(path: string, options?: Options<ParamList>) => {\n return getStateFromPath(path, options, getRouteInfo().segments);\n },\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\nfunction isPathInRootConfig(\n config: ReturnType<typeof getReactNavigationConfig>,\n path: string\n): boolean {\n return Object.values(config.screens).some((screenConfig) =>\n typeof screenConfig === 'string' ? screenConfig === path : screenConfig.path === path\n );\n}\n\nfunction generateLinkingPathInRoot(name: string, path: string, metaOnly: boolean) {\n if (metaOnly) {\n return { [name]: path };\n }\n return {\n [name]: { path },\n };\n}\n"]}
@@ -8,6 +8,7 @@ export type Options = {
8
8
  internal_stripLoadRoute?: boolean;
9
9
  skipGenerated?: boolean;
10
10
  notFound?: boolean;
11
+ unstable_useServerMiddleware?: boolean;
11
12
  importMode?: string;
12
13
  platformRoutes?: boolean;
13
14
  sitemap?: boolean;
@@ -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;AAmjBD;;;;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,EAAkB,SAAS,EAAE,MAAM,SAAS,CAAC;AAW5E,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;IAEnB,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,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,CAoB3F;AAioBD;;;;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"}
@@ -19,17 +19,75 @@ const validPlatforms = new Set(['android', 'ios', 'native', 'web']);
19
19
  * - If multiple routes have the same name, the most specific route is used
20
20
  */
21
21
  function getRoutes(contextModule, options) {
22
+ const middleware = getMiddleware(contextModule, options);
22
23
  const directoryTree = getDirectoryTree(contextModule, options);
23
24
  // If there are no routes
24
25
  if (!directoryTree) {
25
26
  return null;
26
27
  }
27
28
  const rootNode = flattenDirectoryTreeToRoutes(directoryTree, options);
29
+ if (middleware) {
30
+ rootNode.middleware = middleware;
31
+ }
28
32
  if (!options.ignoreEntryPoints) {
29
33
  crawlAndAppendInitialRoutesAndEntryFiles(rootNode, options);
30
34
  }
31
35
  return rootNode;
32
36
  }
37
+ /**
38
+ * Given a RequireContext, return the middleware node if one is found. If more than one middleware file is found, an error is thrown.
39
+ */
40
+ function getMiddleware(contextModule, options) {
41
+ const allMiddlewareFiles = contextModule.keys().filter((key) => key.includes('+middleware'));
42
+ // Check if middleware is enabled via plugin config
43
+ if (!options.unstable_useServerMiddleware) {
44
+ if (allMiddlewareFiles.length > 0) {
45
+ console.warn('Server middleware is not enabled. Add unstable_useServerMiddleware: true to your `expo-router` plugin config.\n\n' +
46
+ JSON.stringify({
47
+ expo: {
48
+ plugins: [['expo-router', { unstable_useServerMiddleware: true }]],
49
+ },
50
+ }, null, 2));
51
+ }
52
+ return null;
53
+ }
54
+ const isValidMiddleware = (key) => /^\.\/\+middleware\.[tj]sx?$/.test(key);
55
+ const rootMiddlewareFiles = allMiddlewareFiles.filter(isValidMiddleware);
56
+ const nonRootMiddleware = allMiddlewareFiles.filter((file) => !rootMiddlewareFiles.includes(file));
57
+ if (nonRootMiddleware.length > 0) {
58
+ throw new Error(`The middleware file can only be placed at the root level. Remove the following files: ${nonRootMiddleware.join(', ')}`);
59
+ }
60
+ if (rootMiddlewareFiles.length === 0) {
61
+ return null;
62
+ }
63
+ // In development, throw an error if there are multiple root-level middleware files
64
+ if (rootMiddlewareFiles.length > 1) {
65
+ if (process.env.NODE_ENV !== 'production') {
66
+ throw new Error(`Only one middleware file is allowed. Keep one of the conflicting files: ${rootMiddlewareFiles.map((p) => `"${p}"`).join(' or ')}`);
67
+ }
68
+ }
69
+ const middlewareFilePath = rootMiddlewareFiles[0];
70
+ const middleware = {
71
+ loadRoute() {
72
+ if (options.ignoreRequireErrors) {
73
+ try {
74
+ return contextModule(middlewareFilePath);
75
+ }
76
+ catch {
77
+ return {};
78
+ }
79
+ }
80
+ else {
81
+ return contextModule(middlewareFilePath);
82
+ }
83
+ },
84
+ contextKey: middlewareFilePath,
85
+ };
86
+ if (options.internal_stripLoadRoute) {
87
+ delete middleware.loadRoute;
88
+ }
89
+ return middleware;
90
+ }
33
91
  /**
34
92
  * Converts the RequireContext keys (file paths) into a directory tree.
35
93
  */
@@ -42,6 +100,8 @@ function getDirectoryTree(contextModule, options) {
42
100
  if (!options.preserveApiRoutes) {
43
101
  ignoreList.push(/\+api$/, /\+api\.[tj]sx?$/);
44
102
  }
103
+ // Always ignore middleware files in regular route processing
104
+ ignoreList.push(/\+middleware$/, /\+middleware\.[tj]sx?$/);
45
105
  const rootDirectory = {
46
106
  files: new Map(),
47
107
  subdirectories: new Map(),