@symbiote-native/navigation 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/LICENSE +21 -0
  2. package/build/angular/drawer/index.d.ts +76 -0
  3. package/build/angular/drawer/index.js +508 -0
  4. package/build/angular/drawer-screen.directive.d.ts +14 -0
  5. package/build/angular/drawer-screen.directive.js +87 -0
  6. package/build/angular/index.d.ts +23 -0
  7. package/build/angular/index.js +22 -0
  8. package/build/angular/injectors/index.d.ts +13 -0
  9. package/build/angular/injectors/index.js +8 -0
  10. package/build/angular/injectors/inject-drawer-navigation.d.ts +4 -0
  11. package/build/angular/injectors/inject-drawer-navigation.js +12 -0
  12. package/build/angular/injectors/inject-focus-effect.d.ts +2 -0
  13. package/build/angular/injectors/inject-focus-effect.js +29 -0
  14. package/build/angular/injectors/inject-is-focused.d.ts +2 -0
  15. package/build/angular/injectors/inject-is-focused.js +20 -0
  16. package/build/angular/injectors/inject-navigation-state.d.ts +3 -0
  17. package/build/angular/injectors/inject-navigation-state.js +35 -0
  18. package/build/angular/injectors/inject-navigation.d.ts +7 -0
  19. package/build/angular/injectors/inject-navigation.js +16 -0
  20. package/build/angular/injectors/inject-route.d.ts +3 -0
  21. package/build/angular/injectors/inject-route.js +20 -0
  22. package/build/angular/injectors/inject-stack-navigation.d.ts +4 -0
  23. package/build/angular/injectors/inject-stack-navigation.js +15 -0
  24. package/build/angular/injectors/inject-tab-navigation.d.ts +4 -0
  25. package/build/angular/injectors/inject-tab-navigation.js +11 -0
  26. package/build/angular/linking.d.ts +3 -0
  27. package/build/angular/linking.js +43 -0
  28. package/build/angular/navigation-context.service.d.ts +13 -0
  29. package/build/angular/navigation-context.service.js +105 -0
  30. package/build/angular/navigation-scope.directive.d.ts +10 -0
  31. package/build/angular/navigation-scope.directive.js +90 -0
  32. package/build/angular/screen.directive.d.ts +22 -0
  33. package/build/angular/screen.directive.js +90 -0
  34. package/build/angular/search-bar-ref.directive.d.ts +10 -0
  35. package/build/angular/search-bar-ref.directive.js +88 -0
  36. package/build/angular/stack/index.d.ts +55 -0
  37. package/build/angular/stack/index.js +386 -0
  38. package/build/angular/tab-screen.directive.d.ts +14 -0
  39. package/build/angular/tab-screen.directive.js +87 -0
  40. package/build/angular/tabs/index.d.ts +42 -0
  41. package/build/angular/tabs/index.js +263 -0
  42. package/build/core/constants.d.ts +27 -0
  43. package/build/core/constants.js +61 -0
  44. package/build/core/drawer-options/index.d.ts +64 -0
  45. package/build/core/drawer-options/index.js +200 -0
  46. package/build/core/drawer-router-state/index.d.ts +21 -0
  47. package/build/core/drawer-router-state/index.js +40 -0
  48. package/build/core/guards.d.ts +2 -0
  49. package/build/core/guards.js +22 -0
  50. package/build/core/header-bar-buttons.d.ts +9 -0
  51. package/build/core/header-bar-buttons.js +163 -0
  52. package/build/core/index.d.ts +29 -0
  53. package/build/core/index.js +32 -0
  54. package/build/core/linking-config/index.d.ts +13 -0
  55. package/build/core/linking-config/index.js +171 -0
  56. package/build/core/navigation-events/index.d.ts +16 -0
  57. package/build/core/navigation-events/index.js +57 -0
  58. package/build/core/navigator-handles/index.d.ts +30 -0
  59. package/build/core/navigator-handles/index.js +15 -0
  60. package/build/core/navigator-props.d.ts +216 -0
  61. package/build/core/navigator-props.js +7 -0
  62. package/build/core/navigator-state/index.d.ts +36 -0
  63. package/build/core/navigator-state/index.js +81 -0
  64. package/build/core/render-drawer.d.ts +13 -0
  65. package/build/core/render-drawer.js +88 -0
  66. package/build/core/render-stack.d.ts +35 -0
  67. package/build/core/render-stack.js +294 -0
  68. package/build/core/render-tabs.d.ts +20 -0
  69. package/build/core/render-tabs.js +97 -0
  70. package/build/core/screen-options.d.ts +4 -0
  71. package/build/core/screen-options.js +133 -0
  72. package/build/core/search-bar-commands.d.ts +10 -0
  73. package/build/core/search-bar-commands.js +42 -0
  74. package/build/core/state-persistence/index.d.ts +3 -0
  75. package/build/core/state-persistence/index.js +23 -0
  76. package/build/core/tab-options.d.ts +13 -0
  77. package/build/core/tab-options.js +10 -0
  78. package/build/core/tab-router-state/index.d.ts +19 -0
  79. package/build/core/tab-router-state/index.js +51 -0
  80. package/build/react/collect-registry.d.ts +4 -0
  81. package/build/react/collect-registry.js +15 -0
  82. package/build/react/drawer/index.d.ts +29 -0
  83. package/build/react/drawer/index.js +277 -0
  84. package/build/react/drawer-screen.d.ts +14 -0
  85. package/build/react/drawer-screen.js +8 -0
  86. package/build/react/hooks/index.d.ts +12 -0
  87. package/build/react/hooks/index.js +8 -0
  88. package/build/react/hooks/use-drawer-navigation.d.ts +4 -0
  89. package/build/react/hooks/use-drawer-navigation.js +12 -0
  90. package/build/react/hooks/use-focus-effect.d.ts +2 -0
  91. package/build/react/hooks/use-focus-effect.js +29 -0
  92. package/build/react/hooks/use-is-focused.d.ts +1 -0
  93. package/build/react/hooks/use-is-focused.js +22 -0
  94. package/build/react/hooks/use-navigation-state/index.d.ts +2 -0
  95. package/build/react/hooks/use-navigation-state/index.js +39 -0
  96. package/build/react/hooks/use-navigation.d.ts +7 -0
  97. package/build/react/hooks/use-navigation.js +16 -0
  98. package/build/react/hooks/use-route.d.ts +2 -0
  99. package/build/react/hooks/use-route.js +8 -0
  100. package/build/react/hooks/use-stack-navigation.d.ts +4 -0
  101. package/build/react/hooks/use-stack-navigation.js +14 -0
  102. package/build/react/hooks/use-tab-navigation.d.ts +4 -0
  103. package/build/react/hooks/use-tab-navigation.js +12 -0
  104. package/build/react/index.d.ts +24 -0
  105. package/build/react/index.js +21 -0
  106. package/build/react/linking.d.ts +3 -0
  107. package/build/react/linking.js +47 -0
  108. package/build/react/navigation-context.d.ts +10 -0
  109. package/build/react/navigation-context.js +22 -0
  110. package/build/react/screen.d.ts +22 -0
  111. package/build/react/screen.js +7 -0
  112. package/build/react/stack/index.d.ts +13 -0
  113. package/build/react/stack/index.js +202 -0
  114. package/build/react/tab-screen.d.ts +15 -0
  115. package/build/react/tab-screen.js +8 -0
  116. package/build/react/tabs/index.d.ts +12 -0
  117. package/build/react/tabs/index.js +116 -0
  118. package/build/register.d.ts +7 -0
  119. package/build/register.js +58 -0
  120. package/build/vue/composables/index.d.ts +12 -0
  121. package/build/vue/composables/index.js +8 -0
  122. package/build/vue/composables/use-drawer-navigation.d.ts +5 -0
  123. package/build/vue/composables/use-drawer-navigation.js +15 -0
  124. package/build/vue/composables/use-focus-effect.d.ts +1 -0
  125. package/build/vue/composables/use-focus-effect.js +31 -0
  126. package/build/vue/composables/use-is-focused.d.ts +2 -0
  127. package/build/vue/composables/use-is-focused.js +28 -0
  128. package/build/vue/composables/use-navigation-state.d.ts +3 -0
  129. package/build/vue/composables/use-navigation-state.js +29 -0
  130. package/build/vue/composables/use-navigation.d.ts +8 -0
  131. package/build/vue/composables/use-navigation.js +13 -0
  132. package/build/vue/composables/use-route.d.ts +3 -0
  133. package/build/vue/composables/use-route.js +9 -0
  134. package/build/vue/composables/use-stack-navigation.d.ts +5 -0
  135. package/build/vue/composables/use-stack-navigation.js +18 -0
  136. package/build/vue/composables/use-tab-navigation.d.ts +5 -0
  137. package/build/vue/composables/use-tab-navigation.js +15 -0
  138. package/build/vue/drawer/index.d.ts +19 -0
  139. package/build/vue/drawer/index.js +390 -0
  140. package/build/vue/drawer-screen.d.ts +14 -0
  141. package/build/vue/drawer-screen.js +12 -0
  142. package/build/vue/index.d.ts +21 -0
  143. package/build/vue/index.js +19 -0
  144. package/build/vue/linking.d.ts +3 -0
  145. package/build/vue/linking.js +57 -0
  146. package/build/vue/navigation-context.d.ts +16 -0
  147. package/build/vue/navigation-context.js +65 -0
  148. package/build/vue/screen.d.ts +21 -0
  149. package/build/vue/screen.js +12 -0
  150. package/build/vue/stack/index.d.ts +9 -0
  151. package/build/vue/stack/index.js +279 -0
  152. package/build/vue/tab-screen.d.ts +14 -0
  153. package/build/vue/tab-screen.js +11 -0
  154. package/build/vue/tabs/index.d.ts +10 -0
  155. package/build/vue/tabs/index.js +209 -0
  156. package/build-ngc/angular/drawer/index.d.ts +79 -0
  157. package/build-ngc/angular/drawer/index.js +479 -0
  158. package/build-ngc/angular/drawer/index.js.map +1 -0
  159. package/build-ngc/angular/drawer-screen.directive.d.ts +17 -0
  160. package/build-ngc/angular/drawer-screen.directive.js +32 -0
  161. package/build-ngc/angular/drawer-screen.directive.js.map +1 -0
  162. package/build-ngc/angular/drawer.d.ts +79 -0
  163. package/build-ngc/angular/drawer.js +475 -0
  164. package/build-ngc/angular/drawer.js.map +1 -0
  165. package/build-ngc/angular/index.d.ts +23 -0
  166. package/build-ngc/angular/index.js +23 -0
  167. package/build-ngc/angular/index.js.map +1 -0
  168. package/build-ngc/angular/injectors/index.d.ts +13 -0
  169. package/build-ngc/angular/injectors/index.js +9 -0
  170. package/build-ngc/angular/injectors/index.js.map +1 -0
  171. package/build-ngc/angular/injectors/inject-drawer-navigation.d.ts +4 -0
  172. package/build-ngc/angular/injectors/inject-drawer-navigation.js +13 -0
  173. package/build-ngc/angular/injectors/inject-drawer-navigation.js.map +1 -0
  174. package/build-ngc/angular/injectors/inject-focus-effect.d.ts +2 -0
  175. package/build-ngc/angular/injectors/inject-focus-effect.js +30 -0
  176. package/build-ngc/angular/injectors/inject-focus-effect.js.map +1 -0
  177. package/build-ngc/angular/injectors/inject-is-focused.d.ts +2 -0
  178. package/build-ngc/angular/injectors/inject-is-focused.js +22 -0
  179. package/build-ngc/angular/injectors/inject-is-focused.js.map +1 -0
  180. package/build-ngc/angular/injectors/inject-navigation-state.d.ts +3 -0
  181. package/build-ngc/angular/injectors/inject-navigation-state.js +37 -0
  182. package/build-ngc/angular/injectors/inject-navigation-state.js.map +1 -0
  183. package/build-ngc/angular/injectors/inject-navigation.d.ts +7 -0
  184. package/build-ngc/angular/injectors/inject-navigation.js +17 -0
  185. package/build-ngc/angular/injectors/inject-navigation.js.map +1 -0
  186. package/build-ngc/angular/injectors/inject-route.d.ts +3 -0
  187. package/build-ngc/angular/injectors/inject-route.js +21 -0
  188. package/build-ngc/angular/injectors/inject-route.js.map +1 -0
  189. package/build-ngc/angular/injectors/inject-stack-navigation.d.ts +4 -0
  190. package/build-ngc/angular/injectors/inject-stack-navigation.js +16 -0
  191. package/build-ngc/angular/injectors/inject-stack-navigation.js.map +1 -0
  192. package/build-ngc/angular/injectors/inject-tab-navigation.d.ts +4 -0
  193. package/build-ngc/angular/injectors/inject-tab-navigation.js +12 -0
  194. package/build-ngc/angular/injectors/inject-tab-navigation.js.map +1 -0
  195. package/build-ngc/angular/linking.d.ts +3 -0
  196. package/build-ngc/angular/linking.js +44 -0
  197. package/build-ngc/angular/linking.js.map +1 -0
  198. package/build-ngc/angular/navigation-context.service.d.ts +16 -0
  199. package/build-ngc/angular/navigation-context.service.js +63 -0
  200. package/build-ngc/angular/navigation-context.service.js.map +1 -0
  201. package/build-ngc/angular/navigation-scope.directive.d.ts +13 -0
  202. package/build-ngc/angular/navigation-scope.directive.js +42 -0
  203. package/build-ngc/angular/navigation-scope.directive.js.map +1 -0
  204. package/build-ngc/angular/screen.directive.d.ts +25 -0
  205. package/build-ngc/angular/screen.directive.js +35 -0
  206. package/build-ngc/angular/screen.directive.js.map +1 -0
  207. package/build-ngc/angular/search-bar-ref.directive.d.ts +13 -0
  208. package/build-ngc/angular/search-bar-ref.directive.js +44 -0
  209. package/build-ngc/angular/search-bar-ref.directive.js.map +1 -0
  210. package/build-ngc/angular/stack/index.d.ts +58 -0
  211. package/build-ngc/angular/stack/index.js +406 -0
  212. package/build-ngc/angular/stack/index.js.map +1 -0
  213. package/build-ngc/angular/stack.d.ts +58 -0
  214. package/build-ngc/angular/stack.js +402 -0
  215. package/build-ngc/angular/stack.js.map +1 -0
  216. package/build-ngc/angular/tab-screen.directive.d.ts +17 -0
  217. package/build-ngc/angular/tab-screen.directive.js +32 -0
  218. package/build-ngc/angular/tab-screen.directive.js.map +1 -0
  219. package/build-ngc/angular/tabs/index.d.ts +45 -0
  220. package/build-ngc/angular/tabs/index.js +231 -0
  221. package/build-ngc/angular/tabs/index.js.map +1 -0
  222. package/build-ngc/angular/tabs.d.ts +45 -0
  223. package/build-ngc/angular/tabs.js +231 -0
  224. package/build-ngc/angular/tabs.js.map +1 -0
  225. package/build-ngc/core/constants.d.ts +27 -0
  226. package/build-ngc/core/constants.js +62 -0
  227. package/build-ngc/core/constants.js.map +1 -0
  228. package/build-ngc/core/drawer-options/index.d.ts +64 -0
  229. package/build-ngc/core/drawer-options/index.js +201 -0
  230. package/build-ngc/core/drawer-options/index.js.map +1 -0
  231. package/build-ngc/core/drawer-options.d.ts +64 -0
  232. package/build-ngc/core/drawer-options.js +201 -0
  233. package/build-ngc/core/drawer-options.js.map +1 -0
  234. package/build-ngc/core/drawer-router-state/index.d.ts +21 -0
  235. package/build-ngc/core/drawer-router-state/index.js +41 -0
  236. package/build-ngc/core/drawer-router-state/index.js.map +1 -0
  237. package/build-ngc/core/drawer-router-state.d.ts +21 -0
  238. package/build-ngc/core/drawer-router-state.js +41 -0
  239. package/build-ngc/core/drawer-router-state.js.map +1 -0
  240. package/build-ngc/core/guards.d.ts +2 -0
  241. package/build-ngc/core/guards.js +23 -0
  242. package/build-ngc/core/guards.js.map +1 -0
  243. package/build-ngc/core/header-bar-buttons.d.ts +9 -0
  244. package/build-ngc/core/header-bar-buttons.js +164 -0
  245. package/build-ngc/core/header-bar-buttons.js.map +1 -0
  246. package/build-ngc/core/href.d.ts +16 -0
  247. package/build-ngc/core/href.js +55 -0
  248. package/build-ngc/core/href.js.map +1 -0
  249. package/build-ngc/core/index.d.ts +29 -0
  250. package/build-ngc/core/index.js +33 -0
  251. package/build-ngc/core/index.js.map +1 -0
  252. package/build-ngc/core/linking-config/index.d.ts +13 -0
  253. package/build-ngc/core/linking-config/index.js +172 -0
  254. package/build-ngc/core/linking-config/index.js.map +1 -0
  255. package/build-ngc/core/linking-config.d.ts +13 -0
  256. package/build-ngc/core/linking-config.js +172 -0
  257. package/build-ngc/core/linking-config.js.map +1 -0
  258. package/build-ngc/core/navigation-events/index.d.ts +16 -0
  259. package/build-ngc/core/navigation-events/index.js +58 -0
  260. package/build-ngc/core/navigation-events/index.js.map +1 -0
  261. package/build-ngc/core/navigation-events.d.ts +16 -0
  262. package/build-ngc/core/navigation-events.js +58 -0
  263. package/build-ngc/core/navigation-events.js.map +1 -0
  264. package/build-ngc/core/navigator-handles/index.d.ts +30 -0
  265. package/build-ngc/core/navigator-handles/index.js +16 -0
  266. package/build-ngc/core/navigator-handles/index.js.map +1 -0
  267. package/build-ngc/core/navigator-handles.d.ts +30 -0
  268. package/build-ngc/core/navigator-handles.js +16 -0
  269. package/build-ngc/core/navigator-handles.js.map +1 -0
  270. package/build-ngc/core/navigator-props.d.ts +216 -0
  271. package/build-ngc/core/navigator-props.js +8 -0
  272. package/build-ngc/core/navigator-props.js.map +1 -0
  273. package/build-ngc/core/navigator-state/index.d.ts +36 -0
  274. package/build-ngc/core/navigator-state/index.js +82 -0
  275. package/build-ngc/core/navigator-state/index.js.map +1 -0
  276. package/build-ngc/core/navigator-state.d.ts +36 -0
  277. package/build-ngc/core/navigator-state.js +82 -0
  278. package/build-ngc/core/navigator-state.js.map +1 -0
  279. package/build-ngc/core/render-drawer.d.ts +13 -0
  280. package/build-ngc/core/render-drawer.js +89 -0
  281. package/build-ngc/core/render-drawer.js.map +1 -0
  282. package/build-ngc/core/render-stack.d.ts +35 -0
  283. package/build-ngc/core/render-stack.js +295 -0
  284. package/build-ngc/core/render-stack.js.map +1 -0
  285. package/build-ngc/core/render-tabs.d.ts +20 -0
  286. package/build-ngc/core/render-tabs.js +98 -0
  287. package/build-ngc/core/render-tabs.js.map +1 -0
  288. package/build-ngc/core/screen-options.d.ts +4 -0
  289. package/build-ngc/core/screen-options.js +134 -0
  290. package/build-ngc/core/screen-options.js.map +1 -0
  291. package/build-ngc/core/search-bar-commands.d.ts +10 -0
  292. package/build-ngc/core/search-bar-commands.js +43 -0
  293. package/build-ngc/core/search-bar-commands.js.map +1 -0
  294. package/build-ngc/core/search-params.d.ts +9 -0
  295. package/build-ngc/core/search-params.js +60 -0
  296. package/build-ngc/core/search-params.js.map +1 -0
  297. package/build-ngc/core/state-persistence/index.d.ts +3 -0
  298. package/build-ngc/core/state-persistence/index.js +24 -0
  299. package/build-ngc/core/state-persistence/index.js.map +1 -0
  300. package/build-ngc/core/state-persistence.d.ts +3 -0
  301. package/build-ngc/core/state-persistence.js +24 -0
  302. package/build-ngc/core/state-persistence.js.map +1 -0
  303. package/build-ngc/core/tab-options.d.ts +13 -0
  304. package/build-ngc/core/tab-options.js +11 -0
  305. package/build-ngc/core/tab-options.js.map +1 -0
  306. package/build-ngc/core/tab-router-state/index.d.ts +19 -0
  307. package/build-ngc/core/tab-router-state/index.js +52 -0
  308. package/build-ngc/core/tab-router-state/index.js.map +1 -0
  309. package/build-ngc/core/tab-router-state.d.ts +19 -0
  310. package/build-ngc/core/tab-router-state.js +52 -0
  311. package/build-ngc/core/tab-router-state.js.map +1 -0
  312. package/build-ngc/register.d.ts +7 -0
  313. package/build-ngc/register.js +59 -0
  314. package/build-ngc/register.js.map +1 -0
  315. package/codegen-specs/FullWindowOverlayNativeComponent.ts +13 -0
  316. package/codegen-specs/ModalScreenNativeComponent.ts +129 -0
  317. package/codegen-specs/NativeScreensModule.ts +8 -0
  318. package/codegen-specs/NativeScreensModule.web.ts +1 -0
  319. package/codegen-specs/ScreenContainerNativeComponent.ts +8 -0
  320. package/codegen-specs/ScreenContentWrapperNativeComponent.ts +9 -0
  321. package/codegen-specs/ScreenFooterNativeComponent.ts +6 -0
  322. package/codegen-specs/ScreenNativeComponent.ts +133 -0
  323. package/codegen-specs/ScreenNavigationContainerNativeComponent.ts +11 -0
  324. package/codegen-specs/ScreenStackHeaderConfigNativeComponent.ts +99 -0
  325. package/codegen-specs/ScreenStackHeaderSubviewNativeComponent.ts +25 -0
  326. package/codegen-specs/ScreenStackNativeComponent.ts +17 -0
  327. package/codegen-specs/SearchBarNativeComponent.ts +101 -0
  328. package/codegen-specs/codegenUtils.ts +6 -0
  329. package/codegen-specs/gamma/ScrollViewMarkerNativeComponent.ts +15 -0
  330. package/codegen-specs/gamma/modals/form-sheet/FormSheetContentWrapperNativeComponent.ts +10 -0
  331. package/codegen-specs/gamma/modals/form-sheet/FormSheetHostNativeComponent.ts +47 -0
  332. package/codegen-specs/gamma/split/SplitHostNativeComponent.ts +124 -0
  333. package/codegen-specs/gamma/split/SplitScreenNativeComponent.ts +24 -0
  334. package/codegen-specs/gamma/stack/StackHeaderConfigAndroidNativeComponent.ts +144 -0
  335. package/codegen-specs/gamma/stack/StackHeaderConfigIOSNativeComponent.ts +34 -0
  336. package/codegen-specs/gamma/stack/StackHeaderItemIOSNativeComponent.ts +47 -0
  337. package/codegen-specs/gamma/stack/StackHeaderItemSpacerIOSNativeComponent.ts +20 -0
  338. package/codegen-specs/gamma/stack/StackHeaderSubviewAndroidNativeComponent.ts +27 -0
  339. package/codegen-specs/gamma/stack/StackHostNativeComponent.ts +8 -0
  340. package/codegen-specs/gamma/stack/StackScreenNativeComponent.ts +42 -0
  341. package/codegen-specs/safe-area/SafeAreaViewNativeComponent.ts +24 -0
  342. package/codegen-specs/tabs/TabsBottomAccessoryContentNativeComponent.ts +15 -0
  343. package/codegen-specs/tabs/TabsBottomAccessoryNativeComponent.ts +19 -0
  344. package/codegen-specs/tabs/TabsHostAndroidNativeComponent.ts +69 -0
  345. package/codegen-specs/tabs/TabsHostIOSNativeComponent.ts +92 -0
  346. package/codegen-specs/tabs/TabsScreenAndroidNativeComponent.ts +112 -0
  347. package/codegen-specs/tabs/TabsScreenIOSNativeComponent.ts +171 -0
  348. package/package.json +201 -0
  349. package/react-native.config.cjs +58 -0
  350. package/src/angular/drawer/drawer.test.ts +299 -0
  351. package/src/angular/drawer/index.ts +546 -0
  352. package/src/angular/drawer-screen.directive.ts +28 -0
  353. package/src/angular/index.ts +63 -0
  354. package/src/angular/injectors/index.ts +13 -0
  355. package/src/angular/injectors/inject-drawer-navigation.ts +21 -0
  356. package/src/angular/injectors/inject-focus-effect.ts +37 -0
  357. package/src/angular/injectors/inject-is-focused.ts +28 -0
  358. package/src/angular/injectors/inject-navigation-state.ts +46 -0
  359. package/src/angular/injectors/inject-navigation.ts +26 -0
  360. package/src/angular/injectors/inject-route.ts +25 -0
  361. package/src/angular/injectors/inject-stack-navigation.ts +24 -0
  362. package/src/angular/injectors/inject-tab-navigation.ts +20 -0
  363. package/src/angular/injectors/injectors.test.ts +247 -0
  364. package/src/angular/injectors/use-typed-navigation.test.ts +229 -0
  365. package/src/angular/linking.ts +55 -0
  366. package/src/angular/navigation-context.service.ts +68 -0
  367. package/src/angular/navigation-scope.directive.ts +31 -0
  368. package/src/angular/nested-navigation.test.ts +189 -0
  369. package/src/angular/screen.directive.ts +48 -0
  370. package/src/angular/search-bar-ref.directive.ts +38 -0
  371. package/src/angular/stack/index.ts +401 -0
  372. package/src/angular/stack/stack.test.ts +419 -0
  373. package/src/angular/tab-screen.directive.ts +26 -0
  374. package/src/angular/tabs/index.ts +254 -0
  375. package/src/angular/tabs/tabs.test.ts +249 -0
  376. package/src/core/constants.ts +68 -0
  377. package/src/core/drawer-options/drawer-options.test.ts +415 -0
  378. package/src/core/drawer-options/index.ts +331 -0
  379. package/src/core/drawer-router-state/drawer-router-state.test.ts +116 -0
  380. package/src/core/drawer-router-state/index.ts +71 -0
  381. package/src/core/guards.ts +23 -0
  382. package/src/core/header-bar-buttons.ts +212 -0
  383. package/src/core/index.ts +170 -0
  384. package/src/core/linking-config/index.ts +209 -0
  385. package/src/core/linking-config/linking-config.test.ts +109 -0
  386. package/src/core/navigation-events/index.ts +94 -0
  387. package/src/core/navigation-events/navigation-events.test.ts +56 -0
  388. package/src/core/navigator-handles/index.ts +63 -0
  389. package/src/core/navigator-handles/navigator-handles.test.ts +46 -0
  390. package/src/core/navigator-props.ts +323 -0
  391. package/src/core/navigator-state/index.ts +112 -0
  392. package/src/core/navigator-state/navigator-state.test.ts +80 -0
  393. package/src/core/render-drawer.ts +123 -0
  394. package/src/core/render-stack.ts +414 -0
  395. package/src/core/render-tabs.ts +138 -0
  396. package/src/core/screen-options.ts +181 -0
  397. package/src/core/search-bar-commands.ts +57 -0
  398. package/src/core/state-persistence/index.ts +30 -0
  399. package/src/core/state-persistence/state-persistence.test.ts +42 -0
  400. package/src/core/tab-options.ts +25 -0
  401. package/src/core/tab-router-state/index.ts +75 -0
  402. package/src/core/tab-router-state/tab-router-state.test.ts +34 -0
  403. package/src/globals.d.ts +4 -0
  404. package/src/react/collect-registry.ts +19 -0
  405. package/src/react/drawer/drawer.test.tsx +472 -0
  406. package/src/react/drawer/index.ts +451 -0
  407. package/src/react/drawer-screen.ts +29 -0
  408. package/src/react/hooks/hooks.test.tsx +199 -0
  409. package/src/react/hooks/index.ts +12 -0
  410. package/src/react/hooks/use-drawer-navigation.ts +21 -0
  411. package/src/react/hooks/use-focus-effect.ts +36 -0
  412. package/src/react/hooks/use-is-focused.ts +26 -0
  413. package/src/react/hooks/use-navigation-state/index.ts +47 -0
  414. package/src/react/hooks/use-navigation-state/use-navigation-state.test.ts +85 -0
  415. package/src/react/hooks/use-navigation.ts +36 -0
  416. package/src/react/hooks/use-route.ts +11 -0
  417. package/src/react/hooks/use-stack-navigation.ts +23 -0
  418. package/src/react/hooks/use-tab-navigation.ts +21 -0
  419. package/src/react/hooks/use-typed-navigation.test.tsx +187 -0
  420. package/src/react/index.ts +52 -0
  421. package/src/react/linking.ts +59 -0
  422. package/src/react/navigation-context.ts +40 -0
  423. package/src/react/nested-navigation.test.tsx +145 -0
  424. package/src/react/screen.ts +44 -0
  425. package/src/react/stack/index.ts +323 -0
  426. package/src/react/stack/stack.test.tsx +514 -0
  427. package/src/react/tab-screen.ts +30 -0
  428. package/src/react/tabs/index.ts +204 -0
  429. package/src/react/tabs/tabs.test.tsx +256 -0
  430. package/src/register.ts +59 -0
  431. package/src/vue/composables/composables.test.ts +221 -0
  432. package/src/vue/composables/index.ts +12 -0
  433. package/src/vue/composables/use-drawer-navigation.ts +25 -0
  434. package/src/vue/composables/use-focus-effect.ts +37 -0
  435. package/src/vue/composables/use-is-focused.ts +34 -0
  436. package/src/vue/composables/use-navigation-state.ts +38 -0
  437. package/src/vue/composables/use-navigation.ts +30 -0
  438. package/src/vue/composables/use-route.ts +13 -0
  439. package/src/vue/composables/use-stack-navigation.ts +28 -0
  440. package/src/vue/composables/use-tab-navigation.ts +25 -0
  441. package/src/vue/composables/use-typed-navigation.test.ts +205 -0
  442. package/src/vue/drawer/drawer.test.ts +451 -0
  443. package/src/vue/drawer/index.ts +550 -0
  444. package/src/vue/drawer-screen.ts +32 -0
  445. package/src/vue/index.ts +70 -0
  446. package/src/vue/linking.ts +69 -0
  447. package/src/vue/navigation-context.ts +87 -0
  448. package/src/vue/nested-navigation.test.ts +155 -0
  449. package/src/vue/screen.ts +52 -0
  450. package/src/vue/stack/index.ts +376 -0
  451. package/src/vue/stack/stack.test.ts +501 -0
  452. package/src/vue/tab-screen.ts +29 -0
  453. package/src/vue/tabs/index.ts +302 -0
  454. package/src/vue/tabs/tabs.test.ts +278 -0
  455. package/symbiote-navigation.podspec +84 -0
