one 1.22.0 → 1.23.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 (691) hide show
  1. package/dist/cjs/Root.cjs +2 -2
  2. package/dist/cjs/Root.native.js +2 -2
  3. package/dist/cjs/Root.native.js.map +1 -1
  4. package/dist/cjs/createApp.cjs +12 -35
  5. package/dist/cjs/createHandleRequest.cjs +4 -2
  6. package/dist/cjs/createHandleRequest.native.js +4 -2
  7. package/dist/cjs/createHandleRequest.native.js.map +1 -1
  8. package/dist/cjs/fallbackViews/Sitemap.cjs +123 -55
  9. package/dist/cjs/fallbackViews/Sitemap.native.js.map +1 -1
  10. package/dist/cjs/fallbackViews/Unmatched.cjs +92 -37
  11. package/dist/cjs/fallbackViews/Unmatched.native.js.map +1 -1
  12. package/dist/cjs/fork/NavigationContainer.cjs +4 -3
  13. package/dist/cjs/fork/NavigationContainer.native.js +4 -3
  14. package/dist/cjs/fork/NavigationContainer.native.js.map +1 -1
  15. package/dist/cjs/{router/renderingRegistry.cjs → fork/localeDirection.cjs} +6 -29
  16. package/dist/cjs/{router/web/ScreenRenderContext.cjs → fork/localeDirection.native.js} +10 -12
  17. package/dist/cjs/fork/localeDirection.native.js.map +1 -0
  18. package/dist/cjs/fork/theme.cjs +71 -0
  19. package/dist/cjs/{router/renderingRegistry.native.js → fork/theme.native.js} +7 -31
  20. package/dist/cjs/fork/theme.native.js.map +1 -0
  21. package/dist/cjs/headless/Presentations.cjs +51 -0
  22. package/dist/cjs/headless/Presentations.native.js +56 -0
  23. package/dist/cjs/headless/Presentations.native.js.map +1 -0
  24. package/dist/cjs/headless/children.cjs +43 -0
  25. package/dist/cjs/headless/children.native.js +46 -0
  26. package/dist/cjs/headless/children.native.js.map +1 -0
  27. package/dist/cjs/headless/devHeadlessNote.cjs +34 -0
  28. package/dist/cjs/{router/web/ScreenRenderContext.native.js → headless/devHeadlessNote.native.js} +11 -12
  29. package/dist/cjs/headless/devHeadlessNote.native.js.map +1 -0
  30. package/dist/cjs/headless/keepMounted.cjs +58 -0
  31. package/dist/cjs/headless/keepMounted.native.js +64 -0
  32. package/dist/cjs/headless/keepMounted.native.js.map +1 -0
  33. package/dist/cjs/headless/types.cjs +18 -0
  34. package/dist/cjs/headless/types.native.js +21 -0
  35. package/dist/cjs/headless/types.native.js.map +1 -0
  36. package/dist/cjs/headless/useDrawer.cjs +83 -0
  37. package/dist/cjs/headless/useDrawer.native.js +95 -0
  38. package/dist/cjs/headless/useDrawer.native.js.map +1 -0
  39. package/dist/cjs/headless/useStack.cjs +75 -0
  40. package/dist/cjs/headless/useStack.native.js +79 -0
  41. package/dist/cjs/headless/useStack.native.js.map +1 -0
  42. package/dist/cjs/headless/useTabs.cjs +62 -0
  43. package/dist/cjs/headless/useTabs.native.js +65 -0
  44. package/dist/cjs/headless/useTabs.native.js.map +1 -0
  45. package/dist/cjs/index.cjs +8 -3
  46. package/dist/cjs/index.native.js +8 -3
  47. package/dist/cjs/index.native.js.map +1 -1
  48. package/dist/cjs/layouts/Drawer.cjs +71 -42
  49. package/dist/cjs/layouts/Drawer.native.js +1 -25
  50. package/dist/cjs/layouts/Drawer.native.js.map +1 -1
  51. package/dist/cjs/layouts/Stack.cjs +9 -13
  52. package/dist/cjs/layouts/Stack.native.js +11 -13
  53. package/dist/cjs/layouts/Stack.native.js.map +1 -1
  54. package/dist/cjs/layouts/Tabs.cjs +104 -88
  55. package/dist/cjs/layouts/Tabs.native.js +1 -13
  56. package/dist/cjs/layouts/Tabs.native.js.map +1 -1
  57. package/dist/cjs/layouts/stack-navigator.cjs +10 -2
  58. package/dist/cjs/layouts/stack-navigator.native.js +5 -1
  59. package/dist/cjs/layouts/stack-navigator.native.js.map +1 -1
  60. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.cjs +4 -0
  61. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js +4 -0
  62. package/dist/cjs/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  63. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.cjs +13 -9
  64. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js +13 -9
  65. package/dist/cjs/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  66. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.cjs +4 -0
  67. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js +4 -0
  68. package/dist/cjs/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  69. package/dist/cjs/layouts/stack-utils/StackHeaderRight.cjs +4 -0
  70. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js +4 -0
  71. package/dist/cjs/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  72. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.cjs +4 -0
  73. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js +4 -0
  74. package/dist/cjs/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  75. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.cjs +8 -4
  76. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js +8 -4
  77. package/dist/cjs/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  78. package/dist/cjs/layouts/stack-utils/StackScreen.cjs +10 -23
  79. package/dist/cjs/layouts/stack-utils/StackScreen.native.js +21 -27
  80. package/dist/cjs/layouts/stack-utils/StackScreen.native.js.map +1 -1
  81. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.cjs +11 -6
  82. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js +15 -6
  83. package/dist/cjs/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  84. package/dist/cjs/layouts/stack-utils/index.cjs +2 -0
  85. package/dist/cjs/layouts/stack-utils/index.native.js +2 -0
  86. package/dist/cjs/layouts/stack-utils/index.native.js.map +1 -1
  87. package/dist/cjs/layouts/withLayoutContext.cjs +2 -2
  88. package/dist/cjs/layouts/withLayoutContext.native.js +2 -2
  89. package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
  90. package/dist/cjs/link/Link.cjs +55 -69
  91. package/dist/cjs/link/Link.native.js.map +1 -1
  92. package/dist/cjs/link/useLinkTo.cjs +3 -17
  93. package/dist/cjs/link/useLinkTo.native.js +1 -23
  94. package/dist/cjs/link/useLinkTo.native.js.map +1 -1
  95. package/dist/cjs/metro-config/withOne.test.native.js.map +1 -1
  96. package/dist/cjs/router/getRouteArtifactPath.test.native.js.map +1 -1
  97. package/dist/cjs/router/router.cjs +2 -2
  98. package/dist/cjs/router/router.native.js +2 -2
  99. package/dist/cjs/router/router.native.js.map +1 -1
  100. package/dist/cjs/router/useScreens.cjs +31 -72
  101. package/dist/cjs/router/useScreens.native.js +15 -71
  102. package/dist/cjs/router/useScreens.native.js.map +1 -1
  103. package/dist/cjs/router/web/WebStackNavigator.cjs +8 -7
  104. package/dist/cjs/router/web/WebStackNavigator.native.js +8 -7
  105. package/dist/cjs/router/web/WebStackNavigator.native.js.map +1 -1
  106. package/dist/cjs/router/web/WebStackView.cjs +108 -131
  107. package/dist/cjs/router/web/WebStackView.native.js +117 -176
  108. package/dist/cjs/router/web/WebStackView.native.js.map +1 -1
  109. package/dist/cjs/router/web/stackStateUtils.native.js.map +1 -1
  110. package/dist/cjs/screensFeatureFlags.cjs +1 -16
  111. package/dist/cjs/screensFeatureFlags.native.js +3 -3
  112. package/dist/cjs/screensFeatureFlags.native.js.map +1 -1
  113. package/dist/cjs/typed-routes/generateRouteTypes.cjs +3 -10
  114. package/dist/cjs/typed-routes/generateRouteTypes.native.js +3 -10
  115. package/dist/cjs/typed-routes/generateRouteTypes.native.js.map +1 -1
  116. package/dist/cjs/ui/Slot.cjs +4 -25
  117. package/dist/cjs/ui/Slot.native.js.map +1 -1
  118. package/dist/cjs/ui/TabList.cjs +7 -19
  119. package/dist/cjs/ui/TabList.native.js.map +1 -1
  120. package/dist/cjs/ui/TabSlot.cjs +15 -47
  121. package/dist/cjs/ui/TabSlot.native.js.map +1 -1
  122. package/dist/cjs/ui/TabTrigger.cjs +30 -134
  123. package/dist/cjs/ui/TabTrigger.native.js +14 -115
  124. package/dist/cjs/ui/TabTrigger.native.js.map +1 -1
  125. package/dist/cjs/ui/Tabs.cjs +15 -155
  126. package/dist/cjs/ui/Tabs.native.js +4 -144
  127. package/dist/cjs/ui/Tabs.native.js.map +1 -1
  128. package/dist/cjs/ui/Tabs.shared.cjs +160 -0
  129. package/dist/cjs/ui/Tabs.shared.native.js +174 -0
  130. package/dist/cjs/ui/Tabs.shared.native.js.map +1 -0
  131. package/dist/cjs/ui/useTabTrigger.cjs +122 -0
  132. package/dist/cjs/ui/useTabTrigger.native.js +125 -0
  133. package/dist/cjs/ui/useTabTrigger.native.js.map +1 -0
  134. package/dist/cjs/useBlocker.cjs +55 -93
  135. package/dist/cjs/utils/platform.cjs +28 -0
  136. package/dist/cjs/utils/platform.native.js +32 -0
  137. package/dist/cjs/utils/platform.native.js.map +1 -0
  138. package/dist/cjs/utils/routeIndex.cjs +80 -0
  139. package/dist/cjs/utils/routeIndex.native.js +86 -0
  140. package/dist/cjs/utils/routeIndex.native.js.map +1 -0
  141. package/dist/cjs/utils/routeIndex.test.cjs +51 -0
  142. package/dist/cjs/utils/routeIndex.test.native.js +54 -0
  143. package/dist/cjs/utils/routeIndex.test.native.js.map +1 -0
  144. package/dist/cjs/utils/style.cjs +21 -1
  145. package/dist/cjs/utils/style.native.js +40 -1
  146. package/dist/cjs/utils/style.native.js.map +1 -1
  147. package/dist/cjs/views/LoadProgressBar.cjs +59 -23
  148. package/dist/cjs/views/LoadProgressBar.native.js.map +1 -1
  149. package/dist/cjs/views/Protected.cjs +4 -0
  150. package/dist/cjs/views/Protected.native.js +4 -0
  151. package/dist/cjs/views/Protected.native.js.map +1 -1
  152. package/dist/cjs/views/RootErrorBoundary.cjs +107 -148
  153. package/dist/cjs/views/RootErrorBoundary.native.js +30 -140
  154. package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
  155. package/dist/cjs/views/RouteErrorView.cjs +108 -0
  156. package/dist/cjs/views/RouteErrorView.native.js +110 -0
  157. package/dist/cjs/views/RouteErrorView.native.js.map +1 -0
  158. package/dist/cjs/views/Screen.cjs +5 -1
  159. package/dist/cjs/views/Screen.native.js +4 -0
  160. package/dist/cjs/views/Screen.native.js.map +1 -1
  161. package/dist/cjs/vite/getManifest.cjs +4 -20
  162. package/dist/cjs/vite/getManifest.native.js +4 -20
  163. package/dist/cjs/vite/getManifest.native.js.map +1 -1
  164. package/dist/cjs/vite/one.cjs +10 -45
  165. package/dist/cjs/vite/one.native.js +18 -55
  166. package/dist/cjs/vite/one.native.js.map +1 -1
  167. package/dist/cjs/vite/plugins/bundledDevPlugin.native.js.map +1 -1
  168. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.cjs +10 -5
  169. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +10 -5
  170. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  171. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.cjs +12 -2
  172. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js +12 -2
  173. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  174. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.cjs +10 -6
  175. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +11 -7
  176. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  177. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.cjs +79 -0
  178. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.native.js +84 -0
  179. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.native.js.map +1 -0
  180. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.cjs +74 -0
  181. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.native.js +83 -0
  182. package/dist/cjs/vite/plugins/routeModuleHmrPlugin.test.native.js.map +1 -0
  183. package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +2 -5
  184. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +11 -10
  185. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  186. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.cjs +10 -2
  187. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js +14 -2
  188. package/dist/cjs/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  189. package/dist/esm/Root.mjs +1 -1
  190. package/dist/esm/Root.mjs.map +1 -1
  191. package/dist/esm/Root.native.js +1 -1
  192. package/dist/esm/Root.native.js.map +1 -1
  193. package/dist/esm/createApp.mjs +12 -35
  194. package/dist/esm/createApp.mjs.map +1 -1
  195. package/dist/esm/createHandleRequest.mjs +4 -2
  196. package/dist/esm/createHandleRequest.mjs.map +1 -1
  197. package/dist/esm/createHandleRequest.native.js +4 -2
  198. package/dist/esm/createHandleRequest.native.js.map +1 -1
  199. package/dist/esm/fallbackViews/Sitemap.mjs +110 -53
  200. package/dist/esm/fallbackViews/Sitemap.mjs.map +1 -1
  201. package/dist/esm/fallbackViews/Sitemap.native.js.map +1 -1
  202. package/dist/esm/fallbackViews/Unmatched.mjs +89 -34
  203. package/dist/esm/fallbackViews/Unmatched.mjs.map +1 -1
  204. package/dist/esm/fallbackViews/Unmatched.native.js.map +1 -1
  205. package/dist/esm/fork/NavigationContainer.mjs +4 -3
  206. package/dist/esm/fork/NavigationContainer.mjs.map +1 -1
  207. package/dist/esm/fork/NavigationContainer.native.js +4 -3
  208. package/dist/esm/fork/NavigationContainer.native.js.map +1 -1
  209. package/dist/esm/fork/localeDirection.mjs +5 -0
  210. package/dist/esm/fork/localeDirection.mjs.map +1 -0
  211. package/dist/esm/fork/localeDirection.native.js +6 -0
  212. package/dist/esm/fork/localeDirection.native.js.map +1 -0
  213. package/dist/esm/fork/theme.mjs +45 -0
  214. package/dist/esm/fork/theme.mjs.map +1 -0
  215. package/dist/esm/fork/theme.native.js +3 -0
  216. package/dist/esm/fork/theme.native.js.map +1 -0
  217. package/dist/esm/headless/Presentations.mjs +25 -0
  218. package/dist/esm/headless/Presentations.mjs.map +1 -0
  219. package/dist/esm/headless/Presentations.native.js +28 -0
  220. package/dist/esm/headless/Presentations.native.js.map +1 -0
  221. package/dist/esm/headless/children.mjs +16 -0
  222. package/dist/esm/headless/children.mjs.map +1 -0
  223. package/dist/esm/headless/children.native.js +16 -0
  224. package/dist/esm/headless/children.native.js.map +1 -0
  225. package/dist/esm/headless/devHeadlessNote.mjs +9 -0
  226. package/dist/esm/headless/devHeadlessNote.mjs.map +1 -0
  227. package/dist/esm/headless/devHeadlessNote.native.js +9 -0
  228. package/dist/esm/headless/devHeadlessNote.native.js.map +1 -0
  229. package/dist/esm/headless/keepMounted.mjs +32 -0
  230. package/dist/esm/headless/keepMounted.mjs.map +1 -0
  231. package/dist/esm/headless/keepMounted.native.js +36 -0
  232. package/dist/esm/headless/keepMounted.native.js.map +1 -0
  233. package/dist/esm/headless/types.mjs +2 -0
  234. package/dist/esm/headless/types.mjs.map +1 -0
  235. package/dist/esm/headless/types.native.js +2 -0
  236. package/dist/esm/headless/types.native.js.map +1 -0
  237. package/dist/esm/headless/useDrawer.mjs +57 -0
  238. package/dist/esm/headless/useDrawer.mjs.map +1 -0
  239. package/dist/esm/headless/useDrawer.native.js +67 -0
  240. package/dist/esm/headless/useDrawer.native.js.map +1 -0
  241. package/dist/esm/headless/useStack.mjs +49 -0
  242. package/dist/esm/headless/useStack.mjs.map +1 -0
  243. package/dist/esm/headless/useStack.native.js +51 -0
  244. package/dist/esm/headless/useStack.native.js.map +1 -0
  245. package/dist/esm/headless/useTabs.mjs +37 -0
  246. package/dist/esm/headless/useTabs.mjs.map +1 -0
  247. package/dist/esm/headless/useTabs.native.js +38 -0
  248. package/dist/esm/headless/useTabs.native.js.map +1 -0
  249. package/dist/esm/index.js +5 -2
  250. package/dist/esm/index.js.map +1 -1
  251. package/dist/esm/index.mjs +5 -2
  252. package/dist/esm/index.mjs.map +1 -1
  253. package/dist/esm/index.native.js +5 -2
  254. package/dist/esm/index.native.js.map +1 -1
  255. package/dist/esm/layouts/Drawer.mjs +69 -29
  256. package/dist/esm/layouts/Drawer.mjs.map +1 -1
  257. package/dist/esm/layouts/Drawer.native.js +2 -26
  258. package/dist/esm/layouts/Drawer.native.js.map +1 -1
  259. package/dist/esm/layouts/Stack.mjs +10 -14
  260. package/dist/esm/layouts/Stack.mjs.map +1 -1
  261. package/dist/esm/layouts/Stack.native.js +12 -14
  262. package/dist/esm/layouts/Stack.native.js.map +1 -1
  263. package/dist/esm/layouts/Tabs.mjs +101 -74
  264. package/dist/esm/layouts/Tabs.mjs.map +1 -1
  265. package/dist/esm/layouts/Tabs.native.js +2 -14
  266. package/dist/esm/layouts/Tabs.native.js.map +1 -1
  267. package/dist/esm/layouts/stack-navigator.mjs +8 -1
  268. package/dist/esm/layouts/stack-navigator.mjs.map +1 -1
  269. package/dist/esm/layouts/stack-navigator.native.js +4 -1
  270. package/dist/esm/layouts/stack-navigator.native.js.map +1 -1
  271. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs +4 -0
  272. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.mjs.map +1 -1
  273. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js +4 -0
  274. package/dist/esm/layouts/stack-utils/StackHeaderBackButton.native.js.map +1 -1
  275. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs +7 -3
  276. package/dist/esm/layouts/stack-utils/StackHeaderComponent.mjs.map +1 -1
  277. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js +7 -3
  278. package/dist/esm/layouts/stack-utils/StackHeaderComponent.native.js.map +1 -1
  279. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs +4 -0
  280. package/dist/esm/layouts/stack-utils/StackHeaderLeft.mjs.map +1 -1
  281. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js +4 -0
  282. package/dist/esm/layouts/stack-utils/StackHeaderLeft.native.js.map +1 -1
  283. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs +4 -0
  284. package/dist/esm/layouts/stack-utils/StackHeaderRight.mjs.map +1 -1
  285. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js +4 -0
  286. package/dist/esm/layouts/stack-utils/StackHeaderRight.native.js.map +1 -1
  287. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs +4 -0
  288. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.mjs.map +1 -1
  289. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js +4 -0
  290. package/dist/esm/layouts/stack-utils/StackHeaderSearchBar.native.js.map +1 -1
  291. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs +9 -5
  292. package/dist/esm/layouts/stack-utils/StackHeaderTitle.mjs.map +1 -1
  293. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js +9 -5
  294. package/dist/esm/layouts/stack-utils/StackHeaderTitle.native.js.map +1 -1
  295. package/dist/esm/layouts/stack-utils/StackScreen.mjs +10 -23
  296. package/dist/esm/layouts/stack-utils/StackScreen.mjs.map +1 -1
  297. package/dist/esm/layouts/stack-utils/StackScreen.native.js +23 -29
  298. package/dist/esm/layouts/stack-utils/StackScreen.native.js.map +1 -1
  299. package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs +12 -7
  300. package/dist/esm/layouts/stack-utils/__tests__/composition.test.mjs.map +1 -1
  301. package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js +16 -7
  302. package/dist/esm/layouts/stack-utils/__tests__/composition.test.native.js.map +1 -1
  303. package/dist/esm/layouts/stack-utils/index.mjs +2 -0
  304. package/dist/esm/layouts/stack-utils/index.mjs.map +1 -1
  305. package/dist/esm/layouts/stack-utils/index.native.js +2 -0
  306. package/dist/esm/layouts/stack-utils/index.native.js.map +1 -1
  307. package/dist/esm/layouts/withLayoutContext.mjs +2 -2
  308. package/dist/esm/layouts/withLayoutContext.mjs.map +1 -1
  309. package/dist/esm/layouts/withLayoutContext.native.js +2 -2
  310. package/dist/esm/layouts/withLayoutContext.native.js.map +1 -1
  311. package/dist/esm/link/Link.mjs +57 -68
  312. package/dist/esm/link/Link.mjs.map +1 -1
  313. package/dist/esm/link/useLinkTo.mjs +4 -19
  314. package/dist/esm/link/useLinkTo.mjs.map +1 -1
  315. package/dist/esm/link/useLinkTo.native.js +2 -25
  316. package/dist/esm/link/useLinkTo.native.js.map +1 -1
  317. package/dist/esm/metro-config/withOne.test.mjs.map +1 -1
  318. package/dist/esm/metro-config/withOne.test.native.js.map +1 -1
  319. package/dist/esm/router/getRouteArtifactPath.test.mjs.map +1 -1
  320. package/dist/esm/router/getRouteArtifactPath.test.native.js.map +1 -1
  321. package/dist/esm/router/router.mjs +2 -2
  322. package/dist/esm/router/router.mjs.map +1 -1
  323. package/dist/esm/router/router.native.js +2 -2
  324. package/dist/esm/router/router.native.js.map +1 -1
  325. package/dist/esm/router/useScreens.mjs +30 -71
  326. package/dist/esm/router/useScreens.mjs.map +1 -1
  327. package/dist/esm/router/useScreens.native.js +13 -69
  328. package/dist/esm/router/useScreens.native.js.map +1 -1
  329. package/dist/esm/router/web/WebStackNavigator.mjs +5 -4
  330. package/dist/esm/router/web/WebStackNavigator.mjs.map +1 -1
  331. package/dist/esm/router/web/WebStackNavigator.native.js +5 -4
  332. package/dist/esm/router/web/WebStackNavigator.native.js.map +1 -1
  333. package/dist/esm/router/web/WebStackView.mjs +99 -131
  334. package/dist/esm/router/web/WebStackView.mjs.map +1 -1
  335. package/dist/esm/router/web/WebStackView.native.js +107 -175
  336. package/dist/esm/router/web/WebStackView.native.js.map +1 -1
  337. package/dist/esm/router/web/stackStateUtils.mjs.map +1 -1
  338. package/dist/esm/router/web/stackStateUtils.native.js.map +1 -1
  339. package/dist/esm/screensFeatureFlags.mjs +1 -16
  340. package/dist/esm/screensFeatureFlags.mjs.map +1 -1
  341. package/dist/esm/screensFeatureFlags.native.js.map +1 -1
  342. package/dist/esm/typed-routes/generateRouteTypes.mjs +3 -10
  343. package/dist/esm/typed-routes/generateRouteTypes.mjs.map +1 -1
  344. package/dist/esm/typed-routes/generateRouteTypes.native.js +3 -10
  345. package/dist/esm/typed-routes/generateRouteTypes.native.js.map +1 -1
  346. package/dist/esm/ui/Slot.mjs +1 -22
  347. package/dist/esm/ui/Slot.mjs.map +1 -1
  348. package/dist/esm/ui/Slot.native.js.map +1 -1
  349. package/dist/esm/ui/TabList.mjs +3 -15
  350. package/dist/esm/ui/TabList.mjs.map +1 -1
  351. package/dist/esm/ui/TabList.native.js.map +1 -1
  352. package/dist/esm/ui/TabSlot.mjs +12 -44
  353. package/dist/esm/ui/TabSlot.mjs.map +1 -1
  354. package/dist/esm/ui/TabSlot.native.js.map +1 -1
  355. package/dist/esm/ui/TabTrigger.mjs +25 -129
  356. package/dist/esm/ui/TabTrigger.mjs.map +1 -1
  357. package/dist/esm/ui/TabTrigger.native.js +13 -114
  358. package/dist/esm/ui/TabTrigger.native.js.map +1 -1
  359. package/dist/esm/ui/Tabs.mjs +7 -145
  360. package/dist/esm/ui/Tabs.mjs.map +1 -1
  361. package/dist/esm/ui/Tabs.native.js +5 -143
  362. package/dist/esm/ui/Tabs.native.js.map +1 -1
  363. package/dist/esm/ui/Tabs.shared.mjs +134 -0
  364. package/dist/esm/ui/Tabs.shared.mjs.map +1 -0
  365. package/dist/esm/ui/Tabs.shared.native.js +145 -0
  366. package/dist/esm/ui/Tabs.shared.native.js.map +1 -0
  367. package/dist/esm/ui/useTabTrigger.mjs +96 -0
  368. package/dist/esm/ui/useTabTrigger.mjs.map +1 -0
  369. package/dist/esm/ui/useTabTrigger.native.js +96 -0
  370. package/dist/esm/ui/useTabTrigger.native.js.map +1 -0
  371. package/dist/esm/useBlocker.mjs +55 -93
  372. package/dist/esm/useBlocker.mjs.map +1 -1
  373. package/dist/esm/utils/platform.mjs +3 -0
  374. package/dist/esm/utils/platform.mjs.map +1 -0
  375. package/dist/esm/utils/platform.native.js +4 -0
  376. package/dist/esm/utils/platform.native.js.map +1 -0
  377. package/dist/esm/utils/routeIndex.mjs +43 -0
  378. package/dist/esm/utils/routeIndex.mjs.map +1 -0
  379. package/dist/esm/utils/routeIndex.native.js +46 -0
  380. package/dist/esm/utils/routeIndex.native.js.map +1 -0
  381. package/dist/esm/utils/routeIndex.test.mjs +52 -0
  382. package/dist/esm/utils/routeIndex.test.mjs.map +1 -0
  383. package/dist/esm/utils/routeIndex.test.native.js +52 -0
  384. package/dist/esm/utils/routeIndex.test.native.js.map +1 -0
  385. package/dist/esm/utils/style.mjs +20 -1
  386. package/dist/esm/utils/style.mjs.map +1 -1
  387. package/dist/esm/utils/style.native.js +39 -1
  388. package/dist/esm/utils/style.native.js.map +1 -1
  389. package/dist/esm/views/LoadProgressBar.mjs +45 -20
  390. package/dist/esm/views/LoadProgressBar.mjs.map +1 -1
  391. package/dist/esm/views/LoadProgressBar.native.js.map +1 -1
  392. package/dist/esm/views/Protected.mjs +4 -0
  393. package/dist/esm/views/Protected.mjs.map +1 -1
  394. package/dist/esm/views/Protected.native.js +4 -0
  395. package/dist/esm/views/Protected.native.js.map +1 -1
  396. package/dist/esm/views/RootErrorBoundary.mjs +106 -147
  397. package/dist/esm/views/RootErrorBoundary.mjs.map +1 -1
  398. package/dist/esm/views/RootErrorBoundary.native.js +37 -145
  399. package/dist/esm/views/RootErrorBoundary.native.js.map +1 -1
  400. package/dist/esm/views/RouteErrorView.mjs +83 -0
  401. package/dist/esm/views/RouteErrorView.mjs.map +1 -0
  402. package/dist/esm/views/RouteErrorView.native.js +82 -0
  403. package/dist/esm/views/RouteErrorView.native.js.map +1 -0
  404. package/dist/esm/views/Screen.mjs +4 -0
  405. package/dist/esm/views/Screen.mjs.map +1 -1
  406. package/dist/esm/views/Screen.native.js +4 -0
  407. package/dist/esm/views/Screen.native.js.map +1 -1
  408. package/dist/esm/vite/getManifest.mjs +4 -9
  409. package/dist/esm/vite/getManifest.mjs.map +1 -1
  410. package/dist/esm/vite/getManifest.native.js +4 -9
  411. package/dist/esm/vite/getManifest.native.js.map +1 -1
  412. package/dist/esm/vite/one.mjs +10 -45
  413. package/dist/esm/vite/one.mjs.map +1 -1
  414. package/dist/esm/vite/one.native.js +18 -55
  415. package/dist/esm/vite/one.native.js.map +1 -1
  416. package/dist/esm/vite/plugins/bundledDevPlugin.mjs.map +1 -1
  417. package/dist/esm/vite/plugins/bundledDevPlugin.native.js.map +1 -1
  418. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs +10 -5
  419. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  420. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +10 -5
  421. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  422. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs +12 -2
  423. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.mjs.map +1 -1
  424. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js +12 -2
  425. package/dist/esm/vite/plugins/fileSystemRouterPlugin.test.native.js.map +1 -1
  426. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs +10 -6
  427. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs.map +1 -1
  428. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +11 -7
  429. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  430. package/dist/esm/vite/plugins/routeModuleHmrPlugin.mjs +43 -0
  431. package/dist/esm/vite/plugins/routeModuleHmrPlugin.mjs.map +1 -0
  432. package/dist/esm/vite/plugins/routeModuleHmrPlugin.native.js +45 -0
  433. package/dist/esm/vite/plugins/routeModuleHmrPlugin.native.js.map +1 -0
  434. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.mjs +75 -0
  435. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.mjs.map +1 -0
  436. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.native.js +81 -0
  437. package/dist/esm/vite/plugins/routeModuleHmrPlugin.test.native.js.map +1 -0
  438. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +2 -5
  439. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
  440. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +11 -10
  441. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  442. package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs +10 -2
  443. package/dist/esm/vite/plugins/virtualEntryPlugin.test.mjs.map +1 -1
  444. package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js +14 -2
  445. package/dist/esm/vite/plugins/virtualEntryPlugin.test.native.js.map +1 -1
  446. package/package.json +9 -10
  447. package/src/Root.tsx +2 -6
  448. package/src/createApp.tsx +15 -42
  449. package/src/createHandleRequest.ts +6 -2
  450. package/src/fallbackViews/Sitemap.web.tsx +149 -0
  451. package/src/fallbackViews/Unmatched.web.tsx +91 -0
  452. package/src/fork/NavigationContainer.tsx +3 -3
  453. package/src/fork/localeDirection.native.ts +6 -0
  454. package/src/fork/localeDirection.ts +11 -0
  455. package/src/fork/theme.native.ts +1 -0
  456. package/src/fork/theme.ts +41 -0
  457. package/src/headless/Presentations.tsx +37 -0
  458. package/src/headless/children.ts +25 -0
  459. package/src/headless/devHeadlessNote.ts +13 -0
  460. package/src/headless/keepMounted.tsx +46 -0
  461. package/src/headless/types.ts +72 -0
  462. package/src/headless/useDrawer.tsx +88 -0
  463. package/src/headless/useStack.ts +74 -0
  464. package/src/headless/useTabs.ts +40 -0
  465. package/src/index.ts +14 -18
  466. package/src/layouts/Drawer.tsx +4 -35
  467. package/src/layouts/Drawer.web.tsx +117 -0
  468. package/src/layouts/Stack.tsx +54 -62
  469. package/src/layouts/Tabs.tsx +6 -32
  470. package/src/layouts/Tabs.web.tsx +151 -0
  471. package/src/layouts/stack-navigator.ts +6 -2
  472. package/src/layouts/stack-navigator.web.ts +8 -0
  473. package/src/layouts/stack-utils/StackHeaderBackButton.tsx +4 -0
  474. package/src/layouts/stack-utils/StackHeaderComponent.tsx +7 -3
  475. package/src/layouts/stack-utils/StackHeaderLeft.tsx +4 -0
  476. package/src/layouts/stack-utils/StackHeaderRight.tsx +4 -0
  477. package/src/layouts/stack-utils/StackHeaderSearchBar.tsx +4 -0
  478. package/src/layouts/stack-utils/StackHeaderTitle.tsx +9 -5
  479. package/src/layouts/stack-utils/StackScreen.tsx +31 -36
  480. package/src/layouts/stack-utils/__tests__/composition.test.tsx +12 -11
  481. package/src/layouts/stack-utils/index.tsx +2 -0
  482. package/src/layouts/withLayoutContext.tsx +5 -2
  483. package/src/link/Link.web.tsx +84 -0
  484. package/src/link/useLinkTo.tsx +2 -2
  485. package/src/metro-config/withOne.test.ts +1 -3
  486. package/src/router/getRouteArtifactPath.test.ts +1 -6
  487. package/src/router/router.ts +2 -2
  488. package/src/router/useScreens.tsx +31 -71
  489. package/src/router/web/WebStackNavigator.tsx +22 -20
  490. package/src/router/web/WebStackView.tsx +148 -188
  491. package/src/router/web/stackStateUtils.ts +2 -1
  492. package/src/screensFeatureFlags.native.ts +23 -0
  493. package/src/screensFeatureFlags.ts +3 -23
  494. package/src/typed-routes/generateRouteTypes.ts +4 -10
  495. package/src/ui/Slot.web.tsx +9 -0
  496. package/src/ui/TabList.web.tsx +27 -0
  497. package/src/ui/TabSlot.web.tsx +90 -0
  498. package/src/ui/TabTrigger.tsx +33 -249
  499. package/src/ui/TabTrigger.web.tsx +71 -0
  500. package/src/ui/Tabs.shared.tsx +230 -0
  501. package/src/ui/Tabs.tsx +5 -295
  502. package/src/ui/Tabs.web.tsx +40 -0
  503. package/src/ui/useTabTrigger.ts +182 -0
  504. package/src/useBlocker.ts +2 -3
  505. package/src/utils/platform.ts +7 -0
  506. package/src/utils/platform.web.ts +1 -0
  507. package/src/utils/routeIndex.test.ts +55 -0
  508. package/src/utils/routeIndex.ts +59 -0
  509. package/src/utils/style.ts +22 -1
  510. package/src/views/LoadProgressBar.web.tsx +135 -0
  511. package/src/views/Protected.tsx +4 -1
  512. package/src/views/RootErrorBoundary.tsx +2 -158
  513. package/src/views/RootErrorBoundary.web.tsx +163 -0
  514. package/src/views/RouteErrorView.tsx +66 -0
  515. package/src/views/RouteErrorView.web.tsx +62 -0
  516. package/src/views/Screen.tsx +3 -0
  517. package/src/vite/getManifest.ts +4 -6
  518. package/src/vite/one.ts +10 -59
  519. package/src/vite/plugins/bundledDevPlugin.ts +4 -1
  520. package/src/vite/plugins/fileSystemRouterPlugin.test.ts +19 -11
  521. package/src/vite/plugins/fileSystemRouterPlugin.tsx +17 -5
  522. package/src/vite/plugins/generateFileSystemRouteTypesPlugin.tsx +22 -11
  523. package/src/vite/plugins/routeModuleHmrPlugin.test.ts +73 -0
  524. package/src/vite/plugins/routeModuleHmrPlugin.ts +54 -0
  525. package/src/vite/plugins/virtualEntryPlugin.test.ts +10 -1
  526. package/src/vite/plugins/virtualEntryPlugin.ts +10 -9
  527. package/types/Root.d.ts +1 -1
  528. package/types/Root.d.ts.map +1 -1
  529. package/types/createApp.d.ts.map +1 -1
  530. package/types/createHandleRequest.d.ts +2 -1
  531. package/types/createHandleRequest.d.ts.map +1 -1
  532. package/types/fallbackViews/Sitemap.web.d.ts +4 -0
  533. package/types/fallbackViews/Sitemap.web.d.ts.map +1 -0
  534. package/types/fallbackViews/Unmatched.web.d.ts +2 -0
  535. package/types/fallbackViews/Unmatched.web.d.ts.map +1 -0
  536. package/types/fork/NavigationContainer.d.ts.map +1 -1
  537. package/types/fork/localeDirection.d.ts +9 -0
  538. package/types/fork/localeDirection.d.ts.map +1 -0
  539. package/types/fork/localeDirection.native.d.ts +3 -0
  540. package/types/fork/localeDirection.native.d.ts.map +1 -0
  541. package/types/fork/theme.d.ts +4 -0
  542. package/types/fork/theme.d.ts.map +1 -0
  543. package/types/fork/theme.native.d.ts +2 -0
  544. package/types/fork/theme.native.d.ts.map +1 -0
  545. package/types/headless/Presentations.d.ts +13 -0
  546. package/types/headless/Presentations.d.ts.map +1 -0
  547. package/types/headless/children.d.ts +5 -0
  548. package/types/headless/children.d.ts.map +1 -0
  549. package/types/headless/devHeadlessNote.d.ts +2 -0
  550. package/types/headless/devHeadlessNote.d.ts.map +1 -0
  551. package/types/headless/keepMounted.d.ts +9 -0
  552. package/types/headless/keepMounted.d.ts.map +1 -0
  553. package/types/headless/types.d.ts +59 -0
  554. package/types/headless/types.d.ts.map +1 -0
  555. package/types/headless/useDrawer.d.ts +19 -0
  556. package/types/headless/useDrawer.d.ts.map +1 -0
  557. package/types/headless/useStack.d.ts +16 -0
  558. package/types/headless/useStack.d.ts.map +1 -0
  559. package/types/headless/useTabs.d.ts +3 -0
  560. package/types/headless/useTabs.d.ts.map +1 -0
  561. package/types/index.d.ts +6 -2
  562. package/types/index.d.ts.map +1 -1
  563. package/types/layouts/Drawer.d.ts +1 -11
  564. package/types/layouts/Drawer.d.ts.map +1 -1
  565. package/types/layouts/Drawer.web.d.ts +5 -0
  566. package/types/layouts/Drawer.web.d.ts.map +1 -0
  567. package/types/layouts/Stack.d.ts +4 -13
  568. package/types/layouts/Stack.d.ts.map +1 -1
  569. package/types/layouts/Tabs.d.ts +1 -11
  570. package/types/layouts/Tabs.d.ts.map +1 -1
  571. package/types/layouts/Tabs.web.d.ts +20 -0
  572. package/types/layouts/Tabs.web.d.ts.map +1 -0
  573. package/types/layouts/stack-navigator.d.ts +3 -2
  574. package/types/layouts/stack-navigator.d.ts.map +1 -1
  575. package/types/layouts/stack-navigator.web.d.ts +6 -0
  576. package/types/layouts/stack-navigator.web.d.ts.map +1 -1
  577. package/types/layouts/stack-utils/StackHeaderBackButton.d.ts.map +1 -1
  578. package/types/layouts/stack-utils/StackHeaderComponent.d.ts +1 -1
  579. package/types/layouts/stack-utils/StackHeaderComponent.d.ts.map +1 -1
  580. package/types/layouts/stack-utils/StackHeaderLeft.d.ts.map +1 -1
  581. package/types/layouts/stack-utils/StackHeaderRight.d.ts.map +1 -1
  582. package/types/layouts/stack-utils/StackHeaderSearchBar.d.ts.map +1 -1
  583. package/types/layouts/stack-utils/StackHeaderTitle.d.ts +1 -1
  584. package/types/layouts/stack-utils/StackHeaderTitle.d.ts.map +1 -1
  585. package/types/layouts/stack-utils/StackScreen.d.ts +5 -12
  586. package/types/layouts/stack-utils/StackScreen.d.ts.map +1 -1
  587. package/types/layouts/stack-utils/index.d.ts +1 -0
  588. package/types/layouts/stack-utils/index.d.ts.map +1 -1
  589. package/types/layouts/withLayoutContext.d.ts.map +1 -1
  590. package/types/link/Link.web.d.ts +3 -0
  591. package/types/link/Link.web.d.ts.map +1 -0
  592. package/types/link/useLinkTo.d.ts +1 -1
  593. package/types/link/useLinkTo.d.ts.map +1 -1
  594. package/types/router/router.d.ts.map +1 -1
  595. package/types/router/useScreens.d.ts.map +1 -1
  596. package/types/router/web/WebStackNavigator.d.ts.map +1 -1
  597. package/types/router/web/WebStackView.d.ts +9 -25
  598. package/types/router/web/WebStackView.d.ts.map +1 -1
  599. package/types/router/web/stackStateUtils.d.ts +1 -1
  600. package/types/router/web/stackStateUtils.d.ts.map +1 -1
  601. package/types/screensFeatureFlags.d.ts.map +1 -1
  602. package/types/screensFeatureFlags.native.d.ts +2 -0
  603. package/types/screensFeatureFlags.native.d.ts.map +1 -0
  604. package/types/typed-routes/generateRouteTypes.d.ts +1 -1
  605. package/types/typed-routes/generateRouteTypes.d.ts.map +1 -1
  606. package/types/ui/Slot.web.d.ts +5 -0
  607. package/types/ui/Slot.web.d.ts.map +1 -0
  608. package/types/ui/TabList.web.d.ts +11 -0
  609. package/types/ui/TabList.web.d.ts.map +1 -0
  610. package/types/ui/TabSlot.web.d.ts +24 -0
  611. package/types/ui/TabSlot.web.d.ts.map +1 -0
  612. package/types/ui/TabTrigger.d.ts +4 -75
  613. package/types/ui/TabTrigger.d.ts.map +1 -1
  614. package/types/ui/TabTrigger.web.d.ts +11 -0
  615. package/types/ui/TabTrigger.web.d.ts.map +1 -0
  616. package/types/ui/Tabs.d.ts +2 -249
  617. package/types/ui/Tabs.d.ts.map +1 -1
  618. package/types/ui/Tabs.shared.d.ts +201 -0
  619. package/types/ui/Tabs.shared.d.ts.map +1 -0
  620. package/types/ui/Tabs.web.d.ts +10 -0
  621. package/types/ui/Tabs.web.d.ts.map +1 -0
  622. package/types/ui/useTabTrigger.d.ts +49 -0
  623. package/types/ui/useTabTrigger.d.ts.map +1 -0
  624. package/types/useBlocker.d.ts.map +1 -1
  625. package/types/utils/platform.d.ts +6 -0
  626. package/types/utils/platform.d.ts.map +1 -0
  627. package/types/utils/platform.web.d.ts +2 -0
  628. package/types/utils/platform.web.d.ts.map +1 -0
  629. package/types/utils/routeIndex.d.ts +10 -0
  630. package/types/utils/routeIndex.d.ts.map +1 -0
  631. package/types/utils/routeIndex.test.d.ts +2 -0
  632. package/types/utils/routeIndex.test.d.ts.map +1 -0
  633. package/types/utils/style.d.ts +6 -1
  634. package/types/utils/style.d.ts.map +1 -1
  635. package/types/views/LoadProgressBar.web.d.ts +21 -0
  636. package/types/views/LoadProgressBar.web.d.ts.map +1 -0
  637. package/types/views/Protected.d.ts.map +1 -1
  638. package/types/views/RootErrorBoundary.d.ts.map +1 -1
  639. package/types/views/RootErrorBoundary.web.d.ts +20 -0
  640. package/types/views/RootErrorBoundary.web.d.ts.map +1 -0
  641. package/types/views/RouteErrorView.d.ts +9 -0
  642. package/types/views/RouteErrorView.d.ts.map +1 -0
  643. package/types/views/RouteErrorView.web.d.ts +3 -0
  644. package/types/views/RouteErrorView.web.d.ts.map +1 -0
  645. package/types/views/Screen.d.ts.map +1 -1
  646. package/types/vite/getManifest.d.ts +2 -1
  647. package/types/vite/getManifest.d.ts.map +1 -1
  648. package/types/vite/one.d.ts.map +1 -1
  649. package/types/vite/plugins/bundledDevPlugin.d.ts.map +1 -1
  650. package/types/vite/plugins/fileSystemRouterPlugin.d.ts +2 -1
  651. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  652. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts +2 -1
  653. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts.map +1 -1
  654. package/types/vite/plugins/routeModuleHmrPlugin.d.ts +3 -0
  655. package/types/vite/plugins/routeModuleHmrPlugin.d.ts.map +1 -0
  656. package/types/vite/plugins/routeModuleHmrPlugin.test.d.ts +2 -0
  657. package/types/vite/plugins/routeModuleHmrPlugin.test.d.ts.map +1 -0
  658. package/types/vite/plugins/virtualEntryPlugin.d.ts +2 -0
  659. package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
  660. package/dist/cjs/router/renderingRegistry.native.js.map +0 -1
  661. package/dist/cjs/router/web/ScreenRenderContext.native.js.map +0 -1
  662. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.cjs +0 -295
  663. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js +0 -335
  664. package/dist/cjs/router/web/__tests__/WebStackView.runtime.test.native.js.map +0 -1
  665. package/dist/cjs/router/web/__tests__/WebStackView.test.cjs +0 -464
  666. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js +0 -515
  667. package/dist/cjs/router/web/__tests__/WebStackView.test.native.js.map +0 -1
  668. package/dist/esm/router/renderingRegistry.mjs +0 -26
  669. package/dist/esm/router/renderingRegistry.mjs.map +0 -1
  670. package/dist/esm/router/renderingRegistry.native.js +0 -26
  671. package/dist/esm/router/renderingRegistry.native.js.map +0 -1
  672. package/dist/esm/router/web/ScreenRenderContext.mjs +0 -10
  673. package/dist/esm/router/web/ScreenRenderContext.mjs.map +0 -1
  674. package/dist/esm/router/web/ScreenRenderContext.native.js +0 -10
  675. package/dist/esm/router/web/ScreenRenderContext.native.js.map +0 -1
  676. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs +0 -272
  677. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.mjs.map +0 -1
  678. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js +0 -309
  679. package/dist/esm/router/web/__tests__/WebStackView.runtime.test.native.js.map +0 -1
  680. package/dist/esm/router/web/__tests__/WebStackView.test.mjs +0 -465
  681. package/dist/esm/router/web/__tests__/WebStackView.test.mjs.map +0 -1
  682. package/dist/esm/router/web/__tests__/WebStackView.test.native.js +0 -513
  683. package/dist/esm/router/web/__tests__/WebStackView.test.native.js.map +0 -1
  684. package/src/router/renderingRegistry.ts +0 -109
  685. package/src/router/web/ScreenRenderContext.tsx +0 -61
  686. package/src/router/web/__tests__/WebStackView.runtime.test.tsx +0 -309
  687. package/src/router/web/__tests__/WebStackView.test.tsx +0 -444
  688. package/types/router/renderingRegistry.d.ts +0 -90
  689. package/types/router/renderingRegistry.d.ts.map +0 -1
  690. package/types/router/web/ScreenRenderContext.d.ts +0 -46
  691. package/types/router/web/ScreenRenderContext.d.ts.map +0 -1
