expo-router 5.0.2-preview.5 → 5.0.2

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 (110) hide show
  1. package/build/ExpoRoot.d.ts.map +1 -1
  2. package/build/ExpoRoot.js +19 -18
  3. package/build/ExpoRoot.js.map +1 -1
  4. package/build/constants.d.ts +2 -0
  5. package/build/constants.d.ts.map +1 -0
  6. package/build/constants.js +5 -0
  7. package/build/constants.js.map +1 -0
  8. package/build/{link/useDomComponentNavigation.d.ts → domComponents/emitDomEvent.d.ts} +2 -4
  9. package/build/domComponents/emitDomEvent.d.ts.map +1 -0
  10. package/build/domComponents/emitDomEvent.js +32 -0
  11. package/build/domComponents/emitDomEvent.js.map +1 -0
  12. package/build/domComponents/events.d.ts +6 -0
  13. package/build/domComponents/events.d.ts.map +1 -0
  14. package/build/domComponents/events.js +9 -0
  15. package/build/domComponents/events.js.map +1 -0
  16. package/build/domComponents/useDomComponentNavigation.d.ts +2 -0
  17. package/build/domComponents/useDomComponentNavigation.d.ts.map +1 -0
  18. package/build/domComponents/useDomComponentNavigation.js +37 -0
  19. package/build/domComponents/useDomComponentNavigation.js.map +1 -0
  20. package/build/fork/getStateFromPath.d.ts +1 -2
  21. package/build/fork/getStateFromPath.d.ts.map +1 -1
  22. package/build/fork/getStateFromPath.js +11 -5
  23. package/build/fork/getStateFromPath.js.map +1 -1
  24. package/build/getLinkingConfig.d.ts +6 -7
  25. package/build/getLinkingConfig.d.ts.map +1 -1
  26. package/build/getLinkingConfig.js +10 -9
  27. package/build/getLinkingConfig.js.map +1 -1
  28. package/build/getRoutesRedirects.d.ts +2 -0
  29. package/build/getRoutesRedirects.d.ts.map +1 -1
  30. package/build/getRoutesRedirects.js +56 -0
  31. package/build/getRoutesRedirects.js.map +1 -1
  32. package/build/global-state/routeInfo.d.ts +29 -4
  33. package/build/global-state/routeInfo.d.ts.map +1 -1
  34. package/build/global-state/routeInfo.js +124 -55
  35. package/build/global-state/routeInfo.js.map +1 -1
  36. package/build/global-state/router-store.d.ts +35 -83
  37. package/build/global-state/router-store.d.ts.map +1 -1
  38. package/build/global-state/router-store.js +138 -238
  39. package/build/global-state/router-store.js.map +1 -1
  40. package/build/global-state/routing.d.ts +13 -14
  41. package/build/global-state/routing.d.ts.map +1 -1
  42. package/build/global-state/routing.js +32 -30
  43. package/build/global-state/routing.js.map +1 -1
  44. package/build/global-state/storeContext.d.ts +29 -0
  45. package/build/global-state/storeContext.d.ts.map +1 -0
  46. package/build/global-state/storeContext.js +9 -0
  47. package/build/global-state/storeContext.js.map +1 -0
  48. package/build/hooks.d.ts +13 -4
  49. package/build/hooks.d.ts.map +1 -1
  50. package/build/hooks.js +13 -23
  51. package/build/hooks.js.map +1 -1
  52. package/build/imperative-api.d.ts.map +1 -1
  53. package/build/imperative-api.js +13 -13
  54. package/build/imperative-api.js.map +1 -1
  55. package/build/layouts/DrawerClient.d.ts +3 -2
  56. package/build/layouts/DrawerClient.d.ts.map +1 -1
  57. package/build/layouts/StackClient.d.ts +5 -2
  58. package/build/layouts/StackClient.d.ts.map +1 -1
  59. package/build/layouts/StackClient.js +2 -0
  60. package/build/layouts/StackClient.js.map +1 -1
  61. package/build/layouts/TabsClient.d.ts +3 -2
  62. package/build/layouts/TabsClient.d.ts.map +1 -1
  63. package/build/layouts/withLayoutContext.d.ts +6 -1
  64. package/build/layouts/withLayoutContext.d.ts.map +1 -1
  65. package/build/layouts/withLayoutContext.js +28 -20
  66. package/build/layouts/withLayoutContext.js.map +1 -1
  67. package/build/link/linking.d.ts +2 -2
  68. package/build/link/linking.d.ts.map +1 -1
  69. package/build/link/linking.js +5 -4
  70. package/build/link/linking.js.map +1 -1
  71. package/build/link/useLinkToPathProps.d.ts.map +1 -1
  72. package/build/link/useLinkToPathProps.js +4 -5
  73. package/build/link/useLinkToPathProps.js.map +1 -1
  74. package/build/link/useLoadedNavigation.d.ts.map +1 -1
  75. package/build/link/useLoadedNavigation.js +2 -3
  76. package/build/link/useLoadedNavigation.js.map +1 -1
  77. package/build/primitives.d.ts.map +1 -1
  78. package/build/primitives.js +1 -0
  79. package/build/primitives.js.map +1 -1
  80. package/build/testing-library/index.d.ts +3 -3
  81. package/build/testing-library/index.d.ts.map +1 -1
  82. package/build/testing-library/index.js +5 -10
  83. package/build/testing-library/index.js.map +1 -1
  84. package/build/ui/common.d.ts.map +1 -1
  85. package/build/ui/common.js +4 -3
  86. package/build/ui/common.js.map +1 -1
  87. package/build/useNavigation.d.ts.map +1 -1
  88. package/build/useNavigation.js +47 -56
  89. package/build/useNavigation.js.map +1 -1
  90. package/build/useScreens.d.ts +2 -2
  91. package/build/useScreens.d.ts.map +1 -1
  92. package/build/useScreens.js +18 -3
  93. package/build/useScreens.js.map +1 -1
  94. package/build/views/Navigator.d.ts.map +1 -1
  95. package/build/views/Navigator.js +4 -4
  96. package/build/views/Navigator.js.map +1 -1
  97. package/build/views/Protected.d.ts +8 -0
  98. package/build/views/Protected.d.ts.map +1 -0
  99. package/build/views/Protected.js +11 -0
  100. package/build/views/Protected.js.map +1 -0
  101. package/build/views/Screen.d.ts +4 -0
  102. package/build/views/Screen.d.ts.map +1 -1
  103. package/build/views/Screen.js +52 -4
  104. package/build/views/Screen.js.map +1 -1
  105. package/build/views/Sitemap.js +5 -2
  106. package/build/views/Sitemap.js.map +1 -1
  107. package/package.json +3 -3
  108. package/build/link/useDomComponentNavigation.d.ts.map +0 -1
  109. package/build/link/useDomComponentNavigation.js +0 -68
  110. package/build/link/useDomComponentNavigation.js.map +0 -1
