@react-navigation/core 6.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 (327) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/lib/commonjs/BaseNavigationContainer.js +393 -0
  4. package/lib/commonjs/BaseNavigationContainer.js.map +1 -0
  5. package/lib/commonjs/CurrentRenderContext.js +21 -0
  6. package/lib/commonjs/CurrentRenderContext.js.map +1 -0
  7. package/lib/commonjs/EnsureSingleNavigator.js +53 -0
  8. package/lib/commonjs/EnsureSingleNavigator.js.map +1 -0
  9. package/lib/commonjs/Group.js +15 -0
  10. package/lib/commonjs/Group.js.map +1 -0
  11. package/lib/commonjs/NavigationBuilderContext.js +23 -0
  12. package/lib/commonjs/NavigationBuilderContext.js.map +1 -0
  13. package/lib/commonjs/NavigationContainerRefContext.js +20 -0
  14. package/lib/commonjs/NavigationContainerRefContext.js.map +1 -0
  15. package/lib/commonjs/NavigationContext.js +20 -0
  16. package/lib/commonjs/NavigationContext.js.map +1 -0
  17. package/lib/commonjs/NavigationHelpersContext.js +21 -0
  18. package/lib/commonjs/NavigationHelpersContext.js.map +1 -0
  19. package/lib/commonjs/NavigationRouteContext.js +20 -0
  20. package/lib/commonjs/NavigationRouteContext.js.map +1 -0
  21. package/lib/commonjs/NavigationStateContext.js +42 -0
  22. package/lib/commonjs/NavigationStateContext.js.map +1 -0
  23. package/lib/commonjs/SceneView.js +97 -0
  24. package/lib/commonjs/SceneView.js.map +1 -0
  25. package/lib/commonjs/Screen.js +15 -0
  26. package/lib/commonjs/Screen.js.map +1 -0
  27. package/lib/commonjs/StaticContainer.js +43 -0
  28. package/lib/commonjs/StaticContainer.js.map +1 -0
  29. package/lib/commonjs/UnhandledActionContext.js +17 -0
  30. package/lib/commonjs/UnhandledActionContext.js.map +1 -0
  31. package/lib/commonjs/checkDuplicateRouteNames.js +31 -0
  32. package/lib/commonjs/checkDuplicateRouteNames.js.map +1 -0
  33. package/lib/commonjs/checkSerializable.js +59 -0
  34. package/lib/commonjs/checkSerializable.js.map +1 -0
  35. package/lib/commonjs/createNavigationContainerRef.js +82 -0
  36. package/lib/commonjs/createNavigationContainerRef.js.map +1 -0
  37. package/lib/commonjs/createNavigatorFactory.js +34 -0
  38. package/lib/commonjs/createNavigatorFactory.js.map +1 -0
  39. package/lib/commonjs/findFocusedRoute.js +22 -0
  40. package/lib/commonjs/findFocusedRoute.js.map +1 -0
  41. package/lib/commonjs/fromEntries.js +19 -0
  42. package/lib/commonjs/fromEntries.js.map +1 -0
  43. package/lib/commonjs/getActionFromState.js +99 -0
  44. package/lib/commonjs/getActionFromState.js.map +1 -0
  45. package/lib/commonjs/getFocusedRouteNameFromRoute.js +23 -0
  46. package/lib/commonjs/getFocusedRouteNameFromRoute.js.map +1 -0
  47. package/lib/commonjs/getPathFromState.js +238 -0
  48. package/lib/commonjs/getPathFromState.js.map +1 -0
  49. package/lib/commonjs/getStateFromPath.js +450 -0
  50. package/lib/commonjs/getStateFromPath.js.map +1 -0
  51. package/lib/commonjs/index.js +227 -0
  52. package/lib/commonjs/index.js.map +1 -0
  53. package/lib/commonjs/isArrayEqual.js +15 -0
  54. package/lib/commonjs/isArrayEqual.js.map +1 -0
  55. package/lib/commonjs/types.js +18 -0
  56. package/lib/commonjs/types.js.map +1 -0
  57. package/lib/commonjs/useChildListeners.js +38 -0
  58. package/lib/commonjs/useChildListeners.js.map +1 -0
  59. package/lib/commonjs/useComponent.js +36 -0
  60. package/lib/commonjs/useComponent.js.map +1 -0
  61. package/lib/commonjs/useCurrentRender.js +33 -0
  62. package/lib/commonjs/useCurrentRender.js.map +1 -0
  63. package/lib/commonjs/useDescriptors.js +141 -0
  64. package/lib/commonjs/useDescriptors.js.map +1 -0
  65. package/lib/commonjs/useEventEmitter.js +118 -0
  66. package/lib/commonjs/useEventEmitter.js.map +1 -0
  67. package/lib/commonjs/useFocusEffect.js +97 -0
  68. package/lib/commonjs/useFocusEffect.js.map +1 -0
  69. package/lib/commonjs/useFocusEvents.js +77 -0
  70. package/lib/commonjs/useFocusEvents.js.map +1 -0
  71. package/lib/commonjs/useFocusedListenersChildrenAdapter.js +57 -0
  72. package/lib/commonjs/useFocusedListenersChildrenAdapter.js.map +1 -0
  73. package/lib/commonjs/useIsFocused.js +47 -0
  74. package/lib/commonjs/useIsFocused.js.map +1 -0
  75. package/lib/commonjs/useKeyedChildListeners.js +35 -0
  76. package/lib/commonjs/useKeyedChildListeners.js.map +1 -0
  77. package/lib/commonjs/useNavigation.js +36 -0
  78. package/lib/commonjs/useNavigation.js.map +1 -0
  79. package/lib/commonjs/useNavigationBuilder.js +480 -0
  80. package/lib/commonjs/useNavigationBuilder.js.map +1 -0
  81. package/lib/commonjs/useNavigationCache.js +122 -0
  82. package/lib/commonjs/useNavigationCache.js.map +1 -0
  83. package/lib/commonjs/useNavigationContainerRef.js +27 -0
  84. package/lib/commonjs/useNavigationContainerRef.js.map +1 -0
  85. package/lib/commonjs/useNavigationHelpers.js +77 -0
  86. package/lib/commonjs/useNavigationHelpers.js.map +1 -0
  87. package/lib/commonjs/useNavigationState.js +41 -0
  88. package/lib/commonjs/useNavigationState.js.map +1 -0
  89. package/lib/commonjs/useOnAction.js +118 -0
  90. package/lib/commonjs/useOnAction.js.map +1 -0
  91. package/lib/commonjs/useOnGetState.js +60 -0
  92. package/lib/commonjs/useOnGetState.js.map +1 -0
  93. package/lib/commonjs/useOnPreventRemove.js +89 -0
  94. package/lib/commonjs/useOnPreventRemove.js.map +1 -0
  95. package/lib/commonjs/useOnRouteFocus.js +45 -0
  96. package/lib/commonjs/useOnRouteFocus.js.map +1 -0
  97. package/lib/commonjs/useOptionsGetters.js +99 -0
  98. package/lib/commonjs/useOptionsGetters.js.map +1 -0
  99. package/lib/commonjs/useRegisterNavigator.js +40 -0
  100. package/lib/commonjs/useRegisterNavigator.js.map +1 -0
  101. package/lib/commonjs/useRoute.js +32 -0
  102. package/lib/commonjs/useRoute.js.map +1 -0
  103. package/lib/commonjs/useRouteCache.js +61 -0
  104. package/lib/commonjs/useRouteCache.js.map +1 -0
  105. package/lib/commonjs/useScheduleUpdate.js +44 -0
  106. package/lib/commonjs/useScheduleUpdate.js.map +1 -0
  107. package/lib/commonjs/useSyncState.js +76 -0
  108. package/lib/commonjs/useSyncState.js.map +1 -0
  109. package/lib/commonjs/validatePathConfig.js +31 -0
  110. package/lib/commonjs/validatePathConfig.js.map +1 -0
  111. package/lib/module/BaseNavigationContainer.js +360 -0
  112. package/lib/module/BaseNavigationContainer.js.map +1 -0
  113. package/lib/module/CurrentRenderContext.js +9 -0
  114. package/lib/module/CurrentRenderContext.js.map +1 -0
  115. package/lib/module/EnsureSingleNavigator.js +38 -0
  116. package/lib/module/EnsureSingleNavigator.js.map +1 -0
  117. package/lib/module/Group.js +8 -0
  118. package/lib/module/Group.js.map +1 -0
  119. package/lib/module/NavigationBuilderContext.js +11 -0
  120. package/lib/module/NavigationBuilderContext.js.map +1 -0
  121. package/lib/module/NavigationContainerRefContext.js +8 -0
  122. package/lib/module/NavigationContainerRefContext.js.map +1 -0
  123. package/lib/module/NavigationContext.js +8 -0
  124. package/lib/module/NavigationContext.js.map +1 -0
  125. package/lib/module/NavigationHelpersContext.js +9 -0
  126. package/lib/module/NavigationHelpersContext.js.map +1 -0
  127. package/lib/module/NavigationRouteContext.js +8 -0
  128. package/lib/module/NavigationRouteContext.js.map +1 -0
  129. package/lib/module/NavigationStateContext.js +27 -0
  130. package/lib/module/NavigationStateContext.js.map +1 -0
  131. package/lib/module/SceneView.js +80 -0
  132. package/lib/module/SceneView.js.map +1 -0
  133. package/lib/module/Screen.js +8 -0
  134. package/lib/module/Screen.js.map +1 -0
  135. package/lib/module/StaticContainer.js +30 -0
  136. package/lib/module/StaticContainer.js.map +1 -0
  137. package/lib/module/UnhandledActionContext.js +4 -0
  138. package/lib/module/UnhandledActionContext.js.map +1 -0
  139. package/lib/module/checkDuplicateRouteNames.js +24 -0
  140. package/lib/module/checkDuplicateRouteNames.js.map +1 -0
  141. package/lib/module/checkSerializable.js +52 -0
  142. package/lib/module/checkSerializable.js.map +1 -0
  143. package/lib/module/createNavigationContainerRef.js +71 -0
  144. package/lib/module/createNavigationContainerRef.js.map +1 -0
  145. package/lib/module/createNavigatorFactory.js +24 -0
  146. package/lib/module/createNavigatorFactory.js.map +1 -0
  147. package/lib/module/findFocusedRoute.js +15 -0
  148. package/lib/module/findFocusedRoute.js.map +1 -0
  149. package/lib/module/fromEntries.js +12 -0
  150. package/lib/module/fromEntries.js.map +1 -0
  151. package/lib/module/getActionFromState.js +92 -0
  152. package/lib/module/getActionFromState.js.map +1 -0
  153. package/lib/module/getFocusedRouteNameFromRoute.js +15 -0
  154. package/lib/module/getFocusedRouteNameFromRoute.js.map +1 -0
  155. package/lib/module/getPathFromState.js +223 -0
  156. package/lib/module/getPathFromState.js.map +1 -0
  157. package/lib/module/getStateFromPath.js +434 -0
  158. package/lib/module/getStateFromPath.js.map +1 -0
  159. package/lib/module/index.js +24 -0
  160. package/lib/module/index.js.map +1 -0
  161. package/lib/module/isArrayEqual.js +8 -0
  162. package/lib/module/isArrayEqual.js.map +1 -0
  163. package/lib/module/types.js +9 -0
  164. package/lib/module/types.js.map +1 -0
  165. package/lib/module/useChildListeners.js +27 -0
  166. package/lib/module/useChildListeners.js.map +1 -0
  167. package/lib/module/useComponent.js +24 -0
  168. package/lib/module/useComponent.js.map +1 -0
  169. package/lib/module/useCurrentRender.js +19 -0
  170. package/lib/module/useCurrentRender.js.map +1 -0
  171. package/lib/module/useDescriptors.js +122 -0
  172. package/lib/module/useDescriptors.js.map +1 -0
  173. package/lib/module/useEventEmitter.js +107 -0
  174. package/lib/module/useEventEmitter.js.map +1 -0
  175. package/lib/module/useFocusEffect.js +83 -0
  176. package/lib/module/useFocusEffect.js.map +1 -0
  177. package/lib/module/useFocusEvents.js +63 -0
  178. package/lib/module/useFocusEvents.js.map +1 -0
  179. package/lib/module/useFocusedListenersChildrenAdapter.js +43 -0
  180. package/lib/module/useFocusedListenersChildrenAdapter.js.map +1 -0
  181. package/lib/module/useIsFocused.js +34 -0
  182. package/lib/module/useIsFocused.js.map +1 -0
  183. package/lib/module/useKeyedChildListeners.js +24 -0
  184. package/lib/module/useKeyedChildListeners.js.map +1 -0
  185. package/lib/module/useNavigation.js +21 -0
  186. package/lib/module/useNavigation.js.map +1 -0
  187. package/lib/module/useNavigationBuilder.js +443 -0
  188. package/lib/module/useNavigationBuilder.js.map +1 -0
  189. package/lib/module/useNavigationCache.js +107 -0
  190. package/lib/module/useNavigationCache.js.map +1 -0
  191. package/lib/module/useNavigationContainerRef.js +12 -0
  192. package/lib/module/useNavigationContainerRef.js.map +1 -0
  193. package/lib/module/useNavigationHelpers.js +59 -0
  194. package/lib/module/useNavigationHelpers.js.map +1 -0
  195. package/lib/module/useNavigationState.js +27 -0
  196. package/lib/module/useNavigationState.js.map +1 -0
  197. package/lib/module/useOnAction.js +103 -0
  198. package/lib/module/useOnAction.js.map +1 -0
  199. package/lib/module/useOnGetState.js +43 -0
  200. package/lib/module/useOnGetState.js.map +1 -0
  201. package/lib/module/useOnPreventRemove.js +68 -0
  202. package/lib/module/useOnPreventRemove.js.map +1 -0
  203. package/lib/module/useOnRouteFocus.js +31 -0
  204. package/lib/module/useOnRouteFocus.js.map +1 -0
  205. package/lib/module/useOptionsGetters.js +83 -0
  206. package/lib/module/useOptionsGetters.js.map +1 -0
  207. package/lib/module/useRegisterNavigator.js +27 -0
  208. package/lib/module/useRegisterNavigator.js.map +1 -0
  209. package/lib/module/useRoute.js +18 -0
  210. package/lib/module/useRoute.js.map +1 -0
  211. package/lib/module/useRouteCache.js +47 -0
  212. package/lib/module/useRouteCache.js.map +1 -0
  213. package/lib/module/useScheduleUpdate.js +29 -0
  214. package/lib/module/useScheduleUpdate.js.map +1 -0
  215. package/lib/module/useSyncState.js +64 -0
  216. package/lib/module/useSyncState.js.map +1 -0
  217. package/lib/module/validatePathConfig.js +24 -0
  218. package/lib/module/validatePathConfig.js.map +1 -0
  219. package/lib/typescript/src/BaseNavigationContainer.d.ts +14 -0
  220. package/lib/typescript/src/CurrentRenderContext.d.ts +9 -0
  221. package/lib/typescript/src/EnsureSingleNavigator.d.ts +13 -0
  222. package/lib/typescript/src/Group.d.ts +6 -0
  223. package/lib/typescript/src/NavigationBuilderContext.d.ts +34 -0
  224. package/lib/typescript/src/NavigationContainerRefContext.d.ts +8 -0
  225. package/lib/typescript/src/NavigationContext.d.ts +24 -0
  226. package/lib/typescript/src/NavigationHelpersContext.d.ts +9 -0
  227. package/lib/typescript/src/NavigationRouteContext.d.ts +7 -0
  228. package/lib/typescript/src/NavigationStateContext.d.ts +45 -0
  229. package/lib/typescript/src/SceneView.d.ts +21 -0
  230. package/lib/typescript/src/Screen.d.ts +6 -0
  231. package/lib/typescript/src/StaticContainer.d.ts +7 -0
  232. package/lib/typescript/src/UnhandledActionContext.d.ts +4 -0
  233. package/lib/typescript/src/checkDuplicateRouteNames.d.ts +2 -0
  234. package/lib/typescript/src/checkSerializable.d.ts +9 -0
  235. package/lib/typescript/src/createNavigationContainerRef.d.ts +3 -0
  236. package/lib/typescript/src/createNavigatorFactory.d.ts +11 -0
  237. package/lib/typescript/src/findFocusedRoute.d.ts +22 -0
  238. package/lib/typescript/src/fromEntries.d.ts +1 -0
  239. package/lib/typescript/src/getActionFromState.d.ts +16 -0
  240. package/lib/typescript/src/getFocusedRouteNameFromRoute.d.ts +2 -0
  241. package/lib/typescript/src/getPathFromState.d.ts +38 -0
  242. package/lib/typescript/src/getStateFromPath.d.ts +32 -0
  243. package/lib/typescript/src/index.d.ts +23 -0
  244. package/lib/typescript/src/isArrayEqual.d.ts +5 -0
  245. package/lib/typescript/src/types.d.ts +485 -0
  246. package/lib/typescript/src/useChildListeners.d.ts +11 -0
  247. package/lib/typescript/src/useComponent.d.ts +2 -0
  248. package/lib/typescript/src/useCurrentRender.d.ts +13 -0
  249. package/lib/typescript/src/useDescriptors.d.ts +89 -0
  250. package/lib/typescript/src/useEventEmitter.d.ts +8 -0
  251. package/lib/typescript/src/useFocusEffect.d.ts +10 -0
  252. package/lib/typescript/src/useFocusEvents.d.ts +12 -0
  253. package/lib/typescript/src/useFocusedListenersChildrenAdapter.d.ts +12 -0
  254. package/lib/typescript/src/useIsFocused.d.ts +5 -0
  255. package/lib/typescript/src/useKeyedChildListeners.d.ts +11 -0
  256. package/lib/typescript/src/useNavigation.d.ts +7 -0
  257. package/lib/typescript/src/useNavigationBuilder.d.ts +223 -0
  258. package/lib/typescript/src/useNavigationCache.d.ts +19 -0
  259. package/lib/typescript/src/useNavigationContainerRef.d.ts +2 -0
  260. package/lib/typescript/src/useNavigationHelpers.d.ts +174 -0
  261. package/lib/typescript/src/useNavigationState.d.ts +9 -0
  262. package/lib/typescript/src/useOnAction.d.ts +25 -0
  263. package/lib/typescript/src/useOnGetState.d.ts +8 -0
  264. package/lib/typescript/src/useOnPreventRemove.d.ts +16 -0
  265. package/lib/typescript/src/useOnRouteFocus.d.ts +14 -0
  266. package/lib/typescript/src/useOptionsGetters.d.ts +12 -0
  267. package/lib/typescript/src/useRegisterNavigator.d.ts +5 -0
  268. package/lib/typescript/src/useRoute.d.ts +8 -0
  269. package/lib/typescript/src/useRouteCache.d.ts +13 -0
  270. package/lib/typescript/src/useScheduleUpdate.d.ts +13 -0
  271. package/lib/typescript/src/useSyncState.d.ts +4 -0
  272. package/lib/typescript/src/validatePathConfig.d.ts +1 -0
  273. package/package.json +73 -0
  274. package/src/BaseNavigationContainer.tsx +453 -0
  275. package/src/CurrentRenderContext.tsx +10 -0
  276. package/src/EnsureSingleNavigator.tsx +53 -0
  277. package/src/Group.tsx +14 -0
  278. package/src/NavigationBuilderContext.tsx +70 -0
  279. package/src/NavigationContainerRefContext.tsx +14 -0
  280. package/src/NavigationContext.tsx +12 -0
  281. package/src/NavigationHelpersContext.tsx +13 -0
  282. package/src/NavigationRouteContext.tsx +10 -0
  283. package/src/NavigationStateContext.tsx +39 -0
  284. package/src/SceneView.tsx +134 -0
  285. package/src/Screen.tsx +17 -0
  286. package/src/StaticContainer.tsx +29 -0
  287. package/src/UnhandledActionContext.tsx +9 -0
  288. package/src/checkDuplicateRouteNames.tsx +33 -0
  289. package/src/checkSerializable.tsx +74 -0
  290. package/src/createNavigationContainerRef.tsx +97 -0
  291. package/src/createNavigatorFactory.tsx +40 -0
  292. package/src/findFocusedRoute.tsx +13 -0
  293. package/src/fromEntries.tsx +13 -0
  294. package/src/getActionFromState.tsx +154 -0
  295. package/src/getFocusedRouteNameFromRoute.tsx +28 -0
  296. package/src/getPathFromState.tsx +297 -0
  297. package/src/getStateFromPath.tsx +575 -0
  298. package/src/index.tsx +23 -0
  299. package/src/isArrayEqual.tsx +7 -0
  300. package/src/types.tsx +645 -0
  301. package/src/useChildListeners.tsx +37 -0
  302. package/src/useComponent.tsx +30 -0
  303. package/src/useCurrentRender.tsx +35 -0
  304. package/src/useDescriptors.tsx +229 -0
  305. package/src/useEventEmitter.tsx +130 -0
  306. package/src/useFocusEffect.tsx +112 -0
  307. package/src/useFocusEvents.tsx +73 -0
  308. package/src/useFocusedListenersChildrenAdapter.tsx +47 -0
  309. package/src/useIsFocused.tsx +43 -0
  310. package/src/useKeyedChildListeners.tsx +40 -0
  311. package/src/useNavigation.tsx +26 -0
  312. package/src/useNavigationBuilder.tsx +640 -0
  313. package/src/useNavigationCache.tsx +159 -0
  314. package/src/useNavigationContainerRef.tsx +17 -0
  315. package/src/useNavigationHelpers.tsx +98 -0
  316. package/src/useNavigationState.tsx +41 -0
  317. package/src/useOnAction.tsx +166 -0
  318. package/src/useOnGetState.tsx +47 -0
  319. package/src/useOnPreventRemove.tsx +99 -0
  320. package/src/useOnRouteFocus.tsx +47 -0
  321. package/src/useOptionsGetters.tsx +98 -0
  322. package/src/useRegisterNavigator.tsx +29 -0
  323. package/src/useRoute.tsx +22 -0
  324. package/src/useRouteCache.tsx +55 -0
  325. package/src/useScheduleUpdate.tsx +32 -0
  326. package/src/useSyncState.tsx +74 -0
  327. package/src/validatePathConfig.tsx +32 -0
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = getStateFromPath;
7
+
8
+ var _escapeStringRegexp = _interopRequireDefault(require("escape-string-regexp"));
9
+
10
+ var queryString = _interopRequireWildcard(require("query-string"));
11
+
12
+ var _findFocusedRoute = _interopRequireDefault(require("./findFocusedRoute"));
13
+
14
+ var _validatePathConfig = _interopRequireDefault(require("./validatePathConfig"));
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ /**
23
+ * Utility to parse a path string to initial state object accepted by the container.
24
+ * This is useful for deep linking when we need to handle the incoming URL.
25
+ *
26
+ * @example
27
+ * ```js
28
+ * getStateFromPath(
29
+ * '/chat/jane/42',
30
+ * {
31
+ * screens: {
32
+ * Chat: {
33
+ * path: 'chat/:author/:id',
34
+ * parse: { id: Number }
35
+ * }
36
+ * }
37
+ * }
38
+ * )
39
+ * ```
40
+ * @param path Path string to parse and convert, e.g. /foo/bar?count=42.
41
+ * @param options Extra options to fine-tune how to parse the path.
42
+ */
43
+ function getStateFromPath(path, options) {
44
+ if (options) {
45
+ (0, _validatePathConfig.default)(options);
46
+ }
47
+
48
+ let initialRoutes = [];
49
+
50
+ if (options !== null && options !== void 0 && options.initialRouteName) {
51
+ initialRoutes.push({
52
+ initialRouteName: options.initialRouteName,
53
+ parentScreens: []
54
+ });
55
+ }
56
+
57
+ const screens = options === null || options === void 0 ? void 0 : options.screens;
58
+ let remaining = path.replace(/\/+/g, '/') // Replace multiple slash (//) with single ones
59
+ .replace(/^\//, '') // Remove extra leading slash
60
+ .replace(/\?.*$/, ''); // Remove query params which we will handle later
61
+ // Make sure there is a trailing slash
62
+
63
+ remaining = remaining.endsWith('/') ? remaining : `${remaining}/`;
64
+
65
+ if (screens === undefined) {
66
+ // When no config is specified, use the path segments as route names
67
+ const routes = remaining.split('/').filter(Boolean).map(segment => {
68
+ const name = decodeURIComponent(segment);
69
+ return {
70
+ name
71
+ };
72
+ });
73
+
74
+ if (routes.length) {
75
+ return createNestedStateObject(path, routes, initialRoutes);
76
+ }
77
+
78
+ return undefined;
79
+ } // Create a normalized configs array which will be easier to use
80
+
81
+
82
+ const configs = [].concat(...Object.keys(screens).map(key => createNormalizedConfigs(key, screens, [], initialRoutes, []))).sort((a, b) => {
83
+ // Sort config so that:
84
+ // - the most exhaustive ones are always at the beginning
85
+ // - patterns with wildcard are always at the end
86
+ // If 2 patterns are same, move the one with less route names up
87
+ // This is an error state, so it's only useful for consistent error messages
88
+ if (a.pattern === b.pattern) {
89
+ return b.routeNames.join('>').localeCompare(a.routeNames.join('>'));
90
+ } // If one of the patterns starts with the other, it's more exhaustive
91
+ // So move it up
92
+
93
+
94
+ if (a.pattern.startsWith(b.pattern)) {
95
+ return -1;
96
+ }
97
+
98
+ if (b.pattern.startsWith(a.pattern)) {
99
+ return 1;
100
+ }
101
+
102
+ const aParts = a.pattern.split('/');
103
+ const bParts = b.pattern.split('/');
104
+
105
+ for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
106
+ // if b is longer, b get higher priority
107
+ if (aParts[i] == null) {
108
+ return 1;
109
+ } // if a is longer, a get higher priority
110
+
111
+
112
+ if (bParts[i] == null) {
113
+ return -1;
114
+ }
115
+
116
+ const aWildCard = aParts[i] === '*' || aParts[i].startsWith(':');
117
+ const bWildCard = bParts[i] === '*' || bParts[i].startsWith(':'); // if both are wildcard we compare next component
118
+
119
+ if (aWildCard && bWildCard) {
120
+ continue;
121
+ } // if only a is wild card, b get higher priority
122
+
123
+
124
+ if (aWildCard) {
125
+ return 1;
126
+ } // if only b is wild card, a get higher priority
127
+
128
+
129
+ if (bWildCard) {
130
+ return -1;
131
+ }
132
+ }
133
+
134
+ return bParts.length - aParts.length;
135
+ }); // Check for duplicate patterns in the config
136
+
137
+ configs.reduce((acc, config) => {
138
+ if (acc[config.pattern]) {
139
+ const a = acc[config.pattern].routeNames;
140
+ const b = config.routeNames; // It's not a problem if the path string omitted from a inner most screen
141
+ // For example, it's ok if a path resolves to `A > B > C` or `A > B`
142
+
143
+ const intersects = a.length > b.length ? b.every((it, i) => a[i] === it) : a.every((it, i) => b[i] === it);
144
+
145
+ if (!intersects) {
146
+ throw new Error(`Found conflicting screens with the same pattern. The pattern '${config.pattern}' resolves to both '${a.join(' > ')}' and '${b.join(' > ')}'. Patterns must be unique and cannot resolve to more than one screen.`);
147
+ }
148
+ }
149
+
150
+ return Object.assign(acc, {
151
+ [config.pattern]: config
152
+ });
153
+ }, {});
154
+
155
+ if (remaining === '/') {
156
+ // We need to add special handling of empty path so navigation to empty path also works
157
+ // When handling empty path, we should only look at the root level config
158
+ const match = configs.find(config => config.path === '' && config.routeNames.every( // Make sure that none of the parent configs have a non-empty path defined
159
+ name => {
160
+ var _configs$find;
161
+
162
+ return !((_configs$find = configs.find(c => c.screen === name)) !== null && _configs$find !== void 0 && _configs$find.path);
163
+ }));
164
+
165
+ if (match) {
166
+ return createNestedStateObject(path, match.routeNames.map(name => ({
167
+ name
168
+ })), initialRoutes, configs);
169
+ }
170
+
171
+ return undefined;
172
+ }
173
+
174
+ let result;
175
+ let current; // We match the whole path against the regex instead of segments
176
+ // This makes sure matches such as wildcard will catch any unmatched routes, even if nested
177
+
178
+ const {
179
+ routes,
180
+ remainingPath
181
+ } = matchAgainstConfigs(remaining, configs.map(c => ({ ...c,
182
+ // Add `$` to the regex to make sure it matches till end of the path and not just beginning
183
+ regex: c.regex ? new RegExp(c.regex.source + '$') : undefined
184
+ })));
185
+
186
+ if (routes !== undefined) {
187
+ // This will always be empty if full path matched
188
+ current = createNestedStateObject(path, routes, initialRoutes, configs);
189
+ remaining = remainingPath;
190
+ result = current;
191
+ }
192
+
193
+ if (current == null || result == null) {
194
+ return undefined;
195
+ }
196
+
197
+ return result;
198
+ }
199
+
200
+ const joinPaths = (...paths) => [].concat(...paths.map(p => p.split('/'))).filter(Boolean).join('/');
201
+
202
+ const matchAgainstConfigs = (remaining, configs) => {
203
+ let routes;
204
+ let remainingPath = remaining; // Go through all configs, and see if the next path segment matches our regex
205
+
206
+ for (const config of configs) {
207
+ if (!config.regex) {
208
+ continue;
209
+ }
210
+
211
+ const match = remainingPath.match(config.regex); // If our regex matches, we need to extract params from the path
212
+
213
+ if (match) {
214
+ var _config$pattern;
215
+
216
+ const matchedParams = (_config$pattern = config.pattern) === null || _config$pattern === void 0 ? void 0 : _config$pattern.split('/').filter(p => p.startsWith(':')).reduce((acc, p, i) => Object.assign(acc, {
217
+ // The param segments appear every second item starting from 2 in the regex match result
218
+ [p]: match[(i + 1) * 2].replace(/\//, '')
219
+ }), {});
220
+ routes = config.routeNames.map(name => {
221
+ var _config$path;
222
+
223
+ const config = configs.find(c => c.screen === name);
224
+ const params = config === null || config === void 0 ? void 0 : (_config$path = config.path) === null || _config$path === void 0 ? void 0 : _config$path.split('/').filter(p => p.startsWith(':')).reduce((acc, p) => {
225
+ const value = matchedParams[p];
226
+
227
+ if (value) {
228
+ var _config$parse;
229
+
230
+ const key = p.replace(/^:/, '').replace(/\?$/, '');
231
+ acc[key] = (_config$parse = config.parse) !== null && _config$parse !== void 0 && _config$parse[key] ? config.parse[key](value) : value;
232
+ }
233
+
234
+ return acc;
235
+ }, {});
236
+
237
+ if (params && Object.keys(params).length) {
238
+ return {
239
+ name,
240
+ params
241
+ };
242
+ }
243
+
244
+ return {
245
+ name
246
+ };
247
+ });
248
+ remainingPath = remainingPath.replace(match[1], '');
249
+ break;
250
+ }
251
+ }
252
+
253
+ return {
254
+ routes,
255
+ remainingPath
256
+ };
257
+ };
258
+
259
+ const createNormalizedConfigs = (screen, routeConfig, routeNames = [], initials, parentScreens, parentPattern) => {
260
+ const configs = [];
261
+ routeNames.push(screen);
262
+ parentScreens.push(screen); // @ts-expect-error: we can't strongly typecheck this for now
263
+
264
+ const config = routeConfig[screen];
265
+
266
+ if (typeof config === 'string') {
267
+ // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern
268
+ const pattern = parentPattern ? joinPaths(parentPattern, config) : config;
269
+ configs.push(createConfigItem(screen, routeNames, pattern, config));
270
+ } else if (typeof config === 'object') {
271
+ let pattern; // if an object is specified as the value (e.g. Foo: { ... }),
272
+ // it can have `path` property and
273
+ // it could have `screens` prop which has nested configs
274
+
275
+ if (typeof config.path === 'string') {
276
+ if (config.exact && config.path === undefined) {
277
+ throw new Error("A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.");
278
+ }
279
+
280
+ pattern = config.exact !== true ? joinPaths(parentPattern || '', config.path || '') : config.path || '';
281
+ configs.push(createConfigItem(screen, routeNames, pattern, config.path, config.parse));
282
+ }
283
+
284
+ if (config.screens) {
285
+ // property `initialRouteName` without `screens` has no purpose
286
+ if (config.initialRouteName) {
287
+ initials.push({
288
+ initialRouteName: config.initialRouteName,
289
+ parentScreens
290
+ });
291
+ }
292
+
293
+ Object.keys(config.screens).forEach(nestedConfig => {
294
+ var _pattern;
295
+
296
+ const result = createNormalizedConfigs(nestedConfig, config.screens, routeNames, initials, [...parentScreens], (_pattern = pattern) !== null && _pattern !== void 0 ? _pattern : parentPattern);
297
+ configs.push(...result);
298
+ });
299
+ }
300
+ }
301
+
302
+ routeNames.pop();
303
+ return configs;
304
+ };
305
+
306
+ const createConfigItem = (screen, routeNames, pattern, path, parse) => {
307
+ // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.
308
+ pattern = pattern.split('/').filter(Boolean).join('/');
309
+ const regex = pattern ? new RegExp(`^(${pattern.split('/').map(it => {
310
+ if (it.startsWith(':')) {
311
+ return `(([^/]+\\/)${it.endsWith('?') ? '?' : ''})`;
312
+ }
313
+
314
+ return `${it === '*' ? '.*' : (0, _escapeStringRegexp.default)(it)}\\/`;
315
+ }).join('')})`) : undefined;
316
+ return {
317
+ screen,
318
+ regex,
319
+ pattern,
320
+ path,
321
+ // The routeNames array is mutated, so copy it to keep the current state
322
+ routeNames: [...routeNames],
323
+ parse
324
+ };
325
+ };
326
+
327
+ const findParseConfigForRoute = (routeName, flatConfig) => {
328
+ for (const config of flatConfig) {
329
+ if (routeName === config.routeNames[config.routeNames.length - 1]) {
330
+ return config.parse;
331
+ }
332
+ }
333
+
334
+ return undefined;
335
+ }; // Try to find an initial route connected with the one passed
336
+
337
+
338
+ const findInitialRoute = (routeName, parentScreens, initialRoutes) => {
339
+ for (const config of initialRoutes) {
340
+ if (parentScreens.length === config.parentScreens.length) {
341
+ let sameParents = true;
342
+
343
+ for (let i = 0; i < parentScreens.length; i++) {
344
+ if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {
345
+ sameParents = false;
346
+ break;
347
+ }
348
+ }
349
+
350
+ if (sameParents) {
351
+ return routeName !== config.initialRouteName ? config.initialRouteName : undefined;
352
+ }
353
+ }
354
+ }
355
+
356
+ return undefined;
357
+ }; // returns state object with values depending on whether
358
+ // it is the end of state and if there is initialRoute for this level
359
+
360
+
361
+ const createStateObject = (initialRoute, route, isEmpty) => {
362
+ if (isEmpty) {
363
+ if (initialRoute) {
364
+ return {
365
+ index: 1,
366
+ routes: [{
367
+ name: initialRoute
368
+ }, route]
369
+ };
370
+ } else {
371
+ return {
372
+ routes: [route]
373
+ };
374
+ }
375
+ } else {
376
+ if (initialRoute) {
377
+ return {
378
+ index: 1,
379
+ routes: [{
380
+ name: initialRoute
381
+ }, { ...route,
382
+ state: {
383
+ routes: []
384
+ }
385
+ }]
386
+ };
387
+ } else {
388
+ return {
389
+ routes: [{ ...route,
390
+ state: {
391
+ routes: []
392
+ }
393
+ }]
394
+ };
395
+ }
396
+ }
397
+ };
398
+
399
+ const createNestedStateObject = (path, routes, initialRoutes, flatConfig) => {
400
+ let state;
401
+ let route = routes.shift();
402
+ const parentScreens = [];
403
+ let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);
404
+ parentScreens.push(route.name);
405
+ state = createStateObject(initialRoute, route, routes.length === 0);
406
+
407
+ if (routes.length > 0) {
408
+ let nestedState = state;
409
+
410
+ while (route = routes.shift()) {
411
+ initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);
412
+ const nestedStateIndex = nestedState.index || nestedState.routes.length - 1;
413
+ nestedState.routes[nestedStateIndex].state = createStateObject(initialRoute, route, routes.length === 0);
414
+
415
+ if (routes.length > 0) {
416
+ nestedState = nestedState.routes[nestedStateIndex].state;
417
+ }
418
+
419
+ parentScreens.push(route.name);
420
+ }
421
+ }
422
+
423
+ route = (0, _findFocusedRoute.default)(state);
424
+ route.path = path;
425
+ const params = parseQueryParams(path, flatConfig ? findParseConfigForRoute(route.name, flatConfig) : undefined);
426
+
427
+ if (params) {
428
+ route.params = { ...route.params,
429
+ ...params
430
+ };
431
+ }
432
+
433
+ return state;
434
+ };
435
+
436
+ const parseQueryParams = (path, parseConfig) => {
437
+ const query = path.split('?')[1];
438
+ const params = queryString.parse(query);
439
+
440
+ if (parseConfig) {
441
+ Object.keys(params).forEach(name => {
442
+ if (parseConfig[name] && typeof params[name] === 'string') {
443
+ params[name] = parseConfig[name](params[name]);
444
+ }
445
+ });
446
+ }
447
+
448
+ return Object.keys(params).length ? params : undefined;
449
+ };
450
+ //# sourceMappingURL=getStateFromPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["getStateFromPath.tsx"],"names":["getStateFromPath","path","options","initialRoutes","initialRouteName","push","parentScreens","screens","remaining","replace","endsWith","undefined","routes","split","filter","Boolean","map","segment","name","decodeURIComponent","length","createNestedStateObject","configs","concat","Object","keys","key","createNormalizedConfigs","sort","a","b","pattern","routeNames","join","localeCompare","startsWith","aParts","bParts","i","Math","max","aWildCard","bWildCard","reduce","acc","config","intersects","every","it","Error","assign","match","find","c","screen","result","current","remainingPath","matchAgainstConfigs","regex","RegExp","source","joinPaths","paths","p","matchedParams","params","value","parse","routeConfig","initials","parentPattern","createConfigItem","exact","forEach","nestedConfig","pop","findParseConfigForRoute","routeName","flatConfig","findInitialRoute","sameParents","createStateObject","initialRoute","route","isEmpty","index","state","shift","nestedState","nestedStateIndex","parseQueryParams","parseConfig","query","queryString"],"mappings":"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","sourcesContent":["import type {\n InitialState,\n NavigationState,\n PartialState,\n} from '@react-navigation/routers';\nimport escape from 'escape-string-regexp';\nimport * as queryString from 'query-string';\n\nimport findFocusedRoute from './findFocusedRoute';\nimport type { PathConfigMap } from './types';\nimport validatePathConfig from './validatePathConfig';\n\ntype Options<ParamList extends {}> = {\n initialRouteName?: string;\n screens: PathConfigMap<ParamList>;\n};\n\ntype ParseConfig = Record<string, (value: string) => any>;\n\ntype RouteConfig = {\n screen: string;\n regex?: RegExp;\n path: string;\n pattern: string;\n routeNames: string[];\n parse?: ParseConfig;\n};\n\ntype InitialRouteConfig = {\n initialRouteName: string;\n parentScreens: string[];\n};\n\ntype ResultState = PartialState<NavigationState> & {\n state?: ResultState;\n};\n\ntype ParsedRoute = {\n name: string;\n path?: string;\n params?: Record<string, any> | undefined;\n};\n\n/**\n * Utility to parse a path string to initial state object accepted by the container.\n * This is useful for deep linking when we need to handle the incoming URL.\n *\n * @example\n * ```js\n * getStateFromPath(\n * '/chat/jane/42',\n * {\n * screens: {\n * Chat: {\n * path: 'chat/:author/:id',\n * parse: { id: Number }\n * }\n * }\n * }\n * )\n * ```\n * @param path Path string to parse and convert, e.g. /foo/bar?count=42.\n * @param options Extra options to fine-tune how to parse the path.\n */\nexport default function getStateFromPath<ParamList extends {}>(\n path: string,\n options?: Options<ParamList>\n): ResultState | undefined {\n if (options) {\n validatePathConfig(options);\n }\n\n let initialRoutes: InitialRouteConfig[] = [];\n\n if (options?.initialRouteName) {\n initialRoutes.push({\n initialRouteName: options.initialRouteName,\n parentScreens: [],\n });\n }\n\n const screens = options?.screens;\n\n let remaining = path\n .replace(/\\/+/g, '/') // Replace multiple slash (//) with single ones\n .replace(/^\\//, '') // Remove extra leading slash\n .replace(/\\?.*$/, ''); // Remove query params which we will handle later\n\n // Make sure there is a trailing slash\n remaining = remaining.endsWith('/') ? remaining : `${remaining}/`;\n\n if (screens === undefined) {\n // When no config is specified, use the path segments as route names\n const routes = remaining\n .split('/')\n .filter(Boolean)\n .map((segment) => {\n const name = decodeURIComponent(segment);\n return { name };\n });\n\n if (routes.length) {\n return createNestedStateObject(path, routes, initialRoutes);\n }\n\n return undefined;\n }\n\n // Create a normalized configs array which will be easier to use\n const configs = ([] as RouteConfig[])\n .concat(\n ...Object.keys(screens).map((key) =>\n createNormalizedConfigs(\n key,\n screens as PathConfigMap<object>,\n [],\n initialRoutes,\n []\n )\n )\n )\n .sort((a, b) => {\n // Sort config so that:\n // - the most exhaustive ones are always at the beginning\n // - patterns with wildcard are always at the end\n\n // If 2 patterns are same, move the one with less route names up\n // This is an error state, so it's only useful for consistent error messages\n if (a.pattern === b.pattern) {\n return b.routeNames.join('>').localeCompare(a.routeNames.join('>'));\n }\n\n // If one of the patterns starts with the other, it's more exhaustive\n // So move it up\n if (a.pattern.startsWith(b.pattern)) {\n return -1;\n }\n\n if (b.pattern.startsWith(a.pattern)) {\n return 1;\n }\n\n const aParts = a.pattern.split('/');\n const bParts = b.pattern.split('/');\n\n for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n // if b is longer, b get higher priority\n if (aParts[i] == null) {\n return 1;\n }\n // if a is longer, a get higher priority\n if (bParts[i] == null) {\n return -1;\n }\n const aWildCard = aParts[i] === '*' || aParts[i].startsWith(':');\n const bWildCard = bParts[i] === '*' || bParts[i].startsWith(':');\n // if both are wildcard we compare next component\n if (aWildCard && bWildCard) {\n continue;\n }\n // if only a is wild card, b get higher priority\n if (aWildCard) {\n return 1;\n }\n // if only b is wild card, a get higher priority\n if (bWildCard) {\n return -1;\n }\n }\n return bParts.length - aParts.length;\n });\n\n // Check for duplicate patterns in the config\n configs.reduce<Record<string, RouteConfig>>((acc, config) => {\n if (acc[config.pattern]) {\n const a = acc[config.pattern].routeNames;\n const b = config.routeNames;\n\n // It's not a problem if the path string omitted from a inner most screen\n // For example, it's ok if a path resolves to `A > B > C` or `A > B`\n const intersects =\n a.length > b.length\n ? b.every((it, i) => a[i] === it)\n : a.every((it, i) => b[i] === it);\n\n if (!intersects) {\n throw new Error(\n `Found conflicting screens with the same pattern. The pattern '${\n config.pattern\n }' resolves to both '${a.join(' > ')}' and '${b.join(\n ' > '\n )}'. Patterns must be unique and cannot resolve to more than one screen.`\n );\n }\n }\n\n return Object.assign(acc, {\n [config.pattern]: config,\n });\n }, {});\n\n if (remaining === '/') {\n // We need to add special handling of empty path so navigation to empty path also works\n // When handling empty path, we should only look at the root level config\n const match = configs.find(\n (config) =>\n config.path === '' &&\n config.routeNames.every(\n // Make sure that none of the parent configs have a non-empty path defined\n (name) => !configs.find((c) => c.screen === name)?.path\n )\n );\n\n if (match) {\n return createNestedStateObject(\n path,\n match.routeNames.map((name) => ({ name })),\n initialRoutes,\n configs\n );\n }\n\n return undefined;\n }\n\n let result: PartialState<NavigationState> | undefined;\n let current: PartialState<NavigationState> | undefined;\n\n // We match the whole path against the regex instead of segments\n // This makes sure matches such as wildcard will catch any unmatched routes, even if nested\n const { routes, remainingPath } = matchAgainstConfigs(\n remaining,\n configs.map((c) => ({\n ...c,\n // Add `$` to the regex to make sure it matches till end of the path and not just beginning\n regex: c.regex ? new RegExp(c.regex.source + '$') : undefined,\n }))\n );\n\n if (routes !== undefined) {\n // This will always be empty if full path matched\n current = createNestedStateObject(path, routes, initialRoutes, configs);\n remaining = remainingPath;\n result = current;\n }\n\n if (current == null || result == null) {\n return undefined;\n }\n\n return result;\n}\n\nconst joinPaths = (...paths: string[]): string =>\n ([] as string[])\n .concat(...paths.map((p) => p.split('/')))\n .filter(Boolean)\n .join('/');\n\nconst matchAgainstConfigs = (remaining: string, configs: RouteConfig[]) => {\n let routes: ParsedRoute[] | undefined;\n let remainingPath = remaining;\n\n // Go through all configs, and see if the next path segment matches our regex\n for (const config of configs) {\n if (!config.regex) {\n continue;\n }\n\n const match = remainingPath.match(config.regex);\n\n // If our regex matches, we need to extract params from the path\n if (match) {\n const matchedParams = config.pattern\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n .reduce<Record<string, any>>(\n (acc, p, i) =>\n Object.assign(acc, {\n // The param segments appear every second item starting from 2 in the regex match result\n [p]: match![(i + 1) * 2].replace(/\\//, ''),\n }),\n {}\n );\n\n routes = config.routeNames.map((name) => {\n const config = configs.find((c) => c.screen === name);\n const params = config?.path\n ?.split('/')\n .filter((p) => p.startsWith(':'))\n .reduce<Record<string, any>>((acc, p) => {\n const value = matchedParams[p];\n\n if (value) {\n const key = p.replace(/^:/, '').replace(/\\?$/, '');\n acc[key] = config.parse?.[key] ? config.parse[key](value) : value;\n }\n\n return acc;\n }, {});\n\n if (params && Object.keys(params).length) {\n return { name, params };\n }\n\n return { name };\n });\n\n remainingPath = remainingPath.replace(match[1], '');\n\n break;\n }\n }\n\n return { routes, remainingPath };\n};\n\nconst createNormalizedConfigs = (\n screen: string,\n routeConfig: PathConfigMap<object>,\n routeNames: string[] = [],\n initials: InitialRouteConfig[],\n parentScreens: string[],\n parentPattern?: string\n): RouteConfig[] => {\n const configs: RouteConfig[] = [];\n\n routeNames.push(screen);\n\n parentScreens.push(screen);\n\n // @ts-expect-error: we can't strongly typecheck this for now\n const config = routeConfig[screen];\n\n if (typeof config === 'string') {\n // If a string is specified as the value of the key(e.g. Foo: '/path'), use it as the pattern\n const pattern = parentPattern ? joinPaths(parentPattern, config) : config;\n\n configs.push(createConfigItem(screen, routeNames, pattern, config));\n } else if (typeof config === 'object') {\n let pattern: string | undefined;\n\n // if an object is specified as the value (e.g. Foo: { ... }),\n // it can have `path` property and\n // it could have `screens` prop which has nested configs\n if (typeof config.path === 'string') {\n if (config.exact && config.path === undefined) {\n throw new Error(\n \"A 'path' needs to be specified when specifying 'exact: true'. If you don't want this screen in the URL, specify it as empty string, e.g. `path: ''`.\"\n );\n }\n\n pattern =\n config.exact !== true\n ? joinPaths(parentPattern || '', config.path || '')\n : config.path || '';\n\n configs.push(\n createConfigItem(\n screen,\n routeNames,\n pattern!,\n config.path,\n config.parse\n )\n );\n }\n\n if (config.screens) {\n // property `initialRouteName` without `screens` has no purpose\n if (config.initialRouteName) {\n initials.push({\n initialRouteName: config.initialRouteName,\n parentScreens,\n });\n }\n\n Object.keys(config.screens).forEach((nestedConfig) => {\n const result = createNormalizedConfigs(\n nestedConfig,\n config.screens as PathConfigMap<object>,\n routeNames,\n initials,\n [...parentScreens],\n pattern ?? parentPattern\n );\n\n configs.push(...result);\n });\n }\n }\n\n routeNames.pop();\n\n return configs;\n};\n\nconst createConfigItem = (\n screen: string,\n routeNames: string[],\n pattern: string,\n path: string,\n parse?: ParseConfig\n): RouteConfig => {\n // Normalize pattern to remove any leading, trailing slashes, duplicate slashes etc.\n pattern = pattern.split('/').filter(Boolean).join('/');\n\n const regex = pattern\n ? new RegExp(\n `^(${pattern\n .split('/')\n .map((it) => {\n if (it.startsWith(':')) {\n return `(([^/]+\\\\/)${it.endsWith('?') ? '?' : ''})`;\n }\n\n return `${it === '*' ? '.*' : escape(it)}\\\\/`;\n })\n .join('')})`\n )\n : undefined;\n\n return {\n screen,\n regex,\n pattern,\n path,\n // The routeNames array is mutated, so copy it to keep the current state\n routeNames: [...routeNames],\n parse,\n };\n};\n\nconst findParseConfigForRoute = (\n routeName: string,\n flatConfig: RouteConfig[]\n): ParseConfig | undefined => {\n for (const config of flatConfig) {\n if (routeName === config.routeNames[config.routeNames.length - 1]) {\n return config.parse;\n }\n }\n\n return undefined;\n};\n\n// Try to find an initial route connected with the one passed\nconst findInitialRoute = (\n routeName: string,\n parentScreens: string[],\n initialRoutes: InitialRouteConfig[]\n): string | undefined => {\n for (const config of initialRoutes) {\n if (parentScreens.length === config.parentScreens.length) {\n let sameParents = true;\n for (let i = 0; i < parentScreens.length; i++) {\n if (parentScreens[i].localeCompare(config.parentScreens[i]) !== 0) {\n sameParents = false;\n break;\n }\n }\n if (sameParents) {\n return routeName !== config.initialRouteName\n ? config.initialRouteName\n : undefined;\n }\n }\n }\n return undefined;\n};\n\n// returns state object with values depending on whether\n// it is the end of state and if there is initialRoute for this level\nconst createStateObject = (\n initialRoute: string | undefined,\n route: ParsedRoute,\n isEmpty: boolean\n): InitialState => {\n if (isEmpty) {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute }, route],\n };\n } else {\n return {\n routes: [route],\n };\n }\n } else {\n if (initialRoute) {\n return {\n index: 1,\n routes: [{ name: initialRoute }, { ...route, state: { routes: [] } }],\n };\n } else {\n return {\n routes: [{ ...route, state: { routes: [] } }],\n };\n }\n }\n};\n\nconst createNestedStateObject = (\n path: string,\n routes: ParsedRoute[],\n initialRoutes: InitialRouteConfig[],\n flatConfig?: RouteConfig[]\n) => {\n let state: InitialState;\n let route = routes.shift() as ParsedRoute;\n const parentScreens: string[] = [];\n\n let initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n parentScreens.push(route.name);\n\n state = createStateObject(initialRoute, route, routes.length === 0);\n\n if (routes.length > 0) {\n let nestedState = state;\n\n while ((route = routes.shift() as ParsedRoute)) {\n initialRoute = findInitialRoute(route.name, parentScreens, initialRoutes);\n\n const nestedStateIndex =\n nestedState.index || nestedState.routes.length - 1;\n\n nestedState.routes[nestedStateIndex].state = createStateObject(\n initialRoute,\n route,\n routes.length === 0\n );\n\n if (routes.length > 0) {\n nestedState = nestedState.routes[nestedStateIndex]\n .state as InitialState;\n }\n\n parentScreens.push(route.name);\n }\n }\n\n route = findFocusedRoute(state) as ParsedRoute;\n route.path = path;\n\n const params = parseQueryParams(\n path,\n flatConfig ? findParseConfigForRoute(route.name, flatConfig) : undefined\n );\n\n if (params) {\n route.params = { ...route.params, ...params };\n }\n\n return state;\n};\n\nconst parseQueryParams = (\n path: string,\n parseConfig?: Record<string, (value: string) => any>\n) => {\n const query = path.split('?')[1];\n const params = queryString.parse(query);\n\n if (parseConfig) {\n Object.keys(params).forEach((name) => {\n if (parseConfig[name] && typeof params[name] === 'string') {\n params[name] = parseConfig[name](params[name] as string);\n }\n });\n }\n\n return Object.keys(params).length ? params : undefined;\n};\n"]}