@rangojs/router 0.0.0-experimental.11 → 0.0.0-experimental.111

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 (1141) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1037 -4
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1635 -158
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/dist/browser/react/use-client-cache.js +39 -0
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/dist/handles/index.js +6 -0
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/theme/ThemeProvider.d.ts +20 -0
  712. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  713. package/dist/theme/ThemeProvider.js +240 -0
  714. package/dist/theme/ThemeProvider.js.map +1 -0
  715. package/dist/theme/ThemeScript.d.ts +48 -0
  716. package/dist/theme/ThemeScript.d.ts.map +1 -0
  717. package/dist/theme/ThemeScript.js +13 -0
  718. package/dist/theme/ThemeScript.js.map +1 -0
  719. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  720. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  721. package/dist/theme/__tests__/theme.test.js +103 -0
  722. package/dist/theme/__tests__/theme.test.js.map +1 -0
  723. package/dist/theme/constants.d.ts +29 -0
  724. package/dist/theme/constants.d.ts.map +1 -0
  725. package/dist/theme/constants.js +48 -0
  726. package/dist/theme/constants.js.map +1 -0
  727. package/dist/theme/index.d.ts +31 -0
  728. package/dist/theme/index.d.ts.map +1 -0
  729. package/dist/theme/index.js +36 -0
  730. package/dist/theme/index.js.map +1 -0
  731. package/dist/theme/theme-context.d.ts +40 -0
  732. package/dist/theme/theme-context.d.ts.map +1 -0
  733. package/dist/theme/theme-context.js +60 -0
  734. package/dist/theme/theme-context.js.map +1 -0
  735. package/dist/theme/theme-script.d.ts +27 -0
  736. package/dist/theme/theme-script.d.ts.map +1 -0
  737. package/dist/theme/theme-script.js +147 -0
  738. package/dist/theme/theme-script.js.map +1 -0
  739. package/dist/theme/types.d.ts +163 -0
  740. package/dist/theme/types.d.ts.map +1 -0
  741. package/dist/theme/types.js +11 -0
  742. package/dist/theme/types.js.map +1 -0
  743. package/dist/theme/use-theme.d.ts +12 -0
  744. package/dist/theme/use-theme.d.ts.map +1 -0
  745. package/dist/theme/use-theme.js +40 -0
  746. package/dist/theme/use-theme.js.map +1 -0
  747. package/dist/types.d.ts +1479 -0
  748. package/dist/types.d.ts.map +1 -0
  749. package/dist/types.js +10 -0
  750. package/dist/types.js.map +1 -0
  751. package/dist/urls.d.ts +441 -0
  752. package/dist/urls.d.ts.map +1 -0
  753. package/dist/urls.gen.d.ts +8 -0
  754. package/dist/urls.gen.d.ts.map +1 -0
  755. package/dist/urls.gen.js +8 -0
  756. package/dist/urls.gen.js.map +1 -0
  757. package/dist/urls.js +443 -0
  758. package/dist/urls.js.map +1 -0
  759. package/dist/use-loader.d.ts +127 -0
  760. package/dist/use-loader.d.ts.map +1 -0
  761. package/dist/use-loader.js +237 -0
  762. package/dist/use-loader.js.map +1 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  779. package/dist/vite/ast-handler-extract.d.ts +49 -0
  780. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  781. package/dist/vite/ast-handler-extract.js +249 -0
  782. package/dist/vite/ast-handler-extract.js.map +1 -0
  783. package/dist/vite/expose-action-id.d.ts +19 -0
  784. package/dist/vite/expose-action-id.d.ts.map +1 -0
  785. package/dist/vite/expose-action-id.js +250 -0
  786. package/dist/vite/expose-action-id.js.map +1 -0
  787. package/dist/vite/expose-id-utils.d.ts +69 -0
  788. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  789. package/dist/vite/expose-id-utils.js +289 -0
  790. package/dist/vite/expose-id-utils.js.map +1 -0
  791. package/dist/vite/expose-internal-ids.d.ts +22 -0
  792. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  793. package/dist/vite/expose-internal-ids.js +886 -0
  794. package/dist/vite/expose-internal-ids.js.map +1 -0
  795. package/dist/vite/index.d.ts +149 -0
  796. package/dist/vite/index.d.ts.map +1 -0
  797. package/dist/vite/index.js +6148 -2425
  798. package/dist/vite/index.js.bak +5448 -0
  799. package/dist/vite/index.js.map +1 -0
  800. package/dist/vite/index.named-routes.gen.ts +103 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +62 -54
  811. package/skills/breadcrumbs/SKILL.md +252 -0
  812. package/skills/bundle-analysis/SKILL.md +159 -0
  813. package/skills/cache-guide/SKILL.md +473 -0
  814. package/skills/caching/SKILL.md +94 -24
  815. package/skills/composability/SKILL.md +197 -0
  816. package/skills/debug-manifest/SKILL.md +12 -8
  817. package/skills/document-cache/SKILL.md +18 -16
  818. package/skills/fonts/SKILL.md +6 -4
  819. package/skills/handler-use/SKILL.md +364 -0
  820. package/skills/hooks/SKILL.md +524 -71
  821. package/skills/host-router/SKILL.md +243 -0
  822. package/skills/i18n/SKILL.md +276 -0
  823. package/skills/intercept/SKILL.md +173 -8
  824. package/skills/layout/SKILL.md +123 -5
  825. package/skills/links/SKILL.md +316 -25
  826. package/skills/loader/SKILL.md +620 -50
  827. package/skills/middleware/SKILL.md +211 -37
  828. package/skills/migrate-nextjs/SKILL.md +562 -0
  829. package/skills/migrate-react-router/SKILL.md +769 -0
  830. package/skills/mime-routes/SKILL.md +42 -11
  831. package/skills/observability/SKILL.md +137 -0
  832. package/skills/parallel/SKILL.md +271 -3
  833. package/skills/prerender/SKILL.md +448 -63
  834. package/skills/rango/SKILL.md +293 -21
  835. package/skills/response-routes/SKILL.md +210 -100
  836. package/skills/route/SKILL.md +310 -14
  837. package/skills/router-setup/SKILL.md +211 -33
  838. package/skills/server-actions/SKILL.md +751 -0
  839. package/skills/streams-and-websockets/SKILL.md +283 -0
  840. package/skills/theme/SKILL.md +9 -8
  841. package/skills/typesafety/SKILL.md +622 -91
  842. package/skills/use-cache/SKILL.md +324 -0
  843. package/skills/view-transitions/SKILL.md +212 -0
  844. package/src/__augment-tests__/augment.ts +81 -0
  845. package/src/__augment-tests__/augmented.check.ts +117 -0
  846. package/src/__internal.ts +102 -4
  847. package/src/bin/rango.ts +312 -15
  848. package/src/browser/action-coordinator.ts +97 -0
  849. package/src/browser/action-response-classifier.ts +99 -0
  850. package/src/browser/app-shell.ts +52 -0
  851. package/src/browser/app-version.ts +14 -0
  852. package/src/browser/event-controller.ts +136 -68
  853. package/src/browser/history-state.ts +101 -0
  854. package/src/browser/index.ts +3 -3
  855. package/src/browser/intercept-utils.ts +52 -0
  856. package/src/browser/link-interceptor.ts +24 -4
  857. package/src/browser/logging.ts +55 -0
  858. package/src/browser/merge-segment-loaders.ts +20 -12
  859. package/src/browser/navigation-bridge.ts +370 -561
  860. package/src/browser/navigation-client.ts +228 -70
  861. package/src/browser/navigation-store.ts +97 -55
  862. package/src/browser/navigation-transaction.ts +293 -0
  863. package/src/browser/network-error-handler.ts +61 -0
  864. package/src/browser/partial-update.ts +376 -315
  865. package/src/browser/prefetch/cache.ts +314 -0
  866. package/src/browser/prefetch/fetch.ts +282 -0
  867. package/src/browser/prefetch/observer.ts +65 -0
  868. package/src/browser/prefetch/policy.ts +48 -0
  869. package/src/browser/prefetch/queue.ts +191 -0
  870. package/src/browser/prefetch/resource-ready.ts +77 -0
  871. package/src/browser/rango-state.ts +152 -0
  872. package/src/browser/react/Link.tsx +255 -71
  873. package/src/browser/react/NavigationProvider.tsx +152 -24
  874. package/src/browser/react/context.ts +11 -0
  875. package/src/browser/react/filter-segment-order.ts +55 -0
  876. package/src/browser/react/index.ts +15 -12
  877. package/src/browser/react/location-state-shared.ts +176 -53
  878. package/src/browser/react/location-state.ts +90 -19
  879. package/src/browser/react/mount-context.ts +6 -1
  880. package/src/browser/react/nonce-context.ts +23 -0
  881. package/src/browser/react/shallow-equal.ts +27 -0
  882. package/src/browser/react/use-action.ts +29 -51
  883. package/src/browser/react/use-client-cache.ts +5 -3
  884. package/src/browser/react/use-handle.ts +41 -123
  885. package/src/browser/react/use-link-status.ts +6 -5
  886. package/src/browser/react/use-navigation.ts +44 -65
  887. package/src/browser/react/use-params.ts +78 -0
  888. package/src/browser/react/use-pathname.ts +47 -0
  889. package/src/browser/react/use-reverse.ts +99 -0
  890. package/src/browser/react/use-router.ts +96 -0
  891. package/src/browser/react/use-search-params.ts +56 -0
  892. package/src/browser/react/use-segments.ts +85 -99
  893. package/src/browser/response-adapter.ts +73 -0
  894. package/src/browser/rsc-router.tsx +254 -72
  895. package/src/browser/scroll-restoration.ts +132 -49
  896. package/src/browser/segment-reconciler.ts +243 -0
  897. package/src/browser/segment-structure-assert.ts +17 -1
  898. package/src/browser/server-action-bridge.ts +510 -603
  899. package/src/browser/shallow.ts +6 -1
  900. package/src/browser/types.ts +158 -48
  901. package/src/browser/validate-redirect-origin.ts +29 -0
  902. package/src/build/generate-manifest.ts +87 -26
  903. package/src/build/generate-route-types.ts +39 -828
  904. package/src/build/index.ts +2 -5
  905. package/src/build/route-trie.ts +84 -31
  906. package/src/build/route-types/ast-helpers.ts +25 -0
  907. package/src/build/route-types/ast-route-extraction.ts +98 -0
  908. package/src/build/route-types/codegen.ts +102 -0
  909. package/src/build/route-types/include-resolution.ts +418 -0
  910. package/src/build/route-types/param-extraction.ts +48 -0
  911. package/src/build/route-types/per-module-writer.ts +128 -0
  912. package/src/build/route-types/router-processing.ts +618 -0
  913. package/src/build/route-types/scan-filter.ts +85 -0
  914. package/src/build/runtime-discovery.ts +231 -0
  915. package/src/cache/background-task.ts +34 -0
  916. package/src/cache/cache-key-utils.ts +44 -0
  917. package/src/cache/cache-policy.ts +125 -0
  918. package/src/cache/cache-runtime.ts +342 -0
  919. package/src/cache/cache-scope.ts +167 -307
  920. package/src/cache/cf/cf-cache-store.ts +573 -21
  921. package/src/cache/cf/index.ts +13 -3
  922. package/src/cache/document-cache.ts +116 -77
  923. package/src/cache/handle-capture.ts +81 -0
  924. package/src/cache/handle-snapshot.ts +41 -0
  925. package/src/cache/index.ts +1 -15
  926. package/src/cache/memory-segment-store.ts +191 -13
  927. package/src/cache/profile-registry.ts +73 -0
  928. package/src/cache/read-through-swr.ts +134 -0
  929. package/src/cache/segment-codec.ts +256 -0
  930. package/src/cache/taint.ts +153 -0
  931. package/src/cache/types.ts +72 -122
  932. package/src/client.rsc.tsx +6 -1
  933. package/src/client.tsx +117 -303
  934. package/src/component-utils.ts +4 -4
  935. package/src/components/DefaultDocument.tsx +5 -1
  936. package/src/context-var.ts +156 -0
  937. package/src/debug.ts +19 -9
  938. package/src/errors.ts +96 -8
  939. package/src/handle.ts +56 -11
  940. package/src/handles/MetaTags.tsx +73 -20
  941. package/src/handles/breadcrumbs.ts +66 -0
  942. package/src/handles/index.ts +1 -0
  943. package/src/handles/meta.ts +30 -13
  944. package/src/host/cookie-handler.ts +21 -15
  945. package/src/host/errors.ts +8 -8
  946. package/src/host/index.ts +6 -9
  947. package/src/host/pattern-matcher.ts +27 -27
  948. package/src/host/router.ts +176 -82
  949. package/src/host/testing.ts +8 -8
  950. package/src/host/types.ts +46 -9
  951. package/src/host/utils.ts +2 -2
  952. package/src/href-client.ts +196 -56
  953. package/src/index.rsc.ts +141 -22
  954. package/src/index.ts +215 -53
  955. package/src/internal-debug.ts +11 -0
  956. package/src/loader-store.ts +463 -0
  957. package/src/loader.rsc.ts +25 -143
  958. package/src/loader.ts +27 -10
  959. package/src/network-error-thrower.tsx +3 -1
  960. package/src/outlet-context.ts +1 -1
  961. package/src/outlet-provider.tsx +45 -0
  962. package/src/prerender/param-hash.ts +4 -2
  963. package/src/prerender/store.ts +122 -17
  964. package/src/prerender.ts +397 -29
  965. package/src/response-utils.ts +28 -0
  966. package/src/reverse.ts +231 -121
  967. package/src/root-error-boundary.tsx +41 -29
  968. package/src/route-content-wrapper.tsx +7 -4
  969. package/src/route-definition/dsl-helpers.ts +1106 -0
  970. package/src/route-definition/helper-factories.ts +90 -0
  971. package/src/route-definition/helpers-types.ts +485 -0
  972. package/src/route-definition/index.ts +55 -0
  973. package/src/route-definition/redirect.ts +101 -0
  974. package/src/route-definition/resolve-handler-use.ts +155 -0
  975. package/src/route-definition/use-item-types.ts +32 -0
  976. package/src/route-definition.ts +1 -1431
  977. package/src/route-map-builder.ts +162 -123
  978. package/src/route-name.ts +53 -0
  979. package/src/route-types.ts +77 -44
  980. package/src/router/content-negotiation.ts +215 -0
  981. package/src/router/debug-manifest.ts +72 -0
  982. package/src/router/error-handling.ts +10 -10
  983. package/src/router/find-match.ts +160 -0
  984. package/src/router/handler-context.ts +376 -109
  985. package/src/router/intercept-resolution.ts +35 -20
  986. package/src/router/lazy-includes.ts +237 -0
  987. package/src/router/loader-resolution.ts +330 -145
  988. package/src/router/logging.ts +251 -0
  989. package/src/router/manifest.ts +70 -22
  990. package/src/router/match-api.ts +196 -261
  991. package/src/router/match-context.ts +4 -2
  992. package/src/router/match-handlers.ts +441 -0
  993. package/src/router/match-middleware/background-revalidation.ts +108 -93
  994. package/src/router/match-middleware/cache-lookup.ts +414 -91
  995. package/src/router/match-middleware/cache-store.ts +91 -29
  996. package/src/router/match-middleware/intercept-resolution.ts +48 -21
  997. package/src/router/match-middleware/segment-resolution.ts +73 -9
  998. package/src/router/match-pipelines.ts +10 -45
  999. package/src/router/match-result.ts +154 -35
  1000. package/src/router/metrics.ts +241 -16
  1001. package/src/router/middleware-cookies.ts +55 -0
  1002. package/src/router/middleware-types.ts +209 -0
  1003. package/src/router/middleware.ts +373 -371
  1004. package/src/router/navigation-snapshot.ts +182 -0
  1005. package/src/router/pattern-matching.ts +291 -54
  1006. package/src/router/prerender-match.ts +502 -0
  1007. package/src/router/preview-match.ts +98 -0
  1008. package/src/router/request-classification.ts +310 -0
  1009. package/src/router/revalidation.ts +195 -40
  1010. package/src/router/route-snapshot.ts +245 -0
  1011. package/src/router/router-context.ts +41 -21
  1012. package/src/router/router-interfaces.ts +490 -0
  1013. package/src/router/router-options.ts +618 -0
  1014. package/src/router/router-registry.ts +21 -0
  1015. package/src/router/segment-resolution/fresh.ts +756 -0
  1016. package/src/router/segment-resolution/helpers.ts +268 -0
  1017. package/src/router/segment-resolution/loader-cache.ts +199 -0
  1018. package/src/router/segment-resolution/revalidation.ts +1407 -0
  1019. package/src/router/segment-resolution/static-store.ts +67 -0
  1020. package/src/router/segment-resolution.ts +21 -1336
  1021. package/src/router/segment-wrappers.ts +291 -0
  1022. package/src/router/substitute-pattern-params.ts +56 -0
  1023. package/src/router/telemetry-otel.ts +299 -0
  1024. package/src/router/telemetry.ts +300 -0
  1025. package/src/router/timeout.ts +148 -0
  1026. package/src/router/trie-matching.ts +111 -39
  1027. package/src/router/types.ts +17 -9
  1028. package/src/router/url-params.ts +49 -0
  1029. package/src/router.ts +707 -2291
  1030. package/src/rsc/handler-context.ts +45 -0
  1031. package/src/rsc/handler.ts +864 -1117
  1032. package/src/rsc/helpers.ts +181 -19
  1033. package/src/rsc/index.ts +1 -21
  1034. package/src/rsc/loader-fetch.ts +229 -0
  1035. package/src/rsc/manifest-init.ts +90 -0
  1036. package/src/rsc/nonce.ts +14 -0
  1037. package/src/rsc/origin-guard.ts +141 -0
  1038. package/src/rsc/progressive-enhancement.ts +395 -0
  1039. package/src/rsc/response-error.ts +37 -0
  1040. package/src/rsc/response-route-handler.ts +360 -0
  1041. package/src/rsc/rsc-rendering.ts +256 -0
  1042. package/src/rsc/runtime-warnings.ts +42 -0
  1043. package/src/rsc/server-action.ts +360 -0
  1044. package/src/rsc/ssr-setup.ts +128 -0
  1045. package/src/rsc/types.ts +52 -11
  1046. package/src/search-params.ts +230 -0
  1047. package/src/segment-content-promise.ts +67 -0
  1048. package/src/segment-loader-promise.ts +122 -0
  1049. package/src/segment-system.tsx +187 -38
  1050. package/src/serialize.ts +243 -0
  1051. package/src/server/context.ts +403 -88
  1052. package/src/server/cookie-store.ts +190 -0
  1053. package/src/server/fetchable-loader-store.ts +37 -0
  1054. package/src/server/handle-store.ts +113 -15
  1055. package/src/server/loader-registry.ts +24 -64
  1056. package/src/server/request-context.ts +603 -109
  1057. package/src/server.ts +35 -155
  1058. package/src/ssr/index.tsx +107 -30
  1059. package/src/static-handler.ts +126 -0
  1060. package/src/theme/ThemeProvider.tsx +21 -15
  1061. package/src/theme/ThemeScript.tsx +5 -5
  1062. package/src/theme/constants.ts +5 -2
  1063. package/src/theme/index.ts +4 -14
  1064. package/src/theme/theme-context.ts +4 -30
  1065. package/src/theme/theme-script.ts +21 -18
  1066. package/src/types/boundaries.ts +158 -0
  1067. package/src/types/cache-types.ts +198 -0
  1068. package/src/types/error-types.ts +192 -0
  1069. package/src/types/global-namespace.ts +113 -0
  1070. package/src/types/handler-context.ts +806 -0
  1071. package/src/types/index.ts +89 -0
  1072. package/src/types/loader-types.ts +209 -0
  1073. package/src/types/request-scope.ts +126 -0
  1074. package/src/types/route-config.ts +170 -0
  1075. package/src/types/route-entry.ts +120 -0
  1076. package/src/types/segments.ts +167 -0
  1077. package/src/types.ts +1 -1763
  1078. package/src/urls/include-helper.ts +164 -0
  1079. package/src/urls/index.ts +50 -0
  1080. package/src/urls/path-helper-types.ts +372 -0
  1081. package/src/urls/path-helper.ts +329 -0
  1082. package/src/urls/pattern-types.ts +124 -0
  1083. package/src/urls/response-types.ts +109 -0
  1084. package/src/urls/type-extraction.ts +282 -0
  1085. package/src/urls/urls-function.ts +94 -0
  1086. package/src/urls.ts +1 -1288
  1087. package/src/use-loader.tsx +511 -107
  1088. package/src/vite/debug.ts +184 -0
  1089. package/src/vite/discovery/bundle-postprocess.ts +181 -0
  1090. package/src/vite/discovery/discover-routers.ts +374 -0
  1091. package/src/vite/discovery/discovery-errors.ts +194 -0
  1092. package/src/vite/discovery/gate-state.ts +171 -0
  1093. package/src/vite/discovery/prerender-collection.ts +480 -0
  1094. package/src/vite/discovery/route-types-writer.ts +258 -0
  1095. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1096. package/src/vite/discovery/state.ts +143 -0
  1097. package/src/vite/discovery/virtual-module-codegen.ts +193 -0
  1098. package/src/vite/index.ts +15 -2012
  1099. package/src/vite/plugin-types.ts +103 -0
  1100. package/src/vite/plugins/cjs-to-esm.ts +98 -0
  1101. package/src/vite/plugins/client-ref-dedup.ts +131 -0
  1102. package/src/vite/plugins/client-ref-hashing.ts +117 -0
  1103. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1104. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1105. package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
  1106. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +109 -66
  1107. package/src/vite/plugins/expose-id-utils.ts +303 -0
  1108. package/src/vite/plugins/expose-ids/export-analysis.ts +320 -0
  1109. package/src/vite/plugins/expose-ids/handler-transform.ts +209 -0
  1110. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  1111. package/src/vite/plugins/expose-ids/router-transform.ts +127 -0
  1112. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1113. package/src/vite/plugins/expose-internal-ids.ts +816 -0
  1114. package/src/vite/plugins/performance-tracks.ts +92 -0
  1115. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1116. package/src/vite/plugins/use-cache-transform.ts +336 -0
  1117. package/src/vite/plugins/version-injector.ts +109 -0
  1118. package/src/vite/plugins/version-plugin.ts +323 -0
  1119. package/src/vite/plugins/virtual-entries.ts +123 -0
  1120. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1121. package/src/vite/rango.ts +509 -0
  1122. package/src/vite/router-discovery.ts +1511 -0
  1123. package/src/vite/utils/ast-handler-extract.ts +517 -0
  1124. package/src/vite/utils/banner.ts +36 -0
  1125. package/src/vite/utils/bundle-analysis.ts +139 -0
  1126. package/src/vite/utils/forward-user-plugins.ts +193 -0
  1127. package/src/vite/utils/manifest-utils.ts +86 -0
  1128. package/src/vite/utils/package-resolution.ts +161 -0
  1129. package/src/vite/utils/prerender-utils.ts +222 -0
  1130. package/src/vite/utils/shared-utils.ts +174 -0
  1131. package/CLAUDE.md +0 -43
  1132. package/src/browser/lru-cache.ts +0 -69
  1133. package/src/browser/request-controller.ts +0 -164
  1134. package/src/cache/memory-store.ts +0 -253
  1135. package/src/router.gen.ts +0 -6
  1136. package/src/urls.gen.ts +0 -8
  1137. package/src/vite/expose-handle-id.ts +0 -209
  1138. package/src/vite/expose-loader-id.ts +0 -426
  1139. package/src/vite/expose-location-state-id.ts +0 -177
  1140. package/src/vite/expose-prerender-handler-id.ts +0 -429
  1141. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,9 +1,117 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useContext, useEffect, useRef, useState } from "react";