@@ -1,24 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.INTERNAL_SLOT_NAME = void 0;
4
3
  exports.getNavigationConfig = getNavigationConfig;
5
4
  exports.getLinkingConfig = getLinkingConfig;
6
5
  const native_1 = require("@react-navigation/native");
7
6
  const expo_modules_core_1 = require("expo-modules-core");
7
+ const constants_1 = require("./constants");
8
8
  const getReactNavigationConfig_1 = require("./getReactNavigationConfig");
9
+ const getRoutesRedirects_1 = require("./getRoutesRedirects");
9
10
  const linking_1 = require("./link/linking");
10
- exports.INTERNAL_SLOT_NAME = '__root';
11
11
  function getNavigationConfig(routes, metaOnly = true) {
12
12
  return {
13
13
  screens: {
14
- [exports.INTERNAL_SLOT_NAME]: {
14
+ [constants_1.INTERNAL_SLOT_NAME]: {
15
15
  path: '',
16
16
  ...(0, getReactNavigationConfig_1.getReactNavigationConfig)(routes, metaOnly),
17
17
  },
18
18
  },
19
19
  };
20
20
  }
21
- function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl, redirects } = {}) {
21
+ function getLinkingConfig(routes, context, getRouteInfo, { metaOnly = true, serverUrl, redirects } = {}) {
22
22
  // Returning `undefined` / `null from `getInitialURL` are valid values, so we need to track if it's been called.
23
23
  let hasCachedInitialUrl = false;
24
24
  let initialUrl;
@@ -29,7 +29,6 @@ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl,
29
29
  ? context(nativeLinkingKey)
30
30
  : undefined;
31
31
  const config = getNavigationConfig(routes, metaOnly);
32
- const boundGetStateFromPath = linking_1.getStateFromPath.bind(store);
33
32
  return {
34
33
  prefixes: [],
35
34
  config,
@@ -48,14 +47,14 @@ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl,
48
47
  else {
49
48
  initialUrl = serverUrl ?? (0, linking_1.getInitialURL)();
50
49
  if (typeof initialUrl === 'string') {
51
- initialUrl = store.applyRedirects(initialUrl);
50
+ initialUrl = (0, getRoutesRedirects_1.applyRedirects)(initialUrl, redirects);
52
51
  if (initialUrl && typeof nativeLinking?.redirectSystemPath === 'function') {
53
52
  initialUrl = nativeLinking.redirectSystemPath({ path: initialUrl, initial: true });
54
53
  }
55
54
  }
56
55
  else if (initialUrl) {
57
56
  initialUrl = initialUrl.then((url) => {
58
- url = store.applyRedirects(url);
57
+ url = (0, getRoutesRedirects_1.applyRedirects)(url, redirects);
59
58
  if (url && typeof nativeLinking?.redirectSystemPath === 'function') {
60
59
  return nativeLinking.redirectSystemPath({ path: url, initial: true });
61
60
  }
@@ -67,8 +66,10 @@ function getLinkingConfig(store, routes, context, { metaOnly = true, serverUrl,
67
66
  }
68
67
  return initialUrl;
69
68
  },
70
- subscribe: (0, linking_1.addEventListener)(nativeLinking, store),
71
- getStateFromPath: boundGetStateFromPath,
69
+ subscribe: (0, linking_1.subscribe)(nativeLinking, redirects),
70
+ getStateFromPath: (path, options) => {
71
+ return (0, linking_1.getStateFromPath)(path, options, getRouteInfo().segments);
72
+ },
72
73
  getPathFromState(state, options) {
73
74
  return ((0, linking_1.getPathFromState)(state, {
74
75
  ...config,
@@ -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 { State } from './fork/getPathFromState';\nimport { getReactNavigationConfig } from './getReactNavigationConfig';\nimport { type RedirectConfig } from './getRoutesCore';\nimport { RouterStore } from './global-state/router-store';\nimport {\n addEventListener,\n getInitialURL,\n getPathFromState,\n getStateFromPath,\n} from './link/linking';\nimport { NativeIntent, RequireContext } from './types';\n\nexport const INTERNAL_SLOT_NAME = '__root';\n\nexport function getNavigationConfig(routes: RouteNode, metaOnly: boolean = true) {\n return {\n screens: {\n [INTERNAL_SLOT_NAME]: {\n path: '',\n ...getReactNavigationConfig(routes, metaOnly),\n },\n },\n };\n}\n\nexport type ExpoLinkingOptions<T extends object = Record<string, unknown>> = LinkingOptions<T> & {\n getPathFromState?: typeof getPathFromState;\n getStateFromPath?: typeof getStateFromPath;\n};\n\nexport type LinkingConfigOptions = {\n metaOnly?: boolean;\n serverUrl?: string;\n getInitialURL?: typeof getInitialURL;\n redirects?: RedirectConfig[];\n};\n\nexport function getLinkingConfig(\n store: RouterStore,\n routes: RouteNode,\n context: RequireContext,\n { metaOnly = true, serverUrl, redirects }: LinkingConfigOptions = {}\n): ExpoLinkingOptions {\n // Returning `undefined` / `null from `getInitialURL` are valid values, so we need to track if it's been called.\n let hasCachedInitialUrl = false;\n let initialUrl: ReturnType<typeof getInitialURL> | undefined;\n\n const nativeLinkingKey = context\n .keys()\n .find((key) => key.match(/^\\.\\/\\+native-intent\\.[tj]sx?$/));\n const nativeLinking: NativeIntent | undefined = nativeLinkingKey\n ? context(nativeLinkingKey)\n : undefined;\n\n const config = getNavigationConfig(routes, metaOnly);\n const boundGetStateFromPath = getStateFromPath.bind(store);\n\n return {\n prefixes: [],\n config,\n // A custom getInitialURL is used on native to ensure the app always starts at\n // the root path if it's launched from something other than a deep link.\n // This helps keep the native functionality working like the web functionality.\n // For example, if you had a root navigator where the first screen was `/settings` and the second was `/index`\n // then `/index` would be used on web and `/settings` would be used on native.\n getInitialURL() {\n // Expo Router calls `getInitialURL` twice, which may confuse the user if they provide a custom `getInitialURL`.\n // Therefor we memoize the result.\n if (!hasCachedInitialUrl) {\n if (Platform.OS === 'web') {\n initialUrl = serverUrl ?? getInitialURL();\n } else {\n initialUrl = serverUrl ?? getInitialURL();\n\n if (typeof initialUrl === 'string') {\n initialUrl = store.applyRedirects(initialUrl);\n if (initialUrl && typeof nativeLinking?.redirectSystemPath === 'function') {\n initialUrl = nativeLinking.redirectSystemPath({ path: initialUrl, initial: true });\n }\n } else if (initialUrl) {\n initialUrl = initialUrl.then((url) => {\n url = store.applyRedirects(url);\n if (url && typeof nativeLinking?.redirectSystemPath === 'function') {\n return nativeLinking.redirectSystemPath({ path: url, initial: true });\n }\n return url;\n });\n }\n }\n hasCachedInitialUrl = true;\n }\n return initialUrl;\n },\n subscribe: addEventListener(nativeLinking, store),\n getStateFromPath: boundGetStateFromPath,\n getPathFromState(state: State, options: Parameters<typeof getPathFromState>[1]) {\n return (\n getPathFromState(state, {\n ...config,\n ...options,\n screens: config.screens ?? options?.screens ?? {},\n }) ?? '/'\n );\n },\n // Add all functions to ensure the types never need to fallback.\n // This is a convenience for usage in the package.\n getActionFromState,\n };\n}\n"]}
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,4 +1,6 @@
1
1
  import { RedirectConfig } from './getRoutesCore';
2
+ import type { StoreRedirects } from './global-state/router-store';
3
+ export declare function applyRedirects(url: string | null | undefined, redirects: StoreRedirects[] | undefined): string | undefined | null;
2
4
  export declare function getRedirectModule(route: string): {
3
5
  default: () => import("react").CElement<{
4
6
  href: string;
@@ -1 +1 @@
1
- {"version":3,"file":"getRoutesRedirects.d.ts","sourceRoot":"","sources":["../src/getRoutesRedirects.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM;;;;;;EAiC9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAuBnE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,UAe7F"}
1
+ {"version":3,"file":"getRoutesRedirects.d.ts","sourceRoot":"","sources":["../src/getRoutesRedirects.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,SAAS,EAAE,cAAc,EAAE,GAAG,SAAS,GACtC,MAAM,GAAG,SAAS,GAAG,IAAI,CAwB3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM;;;;;;EAiC9C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,UAuBnE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,UAe7F"}
@@ -1,10 +1,66 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.applyRedirects = applyRedirects;
3
37
  exports.getRedirectModule = getRedirectModule;
4
38
  exports.convertRedirect = convertRedirect;
5
39
  exports.mergeVariablesWithPath = mergeVariablesWithPath;
40
+ const Linking = __importStar(require("expo-linking"));
6
41
  const react_1 = require("react");
42
+ const getStateFromPath_forks_1 = require("./fork/getStateFromPath-forks");
7
43
  const matchers_1 = require("./matchers");
44
+ function applyRedirects(url, redirects) {
45
+ if (typeof url !== 'string' || !redirects) {
46
+ return url;
47
+ }
48
+ const nextUrl = (0, getStateFromPath_forks_1.cleanPath)(url);
49
+ const redirect = redirects.find(([regex]) => regex.test(nextUrl));
50
+ if (!redirect) {
51
+ return url;
52
+ }
53
+ // If the redirect is external, open the URL
54
+ if (redirect[2]) {
55
+ let href = redirect[1].destination;
56
+ if (href.startsWith('//') && process.env.EXPO_OS !== 'web') {
57
+ href = `https:${href}`;
58
+ }
59
+ Linking.openURL(href);
60
+ return href;
61
+ }
62
+ return applyRedirects(convertRedirect(url, redirect[1]), redirects);
63
+ }
8
64
  function getRedirectModule(route) {
9
65
  return {
10
66
  default: function RedirectComponent() {
@@ -1 +1 @@
1
- {"version":3,"file":"getRoutesRedirects.js","sourceRoot":"","sources":["../src/getRoutesRedirects.tsx"],"names":[],"mappings":"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","sourcesContent":["import { createElement } from 'react';\n\nimport { RedirectConfig } from './getRoutesCore';\nimport { matchDeepDynamicRouteName, matchDynamicName } from './matchers';\n\nexport function getRedirectModule(route: string) {\n return {\n default: function RedirectComponent() {\n // Use the store directly instead of useGlobalSearchParams.\n // Importing the hooks directly causes build errors on the server\n const params = require('./hooks').useGlobalSearchParams();\n\n // Replace dynamic parts of the route with the actual values from the params\n let href = route\n .split('/')\n .map((part) => {\n const match = matchDynamicName(part) || matchDeepDynamicRouteName(part);\n if (!match) {\n return part;\n }\n\n const param = params[match];\n delete params[match];\n return param;\n })\n .filter(Boolean)\n .join('/');\n\n // Add any remaining params as query string\n const queryString = new URLSearchParams(params as Record<string, any>).toString();\n\n if (queryString) {\n href += `?${queryString}`;\n }\n\n return createElement(require('./link/Link').Redirect, { href });\n },\n };\n}\n\nexport function convertRedirect(path: string, config: RedirectConfig) {\n const params: Record<string, string | string[]> = {};\n\n const parts = path.split('/');\n const sourceParts = config.source.split('/');\n\n for (const [index, sourcePart] of sourceParts.entries()) {\n let match = matchDynamicName(sourcePart);\n\n if (match) {\n params[match] = parts[index];\n continue;\n }\n\n match = matchDeepDynamicRouteName(sourcePart);\n\n if (match) {\n params[match] = parts.slice(index);\n break;\n }\n }\n\n return mergeVariablesWithPath(config.destination, params);\n}\n\nexport function mergeVariablesWithPath(path: string, params: Record<string, string | string[]>) {\n return path\n .split('/')\n .map((part) => {\n const match = matchDynamicName(part) || matchDeepDynamicRouteName(part);\n if (!match) {\n return part;\n }\n\n const param = params[match];\n delete params[match];\n return param;\n })\n .filter(Boolean)\n .join('/');\n}\n"]}
1
+ {"version":3,"file":"getRoutesRedirects.js","sourceRoot":"","sources":["../src/getRoutesRedirects.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as Linking from 'expo-linking';\nimport { createElement } from 'react';\n\nimport { cleanPath } from './fork/getStateFromPath-forks';\nimport { RedirectConfig } from './getRoutesCore';\nimport type { StoreRedirects } from './global-state/router-store';\nimport { matchDeepDynamicRouteName, matchDynamicName } from './matchers';\n\nexport function applyRedirects(\n url: string | null | undefined,\n redirects: StoreRedirects[] | undefined\n): string | undefined | null {\n if (typeof url !== 'string' || !redirects) {\n return url;\n }\n\n const nextUrl = cleanPath(url);\n const redirect = redirects.find(([regex]) => regex.test(nextUrl));\n\n if (!redirect) {\n return url;\n }\n\n // If the redirect is external, open the URL\n if (redirect[2]) {\n let href = redirect[1].destination;\n if (href.startsWith('//') && process.env.EXPO_OS !== 'web') {\n href = `https:${href}`;\n }\n\n Linking.openURL(href);\n return href;\n }\n\n return applyRedirects(convertRedirect(url, redirect[1]), redirects);\n}\n\nexport function getRedirectModule(route: string) {\n return {\n default: function RedirectComponent() {\n // Use the store directly instead of useGlobalSearchParams.\n // Importing the hooks directly causes build errors on the server\n const params = require('./hooks').useGlobalSearchParams();\n\n // Replace dynamic parts of the route with the actual values from the params\n let href = route\n .split('/')\n .map((part) => {\n const match = matchDynamicName(part) || matchDeepDynamicRouteName(part);\n if (!match) {\n return part;\n }\n\n const param = params[match];\n delete params[match];\n return param;\n })\n .filter(Boolean)\n .join('/');\n\n // Add any remaining params as query string\n const queryString = new URLSearchParams(params as Record<string, any>).toString();\n\n if (queryString) {\n href += `?${queryString}`;\n }\n\n return createElement(require('./link/Link').Redirect, { href });\n },\n };\n}\n\nexport function convertRedirect(path: string, config: RedirectConfig) {\n const params: Record<string, string | string[]> = {};\n\n const parts = path.split('/');\n const sourceParts = config.source.split('/');\n\n for (const [index, sourcePart] of sourceParts.entries()) {\n let match = matchDynamicName(sourcePart);\n\n if (match) {\n params[match] = parts[index];\n continue;\n }\n\n match = matchDeepDynamicRouteName(sourcePart);\n\n if (match) {\n params[match] = parts.slice(index);\n break;\n }\n }\n\n return mergeVariablesWithPath(config.destination, params);\n}\n\nexport function mergeVariablesWithPath(path: string, params: Record<string, string | string[]>) {\n return path\n .split('/')\n .map((part) => {\n const match = matchDynamicName(part) || matchDeepDynamicRouteName(part);\n if (!match) {\n return part;\n }\n\n const param = params[match];\n delete params[match];\n return param;\n })\n .filter(Boolean)\n .join('/');\n}\n"]}
@@ -1,6 +1,31 @@
1
- import { State } from '../fork/getPathFromState';
2
- import { getStateFromPath } from '../fork/getStateFromPath';
3
- type Options = Parameters<typeof getStateFromPath>[1];
4
- export declare function reconstructState(state: State | undefined, getState: typeof getStateFromPath, options: Options): import("../fork/getStateFromPath").ResultState | undefined;
1
+ import type { NavigationState, PartialState } from '@react-navigation/native';
2
+ import type { FocusedRouteState } from './router-store';
3
+ export type UrlObject = {
4
+ unstable_globalHref: string;
5
+ pathname: string;
6
+ readonly params: Record<string, string | string[]>;
7
+ searchParams: URLSearchParams;
8
+ segments: string[];
9
+ pathnameWithParams: string;
10
+ isIndex: boolean;
11
+ };
12
+ export declare const defaultRouteInfo: UrlObject;
13
+ /**
14
+ * A better typed version of `FocusedRouteState` that is easier to parse
15
+ */
16
+ type StrictState = (FocusedRouteState | NavigationState | PartialState<NavigationState>) & {
17
+ routes: {
18
+ key?: string;
19
+ name: string;
20
+ params?: StrictFocusedRouteParams;
21
+ path?: string;
22
+ state?: StrictState;
23
+ }[];
24
+ };
25
+ type StrictFocusedRouteParams = Record<string, string | string[]> | {
26
+ screen?: string;
27
+ params?: StrictFocusedRouteParams;
28
+ };
29
+ export declare function getRouteInfoFromState(state?: StrictState): UrlObject;
5
30
  export {};
6
31
  //# sourceMappingURL=routeInfo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routeInfo.d.ts","sourceRoot":"","sources":["../../src/global-state/routeInfo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,QAAQ,EAAE,OAAO,gBAAgB,EACjC,OAAO,EAAE,OAAO,8DAqCjB"}
1
+ {"version":3,"file":"routeInfo.d.ts","sourceRoot":"","sources":["../../src/global-state/routeInfo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,MAAM,SAAS,GAAG;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACnD,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAS9B,CAAC;AAEF;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,iBAAiB,GAAG,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC,GAAG;IACzF,MAAM,EAAE;QACN,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,wBAAwB,CAAC;QAClC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,WAAW,CAAC;KACrB,EAAE,CAAC;CACL,CAAC;AAEF,KAAK,wBAAwB,GACzB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACjC;IACE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,wBAAwB,CAAC;CACnC,CAAC;AAEN,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,SAAS,CAwIpE"}
@@ -1,66 +1,135 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.reconstructState = reconstructState;
37
- const queryString = __importStar(require("query-string"));
38
- function reconstructState(state, getState, options) {
3
+ exports.defaultRouteInfo = void 0;
4
+ exports.getRouteInfoFromState = getRouteInfoFromState;
5
+ const constants_1 = require("../constants");
6
+ const getPathFromState_forks_1 = require("../fork/getPathFromState-forks");
7
+ exports.defaultRouteInfo = {
8
+ unstable_globalHref: '',
9
+ searchParams: new URLSearchParams(),
10
+ pathname: '/',
11
+ params: {},
12
+ segments: [],
13
+ pathnameWithParams: '/',
14
+ // TODO: Remove this, it is not used anywhere
15
+ isIndex: false,
16
+ };
17
+ function getRouteInfoFromState(state) {
18
+ if (!state)
19
+ return exports.defaultRouteInfo;
20
+ let route = state.routes[0];
21
+ if (route.name !== constants_1.INTERNAL_SLOT_NAME) {
22
+ throw new Error(`Expected the first route to be ${constants_1.INTERNAL_SLOT_NAME}, but got ${route.name}`);
23
+ }
24
+ state = route.state;
39
25
  const segments = [];
40
- const allParams = {};
41
- while (state?.routes?.length) {
42
- const route = state.routes[state.routes.length - 1];
43
- segments.push(...route.name.split('/'));
26
+ const params = Object.create(null);
27
+ while (state) {
28
+ route = state.routes[0];
29
+ Object.assign(params, route.params);
30
+ let routeName = route.name;
31
+ if (routeName.startsWith('/')) {
32
+ routeName = routeName.slice(1);
33
+ }
34
+ segments.push(...routeName.split('/'));
44
35
  state = route.state;
45
- if (route.params) {
46
- const { screen, params, ...other } = route.params;
47
- Object.assign(allParams, other);
48
- if (screen) {
49
- state = {
50
- routeNames: [screen],
51
- routes: [{ name: screen, params }],
52
- };
53
- }
36
+ }
37
+ /**
38
+ * If React Navigation didn't render the entire tree (e.g it was interrupted in a layout)
39
+ * then the state maybe incomplete. The reset of the path is in the params, instead of being a route
40
+ */
41
+ let routeParams = route.params;
42
+ while (routeParams && 'screen' in routeParams) {
43
+ if (typeof routeParams.screen === 'string') {
44
+ segments.push(...routeParams.screen.split('/'));
45
+ }
46
+ if (typeof routeParams.params === 'object' && !Array.isArray(routeParams.params)) {
47
+ routeParams = routeParams.params;
48
+ }
49
+ else {
50
+ routeParams = undefined;
54
51
  }
55
52
  }
56
- if (segments.length && segments[segments.length - 1] === 'index') {
53
+ if (route.params && 'screen' in route.params && route.params.screen === 'string') {
54
+ segments.push(route.params.screen);
55
+ }
56
+ if (segments[segments.length - 1] === 'index') {
57
57
  segments.pop();
58
58
  }
59
- let path = `/${segments.filter(Boolean).join('/')}`;
60
- const query = queryString.stringify(allParams, { sort: false });
61
- if (query) {
62
- path += `?${query}`;
59
+ delete params['screen'];
60
+ delete params['params'];
61
+ const pathParams = new Set();
62
+ const pathname = '/' +
63
+ segments
64
+ .filter((segment) => {
65
+ return !(segment.startsWith('(') && segment.endsWith(')'));
66
+ })
67
+ .flatMap((segment) => {
68
+ if (segment === '+not-found') {
69
+ const notFoundPath = params['not-found'];
70
+ pathParams.add('not-found');
71
+ if (typeof notFoundPath === 'undefined') {
72
+ // Not founds are optional, do nothing if its not present
73
+ return [];
74
+ }
75
+ else if (Array.isArray(notFoundPath)) {
76
+ return notFoundPath;
77
+ }
78
+ else {
79
+ return [notFoundPath];
80
+ }
81
+ }
82
+ else if (segment.startsWith('[...') && segment.endsWith(']')) {
83
+ let paramName = segment.slice(4, -1);
84
+ // Legacy for React Navigation optional params
85
+ if (paramName.endsWith('?')) {
86
+ paramName = paramName.slice(0, -1);
87
+ }
88
+ const values = params[paramName];
89
+ pathParams.add(paramName);
90
+ // Catchall params are optional
91
+ return values || [];
92
+ }
93
+ else if (segment.startsWith('[') && segment.endsWith(']')) {
94
+ const paramName = segment.slice(1, -1);
95
+ const value = params[paramName];
96
+ pathParams.add(paramName);
97
+ // Optional params are optional
98
+ return value ? [value] : [];
99
+ }
100
+ else {
101
+ return [segment];
102
+ }
103
+ })
104
+ .join('/');
105
+ const searchParams = new URLSearchParams(Object.entries(params).flatMap(([key, value]) => {
106
+ // Search params should not include path params
107
+ if (pathParams.has(key)) {
108
+ return [];
109
+ }
110
+ else if (Array.isArray(value)) {
111
+ return value.map((v) => [key, v]);
112
+ }
113
+ return [[key, value]];
114
+ }));
115
+ let hash;
116
+ if (searchParams.has('#')) {
117
+ hash = searchParams.get('#') || undefined;
118
+ searchParams.delete('#');
63
119
  }
64
- return getState(path, options);
120
+ // We cannot use searchParams.size because it is not included in the React Native polyfill
121
+ const searchParamString = searchParams.toString();
122
+ let pathnameWithParams = searchParamString ? pathname + '?' + searchParamString : pathname;
123
+ pathnameWithParams = hash ? pathnameWithParams + '#' + hash : pathnameWithParams;
124
+ return {
125
+ segments,
126
+ pathname,
127
+ params,
128
+ unstable_globalHref: (0, getPathFromState_forks_1.appendBaseUrl)(pathnameWithParams),
129
+ searchParams,
130
+ pathnameWithParams,
131
+ // TODO: Remove this, it is not used anywhere
132
+ isIndex: false,
133
+ };
65
134
  }
66
135
  //# sourceMappingURL=routeInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routeInfo.js","sourceRoot":"","sources":["../../src/global-state/routeInfo.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,4CAwCC;AA/CD,0DAA4C;AAO5C,SAAgB,gBAAgB,CAC9B,KAAwB,EACxB,QAAiC,EACjC,OAAgB;IAEhB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAExC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAEpB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,MAA6B,CAAC;YACzE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAEhC,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,GAAG;oBACN,UAAU,EAAE,CAAC,MAAM,CAAC;oBACpB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;iBACnC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACjE,QAAQ,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEhE,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import * as queryString from 'query-string';\n\nimport { State } from '../fork/getPathFromState';\nimport { getStateFromPath } from '../fork/getStateFromPath';\n\ntype Options = Parameters<typeof getStateFromPath>[1];\n\nexport function reconstructState(\n state: State | undefined,\n getState: typeof getStateFromPath,\n options: Options\n) {\n const segments: string[] = [];\n\n const allParams = {};\n\n while (state?.routes?.length) {\n const route = state.routes[state.routes.length - 1];\n segments.push(...route.name.split('/'));\n\n state = route.state;\n\n if (route.params) {\n const { screen, params, ...other } = route.params as Record<string, any>;\n Object.assign(allParams, other);\n\n if (screen) {\n state = {\n routeNames: [screen],\n routes: [{ name: screen, params }],\n };\n }\n }\n }\n\n if (segments.length && segments[segments.length - 1] === 'index') {\n segments.pop();\n }\n\n let path = `/${segments.filter(Boolean).join('/')}`;\n const query = queryString.stringify(allParams, { sort: false });\n\n if (query) {\n path += `?${query}`;\n }\n\n return getState(path, options);\n}\n"]}
1
+ {"version":3,"file":"routeInfo.js","sourceRoot":"","sources":["../../src/global-state/routeInfo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NavigationState, PartialState } from '@react-navigation/native';\n\nimport type { FocusedRouteState } from './router-store';\nimport { INTERNAL_SLOT_NAME } from '../constants';\nimport { appendBaseUrl } from '../fork/getPathFromState-forks';\n\nexport type UrlObject = {\n unstable_globalHref: string;\n pathname: string;\n readonly params: Record<string, string | string[]>;\n searchParams: URLSearchParams;\n segments: string[];\n pathnameWithParams: string;\n isIndex: boolean;\n};\n\nexport const defaultRouteInfo: UrlObject = {\n unstable_globalHref: '',\n searchParams: new URLSearchParams(),\n pathname: '/',\n params: {},\n segments: [],\n pathnameWithParams: '/',\n // TODO: Remove this, it is not used anywhere\n isIndex: false,\n};\n\n/**\n * A better typed version of `FocusedRouteState` that is easier to parse\n */\ntype StrictState = (FocusedRouteState | NavigationState | PartialState<NavigationState>) & {\n routes: {\n key?: string;\n name: string;\n params?: StrictFocusedRouteParams;\n path?: string;\n state?: StrictState;\n }[];\n};\n\ntype StrictFocusedRouteParams =\n | Record<string, string | string[]>\n | {\n screen?: string;\n params?: StrictFocusedRouteParams;\n };\n\nexport function getRouteInfoFromState(state?: StrictState): UrlObject {\n if (!state) return defaultRouteInfo;\n\n let route = state.routes[0];\n if (route.name !== INTERNAL_SLOT_NAME) {\n throw new Error(`Expected the first route to be ${INTERNAL_SLOT_NAME}, but got ${route.name}`);\n }\n\n state = route.state;\n\n const segments: string[] = [];\n const params: UrlObject['params'] = Object.create(null);\n\n while (state) {\n route = state.routes[0];\n\n Object.assign(params, route.params);\n\n let routeName = route.name;\n if (routeName.startsWith('/')) {\n routeName = routeName.slice(1);\n }\n\n segments.push(...routeName.split('/'));\n state = route.state;\n }\n\n /**\n * If React Navigation didn't render the entire tree (e.g it was interrupted in a layout)\n * then the state maybe incomplete. The reset of the path is in the params, instead of being a route\n */\n let routeParams: StrictFocusedRouteParams | undefined = route.params;\n while (routeParams && 'screen' in routeParams) {\n if (typeof routeParams.screen === 'string') {\n segments.push(...routeParams.screen.split('/'));\n }\n\n if (typeof routeParams.params === 'object' && !Array.isArray(routeParams.params)) {\n routeParams = routeParams.params;\n } else {\n routeParams = undefined;\n }\n }\n\n if (route.params && 'screen' in route.params && route.params.screen === 'string') {\n segments.push(route.params.screen);\n }\n\n if (segments[segments.length - 1] === 'index') {\n segments.pop();\n }\n\n delete params['screen'];\n delete params['params'];\n\n const pathParams = new Set<string>();\n\n const pathname =\n '/' +\n segments\n .filter((segment) => {\n return !(segment.startsWith('(') && segment.endsWith(')'));\n })\n .flatMap((segment) => {\n if (segment === '+not-found') {\n const notFoundPath = params['not-found'];\n\n pathParams.add('not-found');\n\n if (typeof notFoundPath === 'undefined') {\n // Not founds are optional, do nothing if its not present\n return [];\n } else if (Array.isArray(notFoundPath)) {\n return notFoundPath;\n } else {\n return [notFoundPath];\n }\n } else if (segment.startsWith('[...') && segment.endsWith(']')) {\n let paramName = segment.slice(4, -1);\n\n // Legacy for React Navigation optional params\n if (paramName.endsWith('?')) {\n paramName = paramName.slice(0, -1);\n }\n\n const values = params[paramName];\n pathParams.add(paramName);\n\n // Catchall params are optional\n return values || [];\n } else if (segment.startsWith('[') && segment.endsWith(']')) {\n const paramName = segment.slice(1, -1);\n const value = params[paramName];\n pathParams.add(paramName);\n\n // Optional params are optional\n return value ? [value] : [];\n } else {\n return [segment];\n }\n })\n .join('/');\n\n const searchParams = new URLSearchParams(\n Object.entries(params).flatMap(([key, value]) => {\n // Search params should not include path params\n if (pathParams.has(key)) {\n return [];\n } else if (Array.isArray(value)) {\n return value.map((v) => [key, v]);\n }\n return [[key, value]];\n })\n );\n\n let hash: string | undefined;\n if (searchParams.has('#')) {\n hash = searchParams.get('#') || undefined;\n searchParams.delete('#');\n }\n\n // We cannot use searchParams.size because it is not included in the React Native polyfill\n const searchParamString = searchParams.toString();\n let pathnameWithParams = searchParamString ? pathname + '?' + searchParamString : pathname;\n pathnameWithParams = hash ? pathnameWithParams + '#' + hash : pathnameWithParams;\n\n return {\n segments,\n pathname,\n params,\n unstable_globalHref: appendBaseUrl(pathnameWithParams),\n searchParams,\n pathnameWithParams,\n // TODO: Remove this, it is not used anywhere\n isIndex: false,\n };\n}\n"]}
@@ -1,89 +1,41 @@
1
- import { NavigationContainerRefWithCurrent } from '@react-navigation/native';
1
+ import { NavigationContainerRefWithCurrent, NavigationState, PartialState, useStateForPath } from '@react-navigation/native';
2
2
  import { ComponentType } from 'react';
3
- import { LinkToOptions } from './routing';
4
- import { UrlObject } from '../LocationProvider';
5
3
  import { RouteNode } from '../Route';
6
4
  import { ExpoLinkingOptions, LinkingConfigOptions } from '../getLinkingConfig';
7
5
  import { RedirectConfig } from '../getRoutesCore';
8
- import { Href, RequireContext } from '../types';
9
- type ResultState = any;
10
- /**
11
- * This is the global state for the router. It is used to keep track of the current route, and to provide a way to navigate to other routes.
12
- *
13
- * There should only be one instance of this class and be initialized via `useInitializeExpoRouter`
14
- */
15
- export declare class RouterStore {
16
- routeNode: RouteNode | null;
17
- rootComponent: ComponentType;
18
- linking?: ExpoLinkingOptions;
19
- private hasAttemptedToHideSplash;
20
- initialState?: ResultState;
21
- rootState?: ResultState;
22
- nextState?: ResultState;
23
- routeInfo?: UrlObject;
24
- splashScreenAnimationFrame?: number;
25
- config: any;
26
- redirects?: (readonly [RegExp, RedirectConfig, boolean])[];
27
- navigationRef: NavigationContainerRefWithCurrent<ReactNavigation.RootParamList>;
28
- navigationRefSubscription: () => void;
29
- rootStateSubscribers: Set<() => void>;
30
- storeSubscribers: Set<() => void>;
31
- linkTo: (originalHref: string, options?: LinkToOptions | undefined) => void;
32
- getSortedRoutes: () => RouteNode[];
33
- goBack: () => void;
34
- canGoBack: () => boolean;
35
- push: (url: string | import("../types").HrefObject, options?: import("./routing").NavigationOptions | undefined) => void;
36
- dismiss: (count?: number | undefined) => void;
37
- dismissTo: (href: string | import("../types").HrefObject, options?: import("./routing").NavigationOptions | undefined) => void;
38
- replace: (url: string | import("../types").HrefObject, options?: import("./routing").NavigationOptions | undefined) => void;
39
- dismissAll: () => void;
40
- canDismiss: () => boolean;
41
- setParams: (params?: Record<string, string | number | (string | number)[] | undefined> | undefined) => any;
42
- navigate: (url: string | import("../types").HrefObject, options?: import("./routing").NavigationOptions | undefined) => void;
43
- reload: () => void;
44
- prefetch: (href: string | import("../types").HrefObject, options?: import("./routing").NavigationOptions | undefined) => void;
45
- initialize(context: RequireContext, navigationRef: NavigationContainerRefWithCurrent<ReactNavigation.RootParamList>, linkingConfigOptions?: LinkingConfigOptions): void;
46
- updateState(state: ResultState, nextState?: any): void;
47
- getRouteInfo(state: ResultState): UrlObject;
6
+ import { UrlObject } from './routeInfo';
7
+ import { RequireContext } from '../types';
8
+ export type StoreRedirects = readonly [RegExp, RedirectConfig, boolean];
9
+ export type ReactNavigationState = NavigationState | PartialState<NavigationState>;
10
+ export type FocusedRouteState = NonNullable<ReturnType<typeof useStateForPath>>;
11
+ export type RouterStore = typeof store;
12
+ export declare const store: {
48
13
  shouldShowTutorial(): boolean;
49
- /** Make sure these are arrow functions so `this` is correctly bound */
50
- subscribeToRootState: (subscriber: () => void) => () => boolean;
51
- subscribeToStore: (subscriber: () => void) => () => boolean;
52
- snapshot: () => this;
53
- rootStateSnapshot: () => any;
54
- routeInfoSnapshot: () => UrlObject;
55
- cleanup(): void;
56
- getStateFromPath(href: Href, options?: LinkToOptions): (Partial<Omit<Readonly<{
57
- key: string;
58
- index: number;
59
- routeNames: string[];
60
- history?: unknown[];
61
- routes: import("@react-navigation/native").NavigationRoute<import("@react-navigation/native").ParamListBase, string>[];
62
- type: string;
63
- stale: false;
64
- }>, "stale" | "routes">> & Readonly<{
65
- stale?: true;
66
- routes: import("@react-navigation/native").PartialRoute<import("@react-navigation/native").Route<string, object | undefined>>[];
67
- }> & {
68
- state?: Partial<Omit<Readonly<{
69
- key: string;
70
- index: number;
71
- routeNames: string[];
72
- history?: unknown[];
73
- routes: import("@react-navigation/native").NavigationRoute<import("@react-navigation/native").ParamListBase, string>[];
74
- type: string;
75
- stale: false;
76
- }>, "stale" | "routes">> & Readonly<{
77
- stale?: true;
78
- routes: import("@react-navigation/native").PartialRoute<import("@react-navigation/native").Route<string, object | undefined>>[];
79
- }> & /*elided*/ any;
80
- }) | undefined;
81
- applyRedirects<T extends string | null | undefined>(url: T): T | undefined;
82
- }
83
- export declare const store: RouterStore;
84
- export declare function useExpoRouter(): RouterStore;
85
- export declare function useStoreRootState(): any;
86
- export declare function useStoreRouteInfo(): UrlObject;
87
- export declare function useInitializeExpoRouter(context: RequireContext, options: LinkingConfigOptions): RouterStore;
88
- export {};
14
+ readonly state: ReactNavigationState | undefined;
15
+ readonly focusedState: import("@react-navigation/core/lib/typescript/src/NavigationFocusedRouteStateContext").FocusedRouteState | undefined;
16
+ readonly navigationRef: NavigationContainerRefWithCurrent<ReactNavigation.RootParamList>;
17
+ readonly routeNode: RouteNode | null;
18
+ getRouteInfo(state?: FocusedRouteState | ReactNavigationState | undefined): UrlObject;
19
+ readonly redirects: StoreRedirects[];
20
+ readonly rootComponent: ComponentType<any>;
21
+ readonly linking: ExpoLinkingOptions | undefined;
22
+ setFocusedState(state: FocusedRouteState): void;
23
+ onReady(): void;
24
+ assertIsReady(): void;
25
+ };
26
+ export declare function useStore(context: RequireContext, linkingConfigOptions: LinkingConfigOptions, serverUrl?: string): {
27
+ shouldShowTutorial(): boolean;
28
+ readonly state: ReactNavigationState | undefined;
29
+ readonly focusedState: import("@react-navigation/core/lib/typescript/src/NavigationFocusedRouteStateContext").FocusedRouteState | undefined;
30
+ readonly navigationRef: NavigationContainerRefWithCurrent<ReactNavigation.RootParamList>;
31
+ readonly routeNode: RouteNode | null;
32
+ getRouteInfo(state?: FocusedRouteState | ReactNavigationState | undefined): UrlObject;
33
+ readonly redirects: StoreRedirects[];
34
+ readonly rootComponent: ComponentType<any>;
35
+ readonly linking: ExpoLinkingOptions | undefined;
36
+ setFocusedState(state: FocusedRouteState): void;
37
+ onReady(): void;
38
+ assertIsReady(): void;
39
+ };
40
+ export declare function useRouteInfo(): UrlObject;
89
41
  //# sourceMappingURL=router-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router-store.d.ts","sourceRoot":"","sources":["../../src/global-state/router-store.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,iCAAiC,EAElC,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAiC,aAAa,EAAY,MAAM,OAAO,CAAC;AAG/E,OAAO,EAaL,aAAa,EAEd,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,SAAS,EAAyB,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAoB,MAAM,qBAAqB,CAAC;AAGjG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAKhD,KAAK,WAAW,GAAG,GAAG,CAAC;AAEvB;;;;GAIG;AACH,qBAAa,WAAW;IACtB,SAAS,EAAG,SAAS,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAG,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,wBAAwB,CAAkB;IAElD,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAGpC,MAAM,EAAE,GAAG,CAAC;IACZ,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAE3D,aAAa,EAAG,iCAAiC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IACjF,yBAAyB,EAAG,MAAM,IAAI,CAAC;IAEvC,oBAAoB,YAAiB,IAAI,EAAI;IAC7C,gBAAgB,YAAiB,IAAI,EAAI;IAEzC,MAAM,sEAAqB;IAC3B,eAAe,oBAA8B;IAC7C,MAAM,aAAqB;IAC3B,SAAS,gBAAwB;IACjC,IAAI,qHAAmB;IACvB,OAAO,uCAAsB;IAC7B,SAAS,sHAAwB;IACjC,OAAO,qHAAsB;IAC7B,UAAU,aAAyB;IACnC,UAAU,gBAAyB;IACnC,SAAS,kGAAwB;IACjC,QAAQ,qHAAuB;IAC/B,MAAM,aAAqB;IAC3B,QAAQ,sHAAuB;IAE/B,UAAU,CACR,OAAO,EAAE,cAAc,EACvB,aAAa,EAAE,iCAAiC,CAAC,eAAe,CAAC,aAAa,CAAC,EAC/E,oBAAoB,GAAE,oBAAyB;IAoHjD,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,MAAQ;IAWjD,YAAY,CAAC,KAAK,EAAE,WAAW;IAiB/B,kBAAkB;IAIlB,uEAAuE;IACvE,oBAAoB,GAAI,YAAY,MAAM,IAAI,mBAG5C;IACF,gBAAgB,GAAI,YAAY,MAAM,IAAI,mBAGxC;IACF,QAAQ,aAEN;IACF,iBAAiB,YAEf;IACF,iBAAiB,kBAEf;IAEF,OAAO;IAMP,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,aAAkB;;;;;;;;;;;;;;;;;;;;;;;;;IAMxD,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;CAyB3E;AAED,eAAO,MAAM,KAAK,aAAoB,CAAC;AAEvC,wBAAgB,aAAa,gBAE5B;AAYD,wBAAgB,iBAAiB,QAOhC;AAED,wBAAgB,iBAAiB,cAOhC;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,eAK7F"}
1
+ {"version":3,"file":"router-store.d.ts","sourceRoot":"","sources":["../../src/global-state/router-store.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,iCAAiC,EACjC,eAAe,EACf,YAAY,EAEZ,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,aAAa,EAA6C,MAAM,OAAO,CAAC;AAGjF,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAoB,MAAM,qBAAqB,CAAC;AAGjG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAA2C,SAAS,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK1C,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AACxE,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AACnF,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC;AAsBvC,eAAO,MAAM,KAAK;;;;;;yBAiBP,iBAAiB,GAAG,oBAAoB,GAAG,SAAS,GAC1D,SAAS;;;;2BAuBW,iBAAiB;;;CA6BzC,CAAC;AAEF,wBAAgB,QAAQ,CACtB,OAAO,EAAE,cAAc,EACvB,oBAAoB,EAAE,oBAAoB,EAC1C,SAAS,CAAC,EAAE,MAAM;;;;;;yBA1DT,iBAAiB,GAAG,oBAAoB,GAAG,SAAS,GAC1D,SAAS;;;;2BAuBW,iBAAiB;;;EAkHzC;AAUD,wBAAgB,YAAY,cAE3B"}