@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
@@ -11,6 +11,12 @@ import {
11
11
  import type { UrlPatterns, IncludeOptions } from "./pattern-types.js";
12
12
  import type { IncludeProvider } from "./include-provider.js";
13
13
  import type { IncludeFn } from "./path-helper-types.js";
14
+ import {
15
+ clientUrlIncludePatterns,
16
+ isClientUrlPatterns,
17
+ isClientUrlReference,
18
+ } from "../client-urls/server-projection.js";
19
+ import type { ClientUrlPatterns } from "../client-urls/types.js";
14
20
 
15
21
  function hasExplicitNameOption(options: IncludeOptions | undefined): boolean {
16
22
  return !!options && Object.prototype.hasOwnProperty.call(options, "name");
@@ -61,15 +67,27 @@ export function processItems(items: readonly AllUseItems[]): AllUseItems[] {
61
67
  export function createIncludeHelper<TEnv>(): IncludeFn<TEnv> {
62
68
  return (
63
69
  prefix: string,
64
- // A `urls()` value (eager) OR an async provider thunk
70
+ // A `urls()` value (eager), an async provider thunk
65
71
  // (`() => import("./routes")`) whose evaluation is deferred to the first
66
- // request matching `prefix`. The provider is stored unevaluated and
67
- // resolved by the runtime lazy-include expansion / build-time discovery.
68
- patterns: UrlPatterns<TEnv> | IncludeProvider<TEnv>,
72
+ // request matching `prefix`, or a clientUrls() definition (object or
73
+ // client reference). Providers are stored unevaluated and resolved by the
74
+ // runtime lazy-include expansion / build-time discovery.
75
+ patterns: UrlPatterns<TEnv> | IncludeProvider<TEnv> | ClientUrlPatterns,
69
76
  options?: IncludeOptions,
70
77
  ): IncludeItem => {
71
78
  const { ctx } = requireDslContext("include() must be called inside urls()");
72
79
 
80
+ // clientUrls() sources mount through include() like any urls() module.
81
+ // Detect them FIRST: a client REFERENCE is a callable proxy, so the
82
+ // downstream provider check (`typeof === "function"`) would otherwise
83
+ // invoke it as an async include thunk. The substituted handler defers
84
+ // materialization to evaluation time, when the discovery-installed
85
+ // projection is available; the include machinery then applies URL and
86
+ // route-name prefixes exactly as for server modules.
87
+ if (isClientUrlPatterns(patterns) || isClientUrlReference(patterns)) {
88
+ patterns = clientUrlIncludePatterns(patterns) as UrlPatterns<TEnv>;
89
+ }
90
+
73
91
  const explicitName = options?.name;
74
92
  const hasExplicitName = hasExplicitNameOption(options);
75
93
  if (hasExplicitName && explicitName) {
@@ -5,6 +5,7 @@ import type {
5
5
  Handler,
6
6
  HandlerContext,
7
7
  LoaderDefinition,
8
+ LoaderOptions,
8
9
  MiddlewareFn,
9
10
  NotFoundBoundaryHandler,
10
11
  PartialCacheOptions,
@@ -57,6 +58,7 @@ import type {
57
58
  IncludeOptions,
58
59
  } from "./pattern-types.js";
59
60
  import type { ExtractRoutes, ExtractResponses } from "./type-extraction.js";
61
+ import type { ClientUrlPatterns } from "../client-urls/types.js";
60
62
 
61
63
  /**
62
64
  * Base path function signature for defining routes with URL patterns.
@@ -175,6 +177,11 @@ export type IncludeArg<
175
177
  TResponses extends Record<string, unknown>,
176
178
  > =
177
179
  | UrlPatterns<TEnv, TRoutes, TResponses>
180
+ // clientUrls() definitions mount through include() like any urls() module;
181
+ // on the server the runtime value is the module's client reference, but the
182
+ // TypeScript type of that default export IS ClientUrlPatterns, so route
183
+ // names flow into NamedRoutes through the same TRoutes inference.
184
+ | ClientUrlPatterns<TRoutes>
178
185
  | (() =>
179
186
  | IncludeResolved<TEnv, TRoutes, TResponses>
180
187
  | Promise<IncludeResolved<TEnv, TRoutes, TResponses>>);
@@ -338,10 +345,16 @@ export type PathHelpers<TEnv> = {
338
345
  revalidate: (fn: ShouldRevalidateFn<any, TEnv>) => RevalidateItem;
339
346
 
340
347
  /**
341
- * Attach a data loader to the current route/layout
348
+ * Attach a data loader to the current route/layout.
349
+ *
350
+ * Pass `{ stream: "navigation" }` to await this loader before first flush
351
+ * on DOCUMENT requests (see {@link LoaderOptions}) — the opt-in for loaders
352
+ * whose data, handle pushes, or thrown notFound()/redirect() must be in the
353
+ * SSR'd HTML. Per-loader: a dynamic sibling keeps streaming.
342
354
  */
343
355
  loader: <TData>(
344
356
  loaderDef: LoaderDefinition<TData>,
357
+ optionsOrUse?: LoaderOptions | (() => LoaderUseItem[]),
345
358
  use?: () => LoaderUseItem[],
346
359
  ) => LoaderItem;
347
360
 
@@ -3,6 +3,7 @@
3
3
  import {
4
4
  isValidElement,
5
5
  startTransition,
6
+ use,
6
7
  useCallback,
7
8
  useContext,
8
9
  useEffect,
@@ -13,6 +14,7 @@ import {
13
14
  } from "react";
14
15
  import { OutletContext, type OutletContextValue } from "./outlet-context.js";
15
16
  import { loaderStore, type LoaderEntry } from "./loader-store.js";
17
+ import { decodeLoaderEntry } from "./decode-loader-results.js";
16
18
  import type { LoaderDefinition, LoadOptions } from "./types.js";
17
19
 
18
20
  function isShareableGet(options: LoadOptions | undefined): boolean {
@@ -34,19 +36,47 @@ let privateGroupBucketSeq = 0;
34
36
 
35
37
  const NOT_FOUND = Symbol("not-found");
36
38
 
39
+ /**
40
+ * SPIKE (streaming useLoader): lookup results distinguish a synchronously
41
+ * available value from a still-streaming per-loader promise. A pending stream
42
+ * is `use()`d at the read site (implicit suspension); the promise identity is
43
+ * stable per commit (it comes from the provider's memoized context value /
44
+ * element props), which use() requires across replays.
45
+ */
46
+ type LoaderLookup =
47
+ | typeof NOT_FOUND
48
+ | { value: unknown }
49
+ | { stream: Promise<unknown> };
50
+
51
+ function lookupLoaderStreams(
52
+ loaderStreams: Record<string, unknown> | undefined,
53
+ loaderId: string,
54
+ ): LoaderLookup {
55
+ if (!loaderStreams || !(loaderId in loaderStreams)) return NOT_FOUND;
56
+ const entry = loaderStreams[loaderId];
57
+ // Within the loaderStreams channel a Promise always means "still streaming";
58
+ // settled entries are undecoded result values, never promises.
59
+ return entry instanceof Promise
60
+ ? { stream: entry }
61
+ : { value: decodeLoaderEntry(entry) };
62
+ }
63
+
37
64
  function extractContentLoaderData(
38
65
  node: ReactNode,
39
66
  loaderId: string,
40
- ): unknown | typeof NOT_FOUND {
67
+ ): LoaderLookup {
41
68
  if (!isValidElement(node)) return NOT_FOUND;
42
69
  const props = node.props as Record<string, any> | undefined;
43
70
  if (!props) return NOT_FOUND;
44
71
 
45
72
  // Direct OutletProvider with loaderData
46
73
  if (props.loaderData && loaderId in props.loaderData) {
47
- return props.loaderData[loaderId];
74
+ return { value: props.loaderData[loaderId] };
48
75
  }
49
76
 
77
+ const streamed = lookupLoaderStreams(props.loaderStreams, loaderId);
78
+ if (streamed !== NOT_FOUND) return streamed;
79
+
50
80
  if (
51
81
  props.loaderIds &&
52
82
  Array.isArray(props.loaderIds) &&
@@ -57,9 +87,9 @@ function extractContentLoaderData(
57
87
  if (idx !== -1) {
58
88
  const data = (props.loaderDataPromise as any[])[idx];
59
89
  if (data && typeof data === "object" && "ok" in data) {
60
- return data.ok ? data.data : NOT_FOUND;
90
+ return data.ok ? { value: data.data } : NOT_FOUND;
61
91
  }
62
- return data;
92
+ return { value: data };
63
93
  }
64
94
  }
65
95
 
@@ -102,9 +132,10 @@ function useLoaderInternal<T>(
102
132
  ): UseFetchLoaderResult<T> {
103
133
  const context = useContext(OutletContext);
104
134
 
105
- const { contextData, hasContextData } = useMemo((): {
135
+ const walk = useMemo((): {
106
136
  contextData: T | undefined;
107
137
  hasContextData: boolean;
138
+ pendingStream?: Promise<unknown>;
108
139
  } => {
109
140
  let current: OutletContextValue | null | undefined = context;
110
141
  while (current) {
@@ -114,18 +145,48 @@ function useLoaderInternal<T>(
114
145
  hasContextData: true,
115
146
  };
116
147
  }
148
+ const streamed = lookupLoaderStreams(current.loaderStreams, loader.$$id);
149
+ if (streamed !== NOT_FOUND) {
150
+ if ("stream" in streamed) {
151
+ return {
152
+ contextData: undefined,
153
+ hasContextData: true,
154
+ pendingStream: streamed.stream,
155
+ };
156
+ }
157
+ return { contextData: streamed.value as T, hasContextData: true };
158
+ }
117
159
  const contentData = extractContentLoaderData(
118
160
  current.content,
119
161
  loader.$$id,
120
162
  );
121
163
  if (contentData !== NOT_FOUND) {
122
- return { contextData: contentData as T, hasContextData: true };
164
+ if ("stream" in contentData) {
165
+ return {
166
+ contextData: undefined,
167
+ hasContextData: true,
168
+ pendingStream: contentData.stream,
169
+ };
170
+ }
171
+ return { contextData: contentData.value as T, hasContextData: true };
123
172
  }
124
173
  current = current.parent;
125
174
  }
126
175
  return { contextData: undefined, hasContextData: false };
127
176
  }, [context, loader.$$id]);
128
177
 
178
+ // SPIKE (streaming useLoader): a pending per-loader stream suspends HERE —
179
+ // the implicit-suspense read. use() is exempt from hook-order rules, so the
180
+ // conditional call is legal; on replay after resolution it returns
181
+ // synchronously and the decoded value takes the contextData slot. Hooks
182
+ // below never run in a suspended render, so their order is stable across
183
+ // every COMPLETED render.
184
+ const { hasContextData } = walk;
185
+ let contextData = walk.contextData;
186
+ if (walk.pendingStream) {
187
+ contextData = decodeLoaderEntry(use(walk.pendingStream)) as T;
188
+ }
189
+
129
190
  const loaderId = loader.$$id;
130
191
  const key = options?.key;
131
192
  const refreshGroupOption = options?.refreshGroup;
@@ -0,0 +1,322 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { isAbsolute, relative, resolve } from "node:path";
3
+ import { normalizePath, parseAst } from "vite";
4
+ import {
5
+ serializeClientUrlPatterns,
6
+ type ClientUrlProjection,
7
+ } from "../../client-urls/server-projection.js";
8
+ import type { ClientUrlPatterns } from "../../client-urls/types.js";
9
+ import {
10
+ computeProductionHash,
11
+ hashRefKey,
12
+ } from "../plugins/client-ref-hashing.js";
13
+ import { hasUseClientDirective } from "../utils/directive-prologue.js";
14
+ import { createRangoDebugger, NS } from "../debug.js";
15
+ import { findTsFiles } from "../../build/route-types/scan-filter.js";
16
+ import type { DiscoveryState } from "./state.js";
17
+
18
+ const debug = createRangoDebugger(NS.discovery);
19
+
20
+ interface ClientUrlSsrEnvironment {
21
+ readonly runner?: {
22
+ import(id: string): Promise<Record<string, unknown>>;
23
+ };
24
+ }
25
+
26
+ interface ClientUrlProjectionServerModule {
27
+ clearClientUrlProjections(): void;
28
+ setClientUrlProjection(
29
+ referenceId: string,
30
+ projection: ClientUrlProjection,
31
+ ): void;
32
+ }
33
+
34
+ function hasDefaultExport(code: string): boolean {
35
+ let program: { body?: any[] };
36
+ try {
37
+ program = parseAst(code, { lang: "tsx" }) as { body?: any[] };
38
+ } catch {
39
+ return false;
40
+ }
41
+
42
+ for (const node of program.body ?? []) {
43
+ if (node?.type === "ExportDefaultDeclaration") return true;
44
+ if (node?.type !== "ExportNamedDeclaration") continue;
45
+ for (const specifier of node.specifiers ?? []) {
46
+ const exportedName =
47
+ specifier?.exported?.name ?? specifier?.exported?.value;
48
+ if (exportedName === "default") return true;
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+
54
+ function normalizeSource(state: DiscoveryState, id: string): string {
55
+ const cleanId = id.split("?", 1)[0];
56
+ const absoluteId = isAbsolute(cleanId)
57
+ ? cleanId
58
+ : resolve(state.projectRoot, cleanId);
59
+ return normalizePath(absoluteId);
60
+ }
61
+
62
+ function referenceId(referenceKey: string): string {
63
+ return `${referenceKey}#default`;
64
+ }
65
+
66
+ function withoutReferenceQuery(reference: string): string {
67
+ const exportIndex = reference.lastIndexOf("#");
68
+ const moduleId =
69
+ exportIndex === -1 ? reference : reference.slice(0, exportIndex);
70
+ const exportName = exportIndex === -1 ? "" : reference.slice(exportIndex);
71
+ const queryIndex = moduleId.indexOf("?");
72
+ return `${queryIndex === -1 ? moduleId : moduleId.slice(0, queryIndex)}${exportName}`;
73
+ }
74
+
75
+ export function recordClientUrlsModule(
76
+ state: DiscoveryState,
77
+ code: string,
78
+ id: string,
79
+ ): void {
80
+ if (
81
+ !code.includes("clientUrls(") ||
82
+ !hasUseClientDirective(code) ||
83
+ !hasDefaultExport(code)
84
+ ) {
85
+ return;
86
+ }
87
+
88
+ const source = normalizeSource(state, id);
89
+ const projectRoot = normalizePath(resolve(state.projectRoot));
90
+ const relativeId = normalizePath(relative(projectRoot, source));
91
+ const outsideProject =
92
+ relativeId === ".." ||
93
+ relativeId.startsWith("../") ||
94
+ isAbsolute(relativeId);
95
+ const devReferenceKey = outsideProject ? `/@fs${source}` : `/${relativeId}`;
96
+
97
+ const sourceByReferenceId = (state.clientUrlSourceByReferenceId ??=
98
+ new Map());
99
+ sourceByReferenceId.set(referenceId(devReferenceKey), source);
100
+
101
+ const productionReferenceKeys = new Set([
102
+ hashRefKey(relativeId),
103
+ computeProductionHash(projectRoot, devReferenceKey),
104
+ ]);
105
+ for (const productionReferenceKey of productionReferenceKeys) {
106
+ sourceByReferenceId.set(referenceId(productionReferenceKey), source);
107
+ }
108
+ }
109
+
110
+ export function resolveClientUrlsSource(
111
+ state: DiscoveryState,
112
+ referenceId: string,
113
+ ): string | undefined {
114
+ return state.clientUrlSourceByReferenceId?.get(
115
+ withoutReferenceQuery(referenceId),
116
+ );
117
+ }
118
+
119
+ /**
120
+ * Deterministic filesystem discovery of clientUrls modules. Transform-based
121
+ * recording only sees modules that some environment actually loads — a
122
+ * clientUrls module not yet reachable from any transformed graph at discovery
123
+ * time (cold ordering, a mount added before its first import is served) would
124
+ * never be recorded and its include would fail with empty projections. Walking
125
+ * the project source (the same walk static route-type generation performs)
126
+ * makes recording independent of module-graph timing. The transform hooks
127
+ * still record too — they refresh dev HMR edits between scans.
128
+ */
129
+ export function scanForClientUrlModules(state: DiscoveryState): void {
130
+ if (!state.projectRoot) return;
131
+ for (const filePath of findTsFiles(state.projectRoot, state.scanFilter)) {
132
+ let code: string;
133
+ try {
134
+ code = readFileSync(filePath, "utf-8");
135
+ } catch {
136
+ continue;
137
+ }
138
+ recordClientUrlsModule(state, code, filePath);
139
+ }
140
+ }
141
+
142
+ function projectionError(
143
+ referenceId: string,
144
+ source: string | undefined,
145
+ message: string,
146
+ cause?: unknown,
147
+ ): Error {
148
+ const sourceDescription = source ? ` from source "${source}"` : "";
149
+ const errorMessage = `Cannot discover client URL projection for reference "${referenceId}"${sourceDescription}: ${message}`;
150
+ return cause === undefined
151
+ ? new Error(errorMessage)
152
+ : new Error(errorMessage, { cause });
153
+ }
154
+
155
+ /**
156
+ * Lenient pre-entry projection refresh. Re-serializes every RECORDED clientUrls
157
+ * module before the discovery pass imports the entry, so routers re-created by
158
+ * that import materialize against the CURRENT module contents.
159
+ *
160
+ * Scar: node-preset HMR served stale client-urls routes after a route-shape
161
+ * edit — the clientUrls module is an HMR-accepted client boundary in the rsc
162
+ * graph, and the strict registry-driven pass below only runs AFTER the entry
163
+ * import, so `.routes(reference)` materialized the previous pass's projection.
164
+ *
165
+ * Errors are deliberately swallowed per source (a module mid-edit keeps its
166
+ * last-known projection); the strict discoverClientUrlProjections() pass still
167
+ * surfaces real failures afterwards. No-ops on cold start (nothing recorded
168
+ * yet) and when the SSR runner is unavailable.
169
+ */
170
+ export async function refreshRecordedClientUrlProjections(
171
+ state: DiscoveryState,
172
+ ssrEnv: ClientUrlSsrEnvironment | undefined,
173
+ serverMod: ClientUrlProjectionServerModule,
174
+ ): Promise<void> {
175
+ const sourceByReferenceId = state.clientUrlSourceByReferenceId;
176
+ if (
177
+ !sourceByReferenceId?.size ||
178
+ typeof ssrEnv?.runner?.import !== "function"
179
+ ) {
180
+ return;
181
+ }
182
+
183
+ const referenceIdsBySource = new Map<string, string[]>();
184
+ for (const [refId, source] of sourceByReferenceId) {
185
+ const ids = referenceIdsBySource.get(source);
186
+ if (ids) {
187
+ ids.push(refId);
188
+ } else {
189
+ referenceIdsBySource.set(source, [refId]);
190
+ }
191
+ }
192
+
193
+ for (const [source, referenceIds] of referenceIdsBySource) {
194
+ let definition: unknown;
195
+ try {
196
+ definition = (await ssrEnv.runner.import(source)).default;
197
+ } catch {
198
+ continue;
199
+ }
200
+ if (
201
+ (typeof definition !== "object" && typeof definition !== "function") ||
202
+ definition === null ||
203
+ (definition as { __brand?: unknown }).__brand !== "client-urls"
204
+ ) {
205
+ continue;
206
+ }
207
+ const projection = serializeClientUrlPatterns(
208
+ definition as ClientUrlPatterns,
209
+ );
210
+ debug?.(
211
+ "pre-entry refresh %s -> [%s]",
212
+ source,
213
+ projection.routes.map((route) => route.pattern).join(", "),
214
+ );
215
+ for (const referenceId of referenceIds) {
216
+ serverMod.setClientUrlProjection(referenceId, projection);
217
+ // The eager routes-manifest virtual module REPLAYS this state map
218
+ // (clearClientUrlProjections + set) whenever it re-evaluates — and the
219
+ // watcher's gen-file write invalidates it right before the entry import,
220
+ // so a stale map here would clobber the registry install above before
221
+ // the router materializes its mount. Keep both in sync.
222
+ state.clientUrlProjectionMap?.set(referenceId, projection);
223
+ }
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Strict projection discovery over every RECORDED clientUrls module. Recorded
229
+ * modules — not router references — are the source of truth: include() mounts
230
+ * materialize lazily from the projection registry, so there is no router-level
231
+ * reference list to consult. Serializes every source before atomically
232
+ * installing the new projections (a failure preserves last-known state).
233
+ *
234
+ * A recorded source whose file no longer exists is dropped silently
235
+ * (recordClientUrlsModule never un-records, so deletions must self-heal here).
236
+ * A present-but-broken module is a hard error: it is part of the app graph.
237
+ */
238
+ export async function discoverClientUrlProjections(
239
+ state: DiscoveryState,
240
+ ssrEnv: ClientUrlSsrEnvironment | undefined,
241
+ serverMod: ClientUrlProjectionServerModule,
242
+ ): Promise<void> {
243
+ scanForClientUrlModules(state);
244
+ const sourceByReferenceId = state.clientUrlSourceByReferenceId;
245
+ if (!sourceByReferenceId?.size) {
246
+ serverMod.clearClientUrlProjections();
247
+ state.clientUrlProjectionMap = new Map();
248
+ return;
249
+ }
250
+
251
+ const referenceIdsBySource = new Map<string, string[]>();
252
+ for (const [referenceId, source] of sourceByReferenceId) {
253
+ const ids = referenceIdsBySource.get(source);
254
+ if (ids) {
255
+ ids.push(referenceId);
256
+ } else {
257
+ referenceIdsBySource.set(source, [referenceId]);
258
+ }
259
+ }
260
+
261
+ if (typeof ssrEnv?.runner?.import !== "function") {
262
+ const [source, ids] = referenceIdsBySource.entries().next().value as [
263
+ string,
264
+ string[],
265
+ ];
266
+ throw projectionError(
267
+ ids[0],
268
+ source,
269
+ "the SSR module runner is unavailable",
270
+ );
271
+ }
272
+
273
+ const nextProjections = new Map<string, ClientUrlProjection>();
274
+ const removedSources: string[] = [];
275
+ for (const [source, referenceIds] of referenceIdsBySource) {
276
+ let module: Record<string, unknown>;
277
+ try {
278
+ module = await ssrEnv.runner.import(source);
279
+ } catch (cause) {
280
+ if (!existsSync(source)) {
281
+ removedSources.push(source);
282
+ continue;
283
+ }
284
+ throw projectionError(
285
+ referenceIds[0],
286
+ source,
287
+ "failed to import the source module",
288
+ cause,
289
+ );
290
+ }
291
+ const definition = module.default;
292
+ if (
293
+ (typeof definition !== "object" && typeof definition !== "function") ||
294
+ definition === null ||
295
+ (definition as { __brand?: unknown }).__brand !== "client-urls"
296
+ ) {
297
+ throw projectionError(
298
+ referenceIds[0],
299
+ source,
300
+ 'the module default export must be created by clientUrls() and have __brand === "client-urls"',
301
+ );
302
+ }
303
+ const projection = serializeClientUrlPatterns(
304
+ definition as ClientUrlPatterns,
305
+ );
306
+ for (const referenceId of referenceIds) {
307
+ nextProjections.set(referenceId, projection);
308
+ }
309
+ }
310
+
311
+ for (const source of removedSources) {
312
+ for (const [referenceId, recorded] of sourceByReferenceId) {
313
+ if (recorded === source) sourceByReferenceId.delete(referenceId);
314
+ }
315
+ }
316
+
317
+ serverMod.clearClientUrlProjections();
318
+ for (const [id, projection] of nextProjections) {
319
+ serverMod.setClientUrlProjection(id, projection);
320
+ }
321
+ state.clientUrlProjectionMap = nextProjections;
322
+ }
@@ -21,6 +21,7 @@ import {
21
21
  // RangoContext from the runner realm) — see the runner.import below.
22
22
  import { buildPerRouterTrie } from "../../build/route-trie.js";
23
23
  import { collectFallbackClientRefs } from "../../build/collect-fallback-refs.js";
24
+ import { mergeFullManifests } from "../../build/merge-full-manifests.js";
24
25
  import { flattenLeafEntries } from "../utils/manifest-utils.js";
25
26
  import type { DiscoveryState, PrecomputedEntry } from "./state.js";
26
27
  import {
@@ -34,6 +35,10 @@ import {
34
35
  } from "./discovery-errors.js";
35
36
  import { createRangoDebugger, timed, NS } from "../debug.js";
36
37
  import { computeProductionHash } from "../plugins/client-ref-hashing.js";
38
+ import {
39
+ discoverClientUrlProjections,
40
+ refreshRecordedClientUrlProjections,
41
+ } from "./client-urls-projection.js";
37
42
 
38
43
  const debug = createRangoDebugger(NS.discovery);
39
44
 
@@ -48,9 +53,25 @@ const debug = createRangoDebugger(NS.discovery);
48
53
  export async function discoverRouters(
49
54
  state: DiscoveryState,
50
55
  rscEnv: any,
56
+ ssrEnv?: any,
51
57
  ): Promise<any> {
52
58
  if (!state.resolvedEntryPath) return;
53
59
 
60
+ // Import the router package FIRST (leaf module, no side effects on user
61
+ // code) so recorded clientUrls projections can be refreshed BEFORE the entry
62
+ // import: routers re-created by that import call `.routes(reference)` at
63
+ // module scope and materialize whatever projection is installed at that
64
+ // moment. On HMR re-discovery that must be the CURRENT module contents, not
65
+ // the previous pass's snapshot (see refreshRecordedClientUrlProjections).
66
+ const serverMod = await timed(
67
+ debug,
68
+ "inner: import @rangojs/router/server",
69
+ () => rscEnv.runner.import("@rangojs/router/server"),
70
+ );
71
+ await timed(debug, "inner: refresh recorded client URL projections", () =>
72
+ refreshRecordedClientUrlProjections(state, ssrEnv, serverMod),
73
+ );
74
+
54
75
  // Import the entry file via RSC environment.
55
76
  // For node preset: this is the router file (createRouter() registers in RouterRegistry).
56
77
  // For cloudflare preset: this is the worker entry (which imports the router).
@@ -58,12 +79,6 @@ export async function discoverRouters(
58
79
  rscEnv.runner.import(state.resolvedEntryPath),
59
80
  );
60
81
 
61
- // Import the router package to access the registry
62
- const serverMod = await timed(
63
- debug,
64
- "inner: import @rangojs/router/server",
65
- () => rscEnv.runner.import("@rangojs/router/server"),
66
- );
67
82
  let registry: Map<string, any> = serverMod.RouterRegistry;
68
83
 
69
84
  if (!registry || registry.size === 0) {
@@ -114,6 +129,10 @@ export async function discoverRouters(
114
129
  }
115
130
  }
116
131
 
132
+ await timed(debug, "inner: discover client URL projections", () =>
133
+ discoverClientUrlProjections(state, ssrEnv, serverMod),
134
+ );
135
+
117
136
  // generateManifestFull must run in the RSC runner realm: it invokes the
118
137
  // user's urlpatterns.handler() via RangoContext, consuming router instances
119
138
  // from the runner. The trie/fallback-ref builders are pure transforms over
@@ -176,20 +195,27 @@ export async function discoverRouters(
176
195
 
177
196
  const manifestGenStart = debug ? performance.now() : 0;
178
197
  for (const [id, router] of registry) {
179
- if (!router.urlpatterns || !generateManifestFull) {
198
+ if (!generateManifestFull) {
180
199
  continue;
181
200
  }
182
201
 
183
- const manifest = await generateManifestFull(
184
- router.urlpatterns,
185
- routerMountIndex,
186
- {
187
- routerId: id,
188
- ...(router.__basename ? { urlPrefix: router.__basename } : {}),
189
- ...(collectClientFallbackRef ? { collectClientFallbackRef } : {}),
190
- },
191
- );
192
- routerMountIndex++;
202
+ const mounts =
203
+ router.__urlpatternMounts ??
204
+ (router.urlpatterns ? [{ patterns: router.urlpatterns }] : []);
205
+ if (mounts.length === 0) continue;
206
+
207
+ const mountManifests = [];
208
+ for (const mount of mounts) {
209
+ mountManifests.push(
210
+ await generateManifestFull(mount.patterns, routerMountIndex, {
211
+ routerId: id,
212
+ ...(router.__basename ? { urlPrefix: router.__basename } : {}),
213
+ ...(collectClientFallbackRef ? { collectClientFallbackRef } : {}),
214
+ }),
215
+ );
216
+ routerMountIndex++;
217
+ }
218
+ const manifest = mergeFullManifests(mountManifests);
193
219
  allManifests.push({ id, manifest });
194
220
 
195
221
  // Router-level "use client" boundary defaults -> app-fallback (the