3
+ import {
4
+ isValidElement,
5
+ startTransition,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useMemo,
10
+ useRef,
11
+ useState,
12
+ type ReactNode,
13
+ } from "react";
4
14
  import { OutletContext, type OutletContextValue } from "./outlet-context.js";
15
+ import { loaderStore, type LoaderEntry } from "./loader-store.js";
5
16
  import type { LoaderDefinition, LoadOptions } from "./types.js";
6
17
 
18
+ /**
19
+ * A shareable GET — a `load()` call that reads data (GET or defaulted method)
20
+ * with no request body. Params are allowed. This is the gate for keyed sharing:
21
+ * when a hook is given an explicit `key`, every shareable GET writes to the
22
+ * keyed bucket so co-keyed readers (including parameterized views) refresh
23
+ * together. Non-GET methods and body-bearing calls are mutations and stay local
24
+ * to the call site.
25
+ */
26
+ function isShareableGet(options: LoadOptions | undefined): boolean {
27
+ if (!options) return true;
28
+ if (options.method && options.method !== "GET") return false;
29
+ if ("body" in options && (options as { body?: unknown }).body !== undefined) {
30
+ return false;
31
+ }
32
+ return true;
33
+ }
34
+
35
+ /**
36
+ * Plain route-context refetch — a `load()` call with no options or a
37
+ * trivially-defaulted GET (no params, no body). Results from these are
38
+ * broadcast to every component reading the same loader id via the shared
39
+ * store, so a layout's refetch button updates page + parallel-slot reads
40
+ * automatically.
41
+ *
42
+ * Calls with explicit `params`, an explicit non-GET method, or a `body`
43
+ * stay local to the call site — that preserves the today-semantics of
44
+ * `useFetchLoader(SearchLoader).load({ params: { q } })` style code where
45
+ * each component owns its own fetched view. (An explicit `key` opts a
46
+ * parameterized GET back into sharing; see `isShareableGet`.)
47
+ */
48
+ function isPlainRefetch(options: LoadOptions | undefined): boolean {
49
+ if (!isShareableGet(options)) return false;
50
+ if (options?.params && Object.keys(options.params).length > 0) return false;
51
+ return true;
52
+ }
53
+
54
+ // Per-hook unique suffix for grouped reads that have no explicit `key`. Such a
55
+ // read must NOT share the bare `loader.$$id` bucket, or a cross-loader group
56
+ // refresh would leak into unrelated unkeyed readers of the same loader (which
57
+ // the contract keeps local). Sharing within a group is opt-in via an explicit
58
+ // `key`; without one, each grouped read gets its own private bucket. The value
59
+ // is only ever used as a client-side store bucket key (never rendered), so the
60
+ // counter has no SSR/hydration consistency requirement.
61
+ let privateGroupBucketSeq = 0;
62
+
63
+ /**
64
+ * Extract a specific loader's data from a content ReactNode.
65
+ *
66
+ * When a route registers loaders via loader(), the resolved data lives in
67
+ * the route's OutletProvider (rendered as <Outlet /> content). Parallel
68
+ * slots are siblings of <Outlet />, so they can't find it by walking
69
+ * the parent context chain. This helper traverses wrapper elements
70
+ * (MountContextProvider, ViewTransition, etc.) to reach the OutletProvider
71
+ * and extract the loader data directly.
72
+ */
73
+ const NOT_FOUND = Symbol("not-found");
74
+
75
+ function extractContentLoaderData(
76
+ node: ReactNode,
77
+ loaderId: string,
78
+ ): unknown | typeof NOT_FOUND {
79
+ if (!isValidElement(node)) return NOT_FOUND;
80
+ const props = node.props as Record<string, any> | undefined;
81
+ if (!props) return NOT_FOUND;
82
+
83
+ // Direct OutletProvider with loaderData
84
+ if (props.loaderData && loaderId in props.loaderData) {
85
+ return props.loaderData[loaderId];
86
+ }
87
+
88
+ // LoaderBoundary: loaderIds + loaderDataPromise (already resolved array).
89
+ // When the segment has loading(), loaderData is resolved inside
90
+ // LoaderBoundary via use(). If the promise was pre-awaited (forceAwait
91
+ // or isAction), the prop is a raw array we can index into.
92
+ if (
93
+ props.loaderIds &&
94
+ Array.isArray(props.loaderIds) &&
95
+ props.loaderDataPromise &&
96
+ !(props.loaderDataPromise instanceof Promise)
97
+ ) {
98
+ const idx = (props.loaderIds as string[]).indexOf(loaderId);
99
+ if (idx !== -1) {
100
+ const data = (props.loaderDataPromise as any[])[idx];
101
+ // loaderDataPromise entries may be { ok, data } result objects
102
+ if (data && typeof data === "object" && "ok" in data) {
103
+ return data.ok ? data.data : NOT_FOUND;
104
+ }
105
+ return data;
106
+ }
107
+ }
108
+
109
+ // Traverse into wrapper elements (MountContextProvider, ViewTransition,
110
+ // Suspense wrappers, etc.)
111
+ if (props.children) return extractContentLoaderData(props.children, loaderId);
112
+ return NOT_FOUND;
113
+ }
114
+
7
115
  /**
8
116
  * Payload returned by loader RSC requests
9
117
  */
