one 1.2.57 → 1.2.59

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 (612) hide show
  1. package/dist/cjs/cli/build.cjs +3 -1
  2. package/dist/cjs/cli/build.js +1 -1
  3. package/dist/cjs/cli/build.js.map +1 -1
  4. package/dist/cjs/cli/build.native.js +13 -12
  5. package/dist/cjs/cli/build.native.js.map +1 -1
  6. package/dist/cjs/cli/buildPage.cjs +1 -1
  7. package/dist/cjs/cli/buildPage.js +1 -1
  8. package/dist/cjs/cli/buildPage.native.js +2 -2
  9. package/dist/cjs/cli/buildPage.native.js.map +1 -1
  10. package/dist/cjs/cli/dev.cjs +4 -4
  11. package/dist/cjs/cli/dev.js +4 -4
  12. package/dist/cjs/cli/dev.js.map +1 -1
  13. package/dist/cjs/cli/dev.native.js +4 -4
  14. package/dist/cjs/cli/dev.native.js.map +1 -1
  15. package/dist/cjs/cli/generateRoutes.cjs +1 -1
  16. package/dist/cjs/cli/generateRoutes.js +1 -1
  17. package/dist/cjs/cli/generateRoutes.native.js +1 -1
  18. package/dist/cjs/cli/generateRoutes.native.js.map +1 -1
  19. package/dist/cjs/cli/generateSitemap.native.js +7 -7
  20. package/dist/cjs/cli/generateSitemap.native.js.map +1 -1
  21. package/dist/cjs/config.native.js +2 -2
  22. package/dist/cjs/config.native.js.map +1 -1
  23. package/dist/cjs/constants.native.js +1 -1
  24. package/dist/cjs/constants.native.js.map +1 -1
  25. package/dist/cjs/createApp.cjs +2 -1
  26. package/dist/cjs/createApp.js +2 -2
  27. package/dist/cjs/createApp.js.map +1 -1
  28. package/dist/cjs/createHandleRequest.test.js +3 -1
  29. package/dist/cjs/createHandleRequest.test.js.map +1 -1
  30. package/dist/cjs/createHandleRequest.test.native.js.map +1 -1
  31. package/dist/cjs/devtools/registry.cjs +30 -0
  32. package/dist/cjs/devtools/registry.js +25 -0
  33. package/dist/cjs/devtools/registry.js.map +6 -0
  34. package/dist/cjs/devtools/registry.native.js +33 -0
  35. package/dist/cjs/devtools/registry.native.js.map +1 -0
  36. package/dist/cjs/fork/NavigationContainer.native.js +5 -5
  37. package/dist/cjs/fork/NavigationContainer.native.js.map +1 -1
  38. package/dist/cjs/fork/createMemoryHistory.cjs +20 -9
  39. package/dist/cjs/fork/createMemoryHistory.js +22 -4
  40. package/dist/cjs/fork/createMemoryHistory.js.map +1 -1
  41. package/dist/cjs/fork/createMemoryHistory.native.js +22 -11
  42. package/dist/cjs/fork/createMemoryHistory.native.js.map +1 -1
  43. package/dist/cjs/fork/extractPathFromURL.native.js +8 -8
  44. package/dist/cjs/fork/extractPathFromURL.native.js.map +1 -1
  45. package/dist/cjs/fork/findFocusedRoute.native.js +2 -3
  46. package/dist/cjs/fork/findFocusedRoute.native.js.map +1 -1
  47. package/dist/cjs/fork/getPathFromState-mods.native.js +2 -3
  48. package/dist/cjs/fork/getPathFromState-mods.native.js.map +1 -1
  49. package/dist/cjs/fork/getStateFromPath-mods.native.js +3 -3
  50. package/dist/cjs/fork/getStateFromPath-mods.native.js.map +1 -1
  51. package/dist/cjs/fork/useLinking.cjs +11 -5
  52. package/dist/cjs/fork/useLinking.js +6 -6
  53. package/dist/cjs/fork/useLinking.js.map +1 -1
  54. package/dist/cjs/fork/useLinking.native.js.map +1 -1
  55. package/dist/cjs/head/url.native.js +2 -3
  56. package/dist/cjs/head/url.native.js.map +1 -1
  57. package/dist/cjs/hooks.js.map +1 -1
  58. package/dist/cjs/hooks.native.js.map +1 -1
  59. package/dist/cjs/index.cjs +17 -1
  60. package/dist/cjs/index.js +12 -2
  61. package/dist/cjs/index.js.map +1 -1
  62. package/dist/cjs/index.native.js +17 -1
  63. package/dist/cjs/index.native.js.map +1 -1
  64. package/dist/cjs/layouts/withLayoutContext.cjs +34 -15
  65. package/dist/cjs/layouts/withLayoutContext.js +29 -13
  66. package/dist/cjs/layouts/withLayoutContext.js.map +1 -1
  67. package/dist/cjs/layouts/withLayoutContext.native.js +42 -19
  68. package/dist/cjs/layouts/withLayoutContext.native.js.map +1 -1
  69. package/dist/cjs/link/Link.cjs +5 -2
  70. package/dist/cjs/link/Link.js +3 -2
  71. package/dist/cjs/link/Link.js.map +1 -1
  72. package/dist/cjs/link/Link.native.js +6 -1
  73. package/dist/cjs/link/Link.native.js.map +1 -1
  74. package/dist/cjs/link/href.native.js +2 -2
  75. package/dist/cjs/link/href.native.js.map +1 -1
  76. package/dist/cjs/link/useLinkTo.cjs +11 -3
  77. package/dist/cjs/link/useLinkTo.js +6 -3
  78. package/dist/cjs/link/useLinkTo.js.map +1 -1
  79. package/dist/cjs/link/useLinkTo.native.js +11 -3
  80. package/dist/cjs/link/useLinkTo.native.js.map +1 -1
  81. package/dist/cjs/router/Route.js.map +1 -1
  82. package/dist/cjs/router/Route.native.js.map +1 -1
  83. package/dist/cjs/router/findRouteNode.cjs +70 -0
  84. package/dist/cjs/router/findRouteNode.js +72 -0
  85. package/dist/cjs/router/findRouteNode.js.map +6 -0
  86. package/dist/cjs/router/findRouteNode.native.js +104 -0
  87. package/dist/cjs/router/findRouteNode.native.js.map +1 -0
  88. package/dist/cjs/router/getRoutes.native.js +3 -3
  89. package/dist/cjs/router/getRoutes.native.js.map +1 -1
  90. package/dist/cjs/router/router.cjs +160 -11
  91. package/dist/cjs/router/router.js +142 -7
  92. package/dist/cjs/router/router.js.map +2 -2
  93. package/dist/cjs/router/router.native.js +247 -67
  94. package/dist/cjs/router/router.native.js.map +1 -1
  95. package/dist/cjs/router/useNavigation.js.map +1 -1
  96. package/dist/cjs/router/useNavigation.native.js.map +1 -1
  97. package/dist/cjs/router/useScreens.cjs +1 -1
  98. package/dist/cjs/router/useScreens.js +1 -1
  99. package/dist/cjs/router/useScreens.js.map +1 -1
  100. package/dist/cjs/router/useScreens.native.js +6 -3
  101. package/dist/cjs/router/useScreens.native.js.map +1 -1
  102. package/dist/cjs/router/utils/getNavigateAction.native.js +2 -4
  103. package/dist/cjs/router/utils/getNavigateAction.native.js.map +1 -1
  104. package/dist/cjs/server/oneServe.js.map +1 -1
  105. package/dist/cjs/server/oneServe.native.js +4 -4
  106. package/dist/cjs/server/oneServe.native.js.map +1 -1
  107. package/dist/cjs/server/setupBuildOptions.native.js +1 -1
  108. package/dist/cjs/server/setupBuildOptions.native.js.map +1 -1
  109. package/dist/cjs/ui/common.native.js +6 -5
  110. package/dist/cjs/ui/common.native.js.map +1 -1
  111. package/dist/cjs/useBlocker.cjs +158 -0
  112. package/dist/cjs/useBlocker.js +145 -0
  113. package/dist/cjs/useBlocker.js.map +6 -0
  114. package/dist/cjs/useBlocker.native.js +89 -0
  115. package/dist/cjs/useBlocker.native.js.map +1 -0
  116. package/dist/cjs/useFocusEffect.cjs +2 -2
  117. package/dist/cjs/useFocusEffect.js +2 -2
  118. package/dist/cjs/useFocusEffect.js.map +1 -1
  119. package/dist/cjs/useFocusEffect.native.js +2 -2
  120. package/dist/cjs/useFocusEffect.native.js.map +1 -1
  121. package/dist/cjs/useLoader.cjs +69 -3
  122. package/dist/cjs/useLoader.js +57 -4
  123. package/dist/cjs/useLoader.js.map +2 -2
  124. package/dist/cjs/useLoader.native.js +90 -6
  125. package/dist/cjs/useLoader.native.js.map +1 -1
  126. package/dist/cjs/useScrollGroup.cjs +37 -0
  127. package/dist/cjs/useScrollGroup.js +30 -0
  128. package/dist/cjs/useScrollGroup.js.map +6 -0
  129. package/dist/cjs/useScrollGroup.native.js +29 -0
  130. package/dist/cjs/useScrollGroup.native.js.map +1 -0
  131. package/dist/cjs/validateParams.cjs +80 -0
  132. package/dist/cjs/validateParams.js +84 -0
  133. package/dist/cjs/validateParams.js.map +6 -0
  134. package/dist/cjs/validateParams.native.js +180 -0
  135. package/dist/cjs/validateParams.native.js.map +1 -0
  136. package/dist/cjs/validateSearch.cjs +104 -0
  137. package/dist/cjs/validateSearch.js +99 -0
  138. package/dist/cjs/validateSearch.js.map +6 -0
  139. package/dist/cjs/validateSearch.native.js +202 -0
  140. package/dist/cjs/validateSearch.native.js.map +1 -0
  141. package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js +2 -2
  142. package/dist/cjs/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
  143. package/dist/cjs/views/ErrorBoundary.cjs +293 -10
  144. package/dist/cjs/views/ErrorBoundary.js +328 -8
  145. package/dist/cjs/views/ErrorBoundary.js.map +2 -2
  146. package/dist/cjs/views/ErrorBoundary.native.js +159 -4
  147. package/dist/cjs/views/ErrorBoundary.native.js.map +1 -1
  148. package/dist/cjs/views/Navigator.cjs +10 -3
  149. package/dist/cjs/views/Navigator.js +11 -3
  150. package/dist/cjs/views/Navigator.js.map +1 -1
  151. package/dist/cjs/views/Navigator.native.js +15 -6
  152. package/dist/cjs/views/Navigator.native.js.map +1 -1
  153. package/dist/cjs/views/Protected.cjs +36 -0
  154. package/dist/cjs/views/Protected.js +27 -0
  155. package/dist/cjs/views/Protected.js.map +6 -0
  156. package/dist/cjs/views/Protected.native.js +44 -0
  157. package/dist/cjs/views/Protected.native.js.map +1 -0
  158. package/dist/cjs/views/RootErrorBoundary.cjs +193 -8
  159. package/dist/cjs/views/RootErrorBoundary.js +213 -8
  160. package/dist/cjs/views/RootErrorBoundary.js.map +1 -1
  161. package/dist/cjs/views/RootErrorBoundary.native.js +192 -8
  162. package/dist/cjs/views/RootErrorBoundary.native.js.map +1 -1
  163. package/dist/cjs/views/ScrollBehavior.cjs +49 -11
  164. package/dist/cjs/views/ScrollBehavior.js +47 -11
  165. package/dist/cjs/views/ScrollBehavior.js.map +1 -1
  166. package/dist/cjs/views/ScrollBehavior.native.js +68 -10
  167. package/dist/cjs/views/ScrollBehavior.native.js.map +1 -1
  168. package/dist/cjs/views/SourceInspector.cjs +28 -0
  169. package/dist/cjs/views/SourceInspector.js +23 -0
  170. package/dist/cjs/views/SourceInspector.js.map +6 -0
  171. package/dist/cjs/views/SourceInspector.native.js +32 -0
  172. package/dist/cjs/views/SourceInspector.native.js.map +1 -0
  173. package/dist/cjs/views/Try.cjs +40 -7
  174. package/dist/cjs/views/Try.js +38 -4
  175. package/dist/cjs/views/Try.js.map +1 -1
  176. package/dist/cjs/views/Try.native.js +42 -7
  177. package/dist/cjs/views/Try.native.js.map +1 -1
  178. package/dist/cjs/vite/DevHead.cjs +797 -43
  179. package/dist/cjs/vite/DevHead.js +802 -51
  180. package/dist/cjs/vite/DevHead.js.map +1 -1
  181. package/dist/cjs/vite/DevHead.native.js +783 -1
  182. package/dist/cjs/vite/DevHead.native.js.map +1 -1
  183. package/dist/cjs/vite/one.cjs +7 -1
  184. package/dist/cjs/vite/one.js +7 -2
  185. package/dist/cjs/vite/one.js.map +1 -1
  186. package/dist/cjs/vite/one.native.js +17 -7
  187. package/dist/cjs/vite/one.native.js.map +1 -1
  188. package/dist/cjs/vite/plugins/SSRCSSPlugin.cjs +44 -4
  189. package/dist/cjs/vite/plugins/SSRCSSPlugin.js +48 -4
  190. package/dist/cjs/vite/plugins/SSRCSSPlugin.js.map +1 -1
  191. package/dist/cjs/vite/plugins/SSRCSSPlugin.native.js +62 -5
  192. package/dist/cjs/vite/plugins/SSRCSSPlugin.native.js.map +1 -1
  193. package/dist/cjs/vite/plugins/clientTreeShakePlugin.cjs +34 -15
  194. package/dist/cjs/vite/plugins/clientTreeShakePlugin.js +24 -3
  195. package/dist/cjs/vite/plugins/clientTreeShakePlugin.js.map +1 -1
  196. package/dist/cjs/vite/plugins/clientTreeShakePlugin.native.js +55 -19
  197. package/dist/cjs/vite/plugins/clientTreeShakePlugin.native.js.map +1 -1
  198. package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.cjs +129 -0
  199. package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.js +129 -0
  200. package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.js.map +6 -0
  201. package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.native.js +140 -0
  202. package/dist/cjs/vite/plugins/clientTreeShakePlugin.test.native.js.map +1 -0
  203. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js +6 -3
  204. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  205. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js +3 -3
  206. package/dist/cjs/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  207. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.cjs +5 -1
  208. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.js +11 -6
  209. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.js.map +1 -1
  210. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +1 -0
  211. package/dist/cjs/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  212. package/dist/cjs/vite/plugins/sourceInspectorPlugin.cjs +155 -0
  213. package/dist/cjs/vite/plugins/sourceInspectorPlugin.js +148 -0
  214. package/dist/cjs/vite/plugins/sourceInspectorPlugin.js.map +6 -0
  215. package/dist/cjs/vite/plugins/sourceInspectorPlugin.native.js +231 -0
  216. package/dist/cjs/vite/plugins/sourceInspectorPlugin.native.js.map +1 -0
  217. package/dist/cjs/vite/plugins/virtualEntryPlugin.cjs +25 -6
  218. package/dist/cjs/vite/plugins/virtualEntryPlugin.js +16 -6
  219. package/dist/cjs/vite/plugins/virtualEntryPlugin.js.map +1 -1
  220. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js +26 -7
  221. package/dist/cjs/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  222. package/dist/esm/cli/build.js +1 -1
  223. package/dist/esm/cli/build.js.map +1 -1
  224. package/dist/esm/cli/build.mjs +3 -1
  225. package/dist/esm/cli/build.mjs.map +1 -1
  226. package/dist/esm/cli/build.native.js +13 -12
  227. package/dist/esm/cli/build.native.js.map +1 -1
  228. package/dist/esm/cli/buildPage.js +1 -1
  229. package/dist/esm/cli/buildPage.mjs +1 -1
  230. package/dist/esm/cli/buildPage.mjs.map +1 -1
  231. package/dist/esm/cli/buildPage.native.js +2 -2
  232. package/dist/esm/cli/buildPage.native.js.map +1 -1
  233. package/dist/esm/cli/dev.js +4 -4
  234. package/dist/esm/cli/dev.js.map +1 -1
  235. package/dist/esm/cli/dev.mjs +4 -4
  236. package/dist/esm/cli/dev.mjs.map +1 -1
  237. package/dist/esm/cli/dev.native.js +4 -4
  238. package/dist/esm/cli/dev.native.js.map +1 -1
  239. package/dist/esm/cli/generateRoutes.js +1 -1
  240. package/dist/esm/cli/generateRoutes.mjs +1 -1
  241. package/dist/esm/cli/generateRoutes.mjs.map +1 -1
  242. package/dist/esm/cli/generateRoutes.native.js +1 -1
  243. package/dist/esm/cli/generateRoutes.native.js.map +1 -1
  244. package/dist/esm/cli/generateSitemap.native.js +7 -7
  245. package/dist/esm/cli/generateSitemap.native.js.map +1 -1
  246. package/dist/esm/config.native.js +2 -2
  247. package/dist/esm/config.native.js.map +1 -1
  248. package/dist/esm/constants.native.js +2 -2
  249. package/dist/esm/constants.native.js.map +1 -1
  250. package/dist/esm/createApp.js +2 -2
  251. package/dist/esm/createApp.js.map +1 -1
  252. package/dist/esm/createApp.mjs +2 -1
  253. package/dist/esm/createApp.mjs.map +1 -1
  254. package/dist/esm/createHandleRequest.test.js +3 -1
  255. package/dist/esm/createHandleRequest.test.js.map +1 -1
  256. package/dist/esm/createHandleRequest.test.mjs.map +1 -1
  257. package/dist/esm/createHandleRequest.test.native.js.map +1 -1
  258. package/dist/esm/devtools/registry.js +9 -0
  259. package/dist/esm/devtools/registry.js.map +6 -0
  260. package/dist/esm/devtools/registry.mjs +6 -0
  261. package/dist/esm/devtools/registry.mjs.map +1 -0
  262. package/dist/esm/devtools/registry.native.js +6 -0
  263. package/dist/esm/devtools/registry.native.js.map +1 -0
  264. package/dist/esm/fork/NavigationContainer.native.js +5 -5
  265. package/dist/esm/fork/NavigationContainer.native.js.map +1 -1
  266. package/dist/esm/fork/createMemoryHistory.js +22 -4
  267. package/dist/esm/fork/createMemoryHistory.js.map +1 -1
  268. package/dist/esm/fork/createMemoryHistory.mjs +20 -9
  269. package/dist/esm/fork/createMemoryHistory.mjs.map +1 -1
  270. package/dist/esm/fork/createMemoryHistory.native.js +22 -11
  271. package/dist/esm/fork/createMemoryHistory.native.js.map +1 -1
  272. package/dist/esm/fork/extractPathFromURL.native.js +8 -8
  273. package/dist/esm/fork/extractPathFromURL.native.js.map +1 -1
  274. package/dist/esm/fork/findFocusedRoute.native.js +2 -3
  275. package/dist/esm/fork/findFocusedRoute.native.js.map +1 -1
  276. package/dist/esm/fork/getPathFromState-mods.native.js +2 -3
  277. package/dist/esm/fork/getPathFromState-mods.native.js.map +1 -1
  278. package/dist/esm/fork/getStateFromPath-mods.native.js +3 -3
  279. package/dist/esm/fork/getStateFromPath-mods.native.js.map +1 -1
  280. package/dist/esm/fork/useLinking.js +6 -5
  281. package/dist/esm/fork/useLinking.js.map +1 -1
  282. package/dist/esm/fork/useLinking.mjs +11 -5
  283. package/dist/esm/fork/useLinking.mjs.map +1 -1
  284. package/dist/esm/fork/useLinking.native.js.map +1 -1
  285. package/dist/esm/head/url.native.js +2 -3
  286. package/dist/esm/head/url.native.js.map +1 -1
  287. package/dist/esm/hooks.js.map +1 -1
  288. package/dist/esm/hooks.mjs.map +1 -1
  289. package/dist/esm/hooks.native.js.map +1 -1
  290. package/dist/esm/index.js +30 -2
  291. package/dist/esm/index.js.map +1 -1
  292. package/dist/esm/index.mjs +8 -2
  293. package/dist/esm/index.mjs.map +1 -1
  294. package/dist/esm/index.native.js +8 -2
  295. package/dist/esm/index.native.js.map +1 -1
  296. package/dist/esm/layouts/withLayoutContext.js +30 -12
  297. package/dist/esm/layouts/withLayoutContext.js.map +1 -1
  298. package/dist/esm/layouts/withLayoutContext.mjs +34 -15
  299. package/dist/esm/layouts/withLayoutContext.mjs.map +1 -1
  300. package/dist/esm/layouts/withLayoutContext.native.js +42 -19
  301. package/dist/esm/layouts/withLayoutContext.native.js.map +1 -1
  302. package/dist/esm/link/Link.js +3 -2
  303. package/dist/esm/link/Link.js.map +1 -1
  304. package/dist/esm/link/Link.mjs +5 -2
  305. package/dist/esm/link/Link.mjs.map +1 -1
  306. package/dist/esm/link/Link.native.js +6 -1
  307. package/dist/esm/link/Link.native.js.map +1 -1
  308. package/dist/esm/link/href.native.js +2 -2
  309. package/dist/esm/link/href.native.js.map +1 -1
  310. package/dist/esm/link/useLinkTo.js +6 -3
  311. package/dist/esm/link/useLinkTo.js.map +1 -1
  312. package/dist/esm/link/useLinkTo.mjs +11 -3
  313. package/dist/esm/link/useLinkTo.mjs.map +1 -1
  314. package/dist/esm/link/useLinkTo.native.js +11 -3
  315. package/dist/esm/link/useLinkTo.native.js.map +1 -1
  316. package/dist/esm/router/Route.js.map +1 -1
  317. package/dist/esm/router/Route.mjs.map +1 -1
  318. package/dist/esm/router/Route.native.js.map +1 -1
  319. package/dist/esm/router/findRouteNode.js +56 -0
  320. package/dist/esm/router/findRouteNode.js.map +6 -0
  321. package/dist/esm/router/findRouteNode.mjs +44 -0
  322. package/dist/esm/router/findRouteNode.mjs.map +1 -0
  323. package/dist/esm/router/findRouteNode.native.js +75 -0
  324. package/dist/esm/router/findRouteNode.native.js.map +1 -0
  325. package/dist/esm/router/getRoutes.native.js +3 -3
  326. package/dist/esm/router/getRoutes.native.js.map +1 -1
  327. package/dist/esm/router/router.js +154 -6
  328. package/dist/esm/router/router.js.map +1 -1
  329. package/dist/esm/router/router.mjs +151 -10
  330. package/dist/esm/router/router.mjs.map +1 -1
  331. package/dist/esm/router/router.native.js +238 -66
  332. package/dist/esm/router/router.native.js.map +1 -1
  333. package/dist/esm/router/useNavigation.js.map +1 -1
  334. package/dist/esm/router/useNavigation.mjs.map +1 -1
  335. package/dist/esm/router/useNavigation.native.js.map +1 -1
  336. package/dist/esm/router/useScreens.js +1 -1
  337. package/dist/esm/router/useScreens.js.map +1 -1
  338. package/dist/esm/router/useScreens.mjs +1 -1
  339. package/dist/esm/router/useScreens.mjs.map +1 -1
  340. package/dist/esm/router/useScreens.native.js +6 -3
  341. package/dist/esm/router/useScreens.native.js.map +1 -1
  342. package/dist/esm/router/utils/getNavigateAction.native.js +2 -4
  343. package/dist/esm/router/utils/getNavigateAction.native.js.map +1 -1
  344. package/dist/esm/server/oneServe.js.map +1 -1
  345. package/dist/esm/server/oneServe.mjs.map +1 -1
  346. package/dist/esm/server/oneServe.native.js +4 -4
  347. package/dist/esm/server/oneServe.native.js.map +1 -1
  348. package/dist/esm/server/setupBuildOptions.native.js +1 -1
  349. package/dist/esm/server/setupBuildOptions.native.js.map +1 -1
  350. package/dist/esm/ui/common.native.js +6 -5
  351. package/dist/esm/ui/common.native.js.map +1 -1
  352. package/dist/esm/useBlocker.js +122 -0
  353. package/dist/esm/useBlocker.js.map +6 -0
  354. package/dist/esm/useBlocker.mjs +123 -0
  355. package/dist/esm/useBlocker.mjs.map +1 -0
  356. package/dist/esm/useBlocker.native.js +51 -0
  357. package/dist/esm/useBlocker.native.js.map +1 -0
  358. package/dist/esm/useFocusEffect.js +2 -2
  359. package/dist/esm/useFocusEffect.js.map +1 -1
  360. package/dist/esm/useFocusEffect.mjs +2 -2
  361. package/dist/esm/useFocusEffect.mjs.map +1 -1
  362. package/dist/esm/useFocusEffect.native.js +2 -2
  363. package/dist/esm/useFocusEffect.native.js.map +1 -1
  364. package/dist/esm/useLoader.js +57 -3
  365. package/dist/esm/useLoader.js.map +2 -2
  366. package/dist/esm/useLoader.mjs +69 -4
  367. package/dist/esm/useLoader.mjs.map +1 -1
  368. package/dist/esm/useLoader.native.js +90 -7
  369. package/dist/esm/useLoader.native.js.map +1 -1
  370. package/dist/esm/useScrollGroup.js +16 -0
  371. package/dist/esm/useScrollGroup.js.map +6 -0
  372. package/dist/esm/useScrollGroup.mjs +14 -0
  373. package/dist/esm/useScrollGroup.mjs.map +1 -0
  374. package/dist/esm/useScrollGroup.native.js +3 -0
  375. package/dist/esm/useScrollGroup.native.js.map +1 -0
  376. package/dist/esm/validateParams.js +68 -0
  377. package/dist/esm/validateParams.js.map +6 -0
  378. package/dist/esm/validateParams.mjs +54 -0
  379. package/dist/esm/validateParams.mjs.map +1 -0
  380. package/dist/esm/validateParams.native.js +151 -0
  381. package/dist/esm/validateParams.native.js.map +1 -0
  382. package/dist/esm/validateSearch.js +83 -0
  383. package/dist/esm/validateSearch.js.map +6 -0
  384. package/dist/esm/validateSearch.mjs +77 -0
  385. package/dist/esm/validateSearch.mjs.map +1 -0
  386. package/dist/esm/validateSearch.native.js +172 -0
  387. package/dist/esm/validateSearch.native.js.map +1 -0
  388. package/dist/esm/vercel/build/buildVercelOutputDirectory.native.js +2 -2
  389. package/dist/esm/vercel/build/buildVercelOutputDirectory.native.js.map +1 -1
  390. package/dist/esm/views/ErrorBoundary.js +325 -7
  391. package/dist/esm/views/ErrorBoundary.js.map +2 -2
  392. package/dist/esm/views/ErrorBoundary.mjs +289 -6
  393. package/dist/esm/views/ErrorBoundary.mjs.map +1 -1
  394. package/dist/esm/views/ErrorBoundary.native.js +159 -4
  395. package/dist/esm/views/ErrorBoundary.native.js.map +1 -1
  396. package/dist/esm/views/Navigator.js +11 -2
  397. package/dist/esm/views/Navigator.js.map +1 -1
  398. package/dist/esm/views/Navigator.mjs +10 -3
  399. package/dist/esm/views/Navigator.mjs.map +1 -1
  400. package/dist/esm/views/Navigator.native.js +15 -6
  401. package/dist/esm/views/Navigator.native.js.map +1 -1
  402. package/dist/esm/views/Protected.js +14 -0
  403. package/dist/esm/views/Protected.js.map +6 -0
  404. package/dist/esm/views/Protected.mjs +11 -0
  405. package/dist/esm/views/Protected.mjs.map +1 -0
  406. package/dist/esm/views/Protected.native.js +16 -0
  407. package/dist/esm/views/Protected.native.js.map +1 -0
  408. package/dist/esm/views/RootErrorBoundary.js +214 -7
  409. package/dist/esm/views/RootErrorBoundary.js.map +1 -1
  410. package/dist/esm/views/RootErrorBoundary.mjs +192 -7
  411. package/dist/esm/views/RootErrorBoundary.mjs.map +1 -1
  412. package/dist/esm/views/RootErrorBoundary.native.js +191 -7
  413. package/dist/esm/views/RootErrorBoundary.native.js.map +1 -1
  414. package/dist/esm/views/ScrollBehavior.js +47 -11
  415. package/dist/esm/views/ScrollBehavior.js.map +1 -1
  416. package/dist/esm/views/ScrollBehavior.mjs +48 -11
  417. package/dist/esm/views/ScrollBehavior.mjs.map +1 -1
  418. package/dist/esm/views/ScrollBehavior.native.js +67 -10
  419. package/dist/esm/views/ScrollBehavior.native.js.map +1 -1
  420. package/dist/esm/views/SourceInspector.js +7 -0
  421. package/dist/esm/views/SourceInspector.js.map +6 -0
  422. package/dist/esm/views/SourceInspector.mjs +5 -0
  423. package/dist/esm/views/SourceInspector.mjs.map +1 -0
  424. package/dist/esm/views/SourceInspector.native.js +6 -0
  425. package/dist/esm/views/SourceInspector.native.js.map +1 -0
  426. package/dist/esm/views/Try.js +38 -4
  427. package/dist/esm/views/Try.js.map +1 -1
  428. package/dist/esm/views/Try.mjs +40 -7
  429. package/dist/esm/views/Try.mjs.map +1 -1
  430. package/dist/esm/views/Try.native.js +42 -7
  431. package/dist/esm/views/Try.native.js.map +1 -1
  432. package/dist/esm/vite/DevHead.js +802 -51
  433. package/dist/esm/vite/DevHead.js.map +1 -1
  434. package/dist/esm/vite/DevHead.mjs +797 -43
  435. package/dist/esm/vite/DevHead.mjs.map +1 -1
  436. package/dist/esm/vite/DevHead.native.js +782 -0
  437. package/dist/esm/vite/DevHead.native.js.map +1 -1
  438. package/dist/esm/vite/one.js +7 -1
  439. package/dist/esm/vite/one.js.map +1 -1
  440. package/dist/esm/vite/one.mjs +7 -1
  441. package/dist/esm/vite/one.mjs.map +1 -1
  442. package/dist/esm/vite/one.native.js +17 -7
  443. package/dist/esm/vite/one.native.js.map +1 -1
  444. package/dist/esm/vite/plugins/SSRCSSPlugin.js +48 -4
  445. package/dist/esm/vite/plugins/SSRCSSPlugin.js.map +1 -1
  446. package/dist/esm/vite/plugins/SSRCSSPlugin.mjs +44 -4
  447. package/dist/esm/vite/plugins/SSRCSSPlugin.mjs.map +1 -1
  448. package/dist/esm/vite/plugins/SSRCSSPlugin.native.js +61 -4
  449. package/dist/esm/vite/plugins/SSRCSSPlugin.native.js.map +1 -1
  450. package/dist/esm/vite/plugins/clientTreeShakePlugin.js +24 -3
  451. package/dist/esm/vite/plugins/clientTreeShakePlugin.js.map +1 -1
  452. package/dist/esm/vite/plugins/clientTreeShakePlugin.mjs +34 -15
  453. package/dist/esm/vite/plugins/clientTreeShakePlugin.mjs.map +1 -1
  454. package/dist/esm/vite/plugins/clientTreeShakePlugin.native.js +55 -19
  455. package/dist/esm/vite/plugins/clientTreeShakePlugin.native.js.map +1 -1
  456. package/dist/esm/vite/plugins/clientTreeShakePlugin.test.js +130 -0
  457. package/dist/esm/vite/plugins/clientTreeShakePlugin.test.js.map +6 -0
  458. package/dist/esm/vite/plugins/clientTreeShakePlugin.test.mjs +130 -0
  459. package/dist/esm/vite/plugins/clientTreeShakePlugin.test.mjs.map +1 -0
  460. package/dist/esm/vite/plugins/clientTreeShakePlugin.test.native.js +138 -0
  461. package/dist/esm/vite/plugins/clientTreeShakePlugin.test.native.js.map +1 -0
  462. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js +6 -3
  463. package/dist/esm/vite/plugins/fileSystemRouterPlugin.js.map +1 -1
  464. package/dist/esm/vite/plugins/fileSystemRouterPlugin.mjs.map +1 -1
  465. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js +3 -3
  466. package/dist/esm/vite/plugins/fileSystemRouterPlugin.native.js.map +1 -1
  467. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.js +11 -6
  468. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.js.map +1 -1
  469. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs +5 -1
  470. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.mjs.map +1 -1
  471. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js +1 -0
  472. package/dist/esm/vite/plugins/generateFileSystemRouteTypesPlugin.native.js.map +1 -1
  473. package/dist/esm/vite/plugins/sourceInspectorPlugin.js +126 -0
  474. package/dist/esm/vite/plugins/sourceInspectorPlugin.js.map +6 -0
  475. package/dist/esm/vite/plugins/sourceInspectorPlugin.mjs +121 -0
  476. package/dist/esm/vite/plugins/sourceInspectorPlugin.mjs.map +1 -0
  477. package/dist/esm/vite/plugins/sourceInspectorPlugin.native.js +194 -0
  478. package/dist/esm/vite/plugins/sourceInspectorPlugin.native.js.map +1 -0
  479. package/dist/esm/vite/plugins/virtualEntryPlugin.js +16 -6
  480. package/dist/esm/vite/plugins/virtualEntryPlugin.js.map +1 -1
  481. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs +25 -6
  482. package/dist/esm/vite/plugins/virtualEntryPlugin.mjs.map +1 -1
  483. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js +26 -7
  484. package/dist/esm/vite/plugins/virtualEntryPlugin.native.js.map +1 -1
  485. package/package.json +16 -14
  486. package/src/cli/build.ts +1 -1
  487. package/src/cli/buildPage.ts +1 -1
  488. package/src/cli/dev.ts +4 -4
  489. package/src/cli/generateRoutes.ts +1 -1
  490. package/src/createApp.tsx +11 -1
  491. package/src/createHandleRequest.test.ts +3 -1
  492. package/src/devtools/registry.ts +21 -0
  493. package/src/fork/createMemoryHistory.tsx +43 -11
  494. package/src/fork/useLinking.ts +14 -4
  495. package/src/hooks.tsx +71 -21
  496. package/src/index.ts +34 -1
  497. package/src/interfaces/router.ts +48 -0
  498. package/src/layouts/withLayoutContext.tsx +48 -8
  499. package/src/link/Link.tsx +7 -2
  500. package/src/link/useLinkTo.tsx +7 -3
  501. package/src/router/Route.tsx +32 -3
  502. package/src/router/findRouteNode.ts +127 -0
  503. package/src/router/router.ts +291 -2
  504. package/src/router/useNavigation.ts +12 -3
  505. package/src/router/useScreens.tsx +9 -3
  506. package/src/useBlocker.native.ts +153 -0
  507. package/src/useBlocker.ts +340 -0
  508. package/src/useFocusEffect.ts +18 -5
  509. package/src/useLoader.ts +193 -2
  510. package/src/useScrollGroup.native.ts +7 -0
  511. package/src/useScrollGroup.ts +35 -0
  512. package/src/validateParams.ts +196 -0
  513. package/src/validateSearch.ts +241 -0
  514. package/src/views/ErrorBoundary.tsx +154 -156
  515. package/src/views/ErrorBoundary.web.tsx +321 -0
  516. package/src/views/Navigator.tsx +18 -2
  517. package/src/views/Protected.tsx +62 -0
  518. package/src/views/RootErrorBoundary.tsx +214 -17
  519. package/src/views/ScrollBehavior.tsx +82 -3
  520. package/src/views/SourceInspector.tsx +39 -0
  521. package/src/views/Try.tsx +81 -12
  522. package/src/vite/DevHead.tsx +819 -54
  523. package/src/vite/one.ts +13 -0
  524. package/src/vite/plugins/SSRCSSPlugin.ts +104 -0
  525. package/src/vite/plugins/clientTreeShakePlugin.test.ts +174 -0
  526. package/src/vite/plugins/clientTreeShakePlugin.ts +50 -4
  527. package/src/vite/plugins/fileSystemRouterPlugin.tsx +11 -8
  528. package/src/vite/plugins/generateFileSystemRouteTypesPlugin.tsx +4 -0
  529. package/src/vite/plugins/sourceInspectorPlugin.ts +246 -0
  530. package/src/vite/plugins/virtualEntryPlugin.ts +36 -10
  531. package/src/vite/types.ts +28 -0
  532. package/types/createApp.d.ts +5 -0
  533. package/types/createApp.d.ts.map +1 -1
  534. package/types/devtools/registry.d.ts +15 -0
  535. package/types/devtools/registry.d.ts.map +1 -0
  536. package/types/fork/createMemoryHistory.d.ts +8 -3
  537. package/types/fork/createMemoryHistory.d.ts.map +1 -1
  538. package/types/fork/useLinking.d.ts.map +1 -1
  539. package/types/hooks.d.ts +71 -20
  540. package/types/hooks.d.ts.map +1 -1
  541. package/types/index.d.ts +8 -1
  542. package/types/index.d.ts.map +1 -1
  543. package/types/interfaces/router.d.ts +47 -0
  544. package/types/interfaces/router.d.ts.map +1 -1
  545. package/types/layouts/Drawer.d.ts +15 -11
  546. package/types/layouts/Drawer.d.ts.map +1 -1
  547. package/types/layouts/withLayoutContext.d.ts +2 -1
  548. package/types/layouts/withLayoutContext.d.ts.map +1 -1
  549. package/types/link/Link.d.ts.map +1 -1
  550. package/types/link/useLinkTo.d.ts +1 -0
  551. package/types/link/useLinkTo.d.ts.map +1 -1
  552. package/types/router/Route.d.ts +32 -3
  553. package/types/router/Route.d.ts.map +1 -1
  554. package/types/router/findRouteNode.d.ts +31 -0
  555. package/types/router/findRouteNode.d.ts.map +1 -0
  556. package/types/router/router.d.ts +35 -0
  557. package/types/router/router.d.ts.map +1 -1
  558. package/types/router/useNavigation.d.ts +12 -3
  559. package/types/router/useNavigation.d.ts.map +1 -1
  560. package/types/router/useScreens.d.ts +2 -0
  561. package/types/router/useScreens.d.ts.map +1 -1
  562. package/types/server/oneServe.d.ts.map +1 -1
  563. package/types/ui/TabContext.d.ts +1 -1
  564. package/types/ui/TabContext.d.ts.map +1 -1
  565. package/types/ui/Tabs.d.ts +2 -2
  566. package/types/ui/Tabs.d.ts.map +1 -1
  567. package/types/useBlocker.d.ts +72 -0
  568. package/types/useBlocker.d.ts.map +1 -0
  569. package/types/useBlocker.native.d.ts +60 -0
  570. package/types/useBlocker.native.d.ts.map +1 -0
  571. package/types/useFocusEffect.d.ts +17 -4
  572. package/types/useFocusEffect.d.ts.map +1 -1
  573. package/types/useLoader.d.ts +63 -0
  574. package/types/useLoader.d.ts.map +1 -1
  575. package/types/useScrollGroup.d.ts +18 -0
  576. package/types/useScrollGroup.d.ts.map +1 -0
  577. package/types/useScrollGroup.native.d.ts +6 -0
  578. package/types/useScrollGroup.native.d.ts.map +1 -0
  579. package/types/validateParams.d.ts +85 -0
  580. package/types/validateParams.d.ts.map +1 -0
  581. package/types/validateSearch.d.ts +107 -0
  582. package/types/validateSearch.d.ts.map +1 -0
  583. package/types/views/ErrorBoundary.d.ts +11 -1
  584. package/types/views/ErrorBoundary.d.ts.map +1 -1
  585. package/types/views/ErrorBoundary.web.d.ts +13 -0
  586. package/types/views/ErrorBoundary.web.d.ts.map +1 -0
  587. package/types/views/Navigator.d.ts.map +1 -1
  588. package/types/views/Protected.d.ts +39 -0
  589. package/types/views/Protected.d.ts.map +1 -0
  590. package/types/views/RootErrorBoundary.d.ts +14 -8
  591. package/types/views/RootErrorBoundary.d.ts.map +1 -1
  592. package/types/views/ScrollBehavior.d.ts +8 -0
  593. package/types/views/ScrollBehavior.d.ts.map +1 -1
  594. package/types/views/SourceInspector.d.ts +35 -0
  595. package/types/views/SourceInspector.d.ts.map +1 -0
  596. package/types/views/Try.d.ts +29 -6
  597. package/types/views/Try.d.ts.map +1 -1
  598. package/types/vite/DevHead.d.ts.map +1 -1
  599. package/types/vite/one.d.ts.map +1 -1
  600. package/types/vite/plugins/SSRCSSPlugin.d.ts.map +1 -1
  601. package/types/vite/plugins/clientTreeShakePlugin.d.ts.map +1 -1
  602. package/types/vite/plugins/clientTreeShakePlugin.test.d.ts +2 -0
  603. package/types/vite/plugins/clientTreeShakePlugin.test.d.ts.map +1 -0
  604. package/types/vite/plugins/fileSystemRouterPlugin.d.ts.map +1 -1
  605. package/types/vite/plugins/generateFileSystemRouteTypesPlugin.d.ts.map +1 -1
  606. package/types/vite/plugins/sourceInspectorPlugin.d.ts +3 -0
  607. package/types/vite/plugins/sourceInspectorPlugin.d.ts.map +1 -0
  608. package/types/vite/plugins/virtualEntryPlugin.d.ts.map +1 -1
  609. package/types/vite/types.d.ts +24 -0
  610. package/types/vite/types.d.ts.map +1 -1
  611. package/types/env.d.ts +0 -66
  612. /package/types/vercel/build/generate/{createSSRServerlessFunction.d.ts → createSsrServerlessFunction.d.ts} +0 -0