package/src/ui/Tabs.tsx CHANGED
@@ -1,102 +1,20 @@
1
- import type { RouterFactory } from '@react-navigation/native'
2
- import {
3
- type DefaultNavigatorOptions,
4
- LinkingContext,
5
- type ParamListBase,
6
- type TabActionHelpers,
7
- type TabNavigationState,
8
- type TabRouterOptions,
9
- useNavigationBuilder,
10
- } from '@react-navigation/native'
11
- import {
12
- Children,
13
- type ComponentProps,
14
- Fragment,
15
- isValidElement,
16
- type PropsWithChildren,
17
- type ReactElement,
18
- type ReactNode,
19
- use,
20
- useMemo,
21
- useRef,
22
- } from 'react'
23
- import { StyleSheet, View, type ViewProps } from 'react-native'
24
- import { useRouteInfo } from '../hooks'
25
- import { resolveHref } from '../link/href'
26
- import { useContextKey, useRouteNode } from '../router/Route'
27
- import { shouldLinkExternally } from '../utils/url'
28
- import { NavigatorContext } from '../views/Navigator'
29
- import { type ScreenTrigger, triggersToScreens, ViewSlot } from './common'
30
- import {
31
- type ExpoTabsScreenOptions,
32
- type TabNavigationEventMap,
33
- type TabsContextValue,
34
- TabTriggerMapContext,
35
- } from './TabContext'
36
- import { isTabList } from './TabList'
37
- import { ExpoTabRouter, type ExpoTabRouterOptions } from './TabRouter'
38
- import { isTabSlot } from './TabSlot'
39
- import { isTabTrigger } from './TabTrigger'
40
- import { useComponent } from './useComponent'
1
+ import { isValidElement, type ReactNode } from 'react'
2
+ import { StyleSheet, View } from 'react-native'
41
3
 