@@ -13,12 +121,9 @@ interface LoaderRscPayload<T = unknown> {
13
121
  }
14
122
 
15
123
  /**
16
- * Load function type with form action support
124
+ * Load function type for fetching loader data from the client
17
125
  */
18
- export type LoadFunction<T> = ((options?: LoadOptions) => Promise<T>) & {
19
- /** Form action for progressive enhancement - can be passed to form action prop */
20
- action: (formData: FormData) => Promise<void>;
21
- };
126
+ export type LoadFunction<T> = (options?: LoadOptions) => Promise<T>;
22
127
 
23
128
  /**
24
129
  * Result type for useLoader hook (strict - data is required)
@@ -62,6 +167,37 @@ export interface UseLoaderOptions {
62
167
  * @default true
63
168
  */
64
169
  throwOnError?: boolean;
170
+ /**
171
+ * Client refresh key. Partitions the shared refresh store so that only hooks
172
+ * using the same `key` refresh together when one of them calls `load()`.
173
+ *
174
+ * Without a `key` (default), a plain `load()` on a route-registered loader
175
+ * broadcasts to every reader of that loader, and any parameterized / unregistered
176
+ * load stays local to the calling hook. With a `key`:
177
+ * - readers of the same loader that share a `key` form one refresh group —
178
+ * a `load()` from any of them updates the whole group, including
179
+ * parameterized GETs;
180
+ * - readers with different keys are independent;
181
+ * - it works even when the loader is NOT registered on the route (keyed
182
+ * `useFetchLoader`), letting unrelated components opt into sharing.
183
+ *
184
+ * This is a client-side refresh identity only. It is unrelated to the server
185
+ * `cache({ key })` option and to `revalidate()`; it never changes the request
186
+ * sent to the server.
187
+ */
188
+ key?: string;
189
+ /**
190
+ * Cross-loader refresh group. Tag reads of DIFFERENT loaders with the same
191
+ * `refreshGroup` name, then call `useRefreshLoaders(name)()` to refresh the
192
+ * whole group at once. Each member is refreshed with a plain GET against the
193
+ * current route URL — no params, no body, no mutation methods — because a
194
+ * group spans heterogeneous loaders with different param/return shapes.
195
+ *
196
+ * For parameterized sharing of a SINGLE loader, use `key` instead; group
197
+ * members should be registered or non-parameterized-keyed reads (a plain-GET
198
+ * group refresh would drop any per-call params).
199
+ */
200
+ refreshGroup?: string;
65
201
  }
