@rangojs/router 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/README.md +5 -1
  2. package/dist/bin/rango.js +343 -125
  3. package/dist/types/browser/event-controller.d.ts +6 -0
  4. package/dist/types/browser/react/use-router.d.ts +10 -3
  5. package/dist/types/browser/react/use-search-params.d.ts +57 -10
  6. package/dist/types/browser/types.d.ts +22 -0
  7. package/dist/types/build/merge-full-manifests.d.ts +3 -0
  8. package/dist/types/build/route-trie.d.ts +4 -73
  9. package/dist/types/build/route-types/per-module-writer.d.ts +6 -4
  10. package/dist/types/build/route-types/router-processing.d.ts +2 -3
  11. package/dist/types/cache/cache-exec-scope.d.ts +31 -0
  12. package/dist/types/cache/cf/cf-cache-constants.d.ts +8 -1
  13. package/dist/types/cache/cf/cf-cache-store.d.ts +15 -1
  14. package/dist/types/cache/cf/cf-cache-types.d.ts +1 -1
  15. package/dist/types/cache/cf/cf-kv-utils.d.ts +21 -0
  16. package/dist/types/cache/taint.d.ts +12 -6
  17. package/dist/types/client-urls/client-root.d.ts +38 -0
  18. package/dist/types/client-urls/client-urls.d.ts +5 -0
  19. package/dist/types/client-urls/navigation.d.ts +38 -0
  20. package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
  21. package/dist/types/client-urls/server-projection.d.ts +62 -0
  22. package/dist/types/client-urls/types.d.ts +144 -0
  23. package/dist/types/client.d.ts +12 -4
  24. package/dist/types/client.rsc.d.ts +4 -1
  25. package/dist/types/decode-loader-results.d.ts +37 -0
  26. package/dist/types/errors.d.ts +1 -0
  27. package/dist/types/handles/is-thenable.d.ts +2 -4
  28. package/dist/types/index.d.ts +1 -1
  29. package/dist/types/loader-redirect.d.ts +27 -0
  30. package/dist/types/outlet-context.d.ts +12 -0
  31. package/dist/types/outlet-provider.d.ts +3 -1
  32. package/dist/types/redirect-origin.d.ts +4 -0
  33. package/dist/types/route-content-wrapper.d.ts +42 -1
  34. package/dist/types/route-definition/helpers-types.d.ts +13 -2
  35. package/dist/types/router/error-handling.d.ts +35 -1
  36. package/dist/types/router/intercept-resolution.d.ts +12 -0
  37. package/dist/types/router/loader-resolution.d.ts +24 -2
  38. package/dist/types/router/revalidation.d.ts +7 -0
  39. package/dist/{types.backup/build/route-trie.d.ts → types/router/route-trie-builder.d.ts} +4 -16
  40. package/dist/types/router/router-interfaces.d.ts +20 -0
  41. package/dist/types/router/segment-resolution/helpers.d.ts +1 -1
  42. package/dist/types/router/trie-matching.d.ts +1 -1
  43. package/dist/types/rsc/helpers.d.ts +3 -0
  44. package/dist/types/rsc/manifest-init.d.ts +5 -5
  45. package/dist/types/rsc/render-pipeline.d.ts +9 -0
  46. package/dist/types/rsc/routine-plan.d.ts +124 -0
  47. package/dist/types/rsc/shell-capture-constants.d.ts +17 -0
  48. package/dist/types/rsc/shell-capture.d.ts +9 -0
  49. package/dist/types/rsc/shell-serve.d.ts +11 -0
  50. package/dist/types/rsc/types.d.ts +30 -0
  51. package/dist/types/segment-system.d.ts +2 -0
  52. package/dist/types/server/context.d.ts +10 -0
  53. package/dist/types/server/handle-store.d.ts +34 -3
  54. package/dist/types/server/request-context.d.ts +14 -1
  55. package/dist/types/server.d.ts +1 -0
  56. package/dist/types/ssr/index.d.ts +22 -0
  57. package/dist/types/ssr/ssr-root.d.ts +10 -0
  58. package/dist/types/testing/dom.entry.d.ts +1 -1
  59. package/dist/types/testing/render-route.d.ts +16 -6
  60. package/dist/types/testing/run-loader.d.ts +9 -0
  61. package/dist/types/types/boundaries.d.ts +22 -0
  62. package/dist/types/types/index.d.ts +1 -1
  63. package/dist/types/types/loader-types.d.ts +57 -5
  64. package/dist/types/types/segments.d.ts +7 -0
  65. package/dist/types/urls/path-helper-types.d.ts +10 -4
  66. package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
  67. package/dist/types/vite/discovery/discover-routers.d.ts +1 -1
  68. package/dist/types/vite/discovery/state.d.ts +8 -1
  69. package/dist/types/vite/encryption-key.d.ts +2 -0
  70. package/dist/types/vite/plugins/expose-internal-ids.d.ts +10 -0
  71. package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
  72. package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
  73. package/dist/types/vite/utils/shared-utils.d.ts +12 -0
  74. package/dist/vite/index.js +5101 -2056
  75. package/package.json +3 -3
  76. package/skills/breadcrumbs/SKILL.md +39 -9
  77. package/skills/caching/SKILL.md +1 -1
  78. package/skills/catalog.json +7 -1
  79. package/skills/client-urls/SKILL.md +338 -0
  80. package/skills/comparison/references/framework-comparison.md +23 -9
  81. package/skills/hooks/SKILL.md +2 -2
  82. package/skills/hooks/data.md +11 -2
  83. package/skills/hooks/handle-and-actions.md +7 -0
  84. package/skills/hooks/outlets.md +26 -5
  85. package/skills/hooks/urls.md +40 -3
  86. package/skills/loader/SKILL.md +132 -20
  87. package/skills/migrate-nextjs/SKILL.md +70 -10
  88. package/skills/migrate-react-router/SKILL.md +49 -13
  89. package/skills/migrate-react-router/component-migration.md +18 -13
  90. package/skills/migrate-react-router/data-and-actions.md +14 -3
  91. package/skills/migrate-react-router/route-mapping.md +15 -2
  92. package/skills/mime-routes/SKILL.md +3 -1
  93. package/skills/parallel/SKILL.md +32 -1
  94. package/skills/ppr/SKILL.md +16 -6
  95. package/skills/prerender/SKILL.md +8 -4
  96. package/skills/rango/SKILL.md +21 -17
  97. package/skills/react-compiler/SKILL.md +3 -3
  98. package/skills/response-routes/SKILL.md +4 -2
  99. package/skills/route/SKILL.md +5 -2
  100. package/skills/router-setup/SKILL.md +16 -2
  101. package/skills/scripts/SKILL.md +16 -6
  102. package/skills/shell-manifest/SKILL.md +16 -7
  103. package/skills/testing/SKILL.md +2 -2
  104. package/skills/testing/client-components.md +6 -0
  105. package/skills/testing/handles.md +30 -8
  106. package/skills/testing/loader.md +51 -49
  107. package/skills/testing/middleware.md +1 -1
  108. package/skills/theme/SKILL.md +8 -5
  109. package/skills/typesafety/generated-files-and-cli.md +16 -9
  110. package/skills/typesafety/route-types.md +5 -1
  111. package/skills/use-cache/SKILL.md +47 -0
  112. package/src/bin/rango.ts +7 -3
  113. package/src/browser/event-controller.ts +40 -15
  114. package/src/browser/navigation-bridge.ts +6 -0
  115. package/src/browser/navigation-client.ts +5 -0
  116. package/src/browser/partial-update.ts +77 -10
  117. package/src/browser/react/NavigationProvider.tsx +7 -0
  118. package/src/browser/react/use-router.ts +40 -11
  119. package/src/browser/react/use-search-params.ts +140 -17
  120. package/src/browser/rsc-router.tsx +59 -0
  121. package/src/browser/server-action-bridge.ts +26 -0
  122. package/src/browser/types.ts +22 -0
  123. package/src/build/merge-full-manifests.ts +161 -0
  124. package/src/build/route-trie.ts +9 -332
  125. package/src/build/route-types/include-resolution.ts +66 -11
  126. package/src/build/route-types/per-module-writer.ts +11 -6
  127. package/src/build/route-types/router-processing.ts +184 -153
  128. package/src/build/runtime-discovery.ts +23 -12
  129. package/src/cache/cache-exec-scope.ts +47 -0
  130. package/src/cache/cache-runtime.ts +113 -40
  131. package/src/cache/cf/cf-cache-constants.ts +8 -1
  132. package/src/cache/cf/cf-cache-store.ts +41 -64
  133. package/src/cache/cf/cf-cache-types.ts +1 -1
  134. package/src/cache/cf/cf-kv-utils.ts +38 -0
  135. package/src/cache/segment-codec.ts +21 -5
  136. package/src/cache/taint.ts +28 -9
  137. package/src/client-urls/client-root.tsx +168 -0
  138. package/src/client-urls/client-urls.ts +698 -0
  139. package/src/client-urls/navigation.ts +237 -0
  140. package/src/client-urls/revalidation-protocol.ts +56 -0
  141. package/src/client-urls/server-projection.ts +579 -0
  142. package/src/client-urls/types.ts +195 -0
  143. package/src/client.rsc.tsx +12 -0
  144. package/src/client.tsx +49 -6
  145. package/src/decode-loader-results.ts +113 -0
  146. package/src/errors.ts +14 -0
  147. package/src/handles/deferred-resolution.ts +14 -7
  148. package/src/handles/is-thenable.ts +2 -4
  149. package/src/index.ts +1 -0
  150. package/src/loader-redirect.tsx +64 -0
  151. package/src/outlet-context.ts +12 -0
  152. package/src/outlet-provider.tsx +15 -1
  153. package/src/redirect-origin.ts +29 -0
  154. package/src/route-content-wrapper.tsx +96 -3
  155. package/src/route-definition/dsl-helpers.ts +28 -3
  156. package/src/route-definition/helpers-types.ts +13 -0
  157. package/src/route-definition/redirect.ts +17 -18
  158. package/src/router/error-handling.ts +65 -11
  159. package/src/router/intercept-resolution.ts +29 -0
  160. package/src/router/loader-resolution.ts +261 -28
  161. package/src/router/match-middleware/cache-lookup.ts +24 -15
  162. package/src/router/match-result.ts +7 -0
  163. package/src/router/revalidation.ts +24 -11
  164. package/src/router/route-trie-builder.ts +334 -0
  165. package/src/router/router-interfaces.ts +38 -0
  166. package/src/router/segment-resolution/fresh.ts +47 -0
  167. package/src/router/segment-resolution/helpers.ts +9 -11
  168. package/src/router/segment-resolution/loader-cache.ts +14 -24
  169. package/src/router/segment-resolution/revalidation.ts +20 -1
  170. package/src/router/trie-matching.ts +3 -3
  171. package/src/router.ts +46 -1
  172. package/src/rsc/full-payload.ts +6 -0
  173. package/src/rsc/handler.ts +36 -12
  174. package/src/rsc/helpers.ts +13 -0
  175. package/src/rsc/loader-fetch.ts +2 -2
  176. package/src/rsc/manifest-init.ts +28 -9
  177. package/src/rsc/progressive-enhancement.ts +247 -70
  178. package/src/rsc/render-pipeline.ts +68 -24
  179. package/src/rsc/routine-plan.ts +359 -0
  180. package/src/rsc/rsc-rendering.ts +569 -302
  181. package/src/rsc/server-action.ts +180 -71
  182. package/src/rsc/shell-capture-constants.ts +18 -0
  183. package/src/rsc/shell-capture.ts +104 -21
  184. package/src/rsc/shell-serve.ts +15 -2
  185. package/src/rsc/ssr-setup.ts +10 -1
  186. package/src/rsc/types.ts +31 -2
  187. package/src/segment-system.tsx +83 -26
  188. package/src/server/context.ts +10 -0
  189. package/src/server/cookie-store.ts +19 -19
  190. package/src/server/handle-store.ts +185 -48
  191. package/src/server/request-context.ts +36 -6
  192. package/src/server.ts +7 -0
  193. package/src/ssr/index.tsx +37 -2
  194. package/src/ssr/ssr-root.tsx +30 -2
  195. package/src/testing/dom.entry.ts +1 -1
  196. package/src/testing/render-route.tsx +22 -8
  197. package/src/testing/run-loader.ts +51 -13
  198. package/src/types/boundaries.ts +19 -0
  199. package/src/types/index.ts +1 -0
  200. package/src/types/loader-types.ts +60 -5
  201. package/src/types/segments.ts +7 -0
  202. package/src/urls/include-helper.ts +22 -4
  203. package/src/urls/path-helper-types.ts +14 -1
  204. package/src/use-loader.tsx +67 -6
  205. package/src/vite/discovery/client-urls-projection.ts +322 -0
  206. package/src/vite/discovery/discover-routers.ts +43 -17
  207. package/src/vite/discovery/state.ts +11 -1
  208. package/src/vite/discovery/virtual-module-codegen.ts +20 -0
  209. package/src/vite/encryption-key.ts +29 -0
  210. package/src/vite/plugins/expose-action-id.ts +2 -2
  211. package/src/vite/plugins/expose-internal-ids.ts +46 -0
  212. package/src/vite/plugins/server-ref-hashing.ts +74 -0
  213. package/src/vite/plugins/server-reference-pattern.ts +10 -0
  214. package/src/vite/plugins/virtual-entries.ts +12 -3
  215. package/src/vite/rango.ts +9 -0
  216. package/src/vite/router-discovery.ts +184 -14
  217. package/src/vite/utils/shared-utils.ts +12 -7
  218. package/dist/types.backup/__internal.d.ts +0 -127
  219. package/dist/types.backup/bin/rango.d.ts +0 -1
  220. package/dist/types.backup/browser/action-coordinator.d.ts +0 -57
  221. package/dist/types.backup/browser/action-fence.d.ts +0 -33
  222. package/dist/types.backup/browser/app-shell.d.ts +0 -34
  223. package/dist/types.backup/browser/app-version.d.ts +0 -6
  224. package/dist/types.backup/browser/connection-warmup.d.ts +0 -31
  225. package/dist/types.backup/browser/cookie-name.d.ts +0 -66
  226. package/dist/types.backup/browser/event-controller.d.ts +0 -221
  227. package/dist/types.backup/browser/history-state.d.ts +0 -26
  228. package/dist/types.backup/browser/index.d.ts +0 -1
  229. package/dist/types.backup/browser/intercept-utils.d.ts +0 -30
  230. package/dist/types.backup/browser/invalidate-client-cache.d.ts +0 -17
  231. package/dist/types.backup/browser/link-interceptor.d.ts +0 -43
  232. package/dist/types.backup/browser/logging.d.ts +0 -33
  233. package/dist/types.backup/browser/merge-segment-loaders.d.ts +0 -38
  234. package/dist/types.backup/browser/navigation-bridge.d.ts +0 -27
  235. package/dist/types.backup/browser/navigation-client.d.ts +0 -17
  236. package/dist/types.backup/browser/navigation-store-handle.d.ts +0 -25
  237. package/dist/types.backup/browser/navigation-store.d.ts +0 -95
  238. package/dist/types.backup/browser/navigation-transaction.d.ts +0 -75
  239. package/dist/types.backup/browser/network-error-handler.d.ts +0 -35
  240. package/dist/types.backup/browser/partial-update.d.ts +0 -61
  241. package/dist/types.backup/browser/prefetch/cache.d.ts +0 -183
  242. package/dist/types.backup/browser/prefetch/fetch.d.ts +0 -52
  243. package/dist/types.backup/browser/prefetch/observer.d.ts +0 -27
  244. package/dist/types.backup/browser/prefetch/policy.d.ts +0 -13
  245. package/dist/types.backup/browser/prefetch/queue.d.ts +0 -48
  246. package/dist/types.backup/browser/prefetch/resource-ready.d.ts +0 -28
  247. package/dist/types.backup/browser/rango-state.d.ts +0 -52
  248. package/dist/types.backup/browser/react/Link.d.ts +0 -140
  249. package/dist/types.backup/browser/react/NavigationProvider.d.ts +0 -88
  250. package/dist/types.backup/browser/react/ScrollRestoration.d.ts +0 -78
  251. package/dist/types.backup/browser/react/context.d.ts +0 -54
  252. package/dist/types.backup/browser/react/filter-segment-order.d.ts +0 -35
  253. package/dist/types.backup/browser/react/index.d.ts +0 -1
  254. package/dist/types.backup/browser/react/location-state-shared.d.ts +0 -162
  255. package/dist/types.backup/browser/react/location-state.d.ts +0 -29
  256. package/dist/types.backup/browser/react/mount-context.d.ts +0 -23
  257. package/dist/types.backup/browser/react/nonce-context.d.ts +0 -14
  258. package/dist/types.backup/browser/react/shallow-equal.d.ts +0 -5
  259. package/dist/types.backup/browser/react/use-action.d.ts +0 -61
  260. package/dist/types.backup/browser/react/use-handle.d.ts +0 -21
  261. package/dist/types.backup/browser/react/use-href.d.ts +0 -32
  262. package/dist/types.backup/browser/react/use-link-status.d.ts +0 -36
  263. package/dist/types.backup/browser/react/use-mount.d.ts +0 -24
  264. package/dist/types.backup/browser/react/use-navigation.d.ts +0 -15
  265. package/dist/types.backup/browser/react/use-params.d.ts +0 -21
  266. package/dist/types.backup/browser/react/use-pathname.d.ts +0 -13
  267. package/dist/types.backup/browser/react/use-reverse.d.ts +0 -40
  268. package/dist/types.backup/browser/react/use-router.d.ts +0 -23
  269. package/dist/types.backup/browser/react/use-search-params.d.ts +0 -19
  270. package/dist/types.backup/browser/react/use-segments.d.ts +0 -29
  271. package/dist/types.backup/browser/response-adapter.d.ts +0 -58
  272. package/dist/types.backup/browser/rsc-router.d.ts +0 -141
  273. package/dist/types.backup/browser/scroll-restoration.d.ts +0 -103
  274. package/dist/types.backup/browser/segment-reconciler.d.ts +0 -74
  275. package/dist/types.backup/browser/segment-structure-assert.d.ts +0 -16
  276. package/dist/types.backup/browser/server-action-bridge.d.ts +0 -29
  277. package/dist/types.backup/browser/types.d.ts +0 -530
  278. package/dist/types.backup/browser/validate-redirect-origin.d.ts +0 -28
  279. package/dist/types.backup/build/collect-fallback-refs.d.ts +0 -5
  280. package/dist/types.backup/build/generate-manifest.d.ts +0 -100
  281. package/dist/types.backup/build/generate-route-types.d.ts +0 -8
  282. package/dist/types.backup/build/index.d.ts +0 -21
  283. package/dist/types.backup/build/prefix-tree-utils.d.ts +0 -56
  284. package/dist/types.backup/build/route-types/ast-helpers.d.ts +0 -3
  285. package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +0 -13
  286. package/dist/types.backup/build/route-types/codegen.d.ts +0 -16
  287. package/dist/types.backup/build/route-types/include-resolution.d.ts +0 -74
  288. package/dist/types.backup/build/route-types/param-extraction.d.ts +0 -13
  289. package/dist/types.backup/build/route-types/per-module-writer.d.ts +0 -18
  290. package/dist/types.backup/build/route-types/router-processing.d.ts +0 -82
  291. package/dist/types.backup/build/route-types/scan-filter.d.ts +0 -17
  292. package/dist/types.backup/build/route-types/source-scan.d.ts +0 -13
  293. package/dist/types.backup/build/runtime-discovery.d.ts +0 -24
  294. package/dist/types.backup/cache/background-task.d.ts +0 -21
  295. package/dist/types.backup/cache/cache-error.d.ts +0 -71
  296. package/dist/types.backup/cache/cache-key-utils.d.ts +0 -35
  297. package/dist/types.backup/cache/cache-policy.d.ts +0 -59
  298. package/dist/types.backup/cache/cache-runtime.d.ts +0 -51
  299. package/dist/types.backup/cache/cache-scope.d.ts +0 -134
  300. package/dist/types.backup/cache/cache-tag.d.ts +0 -79
  301. package/dist/types.backup/cache/cf/cf-base64.d.ts +0 -4
  302. package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +0 -105
  303. package/dist/types.backup/cache/cf/cf-cache-store.d.ts +0 -481
  304. package/dist/types.backup/cache/cf/cf-cache-types.d.ts +0 -300
  305. package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +0 -22
  306. package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +0 -15
  307. package/dist/types.backup/cache/cf/index.d.ts +0 -3
  308. package/dist/types.backup/cache/document-cache.d.ts +0 -69
  309. package/dist/types.backup/cache/handle-capture.d.ts +0 -23
  310. package/dist/types.backup/cache/handle-snapshot.d.ts +0 -39
  311. package/dist/types.backup/cache/index.d.ts +0 -7
  312. package/dist/types.backup/cache/memory-segment-store.d.ts +0 -163
  313. package/dist/types.backup/cache/profile-registry.d.ts +0 -40
  314. package/dist/types.backup/cache/read-through-swr.d.ts +0 -60
  315. package/dist/types.backup/cache/segment-codec.d.ts +0 -78
  316. package/dist/types.backup/cache/shell-snapshot.d.ts +0 -162
  317. package/dist/types.backup/cache/tag-invalidation.d.ts +0 -74
  318. package/dist/types.backup/cache/taint.d.ts +0 -71
  319. package/dist/types.backup/cache/types.d.ts +0 -407
  320. package/dist/types.backup/cache/vercel/index.d.ts +0 -1
  321. package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +0 -267
  322. package/dist/types.backup/client.d.ts +0 -184
  323. package/dist/types.backup/client.rsc.d.ts +0 -39
  324. package/dist/types.backup/cloudflare/index.d.ts +0 -7
  325. package/dist/types.backup/cloudflare/tracing.d.ts +0 -53
  326. package/dist/types.backup/component-utils.d.ts +0 -46
  327. package/dist/types.backup/components/DefaultDocument.d.ts +0 -13
  328. package/dist/types.backup/context-var.d.ts +0 -84
  329. package/dist/types.backup/debug.d.ts +0 -57
  330. package/dist/types.backup/decode-loader-results.d.ts +0 -5
  331. package/dist/types.backup/default-error-boundary.d.ts +0 -10
  332. package/dist/types.backup/defer.d.ts +0 -89
  333. package/dist/types.backup/deps/browser.d.ts +0 -1
  334. package/dist/types.backup/deps/html-stream-client.d.ts +0 -1
  335. package/dist/types.backup/deps/html-stream-server.d.ts +0 -1
  336. package/dist/types.backup/deps/rsc.d.ts +0 -1
  337. package/dist/types.backup/deps/ssr.d.ts +0 -1
  338. package/dist/types.backup/encode-kv.d.ts +0 -35
  339. package/dist/types.backup/errors.d.ts +0 -226
  340. package/dist/types.backup/escape-script.d.ts +0 -44
  341. package/dist/types.backup/handle.d.ts +0 -93
  342. package/dist/types.backup/handles/MetaTags.d.ts +0 -17
  343. package/dist/types.backup/handles/Scripts.d.ts +0 -38
  344. package/dist/types.backup/handles/breadcrumbs.d.ts +0 -43
  345. package/dist/types.backup/handles/deferred-resolution.d.ts +0 -53
  346. package/dist/types.backup/handles/is-thenable.d.ts +0 -12
  347. package/dist/types.backup/handles/meta.d.ts +0 -43
  348. package/dist/types.backup/handles/script.d.ts +0 -139
  349. package/dist/types.backup/host/cookie-handler.d.ts +0 -8
  350. package/dist/types.backup/host/errors.d.ts +0 -40
  351. package/dist/types.backup/host/index.d.ts +0 -33
  352. package/dist/types.backup/host/pattern-matcher.d.ts +0 -30
  353. package/dist/types.backup/host/router.d.ts +0 -12
  354. package/dist/types.backup/host/testing.d.ts +0 -41
  355. package/dist/types.backup/host/types.d.ts +0 -148
  356. package/dist/types.backup/host/utils.d.ts +0 -20
  357. package/dist/types.backup/href-client.d.ts +0 -214
  358. package/dist/types.backup/index.d.ts +0 -112
  359. package/dist/types.backup/index.rsc.d.ts +0 -51
  360. package/dist/types.backup/internal-debug.d.ts +0 -1
  361. package/dist/types.backup/loader-store.d.ts +0 -193
  362. package/dist/types.backup/loader.d.ts +0 -18
  363. package/dist/types.backup/loader.rsc.d.ts +0 -18
  364. package/dist/types.backup/missing-id-error.d.ts +0 -1
  365. package/dist/types.backup/outlet-context.d.ts +0 -12
  366. package/dist/types.backup/outlet-provider.d.ts +0 -12
  367. package/dist/types.backup/prerender/build-shell-capture.d.ts +0 -104
  368. package/dist/types.backup/prerender/param-hash.d.ts +0 -6
  369. package/dist/types.backup/prerender/shell-manifest-key.d.ts +0 -18
  370. package/dist/types.backup/prerender/store.d.ts +0 -62
  371. package/dist/types.backup/prerender.d.ts +0 -292
  372. package/dist/types.backup/redirect-origin.d.ts +0 -55
  373. package/dist/types.backup/regex-escape.d.ts +0 -6
  374. package/dist/types.backup/render-error-thrower.d.ts +0 -13
  375. package/dist/types.backup/response-utils.d.ts +0 -35
  376. package/dist/types.backup/reverse.d.ts +0 -206
  377. package/dist/types.backup/root-error-boundary.d.ts +0 -32
  378. package/dist/types.backup/route-content-wrapper.d.ts +0 -40
  379. package/dist/types.backup/route-definition/dsl-helpers.d.ts +0 -130
  380. package/dist/types.backup/route-definition/helper-factories.d.ts +0 -22
  381. package/dist/types.backup/route-definition/helpers-types.d.ts +0 -392
  382. package/dist/types.backup/route-definition/index.d.ts +0 -7
  383. package/dist/types.backup/route-definition/redirect.d.ts +0 -48
  384. package/dist/types.backup/route-definition/resolve-handler-use.d.ts +0 -19
  385. package/dist/types.backup/route-definition/use-item-types.d.ts +0 -1
  386. package/dist/types.backup/route-definition.d.ts +0 -1
  387. package/dist/types.backup/route-map-builder.d.ts +0 -127
  388. package/dist/types.backup/route-name.d.ts +0 -27
  389. package/dist/types.backup/route-types.d.ts +0 -172
  390. package/dist/types.backup/router/basename.d.ts +0 -10
  391. package/dist/types.backup/router/content-negotiation.d.ts +0 -91
  392. package/dist/types.backup/router/debug-manifest.d.ts +0 -7
  393. package/dist/types.backup/router/error-handling.d.ts +0 -76
  394. package/dist/types.backup/router/find-match.d.ts +0 -19
  395. package/dist/types.backup/router/handler-context.d.ts +0 -41
  396. package/dist/types.backup/router/instrument.d.ts +0 -161
  397. package/dist/types.backup/router/intercept-resolution.d.ts +0 -79
  398. package/dist/types.backup/router/lazy-includes.d.ts +0 -26
  399. package/dist/types.backup/router/loader-resolution.d.ts +0 -63
  400. package/dist/types.backup/router/logging.d.ts +0 -41
  401. package/dist/types.backup/router/manifest.d.ts +0 -8
  402. package/dist/types.backup/router/match-api.d.ts +0 -19
  403. package/dist/types.backup/router/match-context.d.ts +0 -184
  404. package/dist/types.backup/router/match-handlers.d.ts +0 -49
  405. package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +0 -113
  406. package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +0 -113
  407. package/dist/types.backup/router/match-middleware/cache-store.d.ts +0 -112
  408. package/dist/types.backup/router/match-middleware/index.d.ts +0 -80
  409. package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +0 -116
  410. package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +0 -94
  411. package/dist/types.backup/router/match-pipelines.d.ts +0 -103
  412. package/dist/types.backup/router/match-result.d.ts +0 -114
  413. package/dist/types.backup/router/metrics.d.ts +0 -6
  414. package/dist/types.backup/router/middleware-types.d.ts +0 -74
  415. package/dist/types.backup/router/middleware.d.ts +0 -116
  416. package/dist/types.backup/router/navigation-snapshot.d.ts +0 -22
  417. package/dist/types.backup/router/params-util.d.ts +0 -8
  418. package/dist/types.backup/router/parse-pattern.d.ts +0 -38
  419. package/dist/types.backup/router/pattern-matching.d.ts +0 -169
  420. package/dist/types.backup/router/prefetch-cache-ttl.d.ts +0 -27
  421. package/dist/types.backup/router/prefetch-limits.d.ts +0 -20
  422. package/dist/types.backup/router/prerender-match.d.ts +0 -50
  423. package/dist/types.backup/router/preview-match.d.ts +0 -22
  424. package/dist/types.backup/router/request-classification.d.ts +0 -104
  425. package/dist/types.backup/router/revalidation.d.ts +0 -57
  426. package/dist/types.backup/router/route-snapshot.d.ts +0 -112
  427. package/dist/types.backup/router/router-context.d.ts +0 -137
  428. package/dist/types.backup/router/router-interfaces.d.ts +0 -432
  429. package/dist/types.backup/router/router-options.d.ts +0 -738
  430. package/dist/types.backup/router/router-registry.d.ts +0 -15
  431. package/dist/types.backup/router/segment-resolution/fresh.d.ts +0 -55
  432. package/dist/types.backup/router/segment-resolution/helpers.d.ts +0 -93
  433. package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +0 -33
  434. package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +0 -44
  435. package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +0 -90
  436. package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +0 -53
  437. package/dist/types.backup/router/segment-resolution/revalidation.d.ts +0 -85
  438. package/dist/types.backup/router/segment-resolution/static-store.d.ts +0 -17
  439. package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +0 -16
  440. package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +0 -28
  441. package/dist/types.backup/router/segment-resolution.d.ts +0 -3
  442. package/dist/types.backup/router/segment-wrappers.d.ts +0 -53
  443. package/dist/types.backup/router/state-cookie-name.d.ts +0 -1
  444. package/dist/types.backup/router/substitute-pattern-params.d.ts +0 -23
  445. package/dist/types.backup/router/telemetry-otel.d.ts +0 -113
  446. package/dist/types.backup/router/telemetry.d.ts +0 -215
  447. package/dist/types.backup/router/timeout.d.ts +0 -68
  448. package/dist/types.backup/router/tracing.d.ts +0 -125
  449. package/dist/types.backup/router/trie-matching.d.ts +0 -32
  450. package/dist/types.backup/router/types.d.ts +0 -98
  451. package/dist/types.backup/router/url-params.d.ts +0 -26
  452. package/dist/types.backup/router.d.ts +0 -7
  453. package/dist/types.backup/rsc/capture-queue.d.ts +0 -6
  454. package/dist/types.backup/rsc/full-payload.d.ts +0 -22
  455. package/dist/types.backup/rsc/handler-context.d.ts +0 -31
  456. package/dist/types.backup/rsc/handler.d.ts +0 -9
  457. package/dist/types.backup/rsc/helpers.d.ts +0 -213
  458. package/dist/types.backup/rsc/index.d.ts +0 -17
  459. package/dist/types.backup/rsc/json-route-result.d.ts +0 -20
  460. package/dist/types.backup/rsc/loader-fetch.d.ts +0 -14
  461. package/dist/types.backup/rsc/manifest-init.d.ts +0 -18
  462. package/dist/types.backup/rsc/nonce.d.ts +0 -28
  463. package/dist/types.backup/rsc/origin-guard.d.ts +0 -50
  464. package/dist/types.backup/rsc/progressive-enhancement.d.ts +0 -19
  465. package/dist/types.backup/rsc/redirect-guard.d.ts +0 -35
  466. package/dist/types.backup/rsc/response-cache-serve.d.ts +0 -46
  467. package/dist/types.backup/rsc/response-error.d.ts +0 -19
  468. package/dist/types.backup/rsc/response-route-handler.d.ts +0 -29
  469. package/dist/types.backup/rsc/rsc-rendering.d.ts +0 -23
  470. package/dist/types.backup/rsc/runtime-warnings.d.ts +0 -22
  471. package/dist/types.backup/rsc/server-action.d.ts +0 -68
  472. package/dist/types.backup/rsc/shell-build-manifest.d.ts +0 -84
  473. package/dist/types.backup/rsc/shell-capture-constants.d.ts +0 -27
  474. package/dist/types.backup/rsc/shell-capture.d.ts +0 -374
  475. package/dist/types.backup/rsc/shell-serve.d.ts +0 -136
  476. package/dist/types.backup/rsc/ssr-setup.d.ts +0 -48
  477. package/dist/types.backup/rsc/transition-gate.d.ts +0 -27
  478. package/dist/types.backup/rsc/types.d.ts +0 -290
  479. package/dist/types.backup/runtime-env.d.ts +0 -1
  480. package/dist/types.backup/search-params.d.ts +0 -125
  481. package/dist/types.backup/segment-content-promise.d.ts +0 -13
  482. package/dist/types.backup/segment-fragments.d.ts +0 -56
  483. package/dist/types.backup/segment-loader-promise.d.ts +0 -22
  484. package/dist/types.backup/segment-system.d.ts +0 -84
  485. package/dist/types.backup/serialize.d.ts +0 -164
  486. package/dist/types.backup/server/context.d.ts +0 -494
  487. package/dist/types.backup/server/cookie-parse.d.ts +0 -10
  488. package/dist/types.backup/server/cookie-store.d.ts +0 -107
  489. package/dist/types.backup/server/fetchable-loader-store.d.ts +0 -20
  490. package/dist/types.backup/server/handle-store.d.ts +0 -100
  491. package/dist/types.backup/server/loader-registry.d.ts +0 -32
  492. package/dist/types.backup/server/request-context.d.ts +0 -596
  493. package/dist/types.backup/server/root-layout.d.ts +0 -3
  494. package/dist/types.backup/server.d.ts +0 -15
  495. package/dist/types.backup/ssr/index.d.ts +0 -233
  496. package/dist/types.backup/ssr/inject-rsc-eager.d.ts +0 -3
  497. package/dist/types.backup/ssr/preinit-client-references.d.ts +0 -71
  498. package/dist/types.backup/ssr/ssr-root.d.ts +0 -69
  499. package/dist/types.backup/static-handler.d.ts +0 -57
  500. package/dist/types.backup/testing/cache-status.d.ts +0 -63
  501. package/dist/types.backup/testing/collect-handle.d.ts +0 -20
  502. package/dist/types.backup/testing/dispatch.d.ts +0 -123
  503. package/dist/types.backup/testing/dom.entry.d.ts +0 -15
  504. package/dist/types.backup/testing/e2e/fixture.d.ts +0 -37
  505. package/dist/types.backup/testing/e2e/index.d.ts +0 -30
  506. package/dist/types.backup/testing/e2e/matchers.d.ts +0 -17
  507. package/dist/types.backup/testing/e2e/page-helpers.d.ts +0 -62
  508. package/dist/types.backup/testing/e2e/parity.d.ts +0 -111
  509. package/dist/types.backup/testing/e2e/server.d.ts +0 -35
  510. package/dist/types.backup/testing/flight-matchers.d.ts +0 -55
  511. package/dist/types.backup/testing/flight-normalize.d.ts +0 -1
  512. package/dist/types.backup/testing/flight-tree.d.ts +0 -192
  513. package/dist/types.backup/testing/flight.d.ts +0 -115
  514. package/dist/types.backup/testing/flight.entry.d.ts +0 -27
  515. package/dist/types.backup/testing/generated-routes.d.ts +0 -66
  516. package/dist/types.backup/testing/index.d.ts +0 -52
  517. package/dist/types.backup/testing/internal/context.d.ts +0 -225
  518. package/dist/types.backup/testing/internal/flight-client-globals.d.ts +0 -1
  519. package/dist/types.backup/testing/internal/seed-vars.d.ts +0 -30
  520. package/dist/types.backup/testing/render-handler.d.ts +0 -160
  521. package/dist/types.backup/testing/render-route.d.ts +0 -246
  522. package/dist/types.backup/testing/run-loader.d.ts +0 -186
  523. package/dist/types.backup/testing/run-middleware.d.ts +0 -132
  524. package/dist/types.backup/testing/run-transition-when.d.ts +0 -77
  525. package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +0 -6
  526. package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +0 -13
  527. package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +0 -7
  528. package/dist/types.backup/testing/vitest-stubs/version.d.ts +0 -1
  529. package/dist/types.backup/testing/vitest.d.ts +0 -205
  530. package/dist/types.backup/theme/ThemeProvider.d.ts +0 -13
  531. package/dist/types.backup/theme/ThemeScript.d.ts +0 -45
  532. package/dist/types.backup/theme/constants.d.ts +0 -39
  533. package/dist/types.backup/theme/index.d.ts +0 -29
  534. package/dist/types.backup/theme/theme-context.d.ts +0 -21
  535. package/dist/types.backup/theme/theme-script.d.ts +0 -26
  536. package/dist/types.backup/theme/types.d.ts +0 -162
  537. package/dist/types.backup/theme/use-theme.d.ts +0 -8
  538. package/dist/types.backup/types/boundaries.d.ts +0 -93
  539. package/dist/types.backup/types/cache-types.d.ts +0 -191
  540. package/dist/types.backup/types/error-types.d.ts +0 -114
  541. package/dist/types.backup/types/global-namespace.d.ts +0 -90
  542. package/dist/types.backup/types/handler-context.d.ts +0 -658
  543. package/dist/types.backup/types/index.d.ts +0 -11
  544. package/dist/types.backup/types/loader-types.d.ts +0 -182
  545. package/dist/types.backup/types/request-scope.d.ts +0 -93
  546. package/dist/types.backup/types/route-config.d.ts +0 -105
  547. package/dist/types.backup/types/route-entry.d.ts +0 -95
  548. package/dist/types.backup/types/segments.d.ts +0 -234
  549. package/dist/types.backup/types.d.ts +0 -1
  550. package/dist/types.backup/urls/include-helper.d.ts +0 -17
  551. package/dist/types.backup/urls/include-provider.d.ts +0 -27
  552. package/dist/types.backup/urls/index.d.ts +0 -6
  553. package/dist/types.backup/urls/path-helper-types.d.ts +0 -197
  554. package/dist/types.backup/urls/path-helper.d.ts +0 -12
  555. package/dist/types.backup/urls/pattern-types.d.ts +0 -166
  556. package/dist/types.backup/urls/response-types.d.ts +0 -67
  557. package/dist/types.backup/urls/type-extraction.d.ts +0 -157
  558. package/dist/types.backup/urls/urls-function.d.ts +0 -24
  559. package/dist/types.backup/urls.d.ts +0 -1
  560. package/dist/types.backup/use-loader.d.ts +0 -150
  561. package/dist/types.backup/vercel/index.d.ts +0 -10
  562. package/dist/types.backup/vercel/tracing.d.ts +0 -70
  563. package/dist/types.backup/vite/debug.d.ts +0 -80
  564. package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +0 -12
  565. package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +0 -65
  566. package/dist/types.backup/vite/discovery/discover-routers.d.ts +0 -17
  567. package/dist/types.backup/vite/discovery/discovery-errors.d.ts +0 -113
  568. package/dist/types.backup/vite/discovery/gate-state.d.ts +0 -79
  569. package/dist/types.backup/vite/discovery/prerender-collection.d.ts +0 -24
  570. package/dist/types.backup/vite/discovery/route-types-writer.d.ts +0 -32
  571. package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +0 -22
  572. package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +0 -40
  573. package/dist/types.backup/vite/discovery/state.d.ts +0 -162
  574. package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +0 -15
  575. package/dist/types.backup/vite/index.d.ts +0 -11
  576. package/dist/types.backup/vite/inject-client-debug.d.ts +0 -56
  577. package/dist/types.backup/vite/plugin-types.d.ts +0 -298
  578. package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +0 -6
  579. package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +0 -40
  580. package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +0 -35
  581. package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +0 -64
  582. package/dist/types.backup/vite/plugins/expose-action-id.d.ts +0 -18
  583. package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +0 -37
  584. package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +0 -19
  585. package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +0 -10
  586. package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +0 -8
  587. package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +0 -13
  588. package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +0 -29
  589. package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +0 -6
  590. package/dist/types.backup/vite/plugins/performance-tracks.d.ts +0 -25
  591. package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +0 -20
  592. package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +0 -20
  593. package/dist/types.backup/vite/plugins/vercel-output.d.ts +0 -85
  594. package/dist/types.backup/vite/plugins/version-injector.d.ts +0 -21
  595. package/dist/types.backup/vite/plugins/version-plugin.d.ts +0 -19
  596. package/dist/types.backup/vite/plugins/virtual-entries.d.ts +0 -36
  597. package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +0 -7
  598. package/dist/types.backup/vite/rango.d.ts +0 -29
  599. package/dist/types.backup/vite/router-discovery.d.ts +0 -23
  600. package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +0 -64
  601. package/dist/types.backup/vite/utils/banner.d.ts +0 -2
  602. package/dist/types.backup/vite/utils/bundle-analysis.d.ts +0 -28
  603. package/dist/types.backup/vite/utils/client-chunks.d.ts +0 -55
  604. package/dist/types.backup/vite/utils/directive-prologue.d.ts +0 -16
  605. package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +0 -37
  606. package/dist/types.backup/vite/utils/manifest-utils.d.ts +0 -7
  607. package/dist/types.backup/vite/utils/package-resolution.d.ts +0 -6
  608. package/dist/types.backup/vite/utils/prerender-utils.d.ts +0 -32
  609. package/dist/types.backup/vite/utils/shared-utils.d.ts +0 -55