@@ -35,11 +35,80 @@ import { sortRoutes } from './sortRoutes'
35
35
  import { getQualifiedRouteComponent } from './useScreens'
36
36
  import { preloadRouteModules } from './useViteRoutes'
37
37
  import { getNavigateAction } from './utils/getNavigateAction'
38
+ import {
39
+ findRouteNodeFromState,
40
+ extractParamsFromState,
41
+ extractSearchFromHref,
42
+ extractPathnameFromHref,
43
+ } from './findRouteNode'
44
+ import {
45
+ validateParams as runValidateParams,
46
+ RouteValidationError,
47
+ ParamValidationError,
48
+ } from '../validateParams'
49
+ import { checkBlocker } from '../useBlocker'
50
+ import { devtoolsRegistry } from '../devtools/registry'
38
51
 
39
52
  // Module-scoped variables
40
53
  export let routeNode: RouteNode | null = null
41
54
  export let rootComponent: ComponentType
42
55
 
56
+ // Global registry for protected routes
57
+ // Key: contextKey (e.g., '/protected-test'), Value: Set of protected route names
58
+ const protectedRouteRegistry = new Map<string, Set<string>>()
59
+
60
+ /**
61
+ * Register protected routes for a navigator context.
62
+ * Called by navigators when their protectedScreens changes.
63
+ */
64
+ export function registerProtectedRoutes(
65
+ contextKey: string,
66
+ protectedScreens: Set<string>
67
+ ) {
68
+ if (protectedScreens.size === 0) {
69
+ protectedRouteRegistry.delete(contextKey)
70
+ } else {
71
+ protectedRouteRegistry.set(contextKey, protectedScreens)
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Unregister protected routes for a navigator context.
77
+ * Called when a navigator unmounts.
78
+ */
79
+ export function unregisterProtectedRoutes(contextKey: string) {
80
+ protectedRouteRegistry.delete(contextKey)
81
+ }
82
+
83
+ /**
84
+ * Check if a route path is protected and should be blocked.
85
+ * Returns true if the route is protected.
86
+ */
87
+ export function isRouteProtected(href: string): boolean {
88
+ // Normalize the href (remove leading/trailing slashes)
89
+ const normalizedHref = href.replace(/^\/+|\/+$/g, '')
90
+
91
+ // Check each navigator context to see if this route is protected
92
+ for (const [contextKey, protectedScreens] of protectedRouteRegistry) {
93
+ const normalizedContextKey = contextKey.replace(/^\/+|\/+$/g, '')
94
+
95
+ // Check if this href is under this context
96
+ if (normalizedHref.startsWith(normalizedContextKey)) {
97
+ // Get the route name relative to this context
98
+ const relativePath = normalizedHref
99
+ .slice(normalizedContextKey.length)
100
+ .replace(/^\//, '')
101
+ const routeName = relativePath.split('/')[0] || 'index'
102
+
103
+ if (protectedScreens.has(routeName)) {
104
+ return true
105
+ }
106
+ }
107
+ }
108
+
109
+ return false
110
+ }
111
+
43
112
  export let hasAttemptedToHideSplash = false
44
113
  export let initialState: OneRouter.ResultState | undefined
45
114
  export let rootState: OneRouter.ResultState | undefined
@@ -56,6 +125,60 @@ const rootStateSubscribers = new Set<OneRouter.RootStateListener>()
56
125
  const loadingStateSubscribers = new Set<OneRouter.LoadingStateListener>()
57
126
  const storeSubscribers = new Set<() => void>()
58
127
 
128
+ // Validation state tracking
129
+ export type ValidationState = {
130
+ status: 'idle' | 'validating' | 'error' | 'valid'
131
+ error?: Error
132
+ lastValidatedHref?: string
133
+ }
134
+
135
+ let validationState: ValidationState = { status: 'idle' }
136
+ const validationStateSubscribers = new Set<(state: ValidationState) => void>()
137
+
138
+ export function subscribeToValidationState(subscriber: (state: ValidationState) => void) {
139
+ validationStateSubscribers.add(subscriber)
140
+ return () => validationStateSubscribers.delete(subscriber)
141
+ }
142
+
143
+ export function setValidationState(state: ValidationState) {
144
+ validationState = state
145
+ for (const subscriber of validationStateSubscribers) {
146
+ subscriber(state)
147
+ }
148
+ // Dispatch event for devtools
149
+ if (
150
+ process.env.TAMAGUI_TARGET !== 'native' &&
151
+ state.status === 'error' &&
152
+ state.error
153
+ ) {
154
+ window.dispatchEvent(
155
+ new CustomEvent('one-validation-error', {
156
+ detail: {
157
+ error: {
158
+ message: state.error.message,
159
+ name: state.error.name,
160
+ stack: state.error.stack,
161
+ },
162
+ href: state.lastValidatedHref,
163
+ timestamp: Date.now(),
164
+ },
165
+ })
166
+ )
167
+ }
168
+ }
169
+
170
+ export function getValidationState(): ValidationState {
171
+ return validationState
172
+ }
173
+
174
+ export function useValidationState() {
175
+ return useSyncExternalStore(
176
+ subscribeToValidationState,
177
+ getValidationState,
178
+ getValidationState
179
+ )
180
+ }
181
+
59
182
  // Initialize function
60
183
  export function initialize(
61
184
  context: One.RouteContext,
@@ -272,6 +395,23 @@ export function updateState(state: OneRouter.ResultState, nextStateParam = state
272
395
  }
273
396
  routeInfo = nextRouteInfo
274
397
  }
398
+
399
+ // Expose devtools API in development
400
+ if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
401
+ // Use registry to avoid circular deps - useLoader registers its function there
402
+ ;(window as any).__oneDevtools = {
403
+ routeInfo: nextRouteInfo,
404
+ rootState: state,
405
+ routeNode,
406
+ getRoutes: () => routeNode?.children || [],
407
+ getLoaderTimingHistory: () => devtoolsRegistry.getLoaderTimingHistory?.() ?? [],
408
+ getPreloadHistory,
409
+ }
410
+ // Dispatch event for devtools panels to listen
411
+ if (process.env.TAMAGUI_TARGET !== 'native') {
412
+ window.dispatchEvent(new CustomEvent('one-route-change', { detail: nextRouteInfo }))
413
+ }
414
+ }
275
415
  }
276
416
 
277
417
  // Subscription functions
@@ -397,6 +537,9 @@ async function doPreload(href: string) {
397
537
  const preloadPath = getPreloadPath(href)
398
538
  const loaderPath = getLoaderPath(href)
399
539
  const cssPreloadPath = getPreloadCSSPath(href)
540
+
541
+ recordPreloadStart(href)
542
+
400
543
  try {
401
544
  const [_preload, cssPreloadModule, loader] = await Promise.all([
402
545
  dynamicImport(preloadPath),
@@ -406,18 +549,24 @@ async function doPreload(href: string) {
406
549
  ])
407
550
 
408
551
  // Store the CSS inject function for later use on navigation
409
- if (cssPreloadModule?.injectCSS) {
552
+ const hasCss = !!cssPreloadModule?.injectCSS
553
+ if (hasCss) {
410
554
  cssInjectFunctions[href] = cssPreloadModule.injectCSS
411
555
  }
412
556
 
413
- if (!loader?.loader) {
557
+ const hasLoader = !!loader?.loader
558
+ if (!hasLoader) {
559
+ recordPreloadComplete(href, false, hasCss)
414
560
  return null
415
561
  }
416
562
 
417
563
  const result = await loader.loader()
564
+ recordPreloadComplete(href, true, hasCss)
418
565
  return result ?? null
419
566
  } catch (err) {
567
+ const errorMessage = err instanceof Error ? err.message : String(err)
420
568
  console.error(`[one] preload error for ${href}:`, err)
569
+ recordPreloadError(href, errorMessage)
421
570
  return null
422
571
  }
423
572
  }
@@ -428,6 +577,79 @@ export const preloadedLoaderData: Record<string, any> = {}
428
577
  // Store CSS inject functions for calling on navigation
429
578
  const cssInjectFunctions: Record<string, (() => Promise<void[]>) | undefined> = {}
430
579
 
580
+ // Preload status tracking for devtools
581
+ export type PreloadStatus = 'pending' | 'loading' | 'loaded' | 'error'
582
+ export type PreloadEntry = {
583
+ href: string
584
+ status: PreloadStatus
585
+ startTime: number
586
+ endTime?: number
587
+ error?: string
588
+ hasLoader: boolean
589
+ hasCss: boolean
590
+ }
591
+
592
+ const preloadHistory: PreloadEntry[] = []
593
+ const MAX_PRELOAD_HISTORY = 30
594
+
595
+ // Preload tracking functions - only do work in development for devtools
596
+ function recordPreloadStart(href: string) {
597
+ if (process.env.NODE_ENV !== 'development') return
598
+
599
+ const existing = preloadHistory.find((p) => p.href === href)
600
+ if (existing) {
601
+ existing.status = 'loading'
602
+ existing.startTime = performance.now()
603
+ return
604
+ }
605
+ preloadHistory.unshift({
606
+ href,
607
+ status: 'loading',
608
+ startTime: performance.now(),
609
+ hasLoader: false,
610
+ hasCss: false,
611
+ })
612
+ if (preloadHistory.length > MAX_PRELOAD_HISTORY) {
613
+ preloadHistory.pop()
614
+ }
615
+ dispatchPreloadEvent()
616
+ }
617
+
618
+ function recordPreloadComplete(href: string, hasLoader: boolean, hasCss: boolean) {
619
+ if (process.env.NODE_ENV !== 'development') return
620
+
621
+ const entry = preloadHistory.find((p) => p.href === href)
622
+ if (entry) {
623
+ entry.status = 'loaded'
624
+ entry.endTime = performance.now()
625
+ entry.hasLoader = hasLoader
626
+ entry.hasCss = hasCss
627
+ }
628
+ dispatchPreloadEvent()
629
+ }
630
+
631
+ function recordPreloadError(href: string, error: string) {
632
+ if (process.env.NODE_ENV !== 'development') return
633
+
634
+ const entry = preloadHistory.find((p) => p.href === href)
635
+ if (entry) {
636
+ entry.status = 'error'
637
+ entry.endTime = performance.now()
638
+ entry.error = error
639
+ }
640
+ dispatchPreloadEvent()
641
+ }
642
+
643
+ function dispatchPreloadEvent() {
644
+ if (process.env.TAMAGUI_TARGET !== 'native') {
645
+ window.dispatchEvent(new CustomEvent('one-preload-update'))
646
+ }
647
+ }
648
+
649
+ export function getPreloadHistory(): PreloadEntry[] {
650
+ return preloadHistory
651
+ }
652
+
431
653
  export function preloadRoute(href: string, injectCSS = false): Promise<any> | undefined {
432
654
  if (process.env.TAMAGUI_TARGET === 'native') {
433
655
  return
@@ -477,6 +699,16 @@ export async function linkTo(
477
699
  return
478
700
  }
479
701
 
702
+ // Check if any blocker wants to block this navigation (web only)
703
+ if (checkBlocker(href, event === 'REPLACE' ? 'replace' : 'push')) {
704
+ return
705
+ }
706
+
707
+ // Check if the route is protected and should be blocked
708
+ if (isRouteProtected(href)) {
709
+ return
710
+ }
711
+
480
712
  assertIsReady(navigationRef)
481
713
  const current = navigationRef.current
482
714
 
@@ -540,8 +772,65 @@ export async function linkTo(
540
772
 
541
773
  setLoadingState('loading')
542
774
 
775
+ // Preload route modules first so loadRoute() won't throw Suspense promises
543
776
  await preloadRoute(href, true)
544
777
 
778
+ // Run async route validation before navigation
779
+ const matchingRouteNode = findRouteNodeFromState(state, routeNode)
780
+ if (matchingRouteNode?.loadRoute) {
781
+ setValidationState({ status: 'validating', lastValidatedHref: href })
782
+
783
+ try {
784
+ const loadedRoute = matchingRouteNode.loadRoute()
785
+ const params = extractParamsFromState(state)
786
+ const search = extractSearchFromHref(href)
787
+ const pathname = extractPathnameFromHref(href)
788
+
789
+ // Run validateParams if exported
790
+ if (loadedRoute.validateParams) {
791
+ runValidateParams(loadedRoute.validateParams, params)
792
+ }
793
+
794
+ // Run validateRoute if exported
795
+ if (loadedRoute.validateRoute) {
796
+ const validationResult = await loadedRoute.validateRoute({
797
+ params,
798
+ search,
799
+ pathname,
800
+ href,
801
+ })
802
+
803
+ // Check for explicit invalid result
804
+ if (validationResult && !validationResult.valid) {
805
+ const error = new RouteValidationError(
806
+ validationResult.error || 'Route validation failed',
807
+ validationResult.details
808
+ )
809
+ setValidationState({ status: 'error', error, lastValidatedHref: href })
810
+ throw error
811
+ }
812
+ }
813
+
814
+ setValidationState({ status: 'valid', lastValidatedHref: href })
815
+ } catch (error) {
816
+ // Handle Suspense promises thrown by loadRoute in dev mode
817
+ if (error && typeof (error as any).then === 'function') {
818
+ // Wait for the route to load and skip validation for this navigation
819
+ await (error as Promise<any>).catch(() => {})
820
+ setValidationState({ status: 'valid', lastValidatedHref: href })
821
+ } else if (
822
+ error instanceof ParamValidationError ||
823
+ error instanceof RouteValidationError
824
+ ) {
825
+ setValidationState({ status: 'error', error, lastValidatedHref: href })
826
+ throw error
827
+ } else {
828
+ // Re-throw other errors
829
+ throw error
830
+ }
831
+ }
832
+ }
833
+
545
834
  const rootState = navigationRef.getRootState()
546
835
 
547
836
  const hash = href.indexOf('#')
@@ -8,9 +8,18 @@ import { getNameFromFilePath } from './matchers'
8
8
  import { useContextKey } from './Route'
9
9
 
10
10
  /**
11
- * Return the navigation object for the current route.
12
- * @param parent Provide an absolute path like `/(root)` to the parent route or a relative path like `../../` to the parent route.
13
- * @returns the navigation object for the provided route.
11
+ * Returns the React Navigation navigation object for the current route.
12
+ * Provides low-level access to navigation actions, events, and screen options.
13
+ *
14
+ * @param parent - Optional path to parent navigator (absolute like `/(tabs)` or relative like `../`)
15
+ * @returns The navigation object with methods like setOptions, addListener, getParent
16
+ * @link https://onestack.dev/docs/api/hooks/useNavigation
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * const navigation = useNavigation()
21
+ * navigation.setOptions({ title: 'My Screen' })
22
+ * ```
14
23
  */
15
24
  export function useNavigation<T = NavigationProp<ReactNavigation.RootParamList>>(
16
25
  parent?: string
@@ -224,7 +224,11 @@ function getSortedChildren(
224
224
  */
225
225
  export function useSortedScreens(
226
226
  order: ScreenProps[],
227
- options?: { onlyMatching?: boolean }
227
+ options?: {
228
+ onlyMatching?: boolean
229
+ /** Set of route names to filter out (protected routes with guard=false) */
230
+ protectedScreens?: Set<string>
231
+ }
228
232
  ): React.ReactNode[] {
229
233
  const node = useRouteNode()
230
234
 
@@ -233,8 +237,10 @@ export function useSortedScreens(
233
237
  ? getSortedChildren(node.children, order, node.initialRouteName, options)
234
238
  : []
235
239
 
236
- return sorted.map((value) => routeToScreen(value.route, value.props))
237
- }, [node?.children, node?.initialRouteName, order])
240
+ return sorted
241
+ .filter((value) => !options?.protectedScreens?.has(value.route.route))
242
+ .map((value) => routeToScreen(value.route, value.props))
243
+ }, [node?.children, node?.initialRouteName, order, options?.protectedScreens])
238
244
 
239
245
  return sortedScreens
240
246
  }
@@ -0,0 +1,153 @@
1
+ import { useNavigation } from '@react-navigation/native'
2
+ import * as React from 'react'
3
+
4
+ export type BlockerState = 'unblocked' | 'blocked' | 'proceeding'
5
+
6
+ export type BlockerFunction = (args: {
7
+ currentLocation: string
8
+ nextLocation: string
9
+ historyAction: 'push' | 'pop' | 'replace'
10
+ }) => boolean
11
+
12
+ export type Blocker =
13
+ | {
14
+ state: 'unblocked'
15
+ reset?: undefined
16
+ proceed?: undefined
17
+ location?: undefined
18
+ }
19
+ | {
20
+ state: 'blocked'
21
+ reset: () => void
22
+ proceed: () => void
23
+ location: string
24
+ }
25
+ | {
26
+ state: 'proceeding'
27
+ reset?: undefined
28
+ proceed?: undefined
29
+ location: string
30
+ }
31
+
32
+ /**
33
+ * Block navigation when a condition is met.
34
+ *
35
+ * On native, this uses React Navigation's `beforeRemove` event to prevent navigation.
36
+ * Note that this only works for navigation within the app - it cannot prevent
37
+ * the app from being closed or backgrounded.
38
+ *
39
+ * @param shouldBlock - Either a boolean or a function that returns whether to block.
40
+ *
41
+ * @example
42
+ * ```tsx
43
+ * function EditForm() {
44
+ * const [isDirty, setIsDirty] = useState(false)
45
+ * const blocker = useBlocker(isDirty)
46
+ *
47
+ * return (
48
+ * <>
49
+ * <TextInput onChange={() => setIsDirty(true)} />
50
+ *
51
+ * {blocker.state === 'blocked' && (
52
+ * <Modal>
53
+ * <Text>You have unsaved changes. Leave anyway?</Text>
54
+ * <Button title="Stay" onPress={blocker.reset} />
55
+ * <Button title="Leave" onPress={blocker.proceed} />
56
+ * </Modal>
57
+ * )}
58
+ * </>
59
+ * )
60
+ * }
61
+ * ```
62
+ */
63
+ export function useBlocker(shouldBlock: BlockerFunction | boolean): Blocker {
64
+ const navigation = useNavigation()
65
+ const [state, setState] = React.useState<BlockerState>('unblocked')
66
+ const [pendingEvent, setPendingEvent] = React.useState<any>(null)
67
+ const [blockedLocation, setBlockedLocation] = React.useState<string | null>(null)
68
+
69
+ const shouldBlockRef = React.useRef(shouldBlock)
70
+ shouldBlockRef.current = shouldBlock
71
+
72
+ React.useEffect(() => {
73
+ const unsubscribe = navigation.addListener('beforeRemove', (e) => {
74
+ const currentShouldBlock = shouldBlockRef.current
75
+
76
+ // Get the next location from the action payload
77
+ const payload = e.data?.action?.payload as { name?: string } | undefined
78
+ const nextLocation = payload?.name || 'previous screen'
79
+
80
+ // Determine if we should block
81
+ const block =
82
+ typeof currentShouldBlock === 'function'
83
+ ? currentShouldBlock({
84
+ currentLocation: '', // Not easily available on native
85
+ nextLocation,
86
+ historyAction: 'pop',
87
+ })
88
+ : currentShouldBlock
89
+
90
+ if (!block) {
91
+ return
92
+ }
93
+
94
+ // Prevent default behavior (leaving the screen)
95
+ e.preventDefault()
96
+
97
+ // Store the event to dispatch later if user confirms
98
+ setPendingEvent(e)
99
+ setBlockedLocation(nextLocation)
100
+ setState('blocked')
101
+ })
102
+
103
+ return unsubscribe
104
+ }, [navigation])
105
+
106
+ const reset = React.useCallback(() => {
107
+ setPendingEvent(null)
108
+ setBlockedLocation(null)
109
+ setState('unblocked')
110
+ }, [])
111
+
112
+ const proceed = React.useCallback(() => {
113
+ if (!pendingEvent) return
114
+
115
+ setState('proceeding')
116
+
117
+ // Dispatch the original action to complete navigation
118
+ navigation.dispatch(pendingEvent.data.action)
119
+
120
+ // Reset after navigation
121
+ setTimeout(() => {
122
+ setPendingEvent(null)
123
+ setBlockedLocation(null)
124
+ setState('unblocked')
125
+ }, 100)
126
+ }, [navigation, pendingEvent])
127
+
128
+ if (state === 'unblocked') {
129
+ return { state: 'unblocked' }
130
+ }
131
+
132
+ if (state === 'proceeding') {
133
+ return { state: 'proceeding', location: blockedLocation! }
134
+ }
135
+
136
+ return {
137
+ state: 'blocked',
138
+ reset,
139
+ proceed,
140
+ location: blockedLocation!,
141
+ }
142
+ }
143
+
144
+ /**
145
+ * No-op on native - native uses React Navigation's beforeRemove event instead.
146
+ * This is only used by the router on web.
147
+ */
148
+ export function checkBlocker(
149
+ _nextLocation: string,
150
+ _historyAction: 'push' | 'pop' | 'replace' = 'push'
151
+ ): boolean {
152
+ return false
153
+ }