expo-router 3.1.2 → 3.3.0

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 (168) 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/babel.js +1 -209
  5. package/build/ExpoRoot.d.ts.map +1 -1
  6. package/build/ExpoRoot.js +57 -15
  7. package/build/ExpoRoot.js.map +1 -1
  8. package/build/LocationProvider.d.ts +3 -2
  9. package/build/LocationProvider.d.ts.map +1 -1
  10. package/build/LocationProvider.js +31 -7
  11. package/build/LocationProvider.js.map +1 -1
  12. package/build/Route.d.ts +3 -0
  13. package/build/Route.d.ts.map +1 -1
  14. package/build/Route.js +1 -1
  15. package/build/Route.js.map +1 -1
  16. package/build/fork/NavigationContainer.native.js +5 -3
  17. package/build/fork/NavigationContainer.native.js.map +1 -1
  18. package/build/fork/extractPathFromURL.d.ts.map +1 -1
  19. package/build/fork/extractPathFromURL.js +17 -16
  20. package/build/fork/extractPathFromURL.js.map +1 -1
  21. package/build/fork/getPathFromState.d.ts +1 -1
  22. package/build/fork/getPathFromState.d.ts.map +1 -1
  23. package/build/fork/getPathFromState.js +17 -38
  24. package/build/fork/getPathFromState.js.map +1 -1
  25. package/build/fork/getStateFromPath.d.ts +2 -2
  26. package/build/fork/getStateFromPath.d.ts.map +1 -1
  27. package/build/fork/getStateFromPath.js +71 -52
  28. package/build/fork/getStateFromPath.js.map +1 -1
  29. package/build/getDevServer/index.d.ts +0 -3
  30. package/build/getDevServer/index.d.ts.map +1 -1
  31. package/build/getDevServer/index.js +1 -28
  32. package/build/getDevServer/index.js.map +1 -1
  33. package/build/getReactNavigationConfig.d.ts.map +1 -1
  34. package/build/getReactNavigationConfig.js +3 -0
  35. package/build/getReactNavigationConfig.js.map +1 -1
  36. package/build/getRoutes.d.ts +8 -5
  37. package/build/getRoutes.d.ts.map +1 -1
  38. package/build/getRoutes.js +150 -67
  39. package/build/getRoutes.js.map +1 -1
  40. package/build/getServerManifest.d.ts +14 -33
  41. package/build/getServerManifest.d.ts.map +1 -1
  42. package/build/getServerManifest.js +6 -5
  43. package/build/getServerManifest.js.map +1 -1
  44. package/build/global-state/router-store.d.ts.map +1 -1
  45. package/build/global-state/router-store.js +29 -3
  46. package/build/global-state/router-store.js.map +1 -1
  47. package/build/global-state/routing.d.ts +0 -4
  48. package/build/global-state/routing.d.ts.map +1 -1
  49. package/build/global-state/routing.js +76 -96
  50. package/build/global-state/routing.js.map +1 -1
  51. package/build/head/ExpoHead.ios.js +4 -4
  52. package/build/head/ExpoHead.ios.js.map +1 -1
  53. package/build/head/ExpoHead.js +1 -1
  54. package/build/head/ExpoHead.js.map +1 -1
  55. package/build/head/url.d.ts.map +1 -1
  56. package/build/head/url.js +5 -6
  57. package/build/head/url.js.map +1 -1
  58. package/build/hooks.d.ts.map +1 -1
  59. package/build/hooks.js +24 -5
  60. package/build/hooks.js.map +1 -1
  61. package/build/import-mode/index.d.ts +1 -1
  62. package/build/import-mode/index.d.ts.map +1 -1
  63. package/build/import-mode/index.js +1 -1
  64. package/build/import-mode/index.js.map +1 -1
  65. package/build/layouts/Tabs.js +2 -2
  66. package/build/layouts/Tabs.js.map +1 -1
  67. package/build/layouts/withLayoutContext.js +1 -1
  68. package/build/layouts/withLayoutContext.js.map +1 -1
  69. package/build/link/Link.d.ts +54 -1
  70. package/build/link/Link.d.ts.map +1 -1
  71. package/build/link/Link.js +54 -12
  72. package/build/link/Link.js.map +1 -1
  73. package/build/link/useLinkToPathProps.js +2 -2
  74. package/build/link/useLinkToPathProps.js.map +1 -1
  75. package/build/loadStaticParamsAsync.d.ts +1 -0
  76. package/build/loadStaticParamsAsync.d.ts.map +1 -1
  77. package/build/loadStaticParamsAsync.js +107 -72
  78. package/build/loadStaticParamsAsync.js.map +1 -1
  79. package/build/matchers.js +1 -1
  80. package/build/matchers.js.map +1 -1
  81. package/build/onboard/Tutorial.js +41 -34
  82. package/build/onboard/Tutorial.js.map +1 -1
  83. package/build/qualified-entry.d.ts.map +1 -1
  84. package/build/qualified-entry.js +10 -7
  85. package/build/qualified-entry.js.map +1 -1
  86. package/build/renderRootComponent.d.ts.map +1 -1
  87. package/build/renderRootComponent.js +28 -4
  88. package/build/renderRootComponent.js.map +1 -1
  89. package/build/routes-manifest.d.ts +1 -0
  90. package/build/routes-manifest.d.ts.map +1 -1
  91. package/build/routes-manifest.js +1 -0
  92. package/build/routes-manifest.js.map +1 -1
  93. package/build/sortRoutes.d.ts.map +1 -1
  94. package/build/sortRoutes.js +21 -2
  95. package/build/sortRoutes.js.map +1 -1
  96. package/build/static/html.d.ts.map +1 -1
  97. package/build/static/html.js +12 -10
  98. package/build/static/html.js.map +1 -1
  99. package/build/static/renderStaticContent.d.ts +13 -3
  100. package/build/static/renderStaticContent.d.ts.map +1 -1
  101. package/build/static/renderStaticContent.js +35 -11
  102. package/build/static/renderStaticContent.js.map +1 -1
  103. package/build/testing-library/index.js +3 -5
  104. package/build/testing-library/index.js.map +1 -1
  105. package/build/testing-library/mocks.d.ts +1 -3
  106. package/build/testing-library/mocks.d.ts.map +1 -1
  107. package/build/testing-library/mocks.js +17 -10
  108. package/build/testing-library/mocks.js.map +1 -1
  109. package/build/testing-library/require-context-ponyfill.js +3 -3
  110. package/build/testing-library/require-context-ponyfill.js.map +1 -1
  111. package/build/useScreens.d.ts.map +1 -1
  112. package/build/useScreens.js +19 -23
  113. package/build/useScreens.js.map +1 -1
  114. package/build/utils/url.d.ts +2 -0
  115. package/build/utils/url.d.ts.map +1 -1
  116. package/build/utils/url.js +13 -1
  117. package/build/utils/url.js.map +1 -1
  118. package/build/views/EmptyRoute.js +5 -2
  119. package/build/views/EmptyRoute.js.map +1 -1
  120. package/build/views/ErrorBoundary.js +50 -31
  121. package/build/views/ErrorBoundary.js.map +1 -1
  122. package/build/views/Navigator.js +16 -10
  123. package/build/views/Navigator.js.map +1 -1
  124. package/build/views/Sitemap.js +54 -36
  125. package/build/views/Sitemap.js.map +1 -1
  126. package/build/views/Splash.d.ts +1 -27
  127. package/build/views/Splash.d.ts.map +1 -1
  128. package/build/views/Splash.js +2 -112
  129. package/build/views/Splash.js.map +1 -1
  130. package/build/views/SuspenseFallback.d.ts +1 -1
  131. package/build/views/SuspenseFallback.d.ts.map +1 -1
  132. package/build/views/SuspenseFallback.js +7 -2
  133. package/build/views/SuspenseFallback.js.map +1 -1
  134. package/build/views/Toast.js +23 -18
  135. package/build/views/Toast.js.map +1 -1
  136. package/build/views/Try.js +1 -1
  137. package/build/views/Try.js.map +1 -1
  138. package/build/views/Unmatched.js +29 -17
  139. package/build/views/Unmatched.js.map +1 -1
  140. package/html.d.ts +1 -0
  141. package/ios/ExpoHead.podspec +1 -1
  142. package/ios/ExpoHeadModule.swift +0 -2
  143. package/package.json +11 -19
  144. package/plugin/build/index.d.ts +2 -2
  145. package/plugin/options.json +3 -3
  146. package/build/fork/react-native-web-container.d.ts +0 -8
  147. package/build/fork/react-native-web-container.d.ts.map +0 -1
  148. package/build/fork/react-native-web-container.js +0 -8
  149. package/build/fork/react-native-web-container.js.map +0 -1
  150. package/build/import-mode/index.android.d.ts +0 -3
  151. package/build/import-mode/index.android.d.ts.map +0 -1
  152. package/build/import-mode/index.android.js +0 -4
  153. package/build/import-mode/index.android.js.map +0 -1
  154. package/build/import-mode/index.ios.d.ts +0 -3
  155. package/build/import-mode/index.ios.d.ts.map +0 -1
  156. package/build/import-mode/index.ios.js +0 -4
  157. package/build/import-mode/index.ios.js.map +0 -1
  158. package/build/import-mode/index.web.d.ts +0 -3
  159. package/build/import-mode/index.web.d.ts.map +0 -1
  160. package/build/import-mode/index.web.js +0 -4
  161. package/build/import-mode/index.web.js.map +0 -1
  162. package/build/link/stateOperations.d.ts +0 -81
  163. package/build/link/stateOperations.d.ts.map +0 -1
  164. package/build/link/stateOperations.js +0 -105
  165. package/build/link/stateOperations.js.map +0 -1
  166. package/types/global.d.ts +0 -38
  167. package/types/metro-require.d.ts +0 -52
  168. package/types/react-native-web.d.ts +0 -295
