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
@@ -0,0 +1,340 @@
1
+ import * as React from 'react'
2
+ import { Platform } from 'react-native'
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
+ * Stored pending navigation that was blocked.
34
+ * We need to restore it when the user confirms.
35
+ */
36
+ type PendingNavigation = {
37
+ previousLocation: string
38
+ nextLocation: string
39
+ historyAction: 'push' | 'pop' | 'replace'
40
+ }
41
+
42
+ // Global state for blocking
43
+ let currentLocation =
44
+ typeof window !== 'undefined' ? window.location.pathname + window.location.search : ''
45
+ let isBlocking = false
46
+ let isProceeding = false
47
+ let pendingNavigation: PendingNavigation | null = null
48
+
49
+ // Active blocker callbacks
50
+ const blockerCallbacks = new Map<
51
+ symbol,
52
+ {
53
+ shouldBlock: () => boolean
54
+ onBlock: (pending: PendingNavigation) => void
55
+ onProceed: () => void
56
+ onReset: () => void
57
+ }
58
+ >()
59
+
60
+ // Track if global listeners are set up
61
+ let listenersSetup = false
62
+
63
+ function setupListeners() {
64
+ if (listenersSetup || typeof window === 'undefined') return
65
+ listenersSetup = true
66
+
67
+ // Track current location on page load
68
+ currentLocation = window.location.pathname + window.location.search
69
+
70
+ // Listen for popstate (browser back/forward)
71
+ window.addEventListener('popstate', () => {
72
+ if (isProceeding) return
73
+
74
+ const nextLocation = window.location.pathname + window.location.search
75
+
76
+ // Check if any blocker wants to block
77
+ for (const [, callbacks] of blockerCallbacks) {
78
+ if (callbacks.shouldBlock()) {
79
+ // Block the navigation
80
+ isBlocking = true
81
+ pendingNavigation = {
82
+ previousLocation: currentLocation,
83
+ nextLocation,
84
+ historyAction: 'pop',
85
+ }
86
+
87
+ // Restore the previous URL immediately using history.forward() or history.back()
88
+ // We pushed a state when we got here, so we need to go back
89
+ window.history.go(1) // Go forward to restore
90
+
91
+ // Notify the blocker
92
+ callbacks.onBlock(pendingNavigation)
93
+ return
94
+ }
95
+ }
96
+
97
+ // No blocking, update current location
98
+ currentLocation = nextLocation
99
+ })
100
+
101
+ // Intercept pushState and replaceState
102
+ const originalPushState = window.history.pushState.bind(window.history)
103
+ const originalReplaceState = window.history.replaceState.bind(window.history)
104
+
105
+ window.history.pushState = function (state, title, url) {
106
+ if (isProceeding || !url) {
107
+ return originalPushState(state, title, url)
108
+ }
109
+
110
+ const nextLocation = typeof url === 'string' ? url : url.toString()
111
+
112
+ for (const [, callbacks] of blockerCallbacks) {
113
+ if (callbacks.shouldBlock()) {
114
+ isBlocking = true
115
+ pendingNavigation = {
116
+ previousLocation: currentLocation,
117
+ nextLocation,
118
+ historyAction: 'push',
119
+ }
120
+ callbacks.onBlock(pendingNavigation)
121
+ return // Don't call original
122
+ }
123
+ }
124
+
125
+ currentLocation = nextLocation
126
+ return originalPushState(state, title, url)
127
+ }
128
+
129
+ window.history.replaceState = function (state, title, url) {
130
+ if (isProceeding || !url) {
131
+ return originalReplaceState(state, title, url)
132
+ }
133
+
134
+ const nextLocation = typeof url === 'string' ? url : url.toString()
135
+
136
+ for (const [, callbacks] of blockerCallbacks) {
137
+ if (callbacks.shouldBlock()) {
138
+ isBlocking = true
139
+ pendingNavigation = {
140
+ previousLocation: currentLocation,
141
+ nextLocation,
142
+ historyAction: 'replace',
143
+ }
144
+ callbacks.onBlock(pendingNavigation)
145
+ return // Don't call original
146
+ }
147
+ }
148
+
149
+ currentLocation = nextLocation
150
+ return originalReplaceState(state, title, url)
151
+ }
152
+
153
+ // Handle beforeunload (page close/refresh)
154
+ window.addEventListener('beforeunload', (event) => {
155
+ for (const [, callbacks] of blockerCallbacks) {
156
+ if (callbacks.shouldBlock()) {
157
+ event.preventDefault()
158
+ event.returnValue = ''
159
+ return
160
+ }
161
+ }
162
+ })
163
+ }
164
+
165
+ /**
166
+ * Block navigation when a condition is met.
167
+ *
168
+ * This is useful for preventing users from accidentally leaving a page with unsaved changes.
169
+ * Works with both browser navigation (back/forward, URL changes) and programmatic navigation.
170
+ *
171
+ * @param shouldBlock - Either a boolean or a function that returns whether to block.
172
+ * When using a function, you receive the current and next locations and can make dynamic decisions.
173
+ *
174
+ * @example
175
+ * ```tsx
176
+ * function EditForm() {
177
+ * const [isDirty, setIsDirty] = useState(false)
178
+ * const blocker = useBlocker(isDirty)
179
+ *
180
+ * return (
181
+ * <>
182
+ * <form onChange={() => setIsDirty(true)}>
183
+ * {// form fields}
184
+ * </form>
185
+ *
186
+ * {blocker.state === 'blocked' && (
187
+ * <Dialog>
188
+ * <p>You have unsaved changes. Leave anyway?</p>
189
+ * <button onClick={blocker.reset}>Stay</button>
190
+ * <button onClick={blocker.proceed}>Leave</button>
191
+ * </Dialog>
192
+ * )}
193
+ * </>
194
+ * )
195
+ * }
196
+ * ```
197
+ *
198
+ * @example
199
+ * ```tsx
200
+ * // Function-based blocking with location info
201
+ * const blocker = useBlocker(({ currentLocation, nextLocation }) => {
202
+ * // Only block when leaving this specific section
203
+ * return currentLocation.startsWith('/edit') && !nextLocation.startsWith('/edit')
204
+ * })
205
+ * ```
206
+ */
207
+ export function useBlocker(shouldBlock: BlockerFunction | boolean): Blocker {
208
+ const [state, setState] = React.useState<BlockerState>('unblocked')
209
+ const [blockedLocation, setBlockedLocation] = React.useState<string | null>(null)
210
+ const idRef = React.useRef<symbol | null>(null)
211
+
212
+ const shouldBlockRef = React.useRef(shouldBlock)
213
+ shouldBlockRef.current = shouldBlock
214
+
215
+ React.useEffect(() => {
216
+ // Only run on web
217
+ if (Platform.OS !== 'web' || typeof window === 'undefined') return
218
+
219
+ setupListeners()
220
+
221
+ const id = Symbol('blocker')
222
+ idRef.current = id
223
+
224
+ blockerCallbacks.set(id, {
225
+ shouldBlock: () => {
226
+ const block = shouldBlockRef.current
227
+ if (typeof block === 'function') {
228
+ return block({
229
+ currentLocation,
230
+ nextLocation: pendingNavigation?.nextLocation || '',
231
+ historyAction: pendingNavigation?.historyAction || 'push',
232
+ })
233
+ }
234
+ return block
235
+ },
236
+ onBlock: (pending) => {
237
+ setBlockedLocation(pending.nextLocation)
238
+ setState('blocked')
239
+ },
240
+ onProceed: () => {
241
+ setState('proceeding')
242
+ },
243
+ onReset: () => {
244
+ setState('unblocked')
245
+ setBlockedLocation(null)
246
+ },
247
+ })
248
+
249
+ return () => {
250
+ blockerCallbacks.delete(id)
251
+ }
252
+ }, [])
253
+
254
+ const reset = React.useCallback(() => {
255
+ isBlocking = false
256
+ pendingNavigation = null
257
+ setBlockedLocation(null)
258
+ setState('unblocked')
259
+ }, [])
260
+
261
+ const proceed = React.useCallback(() => {
262
+ if (!pendingNavigation) return
263
+
264
+ setState('proceeding')
265
+ isProceeding = true
266
+
267
+ const pending = pendingNavigation
268
+ pendingNavigation = null
269
+ isBlocking = false
270
+
271
+ // Execute the blocked navigation
272
+ requestAnimationFrame(() => {
273
+ if (pending.historyAction === 'pop') {
274
+ // Go back to where the user wanted to go
275
+ window.history.back()
276
+ } else if (pending.historyAction === 'push') {
277
+ window.history.pushState(null, '', pending.nextLocation)
278
+ } else {
279
+ window.history.replaceState(null, '', pending.nextLocation)
280
+ }
281
+
282
+ currentLocation = pending.nextLocation
283
+
284
+ // Reset state after navigation
285
+ requestAnimationFrame(() => {
286
+ isProceeding = false
287
+ setBlockedLocation(null)
288
+ setState('unblocked')
289
+ })
290
+ })
291
+ }, [])
292
+
293
+ if (state === 'unblocked') {
294
+ return { state: 'unblocked' }
295
+ }
296
+
297
+ if (state === 'proceeding') {
298
+ return { state: 'proceeding', location: blockedLocation! }
299
+ }
300
+
301
+ return {
302
+ state: 'blocked',
303
+ reset,
304
+ proceed,
305
+ location: blockedLocation!,
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Check if any active blocker wants to block navigation.
311
+ * Called by the router before navigating via Link.
312
+ * Returns true if navigation was blocked.
313
+ */
314
+ export function checkBlocker(
315
+ nextLocation: string,
316
+ historyAction: 'push' | 'pop' | 'replace' = 'push'
317
+ ): boolean {
318
+ if (Platform.OS !== 'web' || typeof window === 'undefined') {
319
+ return false
320
+ }
321
+
322
+ if (isProceeding) {
323
+ return false
324
+ }
325
+
326
+ for (const [, callbacks] of blockerCallbacks) {
327
+ if (callbacks.shouldBlock()) {
328
+ isBlocking = true
329
+ pendingNavigation = {
330
+ previousLocation: currentLocation,
331
+ nextLocation,
332
+ historyAction,
333
+ }
334
+ callbacks.onBlock(pendingNavigation)
335
+ return true
336
+ }
337
+ }
338
+
339
+ return false
340
+ }
@@ -7,12 +7,25 @@ import { useOptionalNavigation } from './link/useLoadedNavigation'
7
7
  type EffectCallback = () => undefined | void | (() => void)
8
8
 
9
9
  /**
10
- * Hook to run an effect in a focused screen, similar to `React.useEffect`.
11
- * This can be used to perform side-effects such as fetching data or subscribing to events.
10
+ * Run side effects when a screen is focused. The effect runs when the screen
11
+ * gains focus and cleans up when it loses focus.
12
12
  *
13
- * @param callback Memoized callback containing the effect, should optionally return a cleanup function.
13
+ * @param effect - Memoized callback containing the effect, optionally returns cleanup function
14
+ * @param deps - Dependency array, effect re-runs when dependencies change (if focused)
15
+ * @link https://onestack.dev/docs/api/hooks/useFocusEffect
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * useFocusEffect(
20
+ * useCallback(() => {
21
+ * const subscription = subscribeToUpdates()
22
+ * return () => subscription.unsubscribe()
23
+ * }, []),
24
+ * []
25
+ * )
26
+ * ```
14
27
  */
15
- export function useFocusEffect(effect: EffectCallback, args: any[]) {
28
+ export function useFocusEffect(effect: EffectCallback, deps: any[]) {
16
29
  const navigation = useOptionalNavigation()
17
30
 
18
31
  useEffect(() => {
@@ -87,5 +100,5 @@ export function useFocusEffect(effect: EffectCallback, args: any[]) {
87
100
  unsubscribeFocus()
88
101
  unsubscribeBlur()
89
102
  }
90
- }, [navigation, ...args])
103
+ }, [navigation, ...deps])
91
104
  }
package/src/useLoader.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { useCallback, useDeferredValue, useSyncExternalStore } from 'react'
1
+ import { useCallback, useSyncExternalStore } from 'react'
2
+ import { registerDevtoolsFunction } from './devtools/registry'
2
3
  import { useParams, usePathname } from './hooks'
3
4
  import { preloadedLoaderData, preloadingLoader } from './router/router'
4
5
  import { getLoaderPath } from './utils/cleanUrl'
@@ -15,6 +16,60 @@ type LoaderStateEntry = {
15
16
  hasLoadedOnce?: boolean
16
17
  }
17
18
 
19
+ // Timing data for loader waterfall devtool (dev only)
20
+ export type LoaderTimingEntry = {
21
+ path: string
22
+ startTime: number
23
+ moduleLoadTime?: number
24
+ executionTime?: number
25
+ totalTime?: number
26
+ error?: string
27
+ source: 'preload' | 'initial' | 'refetch'
28
+ }
29
+
30
+ // Store timing history for devtools - only populated in development
31
+ const loaderTimingHistory: LoaderTimingEntry[] = []
32
+ const MAX_TIMING_HISTORY = 50
33
+
34
+ function recordLoaderTiming(entry: LoaderTimingEntry) {
35
+ if (process.env.NODE_ENV !== 'development') return
36
+
37
+ loaderTimingHistory.unshift(entry)
38
+ if (loaderTimingHistory.length > MAX_TIMING_HISTORY) {
39
+ loaderTimingHistory.pop()
40
+ }
41
+ // Dispatch event for devtools
42
+ if (typeof window !== 'undefined') {
43
+ window.dispatchEvent(new CustomEvent('one-loader-timing', { detail: entry }))
44
+
45
+ // Also dispatch error event if there was an error
46
+ if (entry.error) {
47
+ window.dispatchEvent(
48
+ new CustomEvent('one-error', {
49
+ detail: {
50
+ error: {
51
+ message: entry.error,
52
+ name: 'LoaderError',
53
+ },
54
+ route: {
55
+ pathname: entry.path,
56
+ },
57
+ timestamp: Date.now(),
58
+ type: 'loader',
59
+ },
60
+ })
61
+ )
62
+ }
63
+ }
64
+ }
65
+
66
+ export function getLoaderTimingHistory(): LoaderTimingEntry[] {
67
+ return loaderTimingHistory
68
+ }
69
+
70
+ // Register with devtools registry so router.ts doesn't need to dynamically import us
71
+ registerDevtoolsFunction('getLoaderTimingHistory', getLoaderTimingHistory)
72
+
18
73
  const loaderState: Record<string, LoaderStateEntry> = {}
19
74
  const subscribers = new Set<() => void>()
20
75
 
@@ -43,7 +98,21 @@ function getLoaderState(path: string, preloadedData?: any): LoaderStateEntry {
43
98
  return loaderState[path]
44
99
  }
45
100
 
101
+ /**
102
+ * Imperatively refetch loader data for a given path.
103
+ *
104
+ * @param pathname - The route path to refetch (e.g., '/users/123')
105
+ * @returns Promise that resolves when refetch completes
106
+ * @link https://onestack.dev/docs/api/hooks/useLoaderState#refetchloader
107
+ *
108
+ * @example
109
+ * ```tsx
110
+ * await refetchLoader('/users/123')
111
+ * ```
112
+ */
46
113
  export async function refetchLoader(pathname: string): Promise<void> {
114
+ const startTime = performance.now()
115
+
47
116
  updateState(pathname, {
48
117
  state: 'loading',
49
118
  error: null,
@@ -53,8 +122,15 @@ export async function refetchLoader(pathname: string): Promise<void> {
53
122
  const cacheBust = `${Date.now()}`
54
123
  const loaderJSUrl = getLoaderPath(pathname, true, cacheBust)
55
124
 
125
+ const moduleLoadStart = performance.now()
56
126
  const module = await dynamicImport(loaderJSUrl)
127
+ const moduleLoadTime = performance.now() - moduleLoadStart
128
+
129
+ const executionStart = performance.now()
57
130
  const result = await module.loader()
131
+ const executionTime = performance.now() - executionStart
132
+
133
+ const totalTime = performance.now() - startTime
58
134
 
59
135
  updateState(pathname, {
60
136
  data: result,
@@ -62,19 +138,61 @@ export async function refetchLoader(pathname: string): Promise<void> {
62
138
  timestamp: Date.now(),
63
139
  hasLoadedOnce: true,
64
140
  })
141
+
142
+ recordLoaderTiming({
143
+ path: pathname,
144
+ startTime,
145
+ moduleLoadTime,
146
+ executionTime,
147
+ totalTime,
148
+ source: 'refetch',
149
+ })
65
150
  } catch (err) {
151
+ const totalTime = performance.now() - startTime
152
+
66
153
  updateState(pathname, {
67
154
  error: err,
68
155
  state: 'idle',
69
156
  })
157
+
158
+ recordLoaderTiming({
159
+ path: pathname,
160
+ startTime,
161
+ totalTime,
162
+ error: err instanceof Error ? err.message : String(err),
163
+ source: 'refetch',
164
+ })
165
+
70
166
  throw err
71
167
  }
72
168
  }
73
169
 
74
- if (typeof window !== 'undefined') {
170
+ // Expose refetchLoader globally for HMR in development
171
+ if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
75
172
  ;(window as any).__oneRefetchLoader = refetchLoader
76
173
  }
77
174
 
175
+ /**
176
+ * Access loader data with full state control including refetch capability.
177
+ * Use this when you need loading state or refetch; use `useLoader` for just data.
178
+ *
179
+ * @param loader - The loader function (optional - omit for just refetch/state)
180
+ * @returns Object with data, state ('idle' | 'loading'), and refetch function
181
+ * @link https://onestack.dev/docs/api/hooks/useLoaderState
182
+ *
183
+ * @example
184
+ * ```tsx
185
+ * const { data, state, refetch } = useLoaderState(loader)
186
+ *
187
+ * return (
188
+ * <div>
189
+ * {state === 'loading' && <Spinner />}
190
+ * <button onClick={refetch}>Refresh</button>
191
+ * <pre>{JSON.stringify(data)}</pre>
192
+ * </div>
193
+ * )
194
+ * ```
195
+ */
78
196
  export function useLoaderState<
79
197
  Loader extends Function = any,
80
198
  Returned = Loader extends (p: any) => any ? ReturnType<Loader> : unknown,
@@ -172,12 +290,15 @@ export function useLoaderState<
172
290
  } else {
173
291
  // initial load
174
292
  const loadData = async () => {
293
+ const startTime = performance.now()
294
+
175
295
  try {
176
296
  if (process.env.TAMAGUI_TARGET === 'native') {
177
297
  const loaderJSUrl = getLoaderPath(currentPath, true)
178
298
  const nativeLoaderJSUrl = `${loaderJSUrl}?platform=ios`
179
299
 
180
300
  try {
301
+ const moduleLoadStart = performance.now()
181
302
  const loaderJsCodeResp = await fetch(nativeLoaderJSUrl)
182
303
  if (!loaderJsCodeResp.ok) {
183
304
  throw new Error(`Response not ok: ${loaderJsCodeResp.status}`)
@@ -187,41 +308,91 @@ export function useLoaderState<
187
308
  const result = eval(
188
309
  `() => { var exports = {}; ${loaderJsCode}; return exports; }`
189
310
  )()
311
+ const moduleLoadTime = performance.now() - moduleLoadStart
190
312
 
191
313
  if (typeof result.loader !== 'function') {
192
314
  throw new Error("Loader code isn't exporting a `loader` function")
193
315
  }
194
316
 
317
+ const executionStart = performance.now()
195
318
  const data = await result.loader()
319
+ const executionTime = performance.now() - executionStart
320
+ const totalTime = performance.now() - startTime
321
+
196
322
  updateState(currentPath, {
197
323
  data,
198
324
  hasLoadedOnce: true,
199
325
  promise: undefined,
200
326
  })
327
+
328
+ recordLoaderTiming({
329
+ path: currentPath,
330
+ startTime,
331
+ moduleLoadTime,
332
+ executionTime,
333
+ totalTime,
334
+ source: 'initial',
335
+ })
201
336
  return
202
337
  } catch (e) {
338
+ const totalTime = performance.now() - startTime
203
339
  updateState(currentPath, {
204
340
  data: {},
205
341
  promise: undefined,
206
342
  })
343
+ recordLoaderTiming({
344
+ path: currentPath,
345
+ startTime,
346
+ totalTime,
347
+ error: e instanceof Error ? e.message : String(e),
348
+ source: 'initial',
349
+ })
207
350
  return
208
351
  }
209
352
  }
210
353
 
211
354
  // web platform
212
355
  const loaderJSUrl = getLoaderPath(currentPath, true)
356
+
357
+ const moduleLoadStart = performance.now()
213
358
  const module = await dynamicImport(loaderJSUrl)
359
+ const moduleLoadTime = performance.now() - moduleLoadStart
360
+
361
+ const executionStart = performance.now()
214
362
  const result = await module.loader()
363
+ const executionTime = performance.now() - executionStart
364
+
365
+ const totalTime = performance.now() - startTime
366
+
215
367
  updateState(currentPath, {
216
368
  data: result,
217
369
  hasLoadedOnce: true,
218
370
  promise: undefined,
219
371
  })
372
+
373
+ recordLoaderTiming({
374
+ path: currentPath,
375
+ startTime,
376
+ moduleLoadTime,
377
+ executionTime,
378
+ totalTime,
379
+ source: 'initial',
380
+ })
220
381
  } catch (err) {
382
+ const totalTime = performance.now() - startTime
383
+
221
384
  updateState(currentPath, {
222
385
  error: err,
223
386
  promise: undefined,
224
387
  })
388
+
389
+ recordLoaderTiming({
390
+ path: currentPath,
391
+ startTime,
392
+ totalTime,
393
+ error: err instanceof Error ? err.message : String(err),
394
+ source: 'initial',
395
+ })
225
396
  }
226
397
  }
227
398
 
@@ -259,6 +430,26 @@ export function useLoaderState<
259
430
  }
260
431
  }
261
432
 
433
+ /**
434
+ * Load route data with SSR/SSG support. Returns the loader's data directly.
435
+ * For loading state and refetch capability, use `useLoaderState` instead.
436
+ *
437
+ * @param loader - The loader function exported from the route file
438
+ * @returns The awaited return value of your loader function
439
+ * @link https://onestack.dev/docs/api/hooks/useLoader
440
+ *
441
+ * @example
442
+ * ```tsx
443
+ * export async function loader({ params }) {
444
+ * return { user: await fetchUser(params.id) }
445
+ * }
446
+ *
447
+ * export default function UserPage() {
448
+ * const { user } = useLoader(loader)
449
+ * return <div>{user.name}</div>
450
+ * }
451
+ * ```
452
+ */
262
453
  export function useLoader<
263
454
  Loader extends Function,
264
455
  Returned = Loader extends (p: any) => any ? ReturnType<Loader> : unknown,
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Native no-op for useScrollGroup.
3
+ * Scroll position groups are a web-only feature.
4
+ */
5
+ export function useScrollGroup(_groupPath?: string) {
6
+ // No-op on native - scroll position is handled differently
7
+ }