@@ -1,34 +1,129 @@
1
1
  "use client";
2
2
 
3
- import { useContext, useState, useEffect, useRef } from "react";
3
+ import {
4
+ useCallback,
5
+ useContext,
6
+ useEffect,
7
+ useMemo,
8
+ useRef,
9
+ useState,
10
+ } from "react";
4
11
  import { NavigationStoreContext } from "./context.js";
5
12
  import type { ReadonlyURLSearchParams } from "../types.js";
6
13
 
7
14
  /**
8
- * Hook to access the current URL search params.
15
+ * Accepted shapes for the setter: a full replacement for the search string.
16
+ * Record values are stringified; array values append one entry per element;
17
+ * null/undefined values are skipped (ergonomic conditional spreads).
18
+ */
19
+ export type SearchParamsInit =
20
+ | string
21
+ | URLSearchParams
22
+ | ReadonlyURLSearchParams
23
+ | Record<
24
+ string,
25
+ | string
26
+ | number
27
+ | boolean
28
+ | readonly (string | number | boolean)[]
29
+ | null
30
+ | undefined
31
+ >;
32
+
33
+ export interface SetSearchParamsOptions {
34
+ /** Replace the current history entry instead of pushing (default false). */
35
+ replace?: boolean;
36
+ /** Scroll behavior for the navigation (default: router default, scroll). */
37
+ scroll?: boolean;
38
+ /**
39
+ * Set false to skip the server fetch and only update the URL (default
40
+ * true). Purely client-derived search state (open accordions, view modes)
41
+ * needs no loader re-run; all location-aware hooks still update. Same
42
+ * contract as NavigateOptions.revalidate — it only applies because the
43
+ * setter never changes the pathname.
44
+ */
45
+ revalidate?: boolean;
46
+ }
47
+
48
+ export type SetSearchParams = (
49
+ init: SearchParamsInit | ((prev: URLSearchParams) => SearchParamsInit),
50
+ options?: SetSearchParamsOptions,
51
+ ) => Promise<void>;
52
+
53
+ function normalizeInit(init: SearchParamsInit): URLSearchParams {
54
+ if (typeof init === "string") return new URLSearchParams(init);
55
+ if (init instanceof URLSearchParams) return new URLSearchParams(init);
56
+ const params = new URLSearchParams();
57
+ for (const [key, value] of Object.entries(init)) {
58
+ if (value == null) continue;
59
+ if (Array.isArray(value)) {
60
+ for (const entry of value) params.append(key, String(entry));
61
+ } else {
62
+ params.append(key, String(value));
63
+ }
64
+ }
65
+ return params;
66
+ }
67
+
68
+ /**
69
+ * Hook to read and write the current URL search params
70
+ * (React Router-style tuple).
9
71
  *
10
- * Returns a read-only URLSearchParams object from the committed location.
11
- * Updates when navigation completes, not during pending navigation.
72
+ * The first element is a read-only URLSearchParams from the COMMITTED
73
+ * location — it updates when navigation completes, not during a pending
74
+ * navigation. During document SSR it carries the LIVE request's search (the
75
+ * SSR store is seeded from SSRRenderOptions.search), and the browser's
76
+ * first render seeds from its own store location (window.location) — the
77
+ * same URL, so hydration matches. Ppr capture/resume renders seed the SHELL
78
+ * KEY's search (sorted, cache.searchParams filter applied — search is part
79
+ * of shell identity like every other ppr key), so static-part reads bake
80
+ * markup consistent with the shell's own key. Two edges: a param EXCLUDED
81
+ * by cache.searchParams is absent in shell renders but present in the
82
+ * browser (exclusion declares "does not affect markup" — reading one
83
+ * anyway hydration-mismatches), and toString() renders sorted order while
84
+ * the browser holds the raw URL order.
12
85
  *
13
- * Note: During SSR the search params are not available (the server only sends
14
- * the pathname). The hook returns empty params during SSR and syncs from
15
- * the browser URL on mount.
86
+ * The setter REPLACES the whole search string (React Router semantics) and
87
+ * navigates to the current pathname with the new params a same-route
88
+ * navigation, so route loaders re-evaluate per their revalidate() contract
89
+ * and the commit holds previous content (the same-structure transition
90
+ * lane). Pass a function to merge with the current params: it receives a
91
+ * MUTABLE copy read at call time. The hash is dropped, like React Router.
16
92
  *
17
93
  * @example
18
94
  * ```tsx
19
- * const searchParams = useSearchParams();
20
- * const query = searchParams.get("q"); // "react"
21
- * const page = searchParams.get("page"); // "2"
95
+ * const [searchParams, setSearchParams] = useSearchParams();
96
+ * const category = searchParams.get("category");
97
+ *
98
+ * // Replace the whole search string
99
+ * setSearchParams({ category: "electronics" });
100
+ *
101
+ * // Merge with what's there now
102
+ * setSearchParams((prev) => {
103
+ * prev.set("page", "2");
104
+ * return prev;
105
+ * });
106
+ *
107
+ * // Filter UIs usually want replace + preserved scroll
108
+ * setSearchParams({ category: "home" }, { replace: true, scroll: false });
22
109
  * ```
23
110
  */