66
202
 
67
203
  /**
@@ -69,61 +205,266 @@ export interface UseLoaderOptions {
69
205
  */
70
206
  function useLoaderInternal<T>(
71
207
  loader: LoaderDefinition<T>,
72
- options?: UseLoaderOptions
208
+ options?: UseLoaderOptions,
73
209
  ): UseFetchLoaderResult<T> {
74
210
  const context = useContext(OutletContext);
75
211
 
76
- // Get data from context (SSR/navigation)
77
- const getContextData = useCallback((): T | undefined => {
212
+ // Get data from context (SSR/navigation). `hasContextData` distinguishes
213
+ // "loader registered on the route, value happens to be undefined" from
214
+ // "loader is not in any parent's context at all". The shared store is
215
+ // only consulted when the loader really is in route context — that
216
+ // preserves per-component isolation for ad-hoc useFetchLoader callers
217
+ // who use the same fetchable loader without registering it.
218
+ const { contextData, hasContextData } = useMemo((): {
219
+ contextData: T | undefined;
220
+ hasContextData: boolean;
221
+ } => {
78
222
  let current: OutletContextValue | null | undefined = context;
79
223
  while (current) {
80
224
  if (current.loaderData && loader.$$id in current.loaderData) {
81
- return current.loaderData[loader.$$id] as T;
225
+ return {
226
+ contextData: current.loaderData[loader.$$id] as T,
227
+ hasContextData: true,
228
+ };
229
+ }
230
+ // Check content element — the route's OutletProvider is rendered as
231
+ // <Outlet /> content (a child), so its loaderData isn't in the parent
232
+ // chain. Parallel slots need to reach into it to find route-level loaders.
233
+ const contentData = extractContentLoaderData(
234
+ current.content,
235
+ loader.$$id,
236
+ );
237
+ if (contentData !== NOT_FOUND) {
238
+ return { contextData: contentData as T, hasContextData: true };
82
239
  }
83
240
  current = current.parent;
84
241
  }
85
- return undefined;
242
+ return { contextData: undefined, hasContextData: false };
86
243
  }, [context, loader.$$id]);
87
244
 
88
- const contextData = getContextData();
89
-
90
- // Local state for fetched data (from load() calls)
91
- const [fetchedData, setFetchedData] = useState<T | undefined>(undefined);
92
- const [isLoading, setIsLoading] = useState(false);
93
- const [error, setError] = useState<Error | null>(null);
94
-
95
- // Track context data changes to reset fetched data on navigation
245
+ // Shared subscription: every component reading the same loader id sees
246
+ // the same snapshot, so a plain refetch from one component propagates to
247
+ // the others. Mirrors the convention used by useParams / useLinkStatus —
248
+ // useState seeded from the store, useEffect subscribes for updates and
249
+ // calls setState inside startTransition so subscriber re-renders don't
250
+ // trip Suspense fallbacks during a refetch (matches the per-hook
251
+ // startTransition the old code wrapped setFetchedData in).
252
+ const loaderId = loader.$$id;
253
+ // Client refresh key. The shared store is partitioned by bucket key so that
254
+ // only hooks with the same `key` refresh together. Default (no key) keeps the
255
+ // historical behavior: one bucket per loader id.
256
+ const key = options?.key;
257
+ const refreshGroup = options?.refreshGroup;
258
+ // A grouped reader with no explicit key gets a private per-hook bucket so a
259
+ // cross-loader group refresh cannot leak into the bare `loader.$$id` bucket
260
+ // shared by unrelated unkeyed readers. Sharing within a group is opt-in via
261
+ // an explicit `key`.
262
+ const privateBucketIdRef = useRef<string | null>(null);
263
+ if (
264
+ refreshGroup !== undefined &&
265
+ key === undefined &&
266
+ privateBucketIdRef.current === null
267
+ ) {
268
+ privateBucketIdRef.current = `__rg${privateGroupBucketSeq++}`;
269
+ }
270
+ const effectiveKey =
271
+ key ??
272
+ (refreshGroup !== undefined ? privateBucketIdRef.current! : undefined);
273
+ const bucketKey =
274
+ effectiveKey === undefined ? loaderId : `${loaderId}::${effectiveKey}`;
275
+
276
+ // Plain-GET refresh thunk registered with the store for cross-loader group
277
+ // refresh (useRefreshLoaders). Always shares into this hook's bucket, never
278
+ // touches lastSharedRequestIdRef (so a group refresh never render-throws —
279
+ // errors surface via `error` and reject the refreshGroup() promise instead),
280
+ // and sends no params/body. Stable across navigations (depends only on
281
+ // loaderId + bucketKey), so the store keeps one current thunk per bucket.
282
+ const groupRefetch = useCallback(async (): Promise<void> => {
283
+ if (!loaderId) return;
284
+ const requestId = loaderStore.reserveRequestId(bucketKey);
285
+ loaderStore.beginRequest(bucketKey, requestId);
286
+ try {
287
+ const url = new URL(window.location.href);
288
+ url.searchParams.set("_rsc_loader", loaderId);
289
+ const response = fetch(url.toString(), {
290
+ method: "GET",
291
+ headers: { Accept: "text/x-component" },
292
+ });
293
+ const { createFromFetch } = await import("./deps/browser.js");
294
+ const payload = await createFromFetch<LoaderRscPayload<T>>(response);
295
+ if (payload.loaderError) {
296
+ throw new Error(payload.loaderError.message);
297
+ }
298
+ loaderStore.finishData(bucketKey, requestId, payload.loaderResult);
299
+ } catch (e) {
300
+ const err = e instanceof Error ? e : new Error(String(e));
301
+ loaderStore.finishError(bucketKey, requestId, err);
302
+ throw err;
303
+ } finally {
304
+ loaderStore.setLoading(bucketKey, requestId, false);
305
+ }
306
+ }, [loaderId, bucketKey]);
307
+
308
+ const [sharedState, setSharedState] = useState<{
309
+ bucketKey: string;
310
+ snapshot: LoaderEntry;
311
+ }>(() => ({
312
+ bucketKey,
313
+ snapshot: loaderStore.getSnapshot(bucketKey),
314
+ }));
315
+ const sharedSnapshot =
316
+ sharedState.bucketKey === bucketKey
317
+ ? sharedState.snapshot
318
+ : loaderStore.getSnapshot(bucketKey);
319
+ useEffect(() => {
320
+ // Sync any value the store committed between this hook's lazy
321
+ // initializer and effect-time (e.g. a sibling that mounted earlier
322
+ // already triggered a load()).
323
+ const initial = loaderStore.getSnapshot(bucketKey);
324
+ if (initial !== sharedSnapshot) {
325
+ startTransition(() => {
326
+ setSharedState({ bucketKey, snapshot: initial });
327
+ });
328
+ }
329
+ // ephemeral: a reader with no route context has no route-context reset
330
+ // trigger, so its keyed bucket is reference-counted by the store. A
331
+ // route-registered reader makes the bucket sticky (reset via clearFamily).
332
+ return loaderStore.subscribe(
333
+ bucketKey,
334
+ () => {
335
+ const next = loaderStore.getSnapshot(bucketKey);
336
+ startTransition(() => {
337
+ setSharedState({ bucketKey, snapshot: next });
338
+ });
339
+ },
340
+ {
341
+ loaderId,
342
+ ephemeral: !hasContextData,
343
+ group: refreshGroup,
344
+ refetch: refreshGroup !== undefined ? groupRefetch : undefined,
345
+ },
346
+ );
347
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentional:
348
+ // sharedSnapshot is captured for the one-shot init sync; we don't want
349
+ // to re-subscribe on every snapshot change. bucketKey, hasContextData,
350
+ // refreshGroup, and groupRefetch are the only inputs that require a fresh
351
+ // subscription (groupRefetch is stable per bucketKey).
352
+ }, [bucketKey, hasContextData, refreshGroup, groupRefetch]);
353
+
354
+ // Local state holds the result of:
355
+ // - parameterized / mutation `load()` calls (load({ params }), POST,
356
+ // etc.) — stay scoped so concurrent same-loader different-params
357
+ // fetches don't clobber each other through the shared store;
358
+ // - any `load()` made by hooks that are NOT in route context (i.e.
359
+ // useFetchLoader of an unregistered loader) — keeping those local
360
+ // prevents two unrelated components from accidentally sharing data
361
+ // through the global store just because they reference the same
362
+ // loader id.
363
+ const [localFetchedData, setLocalFetchedData] = useState<T | undefined>(
364
+ undefined,
365
+ );
366
+ const [localIsLoading, setLocalIsLoading] = useState(false);
367
+ const [localError, setLocalError] = useState<Error | null>(null);
368
+
369
+ // Local request id, mirrors the per-hook gating the previous
370
+ // implementation provided. Two quick parameterized loads from the same
371
+ // hook (e.g. load({ params: { q: "a" } }) then load({ params: { q: "b" } }))
372
+ // can resolve out of order — only the latest must commit.
373
+ const localRequestIdRef = useRef(0);
374
+
375
+ // Tracks the request id of the most recent SHARED load() this hook
376
+ // initiated. The render-throw rule below uses it to scope the throw
377
+ // to the originating hook only — sibling readers see the error in
378
+ // `error` but don't blow up their own boundaries.
379
+ const lastSharedRequestIdRef = useRef<number | null>(null);
380
+
381
+ // Reset on navigation. clear() bumps the entry's latest request id so
382
+ // any pre-navigation load() promise that resolves later fails its gate
383
+ // and is dropped — fixes the race where a stale fetch overwrites the
384
+ // new route's context.
96
385
  const prevContextDataRef = useRef(contextData);
97
386
  useEffect(() => {
98
387
  if (prevContextDataRef.current !== contextData) {
99
- // Navigation happened, clear fetched data so context takes precedence
100
- setFetchedData(undefined);
101
- setError(null);
388
+ setLocalFetchedData(undefined);
389
+ setLocalIsLoading(false);
390
+ setLocalError(null);
391
+ lastSharedRequestIdRef.current = null;
392
+ // Reset every sticky bucket of this loader (keyed or not). Ephemeral
393
+ // (unregistered keyed) buckets are left to their refcount lifecycle.
394
+ loaderStore.clearFamily(loaderId);
102
395
  prevContextDataRef.current = contextData;
103
396
  }
104
- }, [contextData]);
397
+ }, [contextData, loaderId]);
105
398
 
106
- // Data priority: fetched data (if any) > context data
107
- const data = fetchedData ?? contextData;
399
+ // Read priority: a parameterized load() result overrides the shared
400
+ // snapshot; the shared snapshot overrides the server-seeded context.
401
+ const data =
402
+ localFetchedData ?? (sharedSnapshot.value as T | undefined) ?? contextData;
403
+ const isLoading = localIsLoading || sharedSnapshot.isLoading;
404
+ const error = localError ?? sharedSnapshot.error;
108
405
 
109
406
  const throwOnError = options?.throwOnError ?? true;
110
407
 
111
- // Load function for fetching data
408
+ // Refs for values used inside load() that should NOT cause callback identity
409
+ // churn. loader.$$id can change if a reusable component receives a different
410
+ // loader without remounting; data changes on every navigation. Refs keep the
411
+ // callback stable while always reading the latest values.
412
+ const loaderIdRef = useRef(loaderId);
413
+ loaderIdRef.current = loaderId;
414
+ const bucketKeyRef = useRef(bucketKey);
415
+ bucketKeyRef.current = bucketKey;
416
+ const dataRef = useRef(data);
417
+ dataRef.current = data;
418
+ const hasContextDataRef = useRef(hasContextData);
419
+ hasContextDataRef.current = hasContextData;
420
+
421
+ // Load function for fetching data via the ?_rsc_loader endpoint.
422
+ // Supports GET (data fetching) and POST/PUT/PATCH/DELETE (mutations).
112
423
  const load = useCallback(
113
424
  async (loadOptions?: LoadOptions): Promise<T> => {
114
- // Verify the loader has $$id
115
- if (!loader.$$id) {
425
+ const id = loaderIdRef.current;
426
+ if (!id) {
116
427
  throw new Error(
117
- `Loader is missing $$id. Make sure the exposeLoaderId Vite plugin is enabled.`
428
+ `Loader is missing $$id. Make sure the exposeLoaderId Vite plugin is enabled.`,
118
429
  );
119
430
  }
120
431
 
121
- setIsLoading(true);
122
- setError(null);
432
+ const bucket = bucketKeyRef.current;
433
+ // A dedicated bucket means this read owns a bucket distinct from the bare
434
+ // loader id — either an explicit `key` (`$$id::key`) or a refreshGroup's
435
+ // private bucket (`$$id::<private>`).
436
+ const hasDedicatedBucket = bucket !== id;
437
+
438
+ // Deciding shared vs local:
439
+ // - With a dedicated bucket, every shareable GET (params allowed) writes
440
+ // to that bucket — the key/group is an explicit opt-in to sharing, and
441
+ // a direct load() must land in the same bucket a group refresh uses.
442
+ // - On the bare loader-id bucket, sharing is only correct when the
443
+ // loader is registered on the route and the call is a plain refetch —
444
+ // otherwise two unrelated components calling load() on the same
445
+ // fetchable loader would overwrite each other's local view.
446
+ // Mutations (non-GET / body) stay local in both cases.
447
+ const shared = hasDedicatedBucket
448
+ ? isShareableGet(loadOptions)
449
+ : isPlainRefetch(loadOptions) && hasContextDataRef.current;
450
+ let sharedRequestId = -1;
451
+ let localRequestId = -1;
452
+ if (shared) {
453
+ sharedRequestId = loaderStore.reserveRequestId(bucket);
454
+ lastSharedRequestIdRef.current = sharedRequestId;
455
+ // beginRequest flips loading on AND clears any prior error so a
456
+ // throwOnError: false consumer doesn't keep showing the stale
457
+ // error during the retry. Gated on requestId === latest.
458
+ loaderStore.beginRequest(bucket, sharedRequestId);
459
+ } else {
460
+ localRequestId = ++localRequestIdRef.current;
461
+ setLocalIsLoading(true);
462
+ setLocalError(null);
463
+ }
123
464
 
124
465
  try {
125
- const url = new URL(window.location.pathname, window.location.origin);
126
- url.searchParams.set("_rsc_loader", loader.$$id);
466
+ const url = new URL(window.location.href);
467
+ url.searchParams.set("_rsc_loader", id);
127
468
 
128
469
  const method = loadOptions?.method ?? "GET";
129
470
  const isBodyMethod = method !== "GET";
@@ -131,29 +472,58 @@ function useLoaderInternal<T>(
131
472
  let fetchOptions: RequestInit;
132
473
 
133
474
  if (isBodyMethod) {
134
- // POST/PUT/PATCH/DELETE - send params and body as JSON
135
- const bodyPayload: { params?: Record<string, string>; body?: unknown } = {};
136
- if (loadOptions?.params && Object.keys(loadOptions.params).length > 0) {
137
- bodyPayload.params = loadOptions.params;
475
+ const bodyValue =
476
+ "body" in (loadOptions ?? {})
477
+ ? (loadOptions as any).body
478
+ : undefined;
479
+ const hasParams =
480
+ loadOptions?.params && Object.keys(loadOptions.params).length > 0;
481
+
482
+ if (bodyValue instanceof FormData) {
483
+ // FormData body — send as multipart/form-data (preserves File objects).
484
+ // Params are appended as a JSON string in a special field.
485
+ if (hasParams) {
486
+ bodyValue.set(
487
+ "_rsc_loader_params",
488
+ JSON.stringify(loadOptions!.params),
489
+ );
490
+ }
491
+ fetchOptions = {
492
+ method,
493
+ headers: { Accept: "text/x-component" },
494
+ body: bodyValue,
495
+ };
496
+ } else {
497
+ // JSON body — send params and body as JSON
498
+ const bodyPayload: {
499
+ params?: Record<string, string>;
500
+ body?: unknown;
501
+ } = {};
502
+ if (hasParams) {
503
+ bodyPayload.params = loadOptions!.params;
504
+ }
505
+ if (bodyValue !== undefined) {
506
+ bodyPayload.body = bodyValue;
507
+ }
508
+
509
+ fetchOptions = {
510
+ method,
511
+ headers: {
512
+ Accept: "text/x-component",
513
+ "Content-Type": "application/json",
514
+ },
515
+ body: JSON.stringify(bodyPayload),
516
+ };
138
517
  }
139
- if ("body" in (loadOptions ?? {}) && (loadOptions as any).body !== undefined) {
140
- bodyPayload.body = (loadOptions as any).body;
141
- }
142
-
143
- fetchOptions = {
144
- method,
145
- headers: {
146
- Accept: "text/x-component",
147
- "Content-Type": "application/json",
148
- },
149
- body: JSON.stringify(bodyPayload),
150
- };
151
518
  } else {
152
519
  // GET - send params in query string
153
- if (loadOptions?.params && Object.keys(loadOptions.params).length > 0) {
520
+ if (
521
+ loadOptions?.params &&
522
+ Object.keys(loadOptions.params).length > 0
523
+ ) {
154
524
  url.searchParams.set(
155
525
  "_rsc_loader_params",
156
- JSON.stringify(loadOptions.params)
526
+ JSON.stringify(loadOptions.params),
157
527
  );
158
528
  }
159
529
 
@@ -175,73 +545,67 @@ function useLoaderInternal<T>(
175
545
  }
176
546
 
177
547
  const result = payload.loaderResult;
178
- setFetchedData(result);
548
+ if (shared) {
549
+ // finishData is gated on requestId; a stale response is dropped.
550
+ loaderStore.finishData(bucket, sharedRequestId, result);
551
+ } else if (localRequestId === localRequestIdRef.current) {
552
+ // Local-branch gate, mirrors the shared-branch requestId check:
553
+ // if a newer load() was issued from this hook before this one
554
+ // resolved, drop the stale result.
555
+ startTransition(() => {
556
+ setLocalFetchedData(result);
557
+ setLocalIsLoading(false);
558
+ });
559
+ }
179
560
  return result;
180
561
  } catch (e) {
181
562
  const err = e instanceof Error ? e : new Error(String(e));
182
- setError(err);
183
- if (throwOnError) {
184
- throw err;
563
+ if (shared) {
564
+ loaderStore.finishError(bucket, sharedRequestId, err);
565
+ } else if (localRequestId === localRequestIdRef.current) {
566
+ setLocalError(err);
567
+ setLocalIsLoading(false);
185
568
  }
186
- // When throwOnError is false, return the current data (previous successful
187
- // value or undefined). Caller should check error state for error handling.
188
- return data as T;
189
- } finally {
190
- setIsLoading(false);
191
- }
192
- },
193
- [throwOnError]
194
- );
195
-
196
- // Form action for progressive enhancement
197
- // This wrapper is for useFetchLoader's load.action - it manages state internally
198
- // and doesn't use React's useActionState. For true PE, use loader.action directly
199
- // with useActionState.
200
- const action = useCallback(
201
- async (formData: FormData): Promise<void> => {
202
- if (!loader.action) {
203
- throw new Error(
204
- `Loader "${loader.$$id}" does not have an action. ` +
205
- `Make sure the loader is created with fetchable: true.`
206
- );
207
- }
208
-
209
- setIsLoading(true);
210
- setError(null);
211
-
212
- try {
213
- // Pass null as prevState - this wrapper manages state internally
214
- const result = await loader.action(null, formData);
215
- setFetchedData(result);
216
- } catch (e) {
217
- const err = e instanceof Error ? e : new Error(String(e));
218
- setError(err);
219
569
  if (throwOnError) {
220
570
  throw err;
221
571
  }
572
+ // When throwOnError is false, return the latest data snapshot (previous
573
+ // successful value or undefined). Caller should check error state.
574
+ return dataRef.current as T;
222
575
  } finally {
223
- setIsLoading(false);
576
+ if (shared) {
577
+ // setLoading is gated; only the latest request flips the flag off.
578
+ loaderStore.setLoading(bucket, sharedRequestId, false);
579
+ }
224
580
  }
225
581
  },
226
- [throwOnError]
582
+ [throwOnError],
227
583
  );
228
584
 
229
- // Attach action to load function
230
- const loadWithAction = load as LoadFunction<T>;
231
- loadWithAction.action = action;
232
-
233
- // Throw during render if there's an error and throwOnError is true
234
- // This allows ErrorBoundaries to catch async errors from load()
235
- if (error && throwOnError) {
236
- throw error;
585
+ // Throw during render if there's an error and throwOnError is true.
586
+ // - Local errors always belong to this hook, so always throw on opt-in.
587
+ // - Shared errors throw only when this hook initiated the failing
588
+ // request (entry.requestId matches lastSharedRequestIdRef). Sibling
589
+ // readers expose the error via `error` but do not throw, so a
590
+ // throwOnError: true reader never explodes because of someone else's
591
+ // throwOnError: false load() failure.
592
+ if (throwOnError) {
593
+ if (localError) throw localError;
594
+ if (
595
+ sharedSnapshot.error &&
596
+ lastSharedRequestIdRef.current !== null &&
597
+ sharedSnapshot.requestId === lastSharedRequestIdRef.current
598
+ ) {
599
+ throw sharedSnapshot.error;
600
+ }
237
601
  }
238
602
 
239
603
  return {
240
604
  data,
241
605
  isLoading,
242
606
  error,
243
- load: loadWithAction,
244
- refetch: loadWithAction,
607
+ load,
608
+ refetch: load,
245
609
  };
246
610
  }
247
611
 
@@ -276,8 +640,8 @@ function useLoaderInternal<T>(
276
640
  */
277
641
  export function useLoader<T>(
278
642
  loader: LoaderDefinition<T>,
279
- options?: UseLoaderOptions
280
- ): UseLoaderResult<T> {
643
+ options?: UseLoaderOptions,
644
+ ): UseLoaderResult<Rango.FlightSerialize<T>> {
281
645
  const result = useLoaderInternal(loader, options);
282
646
 
283
647
  // Strict mode: throw if data is not in context
@@ -285,11 +649,11 @@ export function useLoader<T>(
285
649
  throw new Error(
286
650
  `useLoader: Loader "${loader.$$id}" data not found in context. ` +
287
651
  `Make sure the loader is registered on the route with loader(). ` +
288
- `If you need on-demand fetching, use useFetchLoader() instead.`
652
+ `If you need on-demand fetching, use useFetchLoader() instead.`,
289
653
  );
290
654
  }
291
655
 
292
- return result as UseLoaderResult<T>;
656
+ return result as UseLoaderResult<Rango.FlightSerialize<T>>;
293
657
  }
294
658
 
295
659
  /**
@@ -340,7 +704,47 @@ export function useLoader<T>(
340
704
  */
341
705
  export function useFetchLoader<T>(
342
706
  loader: LoaderDefinition<T>,
343
- options?: UseLoaderOptions
344
- ): UseFetchLoaderResult<T> {
345
- return useLoaderInternal(loader, options);
707
+ options?: UseLoaderOptions,
708
+ ): UseFetchLoaderResult<Rango.FlightSerialize<T>> {
709
+ return useLoaderInternal(loader, options) as UseFetchLoaderResult<
710
+ Rango.FlightSerialize<T>
711
+ >;
712
+ }
713
+
714
+ /**
715
+ * Refresh every loader tagged with a shared `refreshGroup` name.
716
+ *
717
+ * Returns a stable async function that refreshes all currently-mounted reads
718
+ * in the group with a plain GET against the current route URL. This is the
719
+ * cross-loader counterpart to the single-loader `key`: use it to refresh a set
720
+ * of DIFFERENT loaders together (e.g. profile + orders after an account
721
+ * switch). Members are tagged via `useLoader(Loader, { refreshGroup })` /
722
+ * `useFetchLoader(Loader, { refreshGroup })`.
723
+ *
724
+ * Group refresh never render-throws: a failing member surfaces its error via
725
+ * that read's `error` state, and the returned promise rejects with an
726
+ * `AggregateError` of the failures so the caller can handle them at the await
727
+ * site. Each loader is refreshed in place — no params, no body, no mutations.
728
+ *
729
+ * @example
730
+ * ```tsx
731
+ * "use client";
732
+ * import { useLoader, useRefreshLoaders } from "rsc-router/client";
733
+ *
734
+ * function Profile() {
735
+ * const { data } = useLoader(ProfileLoader, { key: userId, refreshGroup: "account" });
736
+ * return <span>{data.name}</span>;
737
+ * }
738
+ * function Orders() {
739
+ * const { data } = useLoader(OrdersLoader, { key: userId, refreshGroup: "account" });
740
+ * return <span>{data.count} orders</span>;
741
+ * }
742
+ * function RefreshButton() {
743
+ * const refreshAccount = useRefreshLoaders("account");
744
+ * return <button onClick={() => refreshAccount()}>Refresh</button>;
745
+ * }
746
+ * ```
747
+ */
748
+ export function useRefreshLoaders(group: string): () => Promise<void> {
749
+ return useCallback(() => loaderStore.refreshGroup(group), [group]);
346
750
  }