@@ -0,0 +1,41 @@
1
+ // DrawerRouter: the logic half (framework-agnostic, zero render), sibling to navigator-state.ts
2
+ // and tab-router-state.ts. Unlike the stack's push/pop route array, a drawer's route list is
3
+ // FIXED at mount (one entry per declared <Drawer.Screen>, collected by the adapter exactly like
4
+ // Stack's/Tab's collectRegistry) — the reducer only tracks which one is focused (`index`) and
5
+ // whether the drawer panel is open. Route identity/shape is `IRoute`, reused verbatim from
6
+ // navigator-state.ts (same convention tab-router-state.ts follows) so all three navigators share
7
+ // one route shape.
8
+ const INITIAL_FOCUSED_INDEX = 0;
9
+ export function createInitialDrawerRouterState(routes, initialRouteName) {
10
+ if (initialRouteName === undefined) {
11
+ return { routes, index: INITIAL_FOCUSED_INDEX, isOpen: false };
12
+ }
13
+ const index = routes.findIndex(route => route.name === initialRouteName);
14
+ return { routes, index: index === -1 ? INITIAL_FOCUSED_INDEX : index, isOpen: false };
15
+ }
16
+ // Mirrors @react-navigation/drawer's DrawerActions: jumpTo focuses a route by NAME (TabRouter's
17
+ // own convention, not the stack's by-key popTo) AND closes the drawer — selecting a destination
18
+ // is itself the dismissal gesture, so a plain focus without also closing would leave the panel
19
+ // covering the just-selected screen.
20
+ export function drawerRouterReducer(state, action) {
21
+ switch (action.type) {
22
+ case 'jumpTo': {
23
+ const index = state.routes.findIndex(route => route.name === action.name);
24
+ if (index === -1)
25
+ return state;
26
+ return index === state.index && !state.isOpen ? state : { ...state, index, isOpen: false };
27
+ }
28
+ case 'openDrawer':
29
+ return state.isOpen ? state : { ...state, isOpen: true };
30
+ case 'closeDrawer':
31
+ return state.isOpen ? { ...state, isOpen: false } : state;
32
+ case 'toggleDrawer':
33
+ return { ...state, isOpen: !state.isOpen };
34
+ default:
35
+ return state;
36
+ }
37
+ }
38
+ export function focusedDrawerRoute(state) {
39
+ return state.routes[state.index];
40
+ }
41
+ //# sourceMappingURL=drawer-router-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-router-state.js","sourceRoot":"","sources":["../../src/core/drawer-router-state.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,6FAA6F;AAC7F,gGAAgG;AAChG,8FAA8F;AAC9F,2FAA2F;AAC3F,iGAAiG;AACjG,mBAAmB;AAoBnB,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,UAAU,8BAA8B,CAC5C,MAA8B,EAC9B,gBAAyB;IAEzB,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACxF,CAAC;AAED,gGAAgG;AAChG,gGAAgG;AAChG,+FAA+F;AAC/F,qCAAqC;AACrC,MAAM,UAAU,mBAAmB,CACjC,KAAyB,EACzB,MAA2B;IAE3B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1E,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC/B,OAAO,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC7F,CAAC;QAED,KAAK,YAAY;YACf,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAE3D,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5D,KAAK,cAAc;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAE7C;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
2
+ export declare function mergeParams(current: unknown, incoming: unknown): unknown;
@@ -0,0 +1,23 @@
1
+ // Runtime guards shared across the navigation package's core. Centralizes what used to be ~11
2
+ // independent copies of the same `typeof value === 'object' && value !== null` check scattered
3
+ // across core and every adapter (route-param merges, persisted-JSON validation, vnode-prop
4
+ // narrowing, gesture-event field reads) - several of which had silently drifted on array
5
+ // handling, one excluding arrays, another not, for the same kind of check.
6
+ //
7
+ // Excludes arrays: every current call site (route params, persisted navigator-state JSON,
8
+ // touch-event objects, vnode props) only ever receives a genuine plain object, never a bare list
9
+ // standing in for one - so `Array.isArray` narrows out a real footgun (a malformed persisted
10
+ // value shaped like `[]` would otherwise pass this guard and fail confusingly deeper in, on a
11
+ // missing `.key`/`.name` field, instead of here) at zero cost to the realistic inputs.
12
+ export function isRecord(value) {
13
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
14
+ }
15
+ // Mirrors @react-navigation's CommonActions.setParams: a shallow merge onto the current params,
16
+ // but only when both sides are genuine plain objects - an array (or any other non-record) on
17
+ // either side means a clean replace instead, never a numeric-key-mangled merge. Shared by
18
+ // navigator-state.ts (Stack) and tab-router-state.ts (Tabs) so the two reducers can't drift on
19
+ // this rule independently.
20
+ export function mergeParams(current, incoming) {
21
+ return isRecord(current) && isRecord(incoming) ? { ...current, ...incoming } : incoming;
22
+ }
23
+ //# sourceMappingURL=guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guards.js","sourceRoot":"","sources":["../../src/core/guards.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+FAA+F;AAC/F,2FAA2F;AAC3F,yFAAyF;AACzF,2EAA2E;AAC3E,EAAE;AACF,0FAA0F;AAC1F,iGAAiG;AACjG,6FAA6F;AAC7F,8FAA8F;AAC9F,uFAAuF;AACvF,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,gGAAgG;AAChG,6FAA6F;AAC7F,0FAA0F;AAC1F,+FAA+F;AAC/F,2BAA2B;AAC3B,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,QAAiB;IAC7D,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ISymbioteEvent } from '@symbiote-native/engine';
2
+ import type { IHeaderBarButtonItem } from './navigator-props';
3
+ export declare function prepareHeaderBarButtonItems(items: IHeaderBarButtonItem[] | undefined, side: 'left' | 'right'): unknown[] | undefined;
4
+ type IHeaderBarButtonDispatch = {
5
+ onPressHeaderBarButtonItem?: (event: ISymbioteEvent) => void;
6
+ onPressHeaderBarButtonMenuItem?: (event: ISymbioteEvent) => void;
7
+ };
8
+ export declare function buildHeaderBarButtonDispatch(leftItems: IHeaderBarButtonItem[] | undefined, rightItems: IHeaderBarButtonItem[] | undefined): IHeaderBarButtonDispatch;
9
+ export {};
@@ -0,0 +1,164 @@
1
+ // Header bar-button payload + dispatch: the native-shaped `headerLeftBarButtonItems`/
2
+ // `headerRightBarButtonItems` fold react-native-screens' own ScreenStackHeaderConfig component
3
+ // would send down, plus the buttonId/menuId -> onPress lookup that answers RNSScreenStackHeader-
4
+ // Config's `onPressHeaderBarButtonItem`/`onPressHeaderBarButtonMenuItem` events. Self-contained:
5
+ // only `resolveHeaderConfigView` (screen-options.ts) calls into this file, as a black box - the
6
+ // id-tagging scheme below is this cluster's own internal invariant, never a cross-file contract.
7
+ import { imageStatics } from '@symbiote-native/components';
8
+ import { processColor } from '@symbiote-native/engine';
9
+ // RNS flattens `icon` into sfSymbolName/xcassetName/imageSource/templateSource at native-payload
10
+ // time (both the structured `icon` field AND the flat native keys reach native - RNS's own
11
+ // prepareHeaderBarButtonItems keeps both), and resolves image assets through the same resolver
12
+ // the Image component uses.
13
+ function prepareIcon(icon) {
14
+ if (!icon)
15
+ return {};
16
+ switch (icon.type) {
17
+ case 'sfSymbol':
18
+ return { sfSymbolName: icon.name };
19
+ case 'xcasset':
20
+ return { xcassetName: icon.name };
21
+ case 'imageSource':
22
+ return { imageSource: imageStatics.resolveAssetSource(icon.imageSource) };
23
+ case 'templateSource':
24
+ return { templateSource: imageStatics.resolveAssetSource(icon.templateSource) };
25
+ }
26
+ }
27
+ // The one id algorithm both the payload tagger (prepareMenuItems/prepareHeaderBarButtonItems)
28
+ // and the dispatch-lookup builder (collectMenuHandlers/collectBarButtonHandlers) call - so a
29
+ // change to the id scheme genuinely can't desync payload tagging from dispatch lookup.
30
+ function buildMenuId(path, index, side) {
31
+ return `${path}-${index}-${side}`;
32
+ }
33
+ function buildButtonId(index, side) {
34
+ return `${index}-${side}`;
35
+ }
36
+ function prepareTitleStyle(titleStyle) {
37
+ if (!titleStyle)
38
+ return undefined;
39
+ return {
40
+ ...titleStyle,
41
+ color: titleStyle.color === undefined ? undefined : processColor(titleStyle.color),
42
+ };
43
+ }
44
+ function prepareBadge(badge) {
45
+ if (!badge)
46
+ return undefined;
47
+ return {
48
+ ...badge,
49
+ style: badge.style
50
+ ? {
51
+ ...badge.style,
52
+ color: badge.style.color === undefined ? undefined : processColor(badge.style.color),
53
+ backgroundColor: badge.style.backgroundColor === undefined
54
+ ? undefined
55
+ : processColor(badge.style.backgroundColor),
56
+ }
57
+ : undefined,
58
+ };
59
+ }
60
+ // onPress is captured separately into the buttonId/menuId -> handler map (collectMenuHandlers/
61
+ // collectBarButtonHandlers below) and must never reach native: a function value fails Fabric's
62
+ // dynamic-value serialization, which silently drops the WHOLE headerLeftBarButtonItems/
63
+ // headerRightBarButtonItems array it's nested in - not just the one bad field - so bar buttons and
64
+ // menu actions never reached native at all, despite the buttonId/menuId dispatch wiring itself
65
+ // being entirely correct.
66
+ function excludeOnPress(item) {
67
+ const { onPress: _onPress, ...rest } = item;
68
+ return rest;
69
+ }
70
+ // Shared fields common to the 'button' and 'menu' item variants (title/icon/tint/badge/...) - the
71
+ // 'spacing' variant carries none of these and passes through untouched.
72
+ function prepareSharedFields(item) {
73
+ return {
74
+ ...(item.type === 'button' ? excludeOnPress(item) : item),
75
+ ...prepareIcon(item.icon),
76
+ titleStyle: prepareTitleStyle(item.titleStyle),
77
+ tintColor: item.tintColor === undefined ? undefined : processColor(item.tintColor),
78
+ badge: prepareBadge(item.badge),
79
+ };
80
+ }
81
+ // Recursively tags every menu action with a `menuId` derived from its tree position
82
+ // (`${path}-${index}-${side}`), mirroring RNS's own prepareMenu exactly - the id must match what
83
+ // buildHeaderBarButtonDispatch computes below, or a press silently no-ops.
84
+ function prepareMenuItems(menuLike, index, side, path = '') {
85
+ return {
86
+ ...menuLike,
87
+ items: menuLike.items.map((menuItem, menuIndex) => {
88
+ const currentPath = path ? `${path}.${menuIndex}` : `${menuIndex}`;
89
+ const icon = prepareIcon(menuItem.icon);
90
+ if (menuItem.type === 'submenu') {
91
+ return { ...menuItem, ...icon, ...prepareMenuItems(menuItem, index, side, currentPath) };
92
+ }
93
+ return {
94
+ ...excludeOnPress(menuItem),
95
+ ...icon,
96
+ menuId: buildMenuId(currentPath, index, side),
97
+ };
98
+ }),
99
+ };
100
+ }
101
+ // Builds the native-shaped payload react-native-screens' own ScreenStackHeaderConfig component
102
+ // would send down (buttonId/menuId-tagged, colors processColor'd) - this is what
103
+ // IHeaderConfigViewProps.headerLeftBarButtonItems/headerRightBarButtonItems actually carry.
104
+ export function prepareHeaderBarButtonItems(items, side) {
105
+ if (!items)
106
+ return undefined;
107
+ return items.map((item, index) => {
108
+ if (item.type === 'spacing')
109
+ return item;
110
+ const prepared = prepareSharedFields(item);
111
+ if (item.type === 'button')
112
+ return { ...prepared, buttonId: buildButtonId(index, side) };
113
+ return { ...prepared, menu: prepareMenuItems(item.menu, index, side) };
114
+ });
115
+ }
116
+ function collectMenuHandlers(items, index, side, path, handlers) {
117
+ items.forEach((item, menuIndex) => {
118
+ const currentPath = path ? `${path}.${menuIndex}` : `${menuIndex}`;
119
+ if (item.type === 'submenu') {
120
+ collectMenuHandlers(item.items, index, side, currentPath, handlers);
121
+ return;
122
+ }
123
+ handlers.set(buildMenuId(currentPath, index, side), item.onPress);
124
+ });
125
+ }
126
+ function collectBarButtonHandlers(items, side, buttonHandlers, menuHandlers) {
127
+ items?.forEach((item, index) => {
128
+ if (item.type === 'button') {
129
+ buttonHandlers.set(buildButtonId(index, side), item.onPress);
130
+ }
131
+ else if (item.type === 'menu') {
132
+ collectMenuHandlers(item.menu.items, index, side, '', menuHandlers);
133
+ }
134
+ });
135
+ }
136
+ function readStringField(record, key) {
137
+ const value = record[key];
138
+ return typeof value === 'string' ? value : undefined;
139
+ }
140
+ // The buttonId/menuId → onPress lookup is built independently from prepareHeaderBarButtonItems'
141
+ // native payload (rather than re-parsing it back out of the `unknown[]` result), over the
142
+ // ORIGINAL typed items - but both sides call the same buildMenuId/buildButtonId, so the id
143
+ // scheme lives in one place and can't desync payload tagging from dispatch lookup.
144
+ export function buildHeaderBarButtonDispatch(leftItems, rightItems) {
145
+ const buttonHandlers = new Map();
146
+ const menuHandlers = new Map();
147
+ collectBarButtonHandlers(leftItems, 'left', buttonHandlers, menuHandlers);
148
+ collectBarButtonHandlers(rightItems, 'right', buttonHandlers, menuHandlers);
149
+ if (buttonHandlers.size === 0 && menuHandlers.size === 0)
150
+ return {};
151
+ return {
152
+ onPressHeaderBarButtonItem: event => {
153
+ const buttonId = readStringField(event.nativeEvent, 'buttonId');
154
+ if (buttonId !== undefined)
155
+ buttonHandlers.get(buttonId)?.();
156
+ },
157
+ onPressHeaderBarButtonMenuItem: event => {
158
+ const menuId = readStringField(event.nativeEvent, 'menuId');
159
+ if (menuId !== undefined)
160
+ menuHandlers.get(menuId)?.();
161
+ },
162
+ };
163
+ }
164
+ //# sourceMappingURL=header-bar-buttons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-bar-buttons.js","sourceRoot":"","sources":["../../src/core/header-bar-buttons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ILinkingConfig } from './linking-config';
2
+ import type { IRoute } from './navigator-state';
3
+ import type { ISearchParams } from './search-params';
4
+ export type IHrefParams = ISearchParams;
5
+ export type IHrefObject = {
6
+ pathname: string;
7
+ params?: IHrefParams;
8
+ };
9
+ export type IHref = string | IHrefObject;
10
+ export type IResolvedHref = {
11
+ name: string;
12
+ params: Record<string, unknown> | undefined;
13
+ };
14
+ export declare function resolveHref(config: ILinkingConfig, href: IHref): IResolvedHref | null;
15
+ export declare function stringifyHref(href: IHref): string;
16
+ export declare function hrefFromRoute(config: ILinkingConfig, route: IRoute<unknown>): string | null;
@@ -0,0 +1,55 @@
1
+ // Href: the URL-shaped navigation target the web-router facade takes, mirroring Expo Router's
2
+ // `Href = string | { pathname, params }` (react-router's `to`, vue-router's `to`). resolveHref
3
+ // turns either form into the { name, params } our by-name navigator handle already pushes —
4
+ // path params (:id) come from the linking config, query/object params merge on top.
5
+ //
6
+ // This is why the web facade REQUIRES a linking config: the config IS the route table (name<->path
7
+ // map), exactly as react-router/vue-router require a route table before you can navigate by path.
8
+ import { resolveRouteFromUrl, resolveUrlFromRoute } from './linking-config';
9
+ import { parseSearchParams, splitPathnameQuery, stringifySearchParams } from './search-params';
10
+ function isRecord(value) {
11
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
12
+ }
13
+ // Peels either Href form down to a bare pathname plus explicit params: a string href's query
14
+ // string is parsed into params, an object href's params are taken as-is. Path params (:id) are
15
+ // resolved later against the config, not here.
16
+ function normalizeHref(href) {
17
+ if (typeof href === 'string') {
18
+ const { pathname, query } = splitPathnameQuery(href);
19
+ return { pathname, params: parseSearchParams(query) };
20
+ }
21
+ return { pathname: href.pathname, params: { ...href.params } };
22
+ }
23
+ // A full-scheme href ('myapp://user/42') is passed through; a bare path ('users/42') gets the
24
+ // leading slash resolveRouteFromUrl's non-prefixed branch expects.
25
+ function toMatchableUrl(pathname) {
26
+ if (pathname.includes('://') || pathname.startsWith('/'))
27
+ return pathname;
28
+ return `/${pathname}`;
29
+ }
30
+ export function resolveHref(config, href) {
31
+ const { pathname, params } = normalizeHref(href);
32
+ const route = resolveRouteFromUrl(config, toMatchableUrl(pathname));
33
+ if (route === null)
34
+ return null;
35
+ const pathParams = isRecord(route.params) ? route.params : {};
36
+ const merged = { ...pathParams, ...params };
37
+ return {
38
+ name: route.name,
39
+ params: Object.keys(merged).length > 0 ? merged : undefined,
40
+ };
41
+ }
42
+ // Collapses an Href to its display/serialized string form ('/users/42?tab=posts'), for a <Link>'s
43
+ // accessibility value or a usePathname read. A string href is already that; an object href joins
44
+ // its pathname with the serialized query.
45
+ export function stringifyHref(href) {
46
+ if (typeof href === 'string')
47
+ return href;
48
+ return `${href.pathname}${stringifySearchParams(href.params ?? {})}`;
49
+ }
50
+ // The reverse direction — a live route back to its URL string — so usePathname/useUnstableGlobalHref
51
+ // have one entry point. Thin pass-through to the linking config's route->url fold.
52
+ export function hrefFromRoute(config, route) {
53
+ return resolveUrlFromRoute(config, route);
54
+ }
55
+ //# sourceMappingURL=href.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"href.js","sourceRoot":"","sources":["../../src/core/href.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,+FAA+F;AAC/F,4FAA4F;AAC5F,oFAAoF;AACpF,EAAE;AACF,mGAAmG;AACnG,kGAAkG;AAGlG,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAgB/F,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,6FAA6F;AAC7F,+FAA+F;AAC/F,+CAA+C;AAC/C,SAAS,aAAa,CAAC,IAAW;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACjE,CAAC;AAED,8FAA8F;AAC9F,mEAAmE;AACnE,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1E,OAAO,IAAI,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsB,EAAE,IAAW;IAC7D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,iGAAiG;AACjG,0CAA0C;AAC1C,MAAM,UAAU,aAAa,CAAC,IAAW;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,qGAAqG;AACrG,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,MAAsB,EAAE,KAAsB;IAC1E,OAAO,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,29 @@
1
+ export * from './constants';
2
+ export { createInitialNavigatorState, navigatorReducer, computeActivityState, isTopRoute, } from './navigator-state';
3
+ export type { IRoute, INavigatorState, INavigatorAction } from './navigator-state';
4
+ export type { IStackAnimation, IStackPresentation, IHeaderBackButtonDisplayMode, IHeaderUserInterfaceStyle, IOptionalBooleanNativeProp, ISheetAllowedDetents, ISheetLargestUndimmedDetent, ISheetInitialDetent, IHeaderBarButtonIcon, IHeaderBarButtonItemBadge, IHeaderBarButtonItemAction, IHeaderBarButtonMenuAction, IHeaderBarButtonSubmenu, IHeaderBarButtonItemMenu, IHeaderBarButtonItemSpacing, IHeaderBarButtonItem, ISearchBarAutoCapitalize, ISearchBarPlacement, ISearchBarOptions, IScreenOrientation, IScreenOptions, INavigatorPlatform, IScreenViewProps, IHeaderConfigViewProps, IStackViewProps, ISearchBarViewProps, } from './navigator-props';
5
+ export { resolveHeaderConfigView, resolveScreenView, resolveSearchBarView } from './screen-options';
6
+ export { buildSearchBarHandle } from './search-bar-commands';
7
+ export type { ISearchBarCommands } from './search-bar-commands';
8
+ export { resolveScreenProps, resolveStackProps, renderHeaderConfig, resolveSearchBarProps, resolveScreenContentWrapperStyle, resolveScreenViewName, isHeaderInModal, resolveHeaderInModalStackStyle, resolveHeaderInModalScreenStyle, buildSearchBarPassthrough, resolveScreenRenderPlan, } from './render-stack';
9
+ export type { IScreenRenderPlanInput, IScreenRenderPlan } from './render-stack';
10
+ export { serializeNavigatorState, deserializeNavigatorState } from './state-persistence';
11
+ export { createNavigationEmitter, diffFocusedRoute, NAVIGATION_EVENT_FOCUS, NAVIGATION_EVENT_BLUR, NAVIGATION_EVENT_STATE, NAVIGATION_EVENT_BEFORE_REMOVE, } from './navigation-events';
12
+ export type { INavigationEmitter, INavigationEventListener, INavigationEventName, IFocusTransition, } from './navigation-events';
13
+ export { isRecord } from './guards';
14
+ export { createInitialTabState, tabRouterReducer, isFocusedRoute } from './tab-router-state';
15
+ export type { ITabRouterState, ITabRouterAction } from './tab-router-state';
16
+ export type { ITabBarIcon, ITabOptions } from './tab-options';
17
+ export { renderTabBarItem, renderTabBar } from './render-tabs';
18
+ export type { ITabBarItemView, ITabBarViewProps } from './render-tabs';
19
+ export { resolveRouteFromUrl, resolveUrlFromRoute } from './linking-config';
20
+ export type { ILinkingConfig, IScreenLinkingConfig } from './linking-config';
21
+ export { createInitialDrawerRouterState, drawerRouterReducer, focusedDrawerRoute, } from './drawer-router-state';
22
+ export type { IDrawerRouterState, IDrawerRouterAction } from './drawer-router-state';
23
+ export type { IDrawerType, IDrawerPosition, IDrawerOptions, IDrawerScreenOptions, IDrawerGeometry, ISwipeIntent, } from './drawer-options';
24
+ export { DRAWER_DEFAULT_TYPE, DRAWER_DEFAULT_POSITION, DRAWER_DEFAULT_WIDTH, DRAWER_DEFAULT_OVERLAY_COLOR, DRAWER_DEFAULT_SWIPE_ENABLED, DRAWER_DEFAULT_SWIPE_EDGE_WIDTH, DRAWER_DEFAULT_SWIPE_MIN_DISTANCE, DRAWER_DEFAULT_SWIPE_MIN_VELOCITY, resolveDrawerType, resolveDrawerPosition, resolveDrawerWidth, isDrawerAnimated, isDrawerOverlayVisible, resolveDrawerGeometry, isSwipeStartInEdge, isHorizontalDrag, resolveSwipeIntent, clamp01, startPageXOf, resolveDragProgress, shouldClaimDrawerSwipe, resolveDrawerSlotInterpolation, } from './drawer-options';
25
+ export type { IDrawerInterpolationRange, IDrawerContentSlotInterpolation, IDrawerOverlaySlotInterpolation, IDrawerPanelSlotInterpolation, } from './drawer-options';
26
+ export { renderDrawer, drawerChildOrder } from './render-drawer';
27
+ export type { IDrawerSlot, IDrawerViewProps } from './render-drawer';
28
+ export type { INavigatorHandle, ITabNavigatorHandle, IDrawerNavigatorHandle, IDrawerDescriptorMap, IAnyNavigatorHandle, } from './navigator-handles';
29
+ export { isStackNavigatorHandle, isTabNavigatorHandle, isDrawerNavigatorHandle, } from './navigator-handles';
@@ -0,0 +1,33 @@
1
+ // @symbiote-native/navigation (core): the framework-agnostic half of the native stack navigator -
2
+ // a pure route-stack reducer plus the react-native-screens prop folds and native-leaf prop
3
+ // resolvers. symbiote ships zero runtime metadata for RNSScreen/RNSScreenStack/
4
+ // RNSScreenStackHeaderConfig - the engine derives their events and color processors from
5
+ // react-native-screens' own ViewConfig - so this layer is the pure JS every adapter reuses
6
+ // verbatim, supplying only its lifecycle (route-key generation, useReducer/reactive state) and
7
+ // the descriptor bridge.
8
+ export * from './constants';
9
+ export { createInitialNavigatorState, navigatorReducer, computeActivityState, isTopRoute, } from './navigator-state';
10
+ export { resolveHeaderConfigView, resolveScreenView, resolveSearchBarView } from './screen-options';
11
+ export { buildSearchBarHandle } from './search-bar-commands';
12
+ export { resolveScreenProps, resolveStackProps, renderHeaderConfig, resolveSearchBarProps, resolveScreenContentWrapperStyle, resolveScreenViewName, isHeaderInModal, resolveHeaderInModalStackStyle, resolveHeaderInModalScreenStyle, buildSearchBarPassthrough, resolveScreenRenderPlan, } from './render-stack';
13
+ export { serializeNavigatorState, deserializeNavigatorState } from './state-persistence';
14
+ export { createNavigationEmitter, diffFocusedRoute, NAVIGATION_EVENT_FOCUS, NAVIGATION_EVENT_BLUR, NAVIGATION_EVENT_STATE, NAVIGATION_EVENT_BEFORE_REMOVE, } from './navigation-events';
15
+ // Runtime guards shared across core (and re-exported for adapters narrowing their own untyped
16
+ // inputs - vnode props, gesture/event data, persisted JSON) - see guards.ts's header for which
17
+ // call sites this consolidates and why array-exclusion is the right default everywhere it's used.
18
+ export { isRecord } from './guards';
19
+ // Bottom-tabs navigator: a FOCUSED-INDEX router (not a stack - see tab-router-state.ts) driving
20
+ // a pure-JS tab bar render, framework-agnostic and shared verbatim by every adapter.
21
+ export { createInitialTabState, tabRouterReducer, isFocusedRoute } from './tab-router-state';
22
+ export { renderTabBarItem, renderTabBar } from './render-tabs';
23
+ // Linking config: resolves a URL to a route (and back), the piece @react-navigation's
24
+ // NavigationContainer `linking` prop provides on top of the framework-agnostic Linking module.
25
+ export { resolveRouteFromUrl, resolveUrlFromRoute } from './linking-config';
26
+ // Drawer navigator: an OPEN/CLOSED-flag router over a fixed route list (see
27
+ // drawer-router-state.ts's header for why it isn't a push/pop stack), a pure swipe/geometry math
28
+ // module, and a Descriptor render fn - all framework-agnostic, shared verbatim by every adapter.
29
+ export { createInitialDrawerRouterState, drawerRouterReducer, focusedDrawerRoute, } from './drawer-router-state';
30
+ export { DRAWER_DEFAULT_TYPE, DRAWER_DEFAULT_POSITION, DRAWER_DEFAULT_WIDTH, DRAWER_DEFAULT_OVERLAY_COLOR, DRAWER_DEFAULT_SWIPE_ENABLED, DRAWER_DEFAULT_SWIPE_EDGE_WIDTH, DRAWER_DEFAULT_SWIPE_MIN_DISTANCE, DRAWER_DEFAULT_SWIPE_MIN_VELOCITY, resolveDrawerType, resolveDrawerPosition, resolveDrawerWidth, isDrawerAnimated, isDrawerOverlayVisible, resolveDrawerGeometry, isSwipeStartInEdge, isHorizontalDrag, resolveSwipeIntent, clamp01, startPageXOf, resolveDragProgress, shouldClaimDrawerSwipe, resolveDrawerSlotInterpolation, } from './drawer-options';
31
+ export { renderDrawer, drawerChildOrder } from './render-drawer';
32
+ export { isStackNavigatorHandle, isTabNavigatorHandle, isDrawerNavigatorHandle, } from './navigator-handles';
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,2FAA2F;AAC3F,gFAAgF;AAChF,yFAAyF;AACzF,2FAA2F;AAC3F,+FAA+F;AAC/F,yBAAyB;AAEzB,cAAc,aAAa,CAAC;AAE5B,OAAO,EACL,2BAA2B,EAC3B,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,GACX,MAAM,mBAAmB,CAAC;AAgC3B,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,qBAAqB,EACrB,eAAe,EACf,8BAA8B,EAC9B,+BAA+B,EAC/B,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAQ7B,8FAA8F;AAC9F,+FAA+F;AAC/F,kGAAkG;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,gGAAgG;AAChG,qFAAqF;AACrF,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAK7F,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG/D,sFAAsF;AACtF,+FAA+F;AAC/F,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5E,4EAA4E;AAC5E,iGAAiG;AACjG,iGAAiG;AACjG,OAAO,EACL,8BAA8B,EAC9B,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAW/B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,4BAA4B,EAC5B,+BAA+B,EAC/B,iCAAiC,EACjC,iCAAiC,EACjC,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACtB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAYjE,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { IRoute } from '../navigator-state';
2
+ export type IScreenLinkingConfig = string | {
3
+ path?: string;
4
+ screens?: Record<string, IScreenLinkingConfig>;
5
+ };
6
+ export type ILinkingConfig = {
7
+ prefixes: string[];
8
+ config: {
9
+ screens: Record<string, IScreenLinkingConfig>;
10
+ };
11
+ };
12
+ export declare function resolveRouteFromUrl(config: ILinkingConfig, url: string): IRoute<unknown> | null;
13
+ export declare function resolveUrlFromRoute(config: ILinkingConfig, route: IRoute<unknown>): string | null;
@@ -0,0 +1,172 @@
1
+ // Linking config: the piece @react-navigation's `NavigationContainer`'s `linking` prop provides
2
+ // on top of the framework-agnostic `Linking` module (core/engine/src/linking) - resolving a URL
3
+ // ('myapp://user/42', '/user/42') to a route, and a route back to a URL. This is OUR OWN type,
4
+ // not imported from react-navigation, kept close to its shape (`prefixes` + `config.screens`)
5
+ // only so the DX is familiar.
6
+ //
7
+ // Why hand-rolled matching instead of react-router's `matchPath`/`generatePath` (evaluated per
8
+ // task): react-router 8's package has no subpath export for the pure `lib/router/utils.ts`
9
+ // matcher - its only general entry point (`.`) eagerly imports `./lib/dom/*`
10
+ // (BrowserRouter/ScrollRestoration/cookies) and `./lib/server-runtime/*`, code that assumes DOM
11
+ // and Node globals a Metro/Hermes RN bundle doesn't have; its `peerDependencies` also pin
12
+ // `react-dom`, which this DOM-free monorepo never installs (see CLAUDE.md
13
+ // react_native_is_an_explicit_top_level_peer - no foreign runtime singleton gets smuggled in).
14
+ // On top of the bundling risk, `matchPath`'s/`generatePath`'s param-name extraction is a
15
+ // template-literal-type trick that only fires for a compile-time LITERAL path string; our
16
+ // patterns come from a runtime config object (`Path` widens to plain `string`), so the generic
17
+ // degrades to an empty params type and using the result would force an `as` cast - forbidden by
18
+ // this project's TS conventions. A minimal `:param`-segment matcher sidesteps both problems and
19
+ // is the right size for a single flat Stack (no optional/splat segments - no nested-navigator use
20
+ // for them yet).
21
+ import { dlog } from '@symbiote-native/engine';
22
+ import { isRecord } from '../guards';
23
+ // Strips leading/trailing slashes so segments join predictably regardless of how the caller
24
+ // wrote a path ('feed/:sort', '/feed/:sort/', etc).
25
+ function normalizeSegment(segment) {
26
+ return segment.replace(/^\/+|\/+$/g, '');
27
+ }
28
+ function joinPath(parent, child) {
29
+ const parts = [normalizeSegment(parent), normalizeSegment(child)].filter(part => part.length > 0);
30
+ return parts.join('/');
31
+ }
32
+ // Walks `screens` recursively, accumulating the path down to each LEAF screen. Unlike
33
+ // react-navigation (which resolves nested config into nested navigation state), our navigator is
34
+ // a single flat Stack - a `screens` group with no `path` of its own is transparent (consumes no
35
+ // URL segment); a group WITH a `path` but no nested `screens` is itself a leaf using that path.
36
+ function flattenScreens(screens, parentPath, out) {
37
+ for (const [name, entry] of Object.entries(screens)) {
38
+ if (typeof entry === 'string') {
39
+ out.push({ name, pattern: joinPath(parentPath, entry) });
40
+ continue;
41
+ }
42
+ const nextParent = entry.path !== undefined ? joinPath(parentPath, entry.path) : parentPath;
43
+ if (entry.screens !== undefined) {
44
+ flattenScreens(entry.screens, nextParent, out);
45
+ }
46
+ else if (entry.path !== undefined) {
47
+ out.push({ name, pattern: nextParent });
48
+ }
49
+ else {
50
+ dlog(`linking-config: screen "${name}" has neither a path nor nested screens, skipping`);
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ function dynamicSegmentCount(pattern) {
56
+ if (pattern.length === 0)
57
+ return 0;
58
+ return pattern.split('/').filter(segment => segment.startsWith(':')).length;
59
+ }
60
+ function segmentCount(pattern) {
61
+ return pattern.length === 0 ? 0 : pattern.split('/').length;
62
+ }
63
+ // More static segments should win over a param that would also match (e.g. a literal
64
+ // '/user/me' pattern over '/user/:id'), mirroring how react-navigation prefers exact matches.
65
+ function bySpecificity(a, b) {
66
+ const dynamicDiff = dynamicSegmentCount(a.pattern) - dynamicSegmentCount(b.pattern);
67
+ if (dynamicDiff !== 0)
68
+ return dynamicDiff;
69
+ return segmentCount(b.pattern) - segmentCount(a.pattern);
70
+ }
71
+ function matchPattern(pattern, pathname) {
72
+ const patternSegments = pattern.length === 0 ? [] : pattern.split('/');
73
+ const pathSegments = pathname.length === 0 ? [] : pathname.split('/');
74
+ if (patternSegments.length !== pathSegments.length)
75
+ return null;
76
+ const params = {};
77
+ for (let index = 0; index < patternSegments.length; index += 1) {
78
+ const patternSegment = patternSegments[index];
79
+ const pathSegment = pathSegments[index];
80
+ if (patternSegment.startsWith(':')) {
81
+ params[patternSegment.slice(1)] = decodeURIComponent(pathSegment);
82
+ }
83
+ else if (patternSegment !== pathSegment) {
84
+ return null;
85
+ }
86
+ }
87
+ return params;
88
+ }
89
+ function stripQueryAndHash(url) {
90
+ const match = /[?#]/.exec(url);
91
+ return match === null ? url : url.slice(0, match.index);
92
+ }
93
+ // Resolves a full URL down to the bare path segment string ('user/42', no leading slash) by
94
+ // stripping the longest matching configured prefix, falling back to treating the URL as an
95
+ // already-bare path when it starts with '/' (the task's second example form). Returns null when
96
+ // neither applies - an unrecognized scheme/host, not "no route matched".
97
+ function extractPathname(config, url) {
98
+ const withoutQuery = stripQueryAndHash(url);
99
+ const sortedPrefixes = [...config.prefixes].sort((a, b) => b.length - a.length);
100
+ for (const prefix of sortedPrefixes) {
101
+ if (withoutQuery.startsWith(prefix)) {
102
+ return normalizeSegment(withoutQuery.slice(prefix.length));
103
+ }
104
+ }
105
+ if (withoutQuery.startsWith('/'))
106
+ return normalizeSegment(withoutQuery);
107
+ return null;
108
+ }
109
+ export function resolveRouteFromUrl(config, url) {
110
+ const pathname = extractPathname(config, url);
111
+ if (pathname === null) {
112
+ dlog(`linking-config: url "${url}" matched no configured prefix`);
113
+ return null;
114
+ }
115
+ const candidates = flattenScreens(config.config.screens, '', []).sort(bySpecificity);
116
+ for (const candidate of candidates) {
117
+ const params = matchPattern(candidate.pattern, pathname);
118
+ if (params !== null) {
119
+ dlog(`linking-config: resolved "${url}" -> ${candidate.name}`);
120
+ // `key` is not real route identity here - the navigator mints its own on push/replace
121
+ // (stack.ts's createRoute); `name` is a stable enough placeholder to satisfy IRoute's shape.
122
+ return {
123
+ key: candidate.name,
124
+ name: candidate.name,
125
+ params: Object.keys(params).length > 0 ? params : undefined,
126
+ };
127
+ }
128
+ }
129
+ dlog(`linking-config: url "${url}" (path "${pathname}") matched no configured screen`);
130
+ return null;
131
+ }
132
+ // The inverse of matchPattern: fills a pattern's ':param' segments from `params`, or returns
133
+ // null when a required param is missing (mirrors react-router's generatePath throwing, minus the
134
+ // throw - a resolver returning null reads more naturally at the call site here).
135
+ function fillPattern(pattern, params) {
136
+ if (pattern.length === 0)
137
+ return '';
138
+ const source = isRecord(params) ? params : {};
139
+ const segments = [];
140
+ for (const segment of pattern.split('/')) {
141
+ if (!segment.startsWith(':')) {
142
+ segments.push(segment);
143
+ continue;
144
+ }
145
+ const value = source[segment.slice(1)];
146
+ if (value === undefined || value === null)
147
+ return null;
148
+ segments.push(encodeURIComponent(String(value)));
149
+ }
150
+ return segments.join('/');
151
+ }
152
+ export function resolveUrlFromRoute(config, route) {
153
+ const candidate = flattenScreens(config.config.screens, '', []).find(entry => entry.name === route.name);
154
+ if (candidate === undefined) {
155
+ dlog(`linking-config: no configured screen for route name "${route.name}"`);
156
+ return null;
157
+ }
158
+ const path = fillPattern(candidate.pattern, route.params);
159
+ if (path === null) {
160
+ dlog(`linking-config: route "${route.name}" is missing a param required by "${candidate.pattern}"`);
161
+ return null;
162
+ }
163
+ const prefix = config.prefixes[0];
164
+ if (prefix === undefined)
165
+ return path.length > 0 ? `/${path}` : '/';
166
+ // A prefix already carrying its own trailing separator ('myapp://') must not be truncated to
167
+ // 'myapp:/' by naively slicing one char off - only add a '/' when the prefix doesn't have one.
168
+ if (path.length === 0)
169
+ return prefix;
170
+ return prefix.endsWith('/') ? `${prefix}${path}` : `${prefix}/${path}`;
171
+ }
172
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/linking-config/index.ts"],"names":[],"mappings":"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"}