24
- export function useSearchParams(): ReadonlyURLSearchParams {
111
+ export function useSearchParams(): [ReadonlyURLSearchParams, SetSearchParams] {
25
112
  const ctx = useContext(NavigationStoreContext);
26
113
 
27
- const [searchParams, setSearchParams] = useState<ReadonlyURLSearchParams>(
28
- () => new URLSearchParams(),
29
- );
114
+ // Seed from the store location on BOTH sides (mirrors usePathname): the
115
+ // SSR store carries the live request's search, the browser store carries
116
+ // window.location — same URL, so the hydration renders agree. No ctx
117
+ // (no provider) seeds empty.
118
+ const [searchParams, setSearchParamsState] =
119
+ useState<ReadonlyURLSearchParams>(() => {
120
+ const location = ctx?.eventController.getState().location as
121
+ | URL
122
+ | undefined;
123
+ return new URLSearchParams(location?.searchParams);
124
+ });
30
125
 
31
- const prevSearch = useRef("");
126
+ const prevSearch = useRef(searchParams.toString());
32
127
 
33
128
  useEffect(() => {
34
129
  if (!ctx) return;
@@ -38,7 +133,7 @@ export function useSearchParams(): ReadonlyURLSearchParams {
38
133
  const nextSearch = location.searchParams.toString();
39
134
  if (nextSearch !== prevSearch.current) {
40
135
  prevSearch.current = nextSearch;
41
- setSearchParams(new URLSearchParams(nextSearch));
136
+ setSearchParamsState(new URLSearchParams(nextSearch));
42
137
  }
43
138
  };
44
139
 
@@ -47,5 +142,33 @@ export function useSearchParams(): ReadonlyURLSearchParams {
47
142
  return ctx.eventController.subscribe(update);
48
143
  }, []);
49
144
 
50
- return searchParams;
145
+ // Reads the committed location at CALL time (not the render closure), so a
146
+ // functional init always merges against fresh params even when the caller's
147
+ // closure is stale.
148
+ const setSearchParams = useCallback<SetSearchParams>((init, options) => {
149
+ if (!ctx) {
150
+ throw new Error(
151
+ "useSearchParams setter must be used within NavigationProvider",
152
+ );
153
+ }
154
+ const location = ctx.eventController.getState().location as URL;
155
+ const resolved =
156
+ typeof init === "function"
157
+ ? init(new URLSearchParams(location.searchParams))
158
+ : init;
159
+ const search = normalizeInit(resolved).toString();
160
+ const url = search ? `${location.pathname}?${search}` : location.pathname;
161
+ return ctx.navigate(url, {
162
+ replace: options?.replace ?? false,
163
+ ...(options?.scroll !== undefined ? { scroll: options.scroll } : {}),
164
+ ...(options?.revalidate !== undefined
165
+ ? { revalidate: options.revalidate }
166
+ : {}),
167
+ });
168
+ }, []);
169
+
170
+ return useMemo(
171
+ () => [searchParams, setSearchParams],
172
+ [searchParams, setSearchParams],
173
+ );
51
174
  }
@@ -8,6 +8,7 @@ import {
8
8
  generateHistoryKey,
9
9
  } from "./navigation-store.js";
10
10
  import { createEventController } from "./event-controller.js";
11
+ import { resolveDeferredHandleValues } from "../handles/deferred-resolution.js";
11
12
  import { validateRedirectOrigin } from "./validate-redirect-origin.js";
12
13
  import { createNavigationClient } from "./navigation-client.js";
13
14
  import { createServerActionBridge } from "./server-action-bridge.js";
@@ -38,6 +39,7 @@ import {
38
39
  } from "./intercept-utils.js";
39
40
  import { createAppShellRef } from "./app-shell.js";
40
41
  import { bootLog, IS_BROWSER_DEBUG } from "./logging.js";
42
+ import { setActiveInterceptTargets } from "../client-urls/navigation.js";
41
43
 
42
44
  // Vite HMR types are provided by vite/client
43
45
 
@@ -205,6 +207,11 @@ export async function initBrowserApp(
205
207
  const version = initialPayload.metadata?.version;
206
208
  initRangoState(version ?? "0", initialPayload.metadata?.stateCookieName);
207
209
 
210
+ // Seed the intercept-target set for the initial location so the FIRST
211
+ // clientUrls navigation already declines intercepted targets (refreshed on
212
+ // every commit in partial-update.ts).
213
+ setActiveInterceptTargets(initialPayload.metadata?.interceptTargets);
214
+
208
215
  // Create navigation store with history-based caching
209
216
  const store = createNavigationStore({
210
217
  initialLocation: window.location,
@@ -268,6 +275,43 @@ export async function initBrowserApp(
268
275
  // Update the initial cache entry with the processed handleData
269
276
  // The cache entry was created by createNavigationStore but without handleData
270
277
  store.updateCacheHandleData(initialHistoryKey, lastHandleData);
278
+
279
+ // Late handle channel: pushes from streaming loader bodies that missed the
280
+ // handler barrier (ctx.handle() writes mid-body). Consumed NON-BLOCKING —
281
+ // hydration must not wait on loader bodies — and applied through the same
282
+ // controller/cache path as the initial snapshot, so useHandle readers
283
+ // re-render as meta/breadcrumbs stream in.
284
+ const lateGenerator = initialPayload.metadata?.handlesLate;
285
+ if (lateGenerator) {
286
+ void (async () => {
287
+ try {
288
+ // Never apply before React commits hydration — a pre-commit
289
+ // application mutates the state useHandle initializers read during
290
+ // the hydration render (mismatch). Yields buffer in the generator
291
+ // meanwhile; nothing is lost.
292
+ await hydrationCommitted;
293
+ for await (const rawLateData of lateGenerator) {
294
+ // Handles are async by design: a push(promise) value resolves
295
+ // whenever it resolves — only SSR'd handles are awaited server-
296
+ // side. The main document snapshot arrives server-resolved
297
+ // (resolvedHandleStream); this late channel is raw, so resolve
298
+ // deferred values here exactly like the nav lane's processHandles
299
+ // does before applying.
300
+ const lateData = await resolveDeferredHandleValues(rawLateData);
301
+ bootLog("handles: late push applied", {
302
+ segments: Object.keys(lateData),
303
+ });
304
+ eventController.setHandleData(
305
+ lateData,
306
+ initialPayload.metadata?.matched,
307
+ );
308
+ store.updateCacheHandleData(initialHistoryKey, lateData);
309
+ }
310
+ } catch (err) {
311
+ console.error("[rsc-router] Error consuming late handles:", err);
312
+ }
313
+ })();
314
+ }
271
315
  } else {
272
316
  bootLog("handles: none in payload");
273
317
  }
@@ -568,6 +612,18 @@ export async function initBrowserApp(
568
612
  // re-runs the root effect; the second flush is not a second hydration).
569
613
  let hydrationCommitLogged = false;
570
614
 
615
+ // Hydration-commit barrier for the late handle channel. useHandle's useState
616
+ // initializer reads the eventController's LIVE state during the hydration
617
+ // render, so applying a late handle update BEFORE hydration commits changes
618
+ // that state out from under React — the classic "external changing data"
619
+ // hydration mismatch (seen when a loader's push lost the handler-barrier race
620
+ // by milliseconds and its late yield landed mid-hydration). The root effect
621
+ // below resolves this; the late consumer awaits it before applying anything.
622
+ let resolveHydrationCommitted!: () => void;
623
+ const hydrationCommitted: Promise<void> = new Promise((resolve) => {
624
+ resolveHydrationCommitted = resolve;
625
+ });
626
+
571
627
  /**
572
628
  * Get the browser app context. Throws if initBrowserApp hasn't been called.
573
629
  */
@@ -643,6 +699,9 @@ export function Rango(_props: RangoProps): React.ReactElement {
643
699
  hydrationCommitLogged = true;
644
700
  bootLog("hydration commit (root effect flushed)");
645
701
  }
702
+ // Release the late handle channel (see hydrationCommitted above).
703
+ // StrictMode double-invoke: resolving twice is a no-op.
704
+ resolveHydrationCommitted();
646
705
  return cleanupPrefetch;
647
706
  }, [bridge, linkInterceptionEnabled]);
648
707
 
@@ -37,6 +37,8 @@ import {
37
37
  import { mergeLocationState } from "./history-state.js";
38
38
  import { classifyActionOutcome } from "./action-coordinator.js";
39
39
  import { getAppVersion } from "./app-version.js";
40
+ import { collectClientRevalidationDecisions } from "../client-urls/navigation.js";
41
+ import { CLIENT_REVALIDATION_HEADER } from "../client-urls/revalidation-protocol.js";
40
42
 
41
43
  // Polyfill Symbol.dispose/asyncDispose for Safari and older browsers
42
44
  if (typeof Symbol.dispose === "undefined") {
@@ -294,12 +296,36 @@ export function createServerActionBridge(
294
296
  const onHandleAbort = () => fetchAbort.abort();
295
297
  handle.signal.addEventListener("abort", onHandleAbort, { once: true });
296
298
 
299
+ // Client-run per-loader revalidation for the action follow-up render:
300
+ // run the held clientUrls route's revalidate() predicates with the
301
+ // action context and ship their decisions. Fails soft to null (locked
302
+ // server defaults).
303
+ let clientRevalidation: string | null = null;
304
+ try {
305
+ const actionPageUrl = new URL(
306
+ segmentState.currentUrl,
307
+ window.location.origin,
308
+ );
309
+ clientRevalidation = collectClientRevalidationDecisions({
310
+ currentUrl: actionPageUrl,
311
+ nextUrl: actionPageUrl,
312
+ isAction: true,
313
+ actionId: id,
314
+ stale: false,
315
+ });
316
+ } catch {
317
+ clientRevalidation = null;
318
+ }
319
+
297
320
  // Send action request with stream tracking
298
321
  const responsePromise = fetch(url, {
299
322
  method: "POST",
300
323
  headers: {
301
324
  "rsc-action": id,
302
325
  "X-RSC-Router-Client-Path": segmentState.currentUrl,
326
+ ...(clientRevalidation && {
327
+ [CLIENT_REVALIDATION_HEADER]: clientRevalidation,
328
+ }),
303
329
  ...(tx && { "X-RSC-Router-Request-Id": tx.requestId }),
304
330
  ...(interceptSourceUrl && {
305
331
  "X-RSC-Router-Intercept-Source": interceptSourceUrl,
@@ -54,10 +54,25 @@ export interface RscMetadata {
54
54
  * Slots are used for intercepting routes during soft navigation
55
55
  */
56
56
  slots?: Record<string, SlotState>;
57
+ /**
58
+ * Intercept TARGET route names reachable from this location as a
59
+ * navigation origin. The browser-local clientUrls matcher declines its
60
+ * optimistic presentation for these targets (the canonical response would
61
+ * commit the intercept over the ORIGIN page, so destination loading would
62
+ * flash and revert). Missing/empty means no targets.
63
+ */
64
+ interceptTargets?: string[];
57
65
  /** Root layout component for browser-side re-renders */
58
66
  rootLayout?: ComponentType<{ children: ReactNode }>;
59
67
  /** Handle data accumulated across route segments (async generator that yields on each push) */
60
68
  handles?: AsyncGenerator<HandleData, void, unknown>;
69
+ /**
70
+ * Document-lane late handle channel: pushes landing after the handler
71
+ * barrier (streaming loader ctx.use(Handle) writes). Consumed non-blocking
72
+ * post-hydration (rsc-router.tsx); `handles` above is drained in blocking
73
+ * positions and must complete at the handler barrier.
74
+ */
75
+ handlesLate?: AsyncGenerator<HandleData, void, unknown>;
61
76
  /** Cached handle data (for back/forward navigation from cache) */
62
77
  cachedHandleData?: HandleData;
63
78
  /**
@@ -531,6 +546,13 @@ export interface FetchPartialOptions {
531
546
  signal?: AbortSignal;
532
547
  /** If true, this is a stale cache revalidation request - server should force revalidators */
533
548
  staleRevalidation?: boolean;
549
+ /**
550
+ * Encoded client-run per-loader revalidation decisions
551
+ * (clientUrls revalidate() predicates executed in the browser); sent as
552
+ * X-Rango-Client-Reval and honored only by materialized client-urls loader
553
+ * stubs. Null/absent = locked server defaults.
554
+ */
555
+ clientRevalidation?: string | null;
534
556
  interceptSourceUrl?: string;
535
557
  /** RSC version for cache invalidation detection */
536
558
  version?: string;
@@ -0,0 +1,161 @@
1
+ import type { FullManifest, PrefixTreeNode } from "./generate-manifest.js";
2
+
3
+ function clonePrefixNode(node: PrefixTreeNode): PrefixTreeNode {
4
+ return {
5
+ staticPrefix: node.staticPrefix,
6
+ fullPrefix: node.fullPrefix,
7
+ ...(node.namePrefix === undefined ? {} : { namePrefix: node.namePrefix }),
8
+ children: clonePrefixTree(node.children),
9
+ routes: [...node.routes],
10
+ };
11
+ }
12
+
13
+ function clonePrefixTree(
14
+ tree: Record<string, PrefixTreeNode>,
15
+ ): Record<string, PrefixTreeNode> {
16
+ return Object.fromEntries(
17
+ Object.entries(tree).map(([prefix, node]) => [
18
+ prefix,
19
+ clonePrefixNode(node),
20
+ ]),
21
+ );
22
+ }
23
+
24
+ function removeRoutesFromPrefixTree(
25
+ tree: Record<string, PrefixTreeNode>,
26
+ routeNames: ReadonlySet<string>,
27
+ ): Record<string, PrefixTreeNode> {
28
+ return Object.fromEntries(
29
+ Object.entries(tree).map(([prefix, node]) => [
30
+ prefix,
31
+ {
32
+ staticPrefix: node.staticPrefix,
33
+ fullPrefix: node.fullPrefix,
34
+ ...(node.namePrefix === undefined
35
+ ? {}
36
+ : { namePrefix: node.namePrefix }),
37
+ children: removeRoutesFromPrefixTree(node.children, routeNames),
38
+ routes: node.routes.filter((name) => !routeNames.has(name)),
39
+ },
40
+ ]),
41
+ );
42
+ }
43
+
44
+ function mergePrefixTrees(
45
+ earlier: Record<string, PrefixTreeNode>,
46
+ later: Record<string, PrefixTreeNode>,
47
+ ): Record<string, PrefixTreeNode> {
48
+ const merged = clonePrefixTree(earlier);
49
+ for (const [prefix, laterNode] of Object.entries(later)) {
50
+ const earlierNode = merged[prefix];
51
+ if (!earlierNode) {
52
+ merged[prefix] = clonePrefixNode(laterNode);
53
+ continue;
54
+ }
55
+
56
+ merged[prefix] = {
57
+ staticPrefix: laterNode.staticPrefix,
58
+ fullPrefix: laterNode.fullPrefix,
59
+ ...(laterNode.namePrefix === undefined
60
+ ? {}
61
+ : { namePrefix: laterNode.namePrefix }),
62
+ children: mergePrefixTrees(earlierNode.children, laterNode.children),
63
+ routes: [...new Set([...earlierNode.routes, ...laterNode.routes])],
64
+ };
65
+ }
66
+ return merged;
67
+ }
68
+
69
+ function mergeRouteRecord<T>(
70
+ earlier: Record<string, T> | undefined,
71
+ later: Record<string, T> | undefined,
72
+ overwrittenRoutes: ReadonlySet<string>,
73
+ cloneValue: (value: T) => T,
74
+ ): Record<string, T> | undefined {
75
+ const merged: Record<string, T> = {};
76
+ for (const [name, value] of Object.entries(earlier ?? {})) {
77
+ if (!overwrittenRoutes.has(name)) merged[name] = cloneValue(value);
78
+ }
79
+ for (const [name, value] of Object.entries(later ?? {})) {
80
+ merged[name] = cloneValue(value);
81
+ }
82
+ return Object.keys(merged).length > 0 ? merged : undefined;
83
+ }
84
+
85
+ function mergeRouteList(
86
+ earlier: readonly string[] | undefined,
87
+ later: readonly string[] | undefined,
88
+ overwrittenRoutes: ReadonlySet<string>,
89
+ ): string[] | undefined {
90
+ const merged = [
91
+ ...(earlier ?? []).filter((name) => !overwrittenRoutes.has(name)),
92
+ ...(later ?? []),
93
+ ];
94
+ const unique = [...new Set(merged)];
95
+ return unique.length > 0 ? unique : undefined;
96
+ }
97
+
98
+ /** Merge ordered per-mount manifests without mutating any input manifest. */
99
+ export function mergeFullManifests(
100
+ manifests: readonly FullManifest[],
101
+ ): FullManifest {
102
+ let merged: FullManifest = {
103
+ prefixTree: {},
104
+ routeManifest: {},
105
+ };
106
+
107
+ for (const manifest of manifests) {
108
+ const overwrittenRoutes = new Set(Object.keys(manifest.routeManifest));
109
+ const prefixTreeWithoutOverwrites = removeRoutesFromPrefixTree(
110
+ merged.prefixTree,
111
+ overwrittenRoutes,
112
+ );
113
+
114
+ merged = {
115
+ prefixTree: mergePrefixTrees(
116
+ prefixTreeWithoutOverwrites,
117
+ manifest.prefixTree,
118
+ ),
119
+ routeManifest: {
120
+ ...merged.routeManifest,
121
+ ...manifest.routeManifest,
122
+ },
123
+ routeTrailingSlash: mergeRouteRecord(
124
+ merged.routeTrailingSlash,
125
+ manifest.routeTrailingSlash,
126
+ overwrittenRoutes,
127
+ (value) => value,
128
+ ),
129
+ prerenderRoutes: mergeRouteList(
130
+ merged.prerenderRoutes,
131
+ manifest.prerenderRoutes,
132
+ overwrittenRoutes,
133
+ ),
134
+ passthroughRoutes: mergeRouteList(
135
+ merged.passthroughRoutes,
136
+ manifest.passthroughRoutes,
137
+ overwrittenRoutes,
138
+ ),
139
+ responseTypeRoutes: mergeRouteRecord(
140
+ merged.responseTypeRoutes,
141
+ manifest.responseTypeRoutes,
142
+ overwrittenRoutes,
143
+ (value) => value,
144
+ ),
145
+ routeSearchSchemas: mergeRouteRecord(
146
+ merged.routeSearchSchemas,
147
+ manifest.routeSearchSchemas,
148
+ overwrittenRoutes,
149
+ (value) => ({ ...value }),
150
+ ),
151
+ _prerenderDefs: mergeRouteRecord(
152
+ merged._prerenderDefs,
153
+ manifest._prerenderDefs,
154
+ overwrittenRoutes,
155
+ (value) => value,
156
+ ),
157
+ };
158
+ }
159
+
160
+ return merged;
161
+ }