42
- type NavigatorContextValue = {
43
- contextKey: string
44
- state: ReturnType<typeof useNavigationBuilder>['state']
45
- navigation: ReturnType<typeof useNavigationBuilder>['navigation']
46
- descriptorsRef: React.MutableRefObject<
47
- ReturnType<typeof useNavigationBuilder>['descriptors']
48
- >
49
- router: RouterFactory<any, any, any>
50
- }
4
+ import { ViewSlot } from './common'
5
+ import { useTabsWithChildren, type TabsProps } from './Tabs.shared'
51
6
 
52
7
  export * from './TabContext'
53
8
  export * from './TabList'
54
9
  export * from './TabSlot'
55
10
  export * from './TabTrigger'
11
+ export * from './Tabs.shared'
56
12
 
57
- /**
58
- * Options to provide to the Tab Router.
59
- */
60
- export type UseTabsOptions = Omit<
61
- DefaultNavigatorOptions<
62
- ParamListBase,
63
- any,
64
- TabNavigationState<any>,
65
- ExpoTabsScreenOptions,
66
- TabNavigationEventMap,
67
- any
68
- >,
69
- 'children'
70
- > & {
71
- backBehavior?: TabRouterOptions['backBehavior']
72
- }
73
-
74
- export type TabsProps = ViewProps & {
75
- /** Forward props to child component and removes the extra `<View>`. Useful for custom wrappers. */
76
- asChild?: boolean
77
- options?: UseTabsOptions
78
- }
79
-
80
- /**
81
- * Root component for the headless tabs.
82
- *
83
- * @see [`useTabsWithChildren`](#usetabswithchildrenoptions) for a hook version of this component.
84
- * @example
85
- * ```tsx
86
- * <Tabs>
87
- * <TabSlot />
88
- * <TabList>
89
- * <TabTrigger name="home" href="/" />
90
- * </TabList>
91
- * </Tabs>
92
- * ```
93
- */
94
13
  export function Tabs(props: TabsProps) {
95
14
  const { children, asChild, options, ...rest } = props
96
15
  const Comp = asChild ? ViewSlot : View
97
16
 
98
17
  const { NavigationContent } = useTabsWithChildren({
99
- // asChild adds an extra layer, so we need to process the child's children
100
18
  children:
101
19
  asChild &&
102
20
  isValidElement(children) &&
@@ -115,214 +33,6 @@ export function Tabs(props: TabsProps) {
115
33
  )
116
34
  }
117
35
 
118
- // @docsMissing
119
- export type UseTabsWithChildrenOptions = PropsWithChildren<UseTabsOptions>
120
-
121
- // @docsMissing
122
- export type UseTabsWithTriggersOptions = UseTabsOptions & {
123
- triggers: ScreenTrigger[]
124
- }
125
-
126
- /**
127
- * Hook version of `Tabs`. The returned NavigationContent component
128
- * should be rendered. Using the hook requires using the `<TabList />`
129
- * and `<TabTrigger />` components exported from One.
130
- *
131
- * The `useTabsWithTriggers()` hook can be used for custom components.
132
- *
133
- * @see [`Tabs`](#tabs) for the component version of this hook.
134
- * @example
135
- * ```tsx
136
- * export function MyTabs({ children }) {
137
- * const { NavigationContent } = useTabsWithChildren({ children })
138
- *
139
- * return <NavigationContent />
140
- * }
141
- * ```
142
- */
143
- export function useTabsWithChildren(options: UseTabsWithChildrenOptions) {
144
- const { children, ...rest } = options
145
- return useTabsWithTriggers({
146
- triggers: parseTriggersFromChildren(children),
147
- ...rest,
148
- })
149
- }
150
-
151
- /**
152
- * Alternative hook version of `Tabs` that uses explicit triggers
153
- * instead of `children`.
154
- *
155
- * @see [`Tabs`](#tabs) for the component version of this hook.
156
- * @example
157
- * ```tsx
158
- * export function MyTabs({ children }) {
159
- * const { NavigationContent } = useTabsWithChildren({ triggers: [] })
160
- *
161
- * return <NavigationContent />
162
- * }
163
- * ```
164
- */
165
- export function useTabsWithTriggers(
166
- options: UseTabsWithTriggersOptions
167
- ): TabsContextValue {
168
- const { triggers, ...rest } = options
169
- // Ensure we extend the parent triggers, so we can trigger them as well
170
- const parentTriggerMap = use(TabTriggerMapContext)
171
- const routeNode = useRouteNode()
172
- const contextKey = useContextKey()
173
- const linking = use(LinkingContext).options
174
- const routeInfo = useRouteInfo()
175
-
176
- if (!routeNode || !linking) {
177
- throw new Error('No RouteNode. This is likely a bug in one router.')
178
- }
179
-
180
- const initialRouteName = routeNode.initialRouteName
181
-
182
- const { children, triggerMap } = triggersToScreens(
183
- triggers,
184
- routeNode,
185
- linking,
186
- initialRouteName,
187
- parentTriggerMap,
188
- routeInfo,
189
- contextKey
190
- )
191
-
192
- const navigatorContext = useNavigationBuilder<
193
- TabNavigationState<any>,
194
- ExpoTabRouterOptions,
195
- TabActionHelpers<ParamListBase>,
196
- ExpoTabsScreenOptions,
197
- TabNavigationEventMap
198
- >(ExpoTabRouter, {
199
- children,
200
- ...rest,
201
- triggerMap,
202
- id: contextKey,
203
- initialRouteName,
204
- })
205
-
206
- const {
207
- state,
208
- descriptors,
209
- navigation,
210
- describe,
211
- NavigationContent: RNNavigationContent,
212
- } = navigatorContext
213
-
214
- // HYDRATION FIX: Use ref for descriptors to avoid context invalidation during hydration.
215
- const descriptorsRef = useRef(descriptors)
216
- descriptorsRef.current = descriptors
217
-
218
- const navigatorContextValue = useMemo(
219
- () => ({
220
- state,
221
- navigation,
222
- contextKey,
223
- router: ExpoTabRouter,
224
- descriptorsRef,
225
- }),
226
- [state, navigation, contextKey, ExpoTabRouter]
227
- ) as unknown as NavigatorContextValue
228
-
229
- const NavigationContent = useComponent((children: React.ReactNode) => (
230
- <TabTriggerMapContext.Provider value={triggerMap}>
231
- <NavigatorContext.Provider value={navigatorContextValue}>
232
- <RNNavigationContent>{children}</RNNavigationContent>
233
- </NavigatorContext.Provider>
234
- </TabTriggerMapContext.Provider>
235
- )) as TabsContextValue['NavigationContent']
236
-
237
- return { state, descriptors, navigation, NavigationContent, describe }
238
- }
239
-
240
- function parseTriggersFromChildren(
241
- children: ReactNode,
242
- screenTriggers: ScreenTrigger[] = [],
243
- isInTabList = false
244
- ) {
245
- Children.forEach(children, (child) => {
246
- if (!child || !isValidElement(child) || isTabSlot(child)) {
247
- return
248
- }
249
-
250
- if (isFragment(child) && typeof child.props.children !== 'function') {
251
- return parseTriggersFromChildren(
252
- child.props.children,
253
- screenTriggers,
254
- isInTabList || isTabList(child)
255
- )
256
- }
257
-
258
- if (isTabList(child) && typeof child.props.children !== 'function') {
259
- let children = child.props.children
260
-
261
- // <TabList asChild /> adds an extra layer. We need to parse the child's children
262
- if (
263
- child.props.asChild &&
264
- isValidElement(children) &&
265
- children.props &&
266
- typeof children.props === 'object' &&
267
- 'children' in children.props
268
- ) {
269
- children = children.props.children as ReactNode
270
- }
271
-
272
- return parseTriggersFromChildren(
273
- children,
274
- screenTriggers,
275
- isInTabList || isTabList(child)
276
- )
277
- }
278
-
279
- // We should only process TabTriggers within the TabList. All other components will be ignored
280
- if (!isInTabList || !isTabTrigger(child)) {
281
- return
282
- }
283
-
284
- const { href, name } = child.props
285
-
286
- if (!href) {
287
- if (process.env.NODE_ENV === 'development') {
288
- console.warn(
289
- `<TabTrigger name={${name}}> does not have a 'href' prop. TabTriggers within a <TabList /> are required to have an href.`
290
- )
291
- }
292
- return
293
- }
294
-
295
- const resolvedHref = resolveHref(href)
296
-
297
- if (shouldLinkExternally(resolvedHref)) {
298
- return screenTriggers.push({
299
- type: 'external',
300
- name,
301
- href: resolvedHref,
302
- })
303
- }
304
-
305
- if (!name) {
306
- if (process.env.NODE_ENV === 'development') {
307
- console.warn(
308
- `<TabTrigger> does not have a 'name' prop. TabTriggers within a <TabList /> are required to have a name.`
309
- )
310
- }
311
- return
312
- }
313
-
314
- return screenTriggers.push({ type: 'internal', href: resolvedHref, name })
315
- })
316
-
317
- return screenTriggers
318
- }
319
-
320
- function isFragment(
321
- child: ReactElement<any>
322
- ): child is ReactElement<ComponentProps<typeof Fragment>> {
323
- return child.type === Fragment
324
- }
325
-
326
36
  const styles = StyleSheet.create({
327
37
  tabsRoot: {
328
38
  flex: 1,
@@ -0,0 +1,40 @@
1
+ import { isValidElement, type HTMLAttributes, type ReactNode } from 'react'
2
+
3
+ // runtime specifier must stay extensionless: the web build emits Slot.web.tsx as Slot.mjs
4
+ import { Slot as SlotImpl } from './Slot'
5
+ import type { Slot as WebSlot } from './Slot.web'
6
+
7
+ const Slot = SlotImpl as unknown as WebSlot
8
+ import { useTabsWithChildren, type TabsProps as SharedTabsProps } from './Tabs.shared'
9
+
10
+ export * from './TabContext'
11
+ export * from './TabList'
12
+ export * from './TabSlot'
13
+ export * from './TabTrigger'
14
+ export * from './Tabs.shared'
15
+
16
+ export type TabsProps = HTMLAttributes<HTMLDivElement> &
17
+ Pick<SharedTabsProps, 'asChild' | 'options'>
18
+
19
+ export function Tabs(props: TabsProps) {
20
+ const { children, asChild, options, ...rest } = props
21
+ const Comp = asChild ? Slot : 'div'
22
+
23
+ const { NavigationContent } = useTabsWithChildren({
24
+ children:
25
+ asChild &&
26
+ isValidElement(children) &&
27
+ children.props &&
28
+ typeof children.props === 'object' &&
29
+ 'children' in children.props
30
+ ? (children.props.children as ReactNode)
31
+ : children,
32
+ ...options,
33
+ })
34
+
35
+ return (
36
+ <Comp {...rest}>
37
+ <NavigationContent>{children}</NavigationContent>
38
+ </Comp>
39
+ )
40
+ }
@@ -0,0 +1,182 @@
1
+ import type { TabNavigationState } from '@react-navigation/native'
2
+ import {
3
+ use,
4
+ useCallback,
5
+ type MouseEvent as ReactMouseEvent,
6
+ type ReactNode,
7
+ type RefAttributes,
8
+ } from 'react'
9
+ import type { GestureResponderEvent, PressableProps, View } from 'react-native'
10
+
11
+ import { appendBaseUrl } from '../fork/getPathFromState-mods'
12
+ import type { OneRouter } from '../interfaces/router'
13
+ import { router } from '../router/imperative-api'
14
+ import { stripGroupSegmentsFromPath } from '../router/matchers'
15
+ import { useNavigatorContext } from '../views/Navigator'
16
+ import type { TriggerMap } from './common'
17
+ import { TabTriggerMapContext } from './TabContext'
18
+
19
+ type PressablePropsWithoutFunctionChildren = Omit<PressableProps, 'children'> & {
20
+ children?: ReactNode | undefined
21
+ }
22
+
23
+ export type TabTriggerProps = PressablePropsWithoutFunctionChildren & {
24
+ /** Name of the tab. */
25
+ name: string
26
+ /** Link used when defining the trigger within a `TabList`. */
27
+ href?: OneRouter.Href
28
+ /** Forward props to the child component. */
29
+ asChild?: boolean
30
+ /** Reset the route when switching to the tab. */
31
+ resetOnFocus?: boolean
32
+ }
33
+
34
+ export type TabTriggerOptions = {
35
+ name: string
36
+ href: OneRouter.Href
37
+ }
38
+
39
+ export type TabTriggerSlotProps = PressablePropsWithoutFunctionChildren &
40
+ RefAttributes<View> & {
41
+ isFocused?: boolean
42
+ href?: string
43
+ }
44
+
45
+ export type SwitchToOptions = {
46
+ resetOnFocus?: boolean
47
+ }
48
+
49
+ export type Trigger = TriggerMap[string] & {
50
+ isFocused: boolean
51
+ resolvedHref: string
52
+ route: TabNavigationState<any>['routes'][number]
53
+ }
54
+
55
+ export type UseTabTriggerResult = {
56
+ switchTab: (name: string, options: SwitchToOptions) => void
57
+ getTrigger: (name: string) => Trigger | undefined
58
+ trigger?: Trigger
59
+ triggerProps: TriggerProps
60
+ }
61
+
62
+ export type TriggerProps = {
63
+ isFocused: boolean
64
+ onPress: PressableProps['onPress']
65
+ onLongPress: PressableProps['onLongPress']
66
+ }
67
+
68
+ export function shouldHandleMouseEvent(
69
+ event?: ReactMouseEvent<HTMLAnchorElement, MouseEvent> | GestureResponderEvent
70
+ ): boolean {
71
+ if (!event) return true
72
+
73
+ if ('button' in event) {
74
+ return (
75
+ !event.metaKey &&
76
+ !event.altKey &&
77
+ !event.ctrlKey &&
78
+ !event.shiftKey &&
79
+ (event.button == null || event.button === 0) &&
80
+ [undefined, null, '', 'self'].includes((event.currentTarget as any).target)
81
+ )
82
+ }
83
+
84
+ return true
85
+ }
86
+
87
+ export function useTabTrigger(options: TabTriggerProps): UseTabTriggerResult {
88
+ const { state, navigation } = useNavigatorContext()
89
+ const { name, resetOnFocus, onPress, onLongPress } = options
90
+ const triggerMap = use(TabTriggerMapContext)
91
+
92
+ const getTrigger = useCallback(
93
+ (name: string) => {
94
+ const config = triggerMap[name]
95
+
96
+ if (!config) return
97
+
98
+ return {
99
+ isFocused: state.index === config.index,
100
+ route: state.routes[config.index],
101
+ resolvedHref: stripGroupSegmentsFromPath(appendBaseUrl(config.href)),
102
+ ...config,
103
+ }
104
+ },
105
+ [triggerMap, state]
106
+ )
107
+
108
+ const trigger = name !== undefined ? getTrigger(name) : undefined
109
+
110
+ const switchTab = useCallback(
111
+ (name: string, options?: SwitchToOptions) => {
112
+ const config = triggerMap[name]
113
+
114
+ if (config) {
115
+ if (config.type === 'external') {
116
+ return router.navigate(config.href)
117
+ }
118
+
119
+ return navigation?.dispatch({
120
+ ...config.action,
121
+ type: 'JUMP_TO',
122
+ payload: {
123
+ ...config.action.payload,
124
+ ...options,
125
+ },
126
+ })
127
+ }
128
+
129
+ return navigation?.dispatch({
130
+ type: 'JUMP_TO',
131
+ payload: { name },
132
+ })
133
+ },
134
+ [navigation, triggerMap]
135
+ )
136
+
137
+ const handleOnPress = useCallback<NonNullable<PressableProps['onPress']>>(
138
+ (event) => {
139
+ onPress?.(event)
140
+ if (!trigger || event?.isDefaultPrevented()) return
141
+
142
+ navigation?.emit({
143
+ type: 'tabPress',
144
+ target: trigger.type === 'internal' ? trigger.route.key : trigger.href,
145
+ canPreventDefault: true,
146
+ })
147
+
148
+ if (!shouldHandleMouseEvent(event) || trigger.isFocused) return
149
+
150
+ switchTab(name, { resetOnFocus })
151
+ },
152
+ [onPress, name, resetOnFocus, trigger, navigation, switchTab]
153
+ )
154
+
155
+ const handleOnLongPress = useCallback<NonNullable<PressableProps['onLongPress']>>(
156
+ (event) => {
157
+ onLongPress?.(event)
158
+ if (!trigger || event?.isDefaultPrevented()) return
159
+
160
+ navigation?.emit({
161
+ type: 'tabLongPress',
162
+ target: trigger.type === 'internal' ? trigger.route.key : trigger.href,
163
+ })
164
+
165
+ if (!shouldHandleMouseEvent(event)) return
166
+
167
+ switchTab(name, { resetOnFocus })
168
+ },
169
+ [onLongPress, name, resetOnFocus, trigger, navigation, switchTab]
170
+ )
171
+
172
+ return {
173
+ switchTab,
174
+ getTrigger,
175
+ trigger,
176
+ triggerProps: {
177
+ isFocused: Boolean(trigger?.isFocused),
178
+ onPress: handleOnPress,
179
+ onLongPress: handleOnLongPress,
180
+ },
181
+ }
182
+ }
package/src/useBlocker.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import * as React from 'react'
2
- import { Platform } from 'react-native'
3
2
 
4
3
  export type BlockerState = 'unblocked' | 'blocked' | 'proceeding'
5
4
 
@@ -214,7 +213,7 @@ export function useBlocker(shouldBlock: BlockerFunction | boolean): Blocker {
214
213
 
215
214
  React.useEffect(() => {
216
215
  // Only run on web
217
- if (Platform.OS !== 'web' || typeof window === 'undefined') return
216
+ if (process.env.TAMAGUI_TARGET !== 'web' || typeof window === 'undefined') return
218
217
 
219
218
  setupListeners()
220
219
 
@@ -315,7 +314,7 @@ export function checkBlocker(
315
314
  nextLocation: string,
316
315
  historyAction: 'push' | 'pop' | 'replace' = 'push'
317
316
  ): boolean {
318
- if (Platform.OS !== 'web' || typeof window === 'undefined') {
317
+ if (process.env.TAMAGUI_TARGET !== 'web' || typeof window === 'undefined') {
319
318
  return false
320
319
  }
321
320
 
@@ -0,0 +1,7 @@
1
+ import { Platform } from 'react-native'
2
+
3
+ /**
4
+ * Current platform. On web this resolves to the `.web` sibling, which is a
5
+ * plain constant, so nothing in the web graph imports react-native for it.
6
+ */
7
+ export const PLATFORM = Platform.OS
@@ -0,0 +1 @@
1
+ export const PLATFORM = 'web'
@@ -0,0 +1,55 @@
1
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'
2
+ import { tmpdir } from 'node:os'
3
+ import { dirname, join } from 'node:path'
4
+ import { afterEach, describe, expect, it } from 'vitest'
5
+ import { createRouteIndex } from './routeIndex'
6
+
7
+ let testDir: string | undefined
8
+
9
+ function writeRoute(relativePath: string) {
10
+ testDir ||= mkdtempSync(join(tmpdir(), 'one-route-index-'))
11
+ const filePath = join(testDir, 'app', relativePath)
12
+ mkdirSync(dirname(filePath), { recursive: true })
13
+ writeFileSync(filePath, 'export default function Route() { return null }')
14
+ return filePath
15
+ }
16
+
17
+ afterEach(() => {
18
+ if (testDir) {
19
+ rmSync(testDir, { recursive: true, force: true })
20
+ testDir = undefined
21
+ }
22
+ })
23
+
24
+ describe(createRouteIndex, () => {
25
+ it('scans and filters the route tree once', () => {
26
+ writeRoute('index.tsx')
27
+ writeRoute('nested/page.ts')
28
+ writeRoute('nested/page.test.tsx')
29
+ writeRoute('routes.d.ts')
30
+
31
+ const routeIndex = createRouteIndex({
32
+ routerRoot: join(testDir!, 'app'),
33
+ ignoredRouteFiles: ['**/*.test.*'],
34
+ })
35
+
36
+ expect(routeIndex.getPaths()).toEqual(['./index.tsx', './nested/page.ts'])
37
+ })
38
+
39
+ it('updates route membership from watcher events', () => {
40
+ writeRoute('index.tsx')
41
+ const routeIndex = createRouteIndex({
42
+ routerRoot: join(testDir!, 'app'),
43
+ ignoredRouteFiles: ['**/*.test.*'],
44
+ })
45
+ const addedRoute = writeRoute('nested/new.tsx')
46
+ const ignoredRoute = writeRoute('nested/new.test.tsx')
47
+
48
+ expect(routeIndex.update('add', addedRoute)).toBe(true)
49
+ expect(routeIndex.update('add', ignoredRoute)).toBe(false)
50
+ expect(routeIndex.getPaths()).toEqual(['./index.tsx', './nested/new.tsx'])
51
+
52
+ expect(routeIndex.update('unlink', addedRoute)).toBe(true)
53
+ expect(routeIndex.getPaths()).toEqual(['./index.tsx'])
54
+ })
55
+ })
@@ -0,0 +1,59 @@
1
+ import micromatch from 'micromatch'
2
+ import path from 'node:path'
3
+ import { globDir } from './globDir'
4
+ import { isPathInsideDirectory, isRouteFilePath } from './routeFileWatch'
5
+
6
+ export function getRoutePaths(
7
+ routerRoot: string,
8
+ ignoredRouteFiles?: string[]
9
+ ): string[] {
10
+ const routePaths = globDir(routerRoot).filter(
11
+ (routePath) => !routePath.endsWith('.d.ts')
12
+ )
13
+ if (!ignoredRouteFiles?.length) return routePaths
14
+ return micromatch.not(routePaths, ignoredRouteFiles, { matchBase: true }) as string[]
15
+ }
16
+
17
+ export function createRouteIndex({
18
+ routerRoot,
19
+ ignoredRouteFiles,
20
+ }: {
21
+ routerRoot: string
22
+ ignoredRouteFiles?: string[]
23
+ }) {
24
+ const absoluteRouterRoot = path.resolve(routerRoot)
25
+ const routePaths = new Set(getRoutePaths(absoluteRouterRoot, ignoredRouteFiles))
26
+
27
+ return {
28
+ getPaths() {
29
+ return [...routePaths].sort()
30
+ },
31
+
32
+ update(event: string, filePath: string) {
33
+ if (event !== 'add' && event !== 'delete' && event !== 'unlink') return false
34
+ if (!isPathInsideDirectory(filePath, absoluteRouterRoot)) return false
35
+ if (!isRouteFilePath(filePath)) return false
36
+
37
+ const relativePath = path
38
+ .relative(absoluteRouterRoot, path.resolve(filePath))
39
+ .replaceAll('\\', '/')
40
+ const routePath = `./${relativePath}`
41
+ if (
42
+ ignoredRouteFiles?.length &&
43
+ micromatch.isMatch(routePath, ignoredRouteFiles, { matchBase: true })
44
+ ) {
45
+ return false
46
+ }
47
+
48
+ if (event === 'add') {
49
+ const size = routePaths.size
50
+ routePaths.add(routePath)
51
+ return routePaths.size !== size
52
+ }
53
+
54
+ return routePaths.delete(routePath)
55
+ },
56
+ }
57
+ }
58
+
59
+ export type RouteIndex = ReturnType<typeof createRouteIndex>