@@ -1 +1 @@
1
- {"version":3,"file":"useScreens.js","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {\n EventMapBase,\n NavigationState,\n ParamListBase,\n RouteProp,\n ScreenListeners,\n} from '@react-navigation/native';\nimport React from 'react';\n\nimport {\n DynamicConvention,\n LoadedRoute,\n Route,\n RouteNode,\n sortRoutesWithInitial,\n useRouteNode,\n} from './Route';\nimport EXPO_ROUTER_IMPORT_MODE from './import-mode';\nimport { Screen } from './primitives';\nimport { EmptyRoute } from './views/EmptyRoute';\nimport { SuspenseFallback } from './views/SuspenseFallback';\nimport { Try } from './views/Try';\n\nexport type ScreenProps<\n TOptions extends Record<string, any> = Record<string, any>,\n State extends NavigationState = NavigationState,\n EventMap extends EventMapBase = EventMapBase,\n> = {\n /** Name is required when used inside a Layout component. */\n name?: string;\n /**\n * Redirect to the nearest sibling route.\n * If all children are redirect={true}, the layout will render `null` as there are no children to render.\n */\n redirect?: boolean;\n initialParams?: { [key: string]: any };\n options?: TOptions;\n\n listeners?:\n | ScreenListeners<State, EventMap>\n | ((prop: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenListeners<State, EventMap>);\n\n getId?: ({ params }: { params?: Record<string, any> | undefined }) => string | undefined;\n};\n\nfunction getSortedChildren(\n children: RouteNode[],\n order?: ScreenProps[],\n initialRouteName?: string\n): { route: RouteNode; props: Partial<ScreenProps> }[] {\n if (!order?.length) {\n return children\n .sort(sortRoutesWithInitial(initialRouteName))\n .map((route) => ({ route, props: {} }));\n }\n const entries = [...children];\n\n const ordered = order\n .map(({ name, redirect, initialParams, listeners, options, getId }) => {\n if (!entries.length) {\n console.warn(`[Layout children]: Too many screens defined. Route \"${name}\" is extraneous.`);\n return null;\n }\n const matchIndex = entries.findIndex((child) => child.route === name);\n if (matchIndex === -1) {\n console.warn(\n `[Layout children]: No route named \"${name}\" exists in nested children:`,\n children.map(({ route }) => route)\n );\n return null;\n } else {\n // Get match and remove from entries\n const match = entries[matchIndex];\n entries.splice(matchIndex, 1);\n\n // Ensure to return null after removing from entries.\n if (redirect) {\n if (typeof redirect === 'string') {\n throw new Error(`Redirecting to a specific route is not supported yet.`);\n }\n return null;\n }\n\n return {\n route: match,\n props: { initialParams, listeners, options, getId },\n };\n }\n })\n .filter(Boolean) as {\n route: RouteNode;\n props: Partial<ScreenProps>;\n }[];\n\n // Add any remaining children\n ordered.push(\n ...entries.sort(sortRoutesWithInitial(initialRouteName)).map((route) => ({ route, props: {} }))\n );\n\n return ordered;\n}\n\n/**\n * @returns React Navigation screens sorted by the `route` property.\n */\nexport function useSortedScreens(order: ScreenProps[]): React.ReactNode[] {\n const node = useRouteNode();\n\n const sorted = node?.children?.length\n ? getSortedChildren(node.children, order, node.initialRouteName)\n : [];\n return React.useMemo(\n () => sorted.map((value) => routeToScreen(value.route, value.props)),\n [sorted]\n );\n}\n\nfunction fromImport({ ErrorBoundary, ...component }: LoadedRoute) {\n if (ErrorBoundary) {\n return {\n default: React.forwardRef((props: any, ref: any) => {\n const children = React.createElement(component.default || EmptyRoute, {\n ...props,\n ref,\n });\n return <Try catch={ErrorBoundary}>{children}</Try>;\n }),\n };\n }\n if (process.env.NODE_ENV !== 'production') {\n if (\n typeof component.default === 'object' &&\n component.default &&\n Object.keys(component.default).length === 0\n ) {\n return { default: EmptyRoute };\n }\n }\n return { default: component.default || EmptyRoute };\n}\n\nfunction fromLoadedRoute(res: LoadedRoute) {\n if (!(res instanceof Promise)) {\n return fromImport(res);\n }\n\n return res.then(fromImport);\n}\n\n// TODO: Maybe there's a more React-y way to do this?\n// Without this store, the process enters a recursive loop.\nconst qualifiedStore = new WeakMap<RouteNode, React.ComponentType<any>>();\n\n/** Wrap the component with various enhancements and add access to child routes. */\nexport function getQualifiedRouteComponent(value: RouteNode) {\n if (qualifiedStore.has(value)) {\n return qualifiedStore.get(value)!;\n }\n\n let getLoadable: (props: any, ref: any) => JSX.Element;\n\n // TODO: This ensures sync doesn't use React.lazy, but it's not ideal.\n if (EXPO_ROUTER_IMPORT_MODE === 'lazy') {\n const AsyncComponent = React.lazy(async () => {\n const res = value.loadRoute();\n return fromLoadedRoute(res) as Promise<{\n default: React.ComponentType<any>;\n }>;\n });\n getLoadable = (props: any, ref: any) => (\n <React.Suspense fallback={<SuspenseFallback route={value} />}>\n <AsyncComponent\n {...{\n ...props,\n ref,\n // Expose the template segment path, e.g. `(home)`, `[foo]`, `index`\n // the intention is to make it possible to deduce shared routes.\n segment: value.route,\n }}\n />\n </React.Suspense>\n );\n } else {\n const res = value.loadRoute();\n const Component = fromImport(res).default;\n const SyncComponent = React.forwardRef((props, ref) => {\n return <Component {...props} ref={ref} />;\n });\n\n getLoadable = (props: any, ref: any) => (\n <SyncComponent\n {...{\n ...props,\n ref,\n // Expose the template segment path, e.g. `(home)`, `[foo]`, `index`\n // the intention is to make it possible to deduce shared routes.\n segment: value.route,\n }}\n />\n );\n }\n\n const QualifiedRoute = React.forwardRef(\n (\n {\n // Remove these React Navigation props to\n // enforce usage of expo-router hooks (where the query params are correct).\n route,\n navigation,\n\n // Pass all other props to the component\n ...props\n }: any,\n ref: any\n ) => {\n const loadable = getLoadable(props, ref);\n\n return <Route node={value}>{loadable}</Route>;\n }\n );\n\n QualifiedRoute.displayName = `Route(${value.route})`;\n\n qualifiedStore.set(value, QualifiedRoute);\n return QualifiedRoute;\n}\n\n/** @returns a function which provides a screen id that matches the dynamic route name in params. */\nexport function createGetIdForRoute(route: Pick<RouteNode, 'dynamic' | 'route'>) {\n if (!route.dynamic?.length) {\n return undefined;\n }\n return ({ params }: { params?: Record<string, any> }) => {\n const getPreferredId = (segment: DynamicConvention) => {\n // Params can be undefined when there are no params in the route.\n const preferredId = params?.[segment.name];\n // If the route has a dynamic segment, use the matching parameter\n // as the screen id. This enables pushing a screen like `/[user]` multiple times\n // when the user is different.\n if (preferredId) {\n if (!Array.isArray(preferredId)) {\n return preferredId;\n } else if (preferredId.length) {\n // Deep dynamic routes will return as an array, so we'll join them to create a\n // fully qualified string.\n return preferredId.join('/');\n }\n // Empty arrays...\n }\n return segment.deep ? `[...${segment.name}]` : `[${segment.name}]`;\n };\n return route.dynamic?.map((segment) => getPreferredId(segment)).join('/');\n };\n}\n\nfunction routeToScreen(route: RouteNode, { options, ...props }: Partial<ScreenProps> = {}) {\n return (\n <Screen\n // Users can override the screen getId function.\n getId={createGetIdForRoute(route)}\n {...props}\n name={route.route}\n key={route.route}\n options={(args) => {\n // Only eager load generated components\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult =\n typeof staticOptions === 'function' ? staticOptions(args) : staticOptions;\n const dynamicResult = typeof options === 'function' ? options?.(args) : options;\n const output = {\n ...staticResult,\n ...dynamicResult,\n };\n\n // Prevent generated screens from showing up in the tab bar.\n if (route.generated) {\n output.tabBarButton = () => null;\n // TODO: React Navigation doesn't provide a way to prevent rendering the drawer item.\n output.drawerItemStyle = { height: 0, display: 'none' };\n }\n\n return output;\n }}\n getComponent={() => getQualifiedRouteComponent(route)}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"useScreens.js","sourceRoot":"","sources":["../src/useScreens.tsx"],"names":[],"mappings":"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","sourcesContent":["import type {\n EventMapBase,\n NavigationState,\n ParamListBase,\n RouteProp,\n ScreenListeners,\n} from '@react-navigation/native';\nimport React from 'react';\n\nimport {\n DynamicConvention,\n LoadedRoute,\n Route,\n RouteNode,\n sortRoutesWithInitial,\n useRouteNode,\n} from './Route';\nimport EXPO_ROUTER_IMPORT_MODE from './import-mode';\nimport { Screen } from './primitives';\nimport { EmptyRoute } from './views/EmptyRoute';\nimport { SuspenseFallback } from './views/SuspenseFallback';\nimport { Try } from './views/Try';\n\nexport type ScreenProps<\n TOptions extends Record<string, any> = Record<string, any>,\n State extends NavigationState = NavigationState,\n EventMap extends EventMapBase = EventMapBase,\n> = {\n /** Name is required when used inside a Layout component. */\n name?: string;\n /**\n * Redirect to the nearest sibling route.\n * If all children are redirect={true}, the layout will render `null` as there are no children to render.\n */\n redirect?: boolean;\n initialParams?: { [key: string]: any };\n options?: TOptions;\n\n listeners?:\n | ScreenListeners<State, EventMap>\n | ((prop: {\n route: RouteProp<ParamListBase, string>;\n navigation: any;\n }) => ScreenListeners<State, EventMap>);\n\n getId?: ({ params }: { params?: Record<string, any> | undefined }) => string | undefined;\n};\n\nfunction getSortedChildren(\n children: RouteNode[],\n order?: ScreenProps[],\n initialRouteName?: string\n): { route: RouteNode; props: Partial<ScreenProps> }[] {\n if (!order?.length) {\n return children\n .sort(sortRoutesWithInitial(initialRouteName))\n .map((route) => ({ route, props: {} }));\n }\n const entries = [...children];\n\n const ordered = order\n .map(({ name, redirect, initialParams, listeners, options, getId }) => {\n if (!entries.length) {\n console.warn(`[Layout children]: Too many screens defined. Route \"${name}\" is extraneous.`);\n return null;\n }\n const matchIndex = entries.findIndex((child) => child.route === name);\n if (matchIndex === -1) {\n console.warn(\n `[Layout children]: No route named \"${name}\" exists in nested children:`,\n children.map(({ route }) => route)\n );\n return null;\n } else {\n // Get match and remove from entries\n const match = entries[matchIndex];\n entries.splice(matchIndex, 1);\n\n // Ensure to return null after removing from entries.\n if (redirect) {\n if (typeof redirect === 'string') {\n throw new Error(`Redirecting to a specific route is not supported yet.`);\n }\n return null;\n }\n\n return {\n route: match,\n props: { initialParams, listeners, options, getId },\n };\n }\n })\n .filter(Boolean) as {\n route: RouteNode;\n props: Partial<ScreenProps>;\n }[];\n\n // Add any remaining children\n ordered.push(\n ...entries.sort(sortRoutesWithInitial(initialRouteName)).map((route) => ({ route, props: {} }))\n );\n\n return ordered;\n}\n\n/**\n * @returns React Navigation screens sorted by the `route` property.\n */\nexport function useSortedScreens(order: ScreenProps[]): React.ReactNode[] {\n const node = useRouteNode();\n\n const sorted = node?.children?.length\n ? getSortedChildren(node.children, order, node.initialRouteName)\n : [];\n return React.useMemo(\n () => sorted.map((value) => routeToScreen(value.route, value.props)),\n [sorted]\n );\n}\n\nfunction fromImport({ ErrorBoundary, ...component }: LoadedRoute) {\n if (ErrorBoundary) {\n return {\n default: React.forwardRef((props: any, ref: any) => {\n const children = React.createElement(component.default || EmptyRoute, {\n ...props,\n ref,\n });\n return <Try catch={ErrorBoundary}>{children}</Try>;\n }),\n };\n }\n if (process.env.NODE_ENV !== 'production') {\n if (\n typeof component.default === 'object' &&\n component.default &&\n Object.keys(component.default).length === 0\n ) {\n return { default: EmptyRoute };\n }\n }\n\n return { default: component.default };\n}\n\nfunction fromLoadedRoute(res: LoadedRoute) {\n if (!(res instanceof Promise)) {\n return fromImport(res);\n }\n\n return res.then(fromImport);\n}\n\n// TODO: Maybe there's a more React-y way to do this?\n// Without this store, the process enters a recursive loop.\nconst qualifiedStore = new WeakMap<RouteNode, React.ComponentType<any>>();\n\n/** Wrap the component with various enhancements and add access to child routes. */\nexport function getQualifiedRouteComponent(value: RouteNode) {\n if (qualifiedStore.has(value)) {\n return qualifiedStore.get(value)!;\n }\n\n let ScreenComponent: React.ForwardRefExoticComponent<React.RefAttributes<unknown>>;\n\n // TODO: This ensures sync doesn't use React.lazy, but it's not ideal.\n if (EXPO_ROUTER_IMPORT_MODE === 'lazy') {\n ScreenComponent = React.lazy(async () => {\n const res = value.loadRoute();\n return fromLoadedRoute(res) as Promise<{\n default: React.ComponentType<any>;\n }>;\n });\n } else {\n const res = value.loadRoute();\n const Component = fromImport(res).default as React.ComponentType<any>;\n ScreenComponent = React.forwardRef((props, ref) => {\n return <Component {...props} ref={ref} />;\n });\n }\n\n const getLoadable = (props: any, ref: any) => (\n <React.Suspense fallback={<SuspenseFallback route={value} />}>\n <ScreenComponent\n {...{\n ...props,\n ref,\n // Expose the template segment path, e.g. `(home)`, `[foo]`, `index`\n // the intention is to make it possible to deduce shared routes.\n segment: value.route,\n }}\n />\n </React.Suspense>\n );\n\n const QualifiedRoute = React.forwardRef(\n (\n {\n // Remove these React Navigation props to\n // enforce usage of expo-router hooks (where the query params are correct).\n route,\n navigation,\n\n // Pass all other props to the component\n ...props\n }: any,\n ref: any\n ) => {\n const loadable = getLoadable(props, ref);\n\n return <Route node={value}>{loadable}</Route>;\n }\n );\n\n QualifiedRoute.displayName = `Route(${value.route})`;\n\n qualifiedStore.set(value, QualifiedRoute);\n return QualifiedRoute;\n}\n\n/** @returns a function which provides a screen id that matches the dynamic route name in params. */\nexport function createGetIdForRoute(route: Pick<RouteNode, 'dynamic' | 'route'>) {\n if (!route.dynamic?.length) {\n return undefined;\n }\n return ({ params }: { params?: Record<string, any> }) => {\n const getPreferredId = (segment: DynamicConvention) => {\n // Params can be undefined when there are no params in the route.\n const preferredId = params?.[segment.name];\n // If the route has a dynamic segment, use the matching parameter\n // as the screen id. This enables pushing a screen like `/[user]` multiple times\n // when the user is different.\n if (preferredId) {\n if (!Array.isArray(preferredId)) {\n return preferredId;\n } else if (preferredId.length) {\n // Deep dynamic routes will return as an array, so we'll join them to create a\n // fully qualified string.\n return preferredId.join('/');\n }\n // Empty arrays...\n }\n return segment.deep ? `[...${segment.name}]` : `[${segment.name}]`;\n };\n return route.dynamic?.map((segment) => getPreferredId(segment)).join('/');\n };\n}\n\nfunction routeToScreen(route: RouteNode, { options, ...props }: Partial<ScreenProps> = {}) {\n return (\n <Screen\n // Users can override the screen getId function.\n getId={createGetIdForRoute(route)}\n {...props}\n name={route.route}\n key={route.route}\n options={(args) => {\n // Only eager load generated components\n const staticOptions = route.generated ? route.loadRoute()?.getNavOptions : null;\n const staticResult =\n typeof staticOptions === 'function' ? staticOptions(args) : staticOptions;\n const dynamicResult = typeof options === 'function' ? options?.(args) : options;\n const output = {\n ...staticResult,\n ...dynamicResult,\n };\n\n // Prevent generated screens from showing up in the tab bar.\n if (route.generated) {\n output.tabBarButton = () => null;\n // TODO: React Navigation doesn't provide a way to prevent rendering the drawer item.\n output.drawerItemStyle = { height: 0, display: 'none' };\n }\n\n return output;\n }}\n getComponent={() => getQualifiedRouteComponent(route)}\n />\n );\n}\n"]}
@@ -3,4 +3,6 @@
3
3
  * NOTE: Additional strictness added to ensure URLs sent in query parameters for in-app navigation are not matched.
4
4
  */
5
5
  export declare function hasUrlProtocolPrefix(href: string): boolean;
6
+ export declare function isWellKnownUri(href: string): boolean;
7
+ export declare function shouldLinkExternally(href: string): boolean;
6
8
  //# sourceMappingURL=url.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKpD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1D"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasUrlProtocolPrefix = void 0;
3
+ exports.shouldLinkExternally = exports.isWellKnownUri = exports.hasUrlProtocolPrefix = void 0;
4
4
  /**
5
5
  * Does the input string start with a valid URL scheme.
6
6
  * NOTE: Additional strictness added to ensure URLs sent in query parameters for in-app navigation are not matched.
@@ -9,4 +9,16 @@ function hasUrlProtocolPrefix(href) {
9
9
  return /^[\w\d_+.-]+:\/\//.test(href);
10
10
  }
11
11
  exports.hasUrlProtocolPrefix = hasUrlProtocolPrefix;
12
+ function isWellKnownUri(href) {
13
+ // This is a hack and we should change this to work like the web in the future where we have full confidence in the
14
+ // ability to match URLs and send anything unmatched to the OS. The main difference between this and `hasUrlProtocolPrefix` is
15
+ // that we don't require `//`, e.g. `mailto:` is valid and common, and `mailto://bacon` is invalid.
16
+ return /^(https?|mailto|tel|sms|geo|maps|market|itmss?|itms-apps|content|file):/.test(href);
17
+ }
18
+ exports.isWellKnownUri = isWellKnownUri;
19
+ function shouldLinkExternally(href) {
20
+ // Cheap check first to avoid regex if the href is not a path fragment.
21
+ return !/^[./]/.test(href) && (hasUrlProtocolPrefix(href) || isWellKnownUri(href));
22
+ }
23
+ exports.shouldLinkExternally = shouldLinkExternally;
12
24
  //# sourceMappingURL=url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAFD,oDAEC","sourcesContent":["/**\n * Does the input string start with a valid URL scheme.\n * NOTE: Additional strictness added to ensure URLs sent in query parameters for in-app navigation are not matched.\n */\nexport function hasUrlProtocolPrefix(href: string): boolean {\n return /^[\\w\\d_+.-]+:\\/\\//.test(href);\n}\n"]}
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAFD,oDAEC;AAED,SAAgB,cAAc,CAAC,IAAY;IACzC,mHAAmH;IACnH,8HAA8H;IAC9H,mGAAmG;IACnG,OAAO,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9F,CAAC;AALD,wCAKC;AAED,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,uEAAuE;IACvE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AACrF,CAAC;AAHD,oDAGC","sourcesContent":["/**\n * Does the input string start with a valid URL scheme.\n * NOTE: Additional strictness added to ensure URLs sent in query parameters for in-app navigation are not matched.\n */\nexport function hasUrlProtocolPrefix(href: string): boolean {\n return /^[\\w\\d_+.-]+:\\/\\//.test(href);\n}\n\nexport function isWellKnownUri(href: string): boolean {\n // This is a hack and we should change this to work like the web in the future where we have full confidence in the\n // ability to match URLs and send anything unmatched to the OS. The main difference between this and `hasUrlProtocolPrefix` is\n // that we don't require `//`, e.g. `mailto:` is valid and common, and `mailto://bacon` is invalid.\n return /^(https?|mailto|tel|sms|geo|maps|market|itmss?|itms-apps|content|file):/.test(href);\n}\n\nexport function shouldLinkExternally(href: string): boolean {\n // Cheap check first to avoid regex if the href is not a path fragment.\n return !/^[./]/.test(href) && (hasUrlProtocolPrefix(href) || isWellKnownUri(href));\n}\n"]}
@@ -9,8 +9,11 @@ const Toast_1 = require("./Toast");
9
9
  const Route_1 = require("../Route");
10
10
  function EmptyRoute() {
11
11
  const route = (0, Route_1.useRouteNode)();
12
- return (react_1.default.createElement(Toast_1.ToastWrapper, null,
13
- react_1.default.createElement(Toast_1.Toast, { warning: true, filename: route?.contextKey }, "Missing default export")));
12
+ return (<Toast_1.ToastWrapper>
13
+ <Toast_1.Toast warning filename={route?.contextKey}>
14
+ Missing default export
15
+ </Toast_1.Toast>
16
+ </Toast_1.ToastWrapper>);
14
17
  }
15
18
  exports.EmptyRoute = EmptyRoute;
16
19
  //# sourceMappingURL=EmptyRoute.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyRoute.js","sourceRoot":"","sources":["../../src/views/EmptyRoute.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,mCAA8C;AAC9C,oCAAwC;AAExC,SAAgB,UAAU;IACxB,MAAM,KAAK,GAAG,IAAA,oBAAY,GAAE,CAAC;IAE7B,OAAO,CACL,8BAAC,oBAAY;QACX,8BAAC,aAAK,IAAC,OAAO,QAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,6BAElC,CACK,CAChB,CAAC;AACJ,CAAC;AAVD,gCAUC","sourcesContent":["import React from 'react';\n\nimport { Toast, ToastWrapper } from './Toast';\nimport { useRouteNode } from '../Route';\n\nexport function EmptyRoute() {\n const route = useRouteNode();\n\n return (\n <ToastWrapper>\n <Toast warning filename={route?.contextKey}>\n Missing default export\n </Toast>\n </ToastWrapper>\n );\n}\n"]}
1
+ {"version":3,"file":"EmptyRoute.js","sourceRoot":"","sources":["../../src/views/EmptyRoute.tsx"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,mCAA8C;AAC9C,oCAAwC;AAExC,SAAgB,UAAU;IACxB,MAAM,KAAK,GAAG,IAAA,oBAAY,GAAE,CAAC;IAE7B,OAAO,CACL,CAAC,oBAAY,CACX;MAAA,CAAC,aAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CACzC;;MACF,EAAE,aAAK,CACT;IAAA,EAAE,oBAAY,CAAC,CAChB,CAAC;AACJ,CAAC;AAVD,gCAUC","sourcesContent":["import React from 'react';\n\nimport { Toast, ToastWrapper } from './Toast';\nimport { useRouteNode } from '../Route';\n\nexport function EmptyRoute() {\n const route = useRouteNode();\n\n return (\n <ToastWrapper>\n <Toast warning filename={route?.contextKey}>\n Missing default export\n </Toast>\n </ToastWrapper>\n );\n}\n"]}
@@ -48,50 +48,65 @@ else {
48
48
  }
49
49
  let StackTrace;
50
50
  if (process.env.NODE_ENV === 'development') {
51
- const { LogContext } = require('@expo/metro-runtime/src/error-overlay/Data/LogContext');
52
- const { LogBoxInspectorStackFrames, } = require('@expo/metro-runtime/src/error-overlay/overlay/LogBoxInspectorStackFrames');
51
+ const { LogContext } = require('@expo/metro-runtime/build/error-overlay/Data/LogContext');
52
+ const { LogBoxInspectorStackFrames, } = require('@expo/metro-runtime/build/error-overlay/overlay/LogBoxInspectorStackFrames');
53
53
  StackTrace = function ({ logData }) {
54
54
  if (!logData?.symbolicated?.stack?.stack) {
55
55
  return null;
56
56
  }
57
- return (react_1.default.createElement(react_native_1.ScrollView, { style: { flex: 1 } },
58
- react_1.default.createElement(LogContext.Provider, { value: {
59
- isDisabled: false,
60
- logs: [logData],
61
- selectedLogIndex: 0,
62
- } },
63
- react_1.default.createElement(LogBoxInspectorStackFrames, { onRetry: function () { }, type: "stack" }))));
57
+ return (<react_native_1.ScrollView style={{ flex: 1 }}>
58
+ <LogContext.Provider value={{
59
+ isDisabled: false,
60
+ logs: [logData],
61
+ selectedLogIndex: 0,
62
+ }}>
63
+ <LogBoxInspectorStackFrames onRetry={function () { }} type="stack"/>
64
+ </LogContext.Provider>
65
+ </react_native_1.ScrollView>);
64
66
  };
65
67
  }
66
68
  else {
67
69
  StackTrace = function () {
68
- return react_1.default.createElement(react_native_1.View, { style: { flex: 1 } });
70
+ return <react_native_1.View style={{ flex: 1 }}/>;
69
71
  };
70
72
  }
71
73
  function ErrorBoundary({ error, retry }) {
72
74
  const logBoxLog = useMetroSymbolication(error);
73
75
  const inTabBar = react_1.default.useContext(bottom_tabs_1.BottomTabBarHeightContext);
74
76
  const Wrapper = inTabBar ? react_native_1.View : react_native_safe_area_context_1.SafeAreaView;
75
- return (react_1.default.createElement(react_native_1.View, { style: styles.container },
76
- react_1.default.createElement(Wrapper, { style: { flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' } },
77
- react_1.default.createElement(react_native_1.View, { style: {
78
- marginBottom: 12,
79
- gap: 4,
80
- flexWrap: 'wrap',
81
- } },
82
- react_1.default.createElement(react_native_1.Text, { role: "heading", "aria-level": 1, style: styles.title }, "Something went wrong"),
83
- react_1.default.createElement(react_native_1.Text, { role: "heading", "aria-level": 2, style: styles.errorMessage },
84
- "Error: ",
85
- error.message)),
86
- react_1.default.createElement(StackTrace, { logData: logBoxLog }),
87
- process.env.NODE_ENV === 'development' && (react_1.default.createElement(Link_1.Link, { href: "/_sitemap", style: styles.link }, "Sitemap")),
88
- react_1.default.createElement(Pressable_1.Pressable, { onPress: retry }, ({ hovered, pressed }) => (react_1.default.createElement(react_native_1.View, { style: [styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }] },
89
- react_1.default.createElement(react_native_1.Text, { style: [
90
- styles.buttonText,
91
- {
92
- color: hovered || pressed ? 'black' : 'white',
93
- },
94
- ] }, "Retry")))))));
77
+ return (<react_native_1.View style={styles.container}>
78
+ <Wrapper style={{ flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' }}>
79
+ <react_native_1.View style={{
80
+ marginBottom: 12,
81
+ gap: 4,
82
+ flexWrap: 'wrap',
83
+ }}>
84
+ <react_native_1.Text role="heading" aria-level={1} style={styles.title}>
85
+ Something went wrong
86
+ </react_native_1.Text>
87
+ <react_native_1.Text role="heading" aria-level={2} style={styles.errorMessage}>
88
+ Error: {error.message}
89
+ </react_native_1.Text>
90
+ </react_native_1.View>
91
+
92
+ <StackTrace logData={logBoxLog}/>
93
+ {process.env.NODE_ENV === 'development' && (<Link_1.Link href="/_sitemap" style={styles.link}>
94
+ Sitemap
95
+ </Link_1.Link>)}
96
+ <Pressable_1.Pressable onPress={retry}>
97
+ {({ hovered, pressed }) => (<react_native_1.View style={[styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }]}>
98
+ <react_native_1.Text style={[
99
+ styles.buttonText,
100
+ {
101
+ color: hovered || pressed ? 'black' : 'white',
102
+ },
103
+ ]}>
104
+ Retry
105
+ </react_native_1.Text>
106
+ </react_native_1.View>)}
107
+ </Pressable_1.Pressable>
108
+ </Wrapper>
109
+ </react_native_1.View>);
95
110
  }
96
111
  exports.ErrorBoundary = ErrorBoundary;
97
112
  const styles = react_native_1.StyleSheet.create({
@@ -118,7 +133,11 @@ const styles = react_native_1.StyleSheet.create({
118
133
  }),
119
134
  },
120
135
  buttonInner: {
121
- transitionDuration: '100ms',
136
+ ...react_native_1.Platform.select({
137
+ web: {
138
+ transitionDuration: '100ms',
139
+ },
140
+ }),
122
141
  paddingVertical: 12,
123
142
  paddingHorizontal: 24,
124
143
  borderColor: 'white',
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/views/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { LogBoxLog } from '@expo/metro-runtime/symbolicate';\nimport { BottomTabBarHeightContext } from '@react-navigation/bottom-tabs';\nimport React from 'react';\nimport { StyleSheet, Text, View, Platform, ScrollView } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Pressable } from './Pressable';\nimport { ErrorBoundaryProps } from './Try';\nimport { Link } from '../link/Link';\n\nlet useMetroSymbolication: (error: Error) => LogBoxLog | null;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogBoxLog, parseErrorStack } =\n require('@expo/metro-runtime/symbolicate') as typeof import('@expo/metro-runtime/symbolicate');\n useMetroSymbolication = function (error: Error) {\n const [logBoxLog, setLogBoxLog] = React.useState<LogBoxLog | null>(null);\n\n React.useEffect(() => {\n let isMounted = true;\n const stack = parseErrorStack(error.stack);\n\n const log = new LogBoxLog({\n level: 'error',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: error.message,\n componentStack: [],\n });\n\n log.symbolicate('stack', (symbolicatedLog) => {\n if (isMounted) {\n setLogBoxLog(log);\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [error]);\n\n return logBoxLog;\n };\n} else {\n useMetroSymbolication = function () {\n return null;\n };\n}\n\nlet StackTrace: React.FC<{ logData: LogBoxLog | null }>;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogContext } = require('@expo/metro-runtime/src/error-overlay/Data/LogContext');\n const {\n LogBoxInspectorStackFrames,\n } = require('@expo/metro-runtime/src/error-overlay/overlay/LogBoxInspectorStackFrames');\n\n StackTrace = function ({ logData }: { logData: LogBoxLog | null }) {\n if (!logData?.symbolicated?.stack?.stack) {\n return null;\n }\n return (\n <ScrollView style={{ flex: 1 }}>\n <LogContext.Provider\n value={{\n isDisabled: false,\n logs: [logData],\n selectedLogIndex: 0,\n }}>\n <LogBoxInspectorStackFrames onRetry={function () {}} type=\"stack\" />\n </LogContext.Provider>\n </ScrollView>\n );\n };\n} else {\n StackTrace = function () {\n return <View style={{ flex: 1 }} />;\n };\n}\n\nexport function ErrorBoundary({ error, retry }: ErrorBoundaryProps) {\n const logBoxLog = useMetroSymbolication(error);\n const inTabBar = React.useContext(BottomTabBarHeightContext);\n const Wrapper = inTabBar ? View : SafeAreaView;\n\n return (\n <View style={styles.container}>\n <Wrapper style={{ flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' }}>\n <View\n style={{\n marginBottom: 12,\n gap: 4,\n flexWrap: 'wrap',\n }}>\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Something went wrong\n </Text>\n <Text role=\"heading\" aria-level={2} style={styles.errorMessage}>\n Error: {error.message}\n </Text>\n </View>\n\n <StackTrace logData={logBoxLog} />\n {process.env.NODE_ENV === 'development' && (\n <Link href=\"/_sitemap\" style={styles.link}>\n Sitemap\n </Link>\n )}\n <Pressable onPress={retry}>\n {({ hovered, pressed }) => (\n <View\n style={[styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }]}>\n <Text\n style={[\n styles.buttonText,\n {\n color: hovered || pressed ? 'black' : 'white',\n },\n ]}>\n Retry\n </Text>\n </View>\n )}\n </Pressable>\n </Wrapper>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n alignItems: 'stretch',\n justifyContent: 'center',\n },\n title: {\n color: 'white',\n fontSize: Platform.select({ web: 32, default: 24 }),\n fontWeight: 'bold',\n },\n buttonText: {\n fontSize: 18,\n fontWeight: 'bold',\n color: 'black',\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n },\n buttonInner: {\n transitionDuration: '100ms',\n paddingVertical: 12,\n paddingHorizontal: 24,\n borderColor: 'white',\n borderWidth: 2,\n marginLeft: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n code: {\n fontFamily: Platform.select({\n default: 'Courier',\n ios: 'Courier New',\n android: 'monospace',\n }),\n fontWeight: '500',\n },\n errorMessage: {\n color: 'white',\n fontSize: 16,\n },\n subtitle: {\n color: 'white',\n fontSize: 14,\n marginBottom: 12,\n // textAlign: \"center\",\n },\n link: {\n color: 'rgba(255,255,255,0.4)',\n textDecorationStyle: 'solid',\n textDecorationLine: 'underline',\n fontSize: 14,\n textAlign: 'center',\n },\n});\n"]}
1
+ {"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/views/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { LogBoxLog } from '@expo/metro-runtime/symbolicate';\nimport { BottomTabBarHeightContext } from '@react-navigation/bottom-tabs';\nimport React from 'react';\nimport { StyleSheet, Text, View, Platform, ScrollView } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Pressable } from './Pressable';\nimport { ErrorBoundaryProps } from './Try';\nimport { Link } from '../link/Link';\n\nlet useMetroSymbolication: (error: Error) => LogBoxLog | null;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogBoxLog, parseErrorStack } =\n require('@expo/metro-runtime/symbolicate') as typeof import('@expo/metro-runtime/symbolicate');\n useMetroSymbolication = function (error: Error) {\n const [logBoxLog, setLogBoxLog] = React.useState<LogBoxLog | null>(null);\n\n React.useEffect(() => {\n let isMounted = true;\n const stack = parseErrorStack(error.stack);\n\n const log = new LogBoxLog({\n level: 'error',\n message: {\n content: error.message,\n substitutions: [],\n },\n isComponentError: false,\n stack,\n category: error.message,\n componentStack: [],\n });\n\n log.symbolicate('stack', (symbolicatedLog) => {\n if (isMounted) {\n setLogBoxLog(log);\n }\n });\n\n return () => {\n isMounted = false;\n };\n }, [error]);\n\n return logBoxLog;\n };\n} else {\n useMetroSymbolication = function () {\n return null;\n };\n}\n\nlet StackTrace: React.FC<{ logData: LogBoxLog | null }>;\n\nif (process.env.NODE_ENV === 'development') {\n const { LogContext } = require('@expo/metro-runtime/build/error-overlay/Data/LogContext');\n const {\n LogBoxInspectorStackFrames,\n } = require('@expo/metro-runtime/build/error-overlay/overlay/LogBoxInspectorStackFrames');\n\n StackTrace = function ({ logData }: { logData: LogBoxLog | null }) {\n if (!logData?.symbolicated?.stack?.stack) {\n return null;\n }\n return (\n <ScrollView style={{ flex: 1 }}>\n <LogContext.Provider\n value={{\n isDisabled: false,\n logs: [logData],\n selectedLogIndex: 0,\n }}>\n <LogBoxInspectorStackFrames onRetry={function () {}} type=\"stack\" />\n </LogContext.Provider>\n </ScrollView>\n );\n };\n} else {\n StackTrace = function () {\n return <View style={{ flex: 1 }} />;\n };\n}\n\nexport function ErrorBoundary({ error, retry }: ErrorBoundaryProps) {\n const logBoxLog = useMetroSymbolication(error);\n const inTabBar = React.useContext(BottomTabBarHeightContext);\n const Wrapper = inTabBar ? View : SafeAreaView;\n\n return (\n <View style={styles.container}>\n <Wrapper style={{ flex: 1, gap: 8, maxWidth: 720, marginHorizontal: 'auto' }}>\n <View\n style={{\n marginBottom: 12,\n gap: 4,\n flexWrap: 'wrap',\n }}>\n <Text role=\"heading\" aria-level={1} style={styles.title}>\n Something went wrong\n </Text>\n <Text role=\"heading\" aria-level={2} style={styles.errorMessage}>\n Error: {error.message}\n </Text>\n </View>\n\n <StackTrace logData={logBoxLog} />\n {process.env.NODE_ENV === 'development' && (\n <Link href=\"/_sitemap\" style={styles.link}>\n Sitemap\n </Link>\n )}\n <Pressable onPress={retry}>\n {({ hovered, pressed }) => (\n <View\n style={[styles.buttonInner, (hovered || pressed) && { backgroundColor: 'white' }]}>\n <Text\n style={[\n styles.buttonText,\n {\n color: hovered || pressed ? 'black' : 'white',\n },\n ]}>\n Retry\n </Text>\n </View>\n )}\n </Pressable>\n </Wrapper>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n padding: 24,\n alignItems: 'stretch',\n justifyContent: 'center',\n },\n title: {\n color: 'white',\n fontSize: Platform.select({ web: 32, default: 24 }),\n fontWeight: 'bold',\n },\n buttonText: {\n fontSize: 18,\n fontWeight: 'bold',\n color: 'black',\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n },\n buttonInner: {\n ...Platform.select({\n web: {\n transitionDuration: '100ms',\n },\n }),\n paddingVertical: 12,\n paddingHorizontal: 24,\n borderColor: 'white',\n borderWidth: 2,\n marginLeft: 8,\n justifyContent: 'center',\n alignItems: 'center',\n },\n code: {\n fontFamily: Platform.select({\n default: 'Courier',\n ios: 'Courier New',\n android: 'monospace',\n }),\n fontWeight: '500',\n },\n errorMessage: {\n color: 'white',\n fontSize: 16,\n },\n subtitle: {\n color: 'white',\n fontSize: 14,\n marginBottom: 12,\n // textAlign: \"center\",\n },\n link: {\n color: 'rgba(255,255,255,0.4)',\n textDecorationStyle: 'solid',\n textDecorationLine: 'underline',\n fontSize: 14,\n textAlign: 'center',\n },\n});\n"]}
@@ -49,7 +49,9 @@ function Navigator({ initialRouteName, screenOptions, children, router }) {
49
49
  console.warn(`Navigator at "${contextKey}" has no children.`);
50
50
  return null;
51
51
  }
52
- return (React.createElement(QualifiedNavigator, { initialRouteName: initialRouteName, screenOptions: screenOptions, screens: sorted, contextKey: contextKey, router: router }, otherSlot));
52
+ return (<QualifiedNavigator initialRouteName={initialRouteName} screenOptions={screenOptions} screens={sorted} contextKey={contextKey} router={router}>
53
+ {otherSlot}
54
+ </QualifiedNavigator>);
53
55
  }
54
56
  exports.Navigator = Navigator;
55
57
  function QualifiedNavigator({ initialRouteName, screenOptions, children, screens, contextKey, router = native_1.StackRouter, }) {
@@ -60,14 +62,15 @@ function QualifiedNavigator({ initialRouteName, screenOptions, children, screens
60
62
  screenOptions,
61
63
  initialRouteName,
62
64
  });
63
- return (React.createElement(exports.NavigatorContext.Provider, { value: {
65
+ return (<exports.NavigatorContext.Provider value={{
64
66
  contextKey,
65
67
  state,
66
68
  navigation,
67
69
  descriptors,
68
70
  router,
69
- } },
70
- React.createElement(NavigationContent, null, children)));
71
+ }}>
72
+ <NavigationContent>{children}</NavigationContent>
73
+ </exports.NavigatorContext.Provider>);
71
74
  }
72
75
  function useNavigatorContext() {
73
76
  const context = React.useContext(exports.NavigatorContext);
@@ -96,10 +99,11 @@ function Slot(props) {
96
99
  // Ensure the context is for the current contextKey
97
100
  if (context?.contextKey !== contextKey) {
98
101
  // Qualify the content and re-export.
99
- return (React.createElement(Navigator, { ...props },
100
- React.createElement(QualifiedSlot, null)));
102
+ return (<Navigator {...props}>
103
+ <QualifiedSlot />
104
+ </Navigator>);
101
105
  }
102
- return React.createElement(QualifiedSlot, null);
106
+ return <QualifiedSlot />;
103
107
  }
104
108
  exports.Slot = Slot;
105
109
  function QualifiedSlot() {
@@ -107,9 +111,11 @@ function QualifiedSlot() {
107
111
  }
108
112
  exports.QualifiedSlot = QualifiedSlot;
109
113
  function DefaultNavigator() {
110
- return (React.createElement(react_native_safe_area_context_1.SafeAreaView, { style: { flex: 1 } },
111
- React.createElement(Navigator, null,
112
- React.createElement(QualifiedSlot, null))));
114
+ return (<react_native_safe_area_context_1.SafeAreaView style={{ flex: 1 }}>
115
+ <Navigator>
116
+ <QualifiedSlot />
117
+ </Navigator>
118
+ </react_native_safe_area_context_1.SafeAreaView>);
113
119
  }
114
120
  exports.DefaultNavigator = DefaultNavigator;
115
121
  Navigator.Slot = Slot;
@@ -1 +1 @@
1
- {"version":3,"file":"Navigator.js","sourceRoot":"","sources":["../../src/views/Navigator.tsx"],"names":[],"mappings":"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","sourcesContent":["import { RouterFactory, StackRouter, useNavigationBuilder } from '@react-navigation/native';\nimport * as React from 'react';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Screen } from './Screen';\nimport { useContextKey } from '../Route';\nimport { useFilterScreenChildren } from '../layouts/withLayoutContext';\nimport { useSortedScreens } from '../useScreens';\n\ntype NavigatorTypes = ReturnType<typeof useNavigationBuilder>;\n\n// TODO: This might already exist upstream, maybe something like `useCurrentRender` ?\nexport const NavigatorContext = React.createContext<{\n contextKey: string;\n state: NavigatorTypes['state'];\n navigation: NavigatorTypes['navigation'];\n descriptors: NavigatorTypes['descriptors'];\n router: RouterFactory<any, any, any>;\n} | null>(null);\n\nif (process.env.NODE_ENV !== 'production') {\n NavigatorContext.displayName = 'NavigatorContext';\n}\n\nexport type NavigatorProps = {\n initialRouteName?: Parameters<typeof useNavigationBuilder>[1]['initialRouteName'];\n screenOptions?: Parameters<typeof useNavigationBuilder>[1]['screenOptions'];\n children?: Parameters<typeof useNavigationBuilder>[1]['children'];\n router?: Parameters<typeof useNavigationBuilder>[0];\n};\n\n/** An unstyled custom navigator. Good for basic web layouts */\nexport function Navigator({ initialRouteName, screenOptions, children, router }: NavigatorProps) {\n const contextKey = useContextKey();\n\n // Allows adding Screen components as children to configure routes.\n const { screens, children: otherSlot } = useFilterScreenChildren(children, {\n isCustomNavigator: true,\n contextKey,\n });\n\n const sorted = useSortedScreens(screens ?? []);\n\n if (!sorted.length) {\n console.warn(`Navigator at \"${contextKey}\" has no children.`);\n return null;\n }\n\n return (\n <QualifiedNavigator\n initialRouteName={initialRouteName}\n screenOptions={screenOptions}\n screens={sorted}\n contextKey={contextKey}\n router={router}>\n {otherSlot}\n </QualifiedNavigator>\n );\n}\n\nfunction QualifiedNavigator({\n initialRouteName,\n screenOptions,\n children,\n screens,\n contextKey,\n router = StackRouter,\n}: NavigatorProps & { contextKey: string; screens: React.ReactNode[] }) {\n const { state, navigation, descriptors, NavigationContent } = useNavigationBuilder(router, {\n // Used for getting the parent with navigation.getParent('/normalized/path')\n id: contextKey,\n children: screens,\n screenOptions,\n initialRouteName,\n });\n\n return (\n <NavigatorContext.Provider\n value={{\n contextKey,\n state,\n navigation,\n descriptors,\n router,\n }}>\n <NavigationContent>{children}</NavigationContent>\n </NavigatorContext.Provider>\n );\n}\n\nexport function useNavigatorContext() {\n const context = React.useContext(NavigatorContext);\n if (!context) {\n throw new Error('useNavigatorContext must be used within a <Navigator />');\n }\n return context;\n}\n\nexport function useSlot() {\n const context = useNavigatorContext();\n\n const { state, descriptors } = context;\n\n const current = state.routes.find((route, i) => {\n return state.index === i;\n });\n\n if (!current) {\n return null;\n }\n\n return descriptors[current.key]?.render() ?? null;\n}\n\n/** Renders the currently selected content. */\nexport function Slot(props: Omit<NavigatorProps, 'children'>) {\n const contextKey = useContextKey();\n const context = React.useContext(NavigatorContext);\n // Ensure the context is for the current contextKey\n if (context?.contextKey !== contextKey) {\n // Qualify the content and re-export.\n return (\n <Navigator {...props}>\n <QualifiedSlot />\n </Navigator>\n );\n }\n\n return <QualifiedSlot />;\n}\n\nexport function QualifiedSlot() {\n return useSlot();\n}\n\nexport function DefaultNavigator() {\n return (\n <SafeAreaView style={{ flex: 1 }}>\n <Navigator>\n <QualifiedSlot />\n </Navigator>\n </SafeAreaView>\n );\n}\n\nNavigator.Slot = Slot;\nNavigator.useContext = useNavigatorContext;\n\n/** Used to configure route settings. */\nNavigator.Screen = Screen;\n"]}
1
+ {"version":3,"file":"Navigator.js","sourceRoot":"","sources":["../../src/views/Navigator.tsx"],"names":[],"mappings":"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","sourcesContent":["import { RouterFactory, StackRouter, useNavigationBuilder } from '@react-navigation/native';\nimport * as React from 'react';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { Screen } from './Screen';\nimport { useContextKey } from '../Route';\nimport { useFilterScreenChildren } from '../layouts/withLayoutContext';\nimport { useSortedScreens } from '../useScreens';\n\ntype NavigatorTypes = ReturnType<typeof useNavigationBuilder>;\n\n// TODO: This might already exist upstream, maybe something like `useCurrentRender` ?\nexport const NavigatorContext = React.createContext<{\n contextKey: string;\n state: NavigatorTypes['state'];\n navigation: NavigatorTypes['navigation'];\n descriptors: NavigatorTypes['descriptors'];\n router: RouterFactory<any, any, any>;\n} | null>(null);\n\nif (process.env.NODE_ENV !== 'production') {\n NavigatorContext.displayName = 'NavigatorContext';\n}\n\nexport type NavigatorProps = {\n initialRouteName?: Parameters<typeof useNavigationBuilder>[1]['initialRouteName'];\n screenOptions?: Parameters<typeof useNavigationBuilder>[1]['screenOptions'];\n children?: Parameters<typeof useNavigationBuilder>[1]['children'];\n router?: Parameters<typeof useNavigationBuilder>[0];\n};\n\n/** An unstyled custom navigator. Good for basic web layouts */\nexport function Navigator({ initialRouteName, screenOptions, children, router }: NavigatorProps) {\n const contextKey = useContextKey();\n\n // Allows adding Screen components as children to configure routes.\n const { screens, children: otherSlot } = useFilterScreenChildren(children, {\n isCustomNavigator: true,\n contextKey,\n });\n\n const sorted = useSortedScreens(screens ?? []);\n\n if (!sorted.length) {\n console.warn(`Navigator at \"${contextKey}\" has no children.`);\n return null;\n }\n\n return (\n <QualifiedNavigator\n initialRouteName={initialRouteName}\n screenOptions={screenOptions}\n screens={sorted}\n contextKey={contextKey}\n router={router}>\n {otherSlot}\n </QualifiedNavigator>\n );\n}\n\nfunction QualifiedNavigator({\n initialRouteName,\n screenOptions,\n children,\n screens,\n contextKey,\n router = StackRouter,\n}: NavigatorProps & { contextKey: string; screens: React.ReactNode[] }) {\n const { state, navigation, descriptors, NavigationContent } = useNavigationBuilder(router, {\n // Used for getting the parent with navigation.getParent('/normalized/path')\n id: contextKey,\n children: screens,\n screenOptions,\n initialRouteName,\n });\n\n return (\n <NavigatorContext.Provider\n value={{\n contextKey,\n state,\n navigation,\n descriptors,\n router,\n }}>\n <NavigationContent>{children}</NavigationContent>\n </NavigatorContext.Provider>\n );\n}\n\nexport function useNavigatorContext() {\n const context = React.useContext(NavigatorContext);\n if (!context) {\n throw new Error('useNavigatorContext must be used within a <Navigator />');\n }\n return context;\n}\n\nexport function useSlot() {\n const context = useNavigatorContext();\n\n const { state, descriptors } = context;\n\n const current = state.routes.find((route, i) => {\n return state.index === i;\n });\n\n if (!current) {\n return null;\n }\n\n return descriptors[current.key]?.render() ?? null;\n}\n\n/** Renders the currently selected content. */\nexport function Slot(props: Omit<NavigatorProps, 'children'>) {\n const contextKey = useContextKey();\n const context = React.useContext(NavigatorContext);\n // Ensure the context is for the current contextKey\n if (context?.contextKey !== contextKey) {\n // Qualify the content and re-export.\n return (\n <Navigator {...props}>\n <QualifiedSlot />\n </Navigator>\n );\n }\n\n return <QualifiedSlot />;\n}\n\nexport function QualifiedSlot() {\n return useSlot();\n}\n\nexport function DefaultNavigator() {\n return (\n <SafeAreaView style={{ flex: 1 }}>\n <Navigator>\n <QualifiedSlot />\n </Navigator>\n </SafeAreaView>\n );\n}\n\nNavigator.Slot = Slot;\nNavigator.useContext = useNavigatorContext;\n\n/** Used to configure route settings. */\nNavigator.Screen = Screen;\n"]}
@@ -38,28 +38,34 @@ exports.getNavOptions = getNavOptions;
38
38
  function Sitemap() {
39
39
  const { top, bottom } = (0, react_native_safe_area_context_1.useSafeAreaInsets)();
40
40
  const { width } = (0, react_native_1.useWindowDimensions)();
41
- return (react_1.default.createElement(react_native_1.View, { style: styles.container },
42
- react_1.default.createElement(react_native_1.StatusBar, { barStyle: "light-content" }),
43
- react_1.default.createElement(react_native_1.View, { style: [
44
- styles.main,
45
- {
46
- minWidth: Math.min(960, width * 0.9),
47
- },
48
- ] },
49
- react_1.default.createElement(react_native_1.ScrollView, { contentContainerStyle: [
50
- styles.scroll,
51
- {
52
- paddingTop: top + 12,
53
- paddingBottom: bottom + 12,
54
- },
55
- ], style: { flex: 1 } },
56
- react_1.default.createElement(FileSystemView, null)))));
41
+ return (<react_native_1.View style={styles.container}>
42
+ <react_native_1.StatusBar barStyle="light-content"/>
43
+ <react_native_1.View style={[
44
+ styles.main,
45
+ {
46
+ minWidth: Math.min(960, width * 0.9),
47
+ },
48
+ ]}>
49
+ <react_native_1.ScrollView contentContainerStyle={[
50
+ styles.scroll,
51
+ {
52
+ paddingTop: top + 12,
53
+ paddingBottom: bottom + 12,
54
+ },
55
+ ]} style={{ flex: 1 }}>
56
+ <FileSystemView />
57
+ </react_native_1.ScrollView>
58
+ </react_native_1.View>
59
+ </react_native_1.View>);
57
60
  }
58
61
  exports.Sitemap = Sitemap;
59
62
  function FileSystemView() {
60
63
  const routes = (0, router_store_1.useExpoRouter)().getSortedRoutes();
61
- return (react_1.default.createElement(react_1.default.Fragment, null, routes.map((child) => (react_1.default.createElement(react_native_1.View, { key: child.contextKey, style: styles.itemContainer },
62
- react_1.default.createElement(FileItem, { route: child }))))));
64
+ return (<>
65
+ {routes.map((child) => (<react_native_1.View key={child.contextKey} style={styles.itemContainer}>
66
+ <FileItem route={child}/>
67
+ </react_native_1.View>))}
68
+ </>);
63
69
  }
64
70
  function FileItem({ route, level = 0, parents = [], isInitial = false, }) {
65
71
  const disabled = route.children.length > 0;
@@ -90,16 +96,17 @@ function FileItem({ route, level = 0, parents = [], isInitial = false, }) {
90
96
  return segments.slice(-segmentCount).join('/');
91
97
  }, [route]);
92
98
  const info = isInitial ? 'Initial' : route.generated ? 'Virtual' : '';
93
- return (react_1.default.createElement(react_1.default.Fragment, null,
94
- !route.internal && (react_1.default.createElement(Link_1.Link, { accessibilityLabel: route.contextKey, href: href, onPress: () => {
99
+ return (<>
100
+ {!route.internal && (<Link_1.Link accessibilityLabel={route.contextKey} href={href} onPress={() => {
95
101
  if (react_native_1.Platform.OS !== 'web' && imperative_api_1.router.canGoBack()) {
96
102
  // Ensure the modal pops
97
103
  imperative_api_1.router.back();
98
104
  }
99
- }, style: { flex: 1, display: 'flex' }, disabled: disabled, asChild: true,
100
- // Ensure we replace the history so you can't go back to this page.
101
- replace: true },
102
- react_1.default.createElement(Pressable_1.Pressable, { style: { flex: 1 } }, ({ pressed, hovered }) => (react_1.default.createElement(react_native_1.View, { style: [
105
+ }} style={{ flex: 1, display: 'flex' }} disabled={disabled} asChild
106
+ // Ensure we replace the history so you can't go back to this page.
107
+ replace>
108
+ <Pressable_1.Pressable style={{ flex: 1 }}>
109
+ {({ pressed, hovered }) => (<react_native_1.View style={[
103
110
  styles.itemPressable,
104
111
  {
105
112
  paddingLeft: INDENT + level * INDENT,
@@ -107,23 +114,30 @@ function FileItem({ route, level = 0, parents = [], isInitial = false, }) {
107
114
  },
108
115
  pressed && { backgroundColor: '#323232' },
109
116
  disabled && { opacity: 0.4 },
110
- ] },
111
- react_1.default.createElement(react_native_1.View, { style: { flexDirection: 'row', alignItems: 'center' } },
112
- route.children.length ? react_1.default.createElement(PkgIcon, null) : react_1.default.createElement(FileIcon, null),
113
- react_1.default.createElement(react_native_1.Text, { style: styles.filename }, filename)),
114
- react_1.default.createElement(react_native_1.View, { style: { flexDirection: 'row', alignItems: 'center' } },
115
- !!info && (react_1.default.createElement(react_native_1.Text, { style: [styles.virtual, !disabled && { marginRight: 8 }] }, info)),
116
- !disabled && react_1.default.createElement(ForwardIcon, null))))))),
117
- route.children.map((child) => (react_1.default.createElement(FileItem, { key: child.contextKey, route: child, isInitial: route.initialRouteName === child.route, parents: segments, level: level + (route.generated ? 0 : 1) })))));
117
+ ]}>
118
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center' }}>
119
+ {route.children.length ? <PkgIcon /> : <FileIcon />}
120
+ <react_native_1.Text style={styles.filename}>{filename}</react_native_1.Text>
121
+ </react_native_1.View>
122
+
123
+ <react_native_1.View style={{ flexDirection: 'row', alignItems: 'center' }}>
124
+ {!!info && (<react_native_1.Text style={[styles.virtual, !disabled && { marginRight: 8 }]}>{info}</react_native_1.Text>)}
125
+ {!disabled && <ForwardIcon />}
126
+ </react_native_1.View>
127
+ </react_native_1.View>)}
128
+ </Pressable_1.Pressable>
129
+ </Link_1.Link>)}
130
+ {route.children.map((child) => (<FileItem key={child.contextKey} route={child} isInitial={route.initialRouteName === child.route} parents={segments} level={level + (route.generated ? 0 : 1)}/>))}
131
+ </>);
118
132
  }
119
133
  function FileIcon() {
120
- return react_1.default.createElement(react_native_1.Image, { style: styles.image, source: require('expo-router/assets/file.png') });
134
+ return <react_native_1.Image style={styles.image} source={require('expo-router/assets/file.png')}/>;
121
135
  }
122
136
  function PkgIcon() {
123
- return react_1.default.createElement(react_native_1.Image, { style: styles.image, source: require('expo-router/assets/pkg.png') });
137
+ return <react_native_1.Image style={styles.image} source={require('expo-router/assets/pkg.png')}/>;
124
138
  }
125
139
  function ForwardIcon() {
126
- return react_1.default.createElement(react_native_1.Image, { style: styles.image, source: require('expo-router/assets/forward.png') });
140
+ return <react_native_1.Image style={styles.image} source={require('expo-router/assets/forward.png')}/>;
127
141
  }
128
142
  const styles = react_native_1.StyleSheet.create({
129
143
  container: {
@@ -155,7 +169,11 @@ const styles = react_native_1.StyleSheet.create({
155
169
  flexDirection: 'row',
156
170
  justifyContent: 'space-between',
157
171
  alignItems: 'center',
158
- transitionDuration: '100ms',
172
+ ...react_native_1.Platform.select({
173
+ web: {
174
+ transitionDuration: '100ms',
175
+ },
176
+ }),
159
177
  },
160
178
  filename: { color: 'white', fontSize: 20, marginLeft: 12 },
161
179
  virtual: { textAlign: 'right', color: 'white' },