@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
@@ -0,0 +1,698 @@
1
+ import type { ComponentType, ReactNode } from "react";
2
+ import { validateUserRouteName } from "../route-name.js";
3
+ import { buildRouteTrie } from "../router/route-trie-builder.js";
4
+ import { tryTrieMatch } from "../router/trie-matching.js";
5
+ import type { LoaderDefinition } from "../types.js";
6
+ import type {
7
+ ClientPathOptions,
8
+ ClientRevalidateFn,
9
+ ClientTransitionConfig,
10
+ ClientUrlBuilder,
11
+ ClientUrlHelpers,
12
+ ClientUrlInterceptRecord,
13
+ ClientUrlItem,
14
+ ClientUrlLoaderRecord,
15
+ ClientUrlPatterns,
16
+ ClientUrlRouteRecord,
17
+ ClientUrlUse,
18
+ } from "./types.js";
19
+ import type { ExtractRoutes } from "../urls/type-extraction.js";
20
+ import type { ClientUrlItems } from "./types.js";
21
+
22
+ const ITEM_KIND = Symbol("client-url-item");
23
+
24
+ const TRANSITION_CONFIG_KEYS = new Set<PropertyKey>([
25
+ "enter",
26
+ "exit",
27
+ "update",
28
+ "share",
29
+ "default",
30
+ "name",
31
+ "viewTransition",
32
+ ]);
33
+
34
+ const UNSUPPORTED_HELPERS = new Set([
35
+ "include",
36
+ "parallel",
37
+ "cache",
38
+ "error",
39
+ "notFound",
40
+ "errorBoundary",
41
+ "notFoundBoundary",
42
+ "middleware",
43
+ ]);
44
+
45
+ type InternalItem =
46
+ | PathItem
47
+ | LayoutItem
48
+ | LoaderItem
49
+ | LoadingItem
50
+ | InterceptItem
51
+ | TransitionItem
52
+ | RevalidateItem;
53
+
54
+ interface ItemBase {
55
+ readonly [ITEM_KIND]: true;
56
+ }
57
+
58
+ interface PathItem extends ItemBase {
59
+ readonly type: "path";
60
+ readonly pattern: string;
61
+ readonly component: ComponentType;
62
+ readonly options: ClientPathOptions | undefined;
63
+ readonly use: readonly InternalItem[];
64
+ }
65
+
66
+ interface LayoutItem extends ItemBase {
67
+ readonly type: "layout";
68
+ readonly component: ComponentType;
69
+ readonly children: readonly InternalItem[];
70
+ }
71
+
72
+ interface InterceptItem extends ItemBase {
73
+ readonly type: "intercept";
74
+ readonly slotName: `@${string}`;
75
+ /** Bare target name — the leading dot of the dot-local argument is stripped. */
76
+ readonly targetName: string;
77
+ readonly component: ComponentType;
78
+ readonly use: readonly InternalItem[];
79
+ }
80
+
81
+ interface TransitionItem extends ItemBase {
82
+ readonly type: "transition";
83
+ readonly config: ClientTransitionConfig;
84
+ }
85
+
86
+ interface LoaderItem extends ItemBase {
87
+ readonly type: "loader";
88
+ readonly definition: LoaderDefinition<any, any>;
89
+ readonly revalidate: readonly ClientRevalidateFn[];
90
+ readonly stream?: "navigation";
91
+ }
92
+
93
+ interface RevalidateItem extends ItemBase {
94
+ readonly type: "revalidate";
95
+ readonly fn: ClientRevalidateFn;
96
+ }
97
+
98
+ interface LoadingItem extends ItemBase {
99
+ readonly type: "loading";
100
+ readonly component: ReactNode;
101
+ }
102
+
103
+ interface FlattenContext {
104
+ readonly layouts: readonly ComponentType[];
105
+ readonly loaders: readonly ClientUrlLoaderRecord[];
106
+ readonly loading: ReactNode | undefined;
107
+ }
108
+
109
+ const EMPTY_CONTEXT: FlattenContext = {
110
+ layouts: [],
111
+ loaders: [],
112
+ loading: undefined,
113
+ };
114
+
115
+ function toPublicItem(item: InternalItem): ClientUrlItem {
116
+ return item as unknown as ClientUrlItem;
117
+ }
118
+
119
+ function isInternalItem(value: unknown): value is InternalItem {
120
+ return (
121
+ typeof value === "object" &&
122
+ value !== null &&
123
+ ITEM_KIND in value &&
124
+ (value as ItemBase)[ITEM_KIND] === true
125
+ );
126
+ }
127
+
128
+ function flattenItems(value: unknown, label: string): InternalItem[] {
129
+ if (!Array.isArray(value)) {
130
+ throw new Error(`clientUrls() ${label} callback must return an array`);
131
+ }
132
+
133
+ const flattened: InternalItem[] = [];
134
+ const visit = (input: unknown): void => {
135
+ if (Array.isArray(input)) {
136
+ for (const child of input) visit(child);
137
+ return;
138
+ }
139
+ if (!isInternalItem(input)) {
140
+ throw new Error(
141
+ `clientUrls() ${label} callback must return only client URL helper items`,
142
+ );
143
+ }
144
+ flattened.push(input);
145
+ };
146
+
147
+ visit(value);
148
+ return flattened;
149
+ }
150
+
151
+ function runUse(use: ClientUrlUse, label: string): InternalItem[] {
152
+ if (typeof use !== "function") {
153
+ throw new Error(`clientUrls() ${label} expects a callback`);
154
+ }
155
+ return flattenItems(use(), label);
156
+ }
157
+
158
+ function rejectItems(
159
+ items: readonly InternalItem[],
160
+ allowed: ReadonlySet<InternalItem["type"]>,
161
+ label: string,
162
+ ): void {
163
+ for (const item of items) {
164
+ if (!allowed.has(item.type)) {
165
+ throw new Error(
166
+ `clientUrls() does not support ${item.type}() inside ${label}()`,
167
+ );
168
+ }
169
+ }
170
+ }
171
+
172
+ function assertNamedComponent(
173
+ component: unknown,
174
+ helper: "path" | "layout" | "intercept",
175
+ ): asserts component is ComponentType {
176
+ if (typeof component !== "function" || component.name.trim() === "") {
177
+ throw new Error(
178
+ `clientUrls() ${helper}() expects a named client component value`,
179
+ );
180
+ }
181
+ }
182
+
183
+ function assertLoaderDefinition(
184
+ definition: unknown,
185
+ ): asserts definition is LoaderDefinition<any, any> {
186
+ const candidate = definition as Partial<LoaderDefinition<any, any>> | null;
187
+ if (
188
+ typeof candidate !== "object" ||
189
+ candidate === null ||
190
+ candidate.__brand !== "loader" ||
191
+ typeof candidate.$$id !== "string"
192
+ ) {
193
+ throw new Error(
194
+ "clientUrls() loader() expects a LoaderDefinition created by createLoader()",
195
+ );
196
+ }
197
+ }
198
+
199
+ function createHelpers(): ClientUrlHelpers {
200
+ const path = ((
201
+ pattern: string,
202
+ component: ComponentType,
203
+ optionsOrUse?: ClientPathOptions | ClientUrlUse,
204
+ maybeUse?: ClientUrlUse,
205
+ ): ClientUrlItem => {
206
+ if (typeof pattern !== "string" || !pattern.startsWith("/")) {
207
+ throw new Error(
208
+ 'clientUrls() path() pattern must be a string beginning with "/"',
209
+ );
210
+ }
211
+ assertNamedComponent(component, "path");
212
+
213
+ let options: ClientPathOptions | undefined;
214
+ let use: ClientUrlUse | undefined;
215
+ if (typeof optionsOrUse === "function") {
216
+ if (maybeUse !== undefined) {
217
+ throw new Error(
218
+ "clientUrls() path() received more than one use callback",
219
+ );
220
+ }
221
+ use = optionsOrUse;
222
+ } else if (optionsOrUse !== undefined) {
223
+ if (typeof optionsOrUse !== "object" || optionsOrUse === null) {
224
+ throw new Error(
225
+ "clientUrls() path() third argument must be PathOptions or a use callback",
226
+ );
227
+ }
228
+ options = { ...optionsOrUse };
229
+ use = maybeUse;
230
+ } else if (maybeUse !== undefined) {
231
+ throw new Error(
232
+ "clientUrls() path() cannot receive a fourth argument without PathOptions",
233
+ );
234
+ }
235
+
236
+ if (options?.name !== undefined) {
237
+ if (typeof options.name !== "string" || options.name === "") {
238
+ throw new Error("clientUrls() path() name must be a non-empty string");
239
+ }
240
+ validateUserRouteName(options.name);
241
+ }
242
+ if (
243
+ options?.trailingSlash !== undefined &&
244
+ options.trailingSlash !== "always" &&
245
+ options.trailingSlash !== "never" &&
246
+ options.trailingSlash !== "ignore"
247
+ ) {
248
+ throw new Error(
249
+ 'clientUrls() path() trailingSlash must be "always", "never", or "ignore"',
250
+ );
251
+ }
252
+
253
+ const items = use ? runUse(use, "path use") : [];
254
+ rejectItems(items, new Set(["loader", "loading", "transition"]), "path");
255
+ if (items.filter((item) => item.type === "transition").length > 1) {
256
+ throw new Error(
257
+ "clientUrls() path() received more than one transition()",
258
+ );
259
+ }
260
+ return toPublicItem({
261
+ [ITEM_KIND]: true,
262
+ type: "path",
263
+ pattern,
264
+ component,
265
+ options,
266
+ use: items,
267
+ });
268
+ }) as ClientUrlHelpers["path"];
269
+
270
+ const layout = ((
271
+ component: ComponentType,
272
+ children: ClientUrlUse,
273
+ ): ClientUrlItem => {
274
+ assertNamedComponent(component, "layout");
275
+ const items = runUse(children, "layout children");
276
+ rejectItems(
277
+ items,
278
+ new Set(["path", "layout", "loader", "loading", "intercept"]),
279
+ "layout",
280
+ );
281
+ return toPublicItem({
282
+ [ITEM_KIND]: true,
283
+ type: "layout",
284
+ component,
285
+ children: items,
286
+ });
287
+ }) as ClientUrlHelpers["layout"];
288
+
289
+ const loader: ClientUrlHelpers["loader"] = (
290
+ definition,
291
+ optionsOrUse,
292
+ maybeUse,
293
+ ) => {
294
+ assertLoaderDefinition(definition);
295
+ // Same options-or-use disambiguation as the server DSL loader(): the
296
+ // 2-arg loader(Def, use) form is untouched.
297
+ if (typeof optionsOrUse === "function" && maybeUse !== undefined) {
298
+ throw new Error(
299
+ "clientUrls() loader() received two use() callbacks. Pass loader(Def, options, use) or loader(Def, use).",
300
+ );
301
+ }
302
+ const options =
303
+ typeof optionsOrUse === "function" ? undefined : optionsOrUse;
304
+ const use = typeof optionsOrUse === "function" ? optionsOrUse : maybeUse;
305
+ if (options?.stream !== undefined && options.stream !== "navigation") {
306
+ throw new Error(
307
+ `clientUrls() loader() stream must be "navigation" (got ${JSON.stringify(options.stream)}). Omit it to stream on every render.`,
308
+ );
309
+ }
310
+ const items = use ? runUse(use, "loader use") : [];
311
+ rejectItems(items, new Set(["revalidate"]), "loader");
312
+ return toPublicItem({
313
+ [ITEM_KIND]: true,
314
+ type: "loader",
315
+ definition,
316
+ revalidate: items
317
+ .filter(
318
+ (item): item is Extract<InternalItem, { type: "revalidate" }> =>
319
+ item.type === "revalidate",
320
+ )
321
+ .map((item) => item.fn),
322
+ ...(options?.stream === "navigation"
323
+ ? { stream: "navigation" as const }
324
+ : {}),
325
+ });
326
+ };
327
+
328
+ const revalidate: ClientUrlHelpers["revalidate"] = (fn) => {
329
+ if (typeof fn !== "function") {
330
+ throw new Error("clientUrls() revalidate() expects a predicate function");
331
+ }
332
+ return toPublicItem({
333
+ [ITEM_KIND]: true,
334
+ type: "revalidate",
335
+ fn,
336
+ });
337
+ };
338
+
339
+ const loading: ClientUrlHelpers["loading"] = (component) =>
340
+ toPublicItem({ [ITEM_KIND]: true, type: "loading", component });
341
+
342
+ const transition: ClientUrlHelpers["transition"] = (config) => {
343
+ if (
344
+ typeof config !== "object" ||
345
+ config === null ||
346
+ Array.isArray(config)
347
+ ) {
348
+ throw new Error(
349
+ "clientUrls() transition() expects a configuration object",
350
+ );
351
+ }
352
+ for (const key of Reflect.ownKeys(config)) {
353
+ if (key === "when") {
354
+ throw new Error(
355
+ "clientUrls() transition() does not support `when` — the gate is a " +
356
+ "server-executed predicate; declare it with a server-tree transition()",
357
+ );
358
+ }
359
+ if (!TRANSITION_CONFIG_KEYS.has(key)) {
360
+ throw new Error(
361
+ `clientUrls() transition() option ${JSON.stringify(String(key))} is not supported`,
362
+ );
363
+ }
364
+ }
365
+ if (config.name !== undefined && typeof config.name !== "string") {
366
+ throw new Error("clientUrls() transition() name must be a string");
367
+ }
368
+ if (
369
+ config.viewTransition !== undefined &&
370
+ config.viewTransition !== "auto" &&
371
+ config.viewTransition !== false
372
+ ) {
373
+ throw new Error(
374
+ 'clientUrls() transition() viewTransition must be "auto" or false',
375
+ );
376
+ }
377
+ for (const key of [
378
+ "enter",
379
+ "exit",
380
+ "update",
381
+ "share",
382
+ "default",
383
+ ] as const) {
384
+ const value = config[key];
385
+ if (value === undefined || typeof value === "string") continue;
386
+ const isStringMap =
387
+ typeof value === "object" &&
388
+ value !== null &&
389
+ !Array.isArray(value) &&
390
+ Object.values(value).every((entry) => typeof entry === "string");
391
+ if (!isStringMap) {
392
+ throw new Error(
393
+ `clientUrls() transition() ${key} must be a string or a string map of transition types`,
394
+ );
395
+ }
396
+ }
397
+ return toPublicItem({
398
+ [ITEM_KIND]: true,
399
+ type: "transition",
400
+ config: { ...config },
401
+ });
402
+ };
403
+
404
+ const intercept: ClientUrlHelpers["intercept"] = (
405
+ slotName,
406
+ targetName,
407
+ component,
408
+ use,
409
+ ) => {
410
+ if (typeof slotName !== "string" || !/^@.+/.test(slotName)) {
411
+ throw new Error(
412
+ 'clientUrls() intercept() slot name must be a string beginning with "@"',
413
+ );
414
+ }
415
+ if (
416
+ typeof targetName !== "string" ||
417
+ !targetName.startsWith(".") ||
418
+ targetName.length < 2
419
+ ) {
420
+ throw new Error(
421
+ 'clientUrls() intercept() target must be a dot-local route name like ".detail"',
422
+ );
423
+ }
424
+ assertNamedComponent(component, "intercept");
425
+ const items = use ? runUse(use, "intercept use") : [];
426
+ rejectItems(items, new Set(["loader", "loading"]), "intercept");
427
+ for (const item of items) {
428
+ // Intercept loaders run on soft navigations only — a document-render
429
+ // await can never apply, so accepting the flag would be silently inert.
430
+ if (item.type === "loader" && item.stream !== undefined) {
431
+ throw new Error(
432
+ 'clientUrls() intercept() loaders cannot use stream: "navigation" — intercepts render on client navigations only',
433
+ );
434
+ }
435
+ }
436
+ return toPublicItem({
437
+ [ITEM_KIND]: true,
438
+ type: "intercept",
439
+ slotName,
440
+ targetName: targetName.slice(1),
441
+ component,
442
+ use: items,
443
+ });
444
+ };
445
+
446
+ const supported: ClientUrlHelpers = {
447
+ path,
448
+ layout,
449
+ loader,
450
+ loading,
451
+ intercept,
452
+ transition,
453
+ revalidate,
454
+ };
455
+
456
+ return new Proxy(supported, {
457
+ get(target, property, receiver): unknown {
458
+ if (typeof property === "string" && UNSUPPORTED_HELPERS.has(property)) {
459
+ throw new Error(`clientUrls() does not support ${property}()`);
460
+ }
461
+ if (typeof property === "string" && !(property in target)) {
462
+ throw new Error(`clientUrls() has no ${property}() helper`);
463
+ }
464
+ return Reflect.get(target, property, receiver);
465
+ },
466
+ });
467
+ }
468
+
469
+ function applyConfig(
470
+ context: FlattenContext,
471
+ items: readonly InternalItem[],
472
+ ): FlattenContext {
473
+ const loaders = [...context.loaders];
474
+ let loading = context.loading;
475
+
476
+ for (const item of items) {
477
+ if (item.type === "loader") {
478
+ loaders.push(
479
+ Object.freeze({
480
+ loader: item.definition,
481
+ revalidate: Object.freeze([...item.revalidate]),
482
+ ...(item.stream ? { stream: item.stream } : {}),
483
+ }),
484
+ );
485
+ } else if (item.type === "loading") {
486
+ loading = item.component;
487
+ }
488
+ }
489
+
490
+ return {
491
+ layouts: context.layouts,
492
+ loaders,
493
+ loading,
494
+ };
495
+ }
496
+
497
+ function addPathRecord(
498
+ item: PathItem,
499
+ context: FlattenContext,
500
+ routes: ClientUrlRouteRecord[],
501
+ ): void {
502
+ const routeContext = applyConfig(context, item.use);
503
+ const options = item.options ? Object.freeze({ ...item.options }) : undefined;
504
+ // Route-scoped only: transition() is rejected outside path() use callbacks,
505
+ // so there is no layout-level inheritance to fold in.
506
+ const transitionItem = item.use.find(
507
+ (useItem): useItem is Extract<InternalItem, { type: "transition" }> =>
508
+ useItem.type === "transition",
509
+ );
510
+ routes.push(
511
+ Object.freeze({
512
+ id: `client-route-${routes.length}`,
513
+ pattern: item.pattern,
514
+ name: options?.name,
515
+ options,
516
+ component: item.component,
517
+ layouts: Object.freeze([...routeContext.layouts]),
518
+ loaders: Object.freeze([...routeContext.loaders]),
519
+ loading: routeContext.loading,
520
+ transition: transitionItem
521
+ ? Object.freeze({ ...transitionItem.config })
522
+ : undefined,
523
+ }),
524
+ );
525
+ }
526
+
527
+ function flattenLayout(
528
+ item: LayoutItem,
529
+ context: FlattenContext,
530
+ routes: ClientUrlRouteRecord[],
531
+ ): void {
532
+ const routeCount = routes.length;
533
+ const layoutContext = applyConfig(
534
+ {
535
+ ...context,
536
+ layouts: [...context.layouts, item.component],
537
+ },
538
+ item.children,
539
+ );
540
+
541
+ flattenRoutes(item.children, layoutContext, routes);
542
+ if (routes.length === routeCount) {
543
+ throw new Error(
544
+ "clientUrls() layout() children must contain at least one path()",
545
+ );
546
+ }
547
+ }
548
+
549
+ function flattenRoutes(
550
+ items: readonly InternalItem[],
551
+ context: FlattenContext,
552
+ routes: ClientUrlRouteRecord[],
553
+ ): void {
554
+ for (const item of items) {
555
+ if (item.type === "path") {
556
+ addPathRecord(item, context, routes);
557
+ } else if (item.type === "layout") {
558
+ flattenLayout(item, context, routes);
559
+ }
560
+ }
561
+ }
562
+
563
+ function validateRoutes(routes: readonly ClientUrlRouteRecord[]): void {
564
+ const patterns = new Set<string>();
565
+ const names = new Set<string>();
566
+ for (const route of routes) {
567
+ if (patterns.has(route.pattern)) {
568
+ throw new Error(
569
+ `clientUrls() cannot define duplicate path pattern "${route.pattern}"`,
570
+ );
571
+ }
572
+ patterns.add(route.pattern);
573
+
574
+ if (route.name !== undefined) {
575
+ if (names.has(route.name)) {
576
+ throw new Error(
577
+ `clientUrls() cannot define duplicate route name "${route.name}"`,
578
+ );
579
+ }
580
+ names.add(route.name);
581
+ }
582
+ }
583
+ }
584
+
585
+ function collectIntercepts(
586
+ items: readonly InternalItem[],
587
+ intercepts: ClientUrlInterceptRecord[],
588
+ ): void {
589
+ for (const item of items) {
590
+ if (item.type === "intercept") {
591
+ const loaders: ClientUrlLoaderRecord[] = [];
592
+ let loading: ReactNode | undefined;
593
+ for (const useItem of item.use) {
594
+ if (useItem.type === "loader") {
595
+ loaders.push(
596
+ Object.freeze({
597
+ loader: useItem.definition,
598
+ revalidate: Object.freeze([...useItem.revalidate]),
599
+ }),
600
+ );
601
+ } else if (useItem.type === "loading") {
602
+ loading = useItem.component;
603
+ }
604
+ }
605
+ intercepts.push(
606
+ Object.freeze({
607
+ slotName: item.slotName,
608
+ targetName: item.targetName,
609
+ component: item.component,
610
+ loaders: Object.freeze(loaders),
611
+ loading,
612
+ }),
613
+ );
614
+ } else if (item.type === "layout") {
615
+ collectIntercepts(item.children, intercepts);
616
+ }
617
+ }
618
+ }
619
+
620
+ function validateIntercepts(
621
+ intercepts: readonly ClientUrlInterceptRecord[],
622
+ routes: readonly ClientUrlRouteRecord[],
623
+ ): void {
624
+ const names = new Set<string>();
625
+ for (const route of routes) {
626
+ if (route.name !== undefined) names.add(route.name);
627
+ }
628
+ for (const intercept of intercepts) {
629
+ if (!names.has(intercept.targetName)) {
630
+ throw new Error(
631
+ `clientUrls() intercept() target ".${intercept.targetName}" does not match a named path() in this definition`,
632
+ );
633
+ }
634
+ }
635
+ }
636
+
637
+ export function clientUrls<const TItems extends ClientUrlItems>(
638
+ builder: ClientUrlBuilder<TItems>,
639
+ ): ClientUrlPatterns<ExtractRoutes<TItems>> {
640
+ if (typeof builder !== "function") {
641
+ throw new Error("clientUrls() expects a builder function");
642
+ }
643
+
644
+ const items = flattenItems(builder(createHelpers()), "builder");
645
+ rejectItems(items, new Set(["path", "layout", "intercept"]), "clientUrls");
646
+
647
+ const routes: ClientUrlRouteRecord[] = [];
648
+ const rootContext = applyConfig(EMPTY_CONTEXT, items);
649
+ flattenRoutes(items, rootContext, routes);
650
+ if (routes.length === 0) {
651
+ throw new Error("clientUrls() builder must define at least one path()");
652
+ }
653
+ validateRoutes(routes);
654
+
655
+ const intercepts: ClientUrlInterceptRecord[] = [];
656
+ collectIntercepts(items, intercepts);
657
+ validateIntercepts(intercepts, routes);
658
+
659
+ const routeManifest: Record<string, string> = {};
660
+ const staticPrefixes: Record<string, string> = {};
661
+ const trailingSlash: Record<string, string> = {};
662
+ for (const route of routes) {
663
+ routeManifest[route.id] = route.pattern;
664
+ staticPrefixes[route.id] = "";
665
+ if (route.options?.trailingSlash) {
666
+ trailingSlash[route.id] = route.options.trailingSlash;
667
+ }
668
+ }
669
+ const trie = buildRouteTrie(routeManifest, staticPrefixes, trailingSlash);
670
+
671
+ return Object.freeze({
672
+ __brand: "client-urls" as const,
673
+ routes: Object.freeze(routes),
674
+ intercepts: Object.freeze(intercepts),
675
+ match(pathname: string) {
676
+ return tryTrieMatch(trie, pathname);
677
+ },
678
+ }) as ClientUrlPatterns<ExtractRoutes<TItems>>;
679
+ }
680
+
681
+ export type {
682
+ ClientRevalidateArgs,
683
+ ClientRevalidateFn,
684
+ ClientTransitionConfig,
685
+ ClientUrlBuilder,
686
+ ClientUrlHelpers,
687
+ ClientUrlInterceptRecord,
688
+ ClientUrlItem,
689
+ ClientUrlItemInput,
690
+ ClientUrlItems,
691
+ ClientLayoutFn,
692
+ ClientPathOptions,
693
+ ClientUrlLoaderRecord,
694
+ ClientPathFn,
695
+ ClientUrlPatterns,
696
+ ClientUrlRouteRecord,
697
+ ClientUrlUse,
698
+ } from "./types.js";