@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
@@ -8,6 +8,7 @@ import { invariant } from "./errors.js";
8
8
  import {
9
9
  RouteContentWrapper,
10
10
  LoaderBoundary,
11
+ StreamedLoaderErrorBoundary,
11
12
  } from "./route-content-wrapper.js";
12
13
  import { RootErrorBoundary } from "./root-error-boundary.js";
13
14
  import { INTERNAL_RANGO_DEBUG } from "./internal-debug.js";
@@ -113,6 +114,9 @@ export interface RenderSegmentsOptions {
113
114
  */
114
115
  forceAwait?: boolean;
115
116
 
117
+ /** Seeded descendant client-route pending state for testing. */
118
+ outletPending?: boolean;
119
+
116
120
  /**
117
121
  * Intercept segments to inject into the tree.
118
122
  * These are parallel segments from intercept routes that need to be
@@ -231,6 +235,7 @@ export async function renderSegments(
231
235
  isAction,
232
236
  interceptSegments,
233
237
  forceAwait,
238
+ outletPending = false,
234
239
  rootLayout: RootLayout,
235
240
  } = options || {};
236
241
 
@@ -448,9 +453,30 @@ export async function renderSegments(
448
453
  // Prepare loader data if there are loaders
449
454
  const loaderIds = loaderEntries.map((loader) => loader.loaderId!);
450
455
 
456
+ // Loader-bearing segments get the router-owned error boundary around
457
+ // their children so a read-site loader error renders its errorBoundary()
458
+ // fallback (LOADER_ERROR_FALLBACK marker on the thrown error) instead of
459
+ // escaping to app boundaries. Wrapped UNCONDITIONALLY on loader presence
460
+ // — streams and forceAwait lanes must produce the same tree shape or
461
+ // lane changes remount the subtree (docs/tree-structure.md).
462
+ if (loaderEntries.length > 0) {
463
+ nodeContent = createElement(StreamedLoaderErrorBoundary, {
464
+ children: nodeContent,
465
+ });
466
+ }
467
+
451
468
  if (loading !== undefined && loading !== null) {
452
469
  const loaderDataPromise = getMemoizedLoaderPromise(loaderEntries);
453
470
  let boundaryLoaderData: Promise<any[]> | any[] = loaderDataPromise;
471
+ // SPIKE (streaming useLoader): per-loader streams for the boundary's
472
+ // readers. MUST come from the individual loader refs — splitting the
473
+ // aggregate client-side is wrong (Promise.all resolves at the slowest
474
+ // loader, erasing per-loader timing; measured 400ms data held to a
475
+ // 2000ms sibling). Zero-loader boundaries pass NO streams so the
476
+ // resolver keeps the fresh-promise resolve-above suspension — that
477
+ // microtask suspension is what makes SSR emit the loading() fallback
478
+ // for content-suspending routes (segment-loader-promise.ts).
479
+ let boundaryLoaderStreams: Record<string, unknown> | undefined;
454
480
  if (forceAwait || isAction) {
455
481
  const awaitStart = segDebug ? performance.now() : 0;
456
482
  boundaryLoaderData = await loaderDataPromise;
@@ -460,16 +486,23 @@ export async function renderSegments(
460
486
  ms: Math.round(performance.now() - awaitStart),
461
487
  });
462
488
  }
463
- } else if (segDebug) {
464
- segDebugLog(
465
- `segment ${id}: streaming loaders via LoaderBoundary (suspense)`,
466
- { loaderIds },
467
- );
489
+ } else if (loaderEntries.length > 0) {
490
+ boundaryLoaderStreams = {};
491
+ for (const l of loaderEntries) {
492
+ boundaryLoaderStreams[l.loaderId!] = l.loaderData;
493
+ }
494
+ if (segDebug) {
495
+ segDebugLog(
496
+ `segment ${id}: per-loader streams via LoaderBoundary (read-site suspense)`,
497
+ { loaderIds },
498
+ );
499
+ }
468
500
  }
469
501
  content = createElement(LoaderBoundary, {
470
502
  key: `loader-boundary-${key}`,
471
503
  loaderDataPromise: boundaryLoaderData,
472
504
  loaderIds,
505
+ loaderStreams: boundaryLoaderStreams,
473
506
  fallback: loading,
474
507
  outletKey: key,
475
508
  outletContent,
@@ -483,6 +516,7 @@ export async function renderSegments(
483
516
  content: outletContent,
484
517
  segment: node.segment,
485
518
  parallel: node.parallel,
519
+ pending: outletPending,
486
520
  children: nodeContent,
487
521
  });
488
522
  } else {
@@ -492,29 +526,50 @@ export async function renderSegments(
492
526
  );
493
527
 
494
528
  const layoutLoaderIds = layoutLoaders.map((l) => l.loaderId!);
495
- // No loading() on this segment, so its loader data cannot stream behind
496
- // a Suspense fallback — the tree build BLOCKS here until the data
497
- // arrives. On the initial document this await runs before hydrateRoot.
498
- const layoutAwaitStart = segDebug ? performance.now() : 0;
499
- const resolvedData = await buildLoaderPromise(layoutLoaders);
500
- if (segDebug) {
501
- segDebugLog(`segment ${id}: layout loaders awaited (blocking)`, {
502
- loaderIds: layoutLoaderIds,
503
- ms: Math.round(performance.now() - layoutAwaitStart),
504
- });
505
- }
506
- const decodeStart = segDebug ? performance.now() : 0;
507
- const { loaderData, errorFallback } = decodeLoaderResults(
508
- resolvedData,
509
- layoutLoaderIds,
510
- );
511
- if (segDebug) {
512
- const decodeMs = Math.round(performance.now() - decodeStart);
513
- if (decodeMs > 0) {
514
- segDebugLog(`segment ${id}: loader results decoded`, {
515
- ms: decodeMs,
529
+ // SPIKE (streaming useLoader): a segment without loading() used to BLOCK
530
+ // the tree build here (await buildLoaderPromise) so its data was always
531
+ // resolved before render. Streaming lanes now skip the await and pass
532
+ // per-loader UNDECODED results (possibly pending promises) through
533
+ // OutletProvider.loaderStreams useLoader suspends at the read site to
534
+ // the nearest CONSUMER Suspense boundary. forceAwait (popstate, stale
535
+ // revalidation, fully-prefetched) and action lanes keep the blocking
536
+ // await so those commits stay whole with no fallback flash.
537
+ let loaderData: Record<string, any> = {};
538
+ let errorFallback: ReactNode = null;
539
+ let loaderStreams: Record<string, unknown> | undefined;
540
+ if (forceAwait || isAction) {
541
+ const layoutAwaitStart = segDebug ? performance.now() : 0;
542
+ const resolvedData = await buildLoaderPromise(layoutLoaders);
543
+ if (segDebug) {
544
+ segDebugLog(`segment ${id}: layout loaders awaited (blocking)`, {
545
+ loaderIds: layoutLoaderIds,
546
+ ms: Math.round(performance.now() - layoutAwaitStart),
516
547
  });
517
548
  }
549
+ const decodeStart = segDebug ? performance.now() : 0;
550
+ ({ loaderData, errorFallback } = decodeLoaderResults(
551
+ resolvedData,
552
+ layoutLoaderIds,
553
+ ));
554
+ if (segDebug) {
555
+ const decodeMs = Math.round(performance.now() - decodeStart);
556
+ if (decodeMs > 0) {
557
+ segDebugLog(`segment ${id}: loader results decoded`, {
558
+ ms: decodeMs,
559
+ });
560
+ }
561
+ }
562
+ } else if (layoutLoaders.length > 0) {
563
+ loaderStreams = {};
564
+ for (const l of layoutLoaders) {
565
+ loaderStreams[l.loaderId!] = l.loaderData;
566
+ }
567
+ if (segDebug) {
568
+ segDebugLog(
569
+ `segment ${id}: layout loaders streaming to read sites (no loading())`,
570
+ { loaderIds: layoutLoaderIds },
571
+ );
572
+ }
518
573
  }
519
574
 
520
575
  if (parallelOwnedLoaders.length > 0) {
@@ -574,6 +629,8 @@ export async function renderSegments(
574
629
  segment: node.segment,
575
630
  parallel: node.parallel,
576
631
  loaderData: Object.keys(loaderData).length > 0 ? loaderData : undefined,
632
+ loaderStreams,
633
+ pending: outletPending,
577
634
  children: errorFallback ?? nodeContent,
578
635
  });
579
636
  }
@@ -106,6 +106,16 @@ export type LoaderEntry = {
106
106
  revalidate: ShouldRevalidateFn<any, any>[];
107
107
  /** Cache config for this specific loader (loaders are NOT cached by default) */
108
108
  cache?: EntryCacheConfig;
109
+ /**
110
+ * Document renders await this loader before segment resolution returns
111
+ * (loader(Def, { stream: "navigation" })), so its data, handle pushes, and
112
+ * thrown notFound()/redirect() deterministically precede first flush.
113
+ * Resolved at DSL-evaluation time from ctx.isSSR — entries are cached
114
+ * per-isSSR (router/manifest.ts cache key), so the flag is already
115
+ * request-mode-correct when resolveLoaders (fresh.ts) reads it and never
116
+ * appears on navigation-lane entries.
117
+ */
118
+ awaitBeforeFlush?: true;
109
119
  };
110
120
 
111
121
  /**
@@ -14,7 +14,7 @@ import {
14
14
  getCurrentLoaderBodyId,
15
15
  isInsideHandlerInvokedLoaderBody,
16
16
  } from "./context.js";
17
- import { INSIDE_CACHE_EXEC } from "../cache/taint.js";
17
+ import { isInsideCacheExecScope } from "../cache/cache-exec-scope.js";
18
18
 
19
19
  /**
20
20
  * A single cookie entry returned by get() and getAll().
@@ -65,7 +65,7 @@ export interface CookieStore {
65
65
  */
66
66
  export function cookies(): CookieStore {
67
67
  const ctx = getRequestContext();
68
- assertNotInsideCacheContext(ctx, "cookies");
68
+ assertNotInsideCacheContext("cookies");
69
69
  assertNotInsideShellCapture(ctx, "cookies");
70
70
  return createCookieStore(ctx);
71
71
  }
@@ -91,9 +91,10 @@ type HeadersIterator<T> = IterableIterator<T>;
91
91
 
92
92
  /**
93
93
  * Throw if called inside a cache boundary — either a "use cache" function
94
- * (`INSIDE_CACHE_EXEC` stamped on ctx by the cache runtime) or a `cache()`
95
- * DSL boundary (`isInsideCacheScope()` the render-store flag set while
96
- * resolving a `type: "cache"` route entry).
94
+ * (`isInsideCacheExecScope()` the AsyncLocalStorage scope the cache runtime
95
+ * enters around the cached body) or a `cache()` DSL boundary
96
+ * (`isInsideCacheScope()` the render-store flag set while resolving a
97
+ * `type: "cache"` route entry).
97
98
  *
98
99
  * Reading request-scoped data (cookies, headers) inside a cached scope
99
100
  * produces per-request values that are NOT reflected in the cache key, so
@@ -103,18 +104,17 @@ type HeadersIterator<T> = IterableIterator<T>;
103
104
  * here is baked into the shell exactly like a `"use cache"` return value is
104
105
  * baked into its cache entry.
105
106
  *
106
- * `isInsideCacheScope()` returns false inside loaders (loaders always run
107
- * fresh on every request, even on a cache hit), so reading cookies()/headers()
108
- * from a loader is allowed — loaders are the dynamic "holes" of a cached
109
- * document.
107
+ * Both checks are scoped so loaders stay exempt — loaders are the dynamic
108
+ * "holes" of a cached document and always run fresh. `isInsideCacheScope()`
109
+ * returns false inside loaders by construction; `isInsideCacheExecScope()`
110
+ * follows the cached body's own async chain, so a loader running in PARALLEL
111
+ * with a slow "use cache" fetch on the same request reads cookies() freely.
112
+ * (Scar: the previous INSIDE_CACHE_EXEC stamp on the shared RequestContext
113
+ * made exactly that parallel read throw for the cached fetch's whole
114
+ * execution window — see cache-exec-scope.ts.)
110
115
  */
111
- function assertNotInsideCacheContext(ctx: unknown, fnName: string): void {
112
- if (
113
- ctx !== null &&
114
- ctx !== undefined &&
115
- typeof ctx === "object" &&
116
- (INSIDE_CACHE_EXEC as symbol) in (ctx as Record<symbol, unknown>)
117
- ) {
116
+ function assertNotInsideCacheContext(fnName: string): void {
117
+ if (isInsideCacheExecScope()) {
118
118
  throw new Error(
119
119
  `${fnName}() cannot be called inside a "use cache" function. ` +
120
120
  `Request-scoped data (cookies, headers) varies per request but is not ` +
@@ -222,7 +222,7 @@ const HEADERS_MUTATION_METHODS = new Set(["set", "append", "delete"]);
222
222
  */
223
223
  export function headers(): ReadonlyHeaders {
224
224
  const ctx = getRequestContext();
225
- assertNotInsideCacheContext(ctx, "headers");
225
+ assertNotInsideCacheContext("headers");
226
226
  assertNotInsideShellCapture(ctx, "headers");
227
227
  return new Proxy(ctx.request.headers, {
228
228
  get(target, prop, receiver) {
@@ -262,7 +262,7 @@ export function invalidateClientCache(): void {
262
262
  }
263
263
  return;
264
264
  }
265
- assertNotInsideCacheContext(ctx, "invalidateClientCache");
265
+ assertNotInsideCacheContext("invalidateClientCache");
266
266
  ctx._rotateStateCookie();
267
267
  }
268
268
 
@@ -287,7 +287,7 @@ export function keepClientCache(): void {
287
287
  }
288
288
  return;
289
289
  }
290
- assertNotInsideCacheContext(ctx, "keepClientCache");
290
+ assertNotInsideCacheContext("keepClientCache");
291
291
  ctx._setKeepCacheDirective();
292
292
  }
293
293
 
@@ -92,6 +92,26 @@ export interface HandleStore {
92
92
  */
93
93
  onError?: (error: Error) => void;
94
94
 
95
+ /**
96
+ * Track a promise on the AUXILIARY (loader) settlement lane. Aux tracking
97
+ * keeps the store OPEN for pushes (a mid-body `ctx.handle(H)(...)` from a
98
+ * streaming loader is legal until this lane drains) WITHOUT joining
99
+ * `settled` — the handler barrier that rendered()-readers, the document
100
+ * handle snapshot, and prerender/cache collection wait on. Two lanes exist
101
+ * because loader bodies stream: joining them to `settled` would block SSR
102
+ * markup and hydration on the slowest loader (ssr-root.tsx and
103
+ * rsc-router.tsx both drain the document handle stream in blocking
104
+ * positions), and would self-deadlock any loader awaiting ctx.rendered().
105
+ */
106
+ trackAuxiliary<T>(promise: Promise<T>): Promise<T>;
107
+
108
+ /**
109
+ * Promise that resolves when the store is sealed AND BOTH lanes (handler +
110
+ * auxiliary) have drained. Late-push legality and default stream completion
111
+ * key on this, not on `settled`.
112
+ */
113
+ readonly fullySettled: Promise<void>;
114
+
95
115
  /**
96
116
  * Push handle data for a specific handle and segment.
97
117
  * Multiple pushes to the same handle/segment accumulate in an array.
@@ -101,16 +121,32 @@ export interface HandleStore {
101
121
 
102
122
  /**
103
123
  * Get all collected handle data after all handlers have settled.
104
- * Waits for `settled`, then returns the finalized data.
124
+ * Waits for `settled` (handler lane), then returns the data at that point.
105
125
  */
106
126
  getData(): Promise<HandleData>;
107
127
 
108
128
  /**
109
129
  * Get an async iterator that yields handle data on each push.
110
- * The iterator completes when all handlers have settled.
130
+ * Completes at the chosen settlement barrier: "fullySettled" (default —
131
+ * nav/action payloads, whose consumer applies each yield progressively) or
132
+ * "settled" (the document lane, whose consumers drain to completion in
133
+ * blocking positions and must not wait on loader bodies).
111
134
  * Each yield contains the full accumulated state (not just the delta).
135
+ * Safe for concurrent consumers (per-consumer version cursor).
112
136
  */
113
- stream(): AsyncGenerator<HandleData, void, unknown>;
137
+ stream(
138
+ until?: "settled" | "fullySettled",
139
+ ): AsyncGenerator<HandleData, void, unknown>;
140
+
141
+ /**
142
+ * Document-lane late channel: yields full-state updates for pushes that
143
+ * land AFTER the handler barrier (streaming loader bodies), completing at
144
+ * fullySettled. Returns without yielding when the auxiliary lane is empty
145
+ * by the time `settled` resolves. The client consumes this post-hydration
146
+ * (rsc-router.tsx) and merges via the same application path as nav-lane
147
+ * progressive handle updates.
148
+ */
149
+ streamLate(): AsyncGenerator<HandleData, void, unknown>;
114
150
 
115
151
  /**
116
152
  * Get handle data for a specific segment (for caching).
@@ -151,20 +187,64 @@ export interface HandleStore {
151
187
  export function createHandleStore(): HandleStore {
152
188
  const data: HandleData = {};
153
189
 
154
- // Settlement barrier: resolved only when sealed AND inflight === 0.
155
- // seal() signals "no more track() calls". Each track() increments
156
- // inflightCount, each promise.finally() decrements. settled resolves
157
- // once both conditions are met even if tracks are added while
158
- // earlier ones are still in flight.
190
+ // Settlement barriers: `settled` (handler lane) resolves when sealed AND
191
+ // handler inflight === 0. `fullySettled` additionally waits for the
192
+ // auxiliary (loader) lane. seal() signals "no more track() calls"; each
193
+ // track/trackAuxiliary increments its lane's count, each promise settle
194
+ // decrements. Barriers resolve once their conditions are met even if
195
+ // tracks are added while earlier ones are still in flight.
159
196
  let sealed = false;
160
197
  let inflightCount = 0;
198
+ let auxInflightCount = 0;
161
199
  let drainWaiters: (() => void)[] = [];
200
+ let fullDrainWaiters: (() => void)[] = [];
201
+
202
+ // Swap the waiter list out before resolving: a resolver may synchronously
203
+ // re-await and push onto the fresh list, which must not be drained by this
204
+ // pass. All three waiter lists (drain, full-drain, emission) flush through
205
+ // here so that ordering rule cannot drift between them.
206
+ function flushWaiters(waiters: (() => void)[]): void {
207
+ for (const resolve of waiters) resolve();
208
+ }
209
+
210
+ // Both lanes settle identically — the handler lane (`track`) gates `settled`,
211
+ // the auxiliary loader lane (`trackAuxiliary`) gates `fullySettled`. Shared so
212
+ // neither copy can lose this rule: .then() rather than .finally(), because
213
+ // .finally() re-throws on a NEW branch, producing an unhandled rejection that
214
+ // can crash the process when the tracked promise rejects.
215
+ function trackSettlement<T>(
216
+ promise: Promise<T>,
217
+ release: () => void,
218
+ ): Promise<T> {
219
+ const onSettle = () => {
220
+ release();
221
+ notifyDrain();
222
+ };
223
+ promise.then(onSettle, onSettle);
224
+ return promise;
225
+ }
162
226
 
163
227
  function notifyDrain() {
164
228
  if (sealed && inflightCount === 0 && drainWaiters.length > 0) {
165
229
  const waiters = drainWaiters;
166
230
  drainWaiters = [];
167
- for (const resolve of waiters) resolve();
231
+ flushWaiters(waiters);
232
+ }
233
+ if (sealed && inflightCount === 0 && auxInflightCount === 0) {
234
+ if (streamConsumed && !completed) {
235
+ // Late-push guard + stream termination key on FULL drain, so a
236
+ // streaming loader body's ctx.handle() push stays legal until the
237
+ // auxiliary lane empties. Armed only once a stream consumer exists —
238
+ // getData()-only paths (prerender collection) keep their historical
239
+ // no-guard behavior.
240
+ completed = true;
241
+ signalEmission();
242
+ }
243
+ if (fullDrainWaiters.length > 0) {
244
+ const waiters = fullDrainWaiters;
245
+ fullDrainWaiters = [];
246
+ flushWaiters(waiters);
247
+ }
168
248
  }
169
249
  }
170
250
 
@@ -174,44 +254,50 @@ export function createHandleStore(): HandleStore {
174
254
  notifyDrain();
175
255
  }
176
256
 
177
- // Dirty flag for pending emissions and resolver for waiting consumer.
178
- // stream() only ever yields the latest full state, so we track a single
179
- // dirty bit and clone `data` once at yield time instead of per push.
180
- let hasPendingEmission = false;
181
- let emissionResolver: (() => void) | null = null;
257
+ // Emission versioning. Each push bumps `version`; every stream consumer
258
+ // keeps its own cursor and yields whenever the version advanced past it.
259
+ // Multi-consumer safe (the document "settled" stream and the late channel
260
+ // overlap until the handler barrier): a single dirty bit + single resolver
261
+ // slot would drop wakeups for all but one consumer.
262
+ let version = 0;
263
+ let emissionWaiters: (() => void)[] = [];
182
264
  let completed = false;
265
+ let streamConsumed = false;
183
266
 
184
- // Signal that a new emission is available
267
+ // Wake every waiting consumer (new push or a settlement barrier fired).
185
268
  function signalEmission() {
186
- if (emissionResolver) {
187
- const resolver = emissionResolver;
188
- emissionResolver = null;
189
- resolver();
269
+ if (emissionWaiters.length > 0) {
270
+ const waiters = emissionWaiters;
271
+ emissionWaiters = [];
272
+ flushWaiters(waiters);
190
273
  }
191
274
  }
192
275
 
193
276
  // Wait for the next emission or completion
194
- function waitForEmission(): Promise<void> {
195
- if (hasPendingEmission || completed) {
277
+ // Resolve when the consumer's cursor is behind the current version, the
278
+ // given done-flag reader reports termination, or a new signal arrives.
279
+ function waitForEmission(seen: number, isDone: () => boolean): Promise<void> {
280
+ if (version > seen || isDone()) {
196
281
  return Promise.resolve();
197
282
  }
198
283
  return new Promise((resolve) => {
199
- emissionResolver = resolve;
284
+ emissionWaiters.push(resolve);
200
285
  });
201
286
  }
202
287
 
203
288
  return {
204
289
  track<T>(promise: Promise<T>): Promise<T> {
205
290
  inflightCount++;
206
- // Use .then() instead of .finally() to avoid creating an unhandled rejection
207
- // branch when the promise rejects. .finally() re-throws on a new branch that
208
- // can crash the process if not caught.
209
- const onSettle = () => {
291
+ return trackSettlement(promise, () => {
210
292
  inflightCount--;
211
- notifyDrain();
212
- };
213
- promise.then(onSettle, onSettle);
214
- return promise;
293
+ });
294
+ },
295
+
296
+ trackAuxiliary<T>(promise: Promise<T>): Promise<T> {
297
+ auxInflightCount++;
298
+ return trackSettlement(promise, () => {
299
+ auxInflightCount--;
300
+ });
215
301
  },
216
302
 
217
303
  seal() {
@@ -225,6 +311,15 @@ export function createHandleStore(): HandleStore {
225
311
  });
226
312
  },
227
313
 
314
+ get fullySettled(): Promise<void> {
315
+ if (sealed && inflightCount === 0 && auxInflightCount === 0) {
316
+ return Promise.resolve();
317
+ }
318
+ return new Promise<void>((resolve) => {
319
+ fullDrainWaiters.push(resolve);
320
+ });
321
+ },
322
+
228
323
  push(handleName: string, segmentId: string, value: unknown): void {
229
324
  if (completed) {
230
325
  const error = createLateHandlePushError(handleName, segmentId);
@@ -240,8 +335,8 @@ export function createHandleStore(): HandleStore {
240
335
  }
241
336
  data[handleName][segmentId].push(value);
242
337
 
243
- // Mark dirty; the actual snapshot is cloned once at yield time.
244
- hasPendingEmission = true;
338
+ // Bump the version; each consumer's cursor decides when to clone+yield.
339
+ version++;
245
340
  signalEmission();
246
341
  },
247
342
 
@@ -250,33 +345,75 @@ export function createHandleStore(): HandleStore {
250
345
  return this.settled.then(() => cloneHandleData(data));
251
346
  },
252
347
 
253
- async *stream(): AsyncGenerator<HandleData, void, unknown> {
348
+ async *stream(
349
+ until: "settled" | "fullySettled" = "fullySettled",
350
+ ): AsyncGenerator<HandleData, void, unknown> {
351
+ streamConsumed = true;
254
352
  sealInternal();
255
-
256
- this.settled.then(() => {
257
- completed = true;
353
+ // Re-evaluate: the store may have been sealed and drained BEFORE this
354
+ // consumer existed (seal() then stream()); sealInternal early-returns
355
+ // then, so the completed flag must be armed here.
356
+ notifyDrain();
357
+
358
+ // Per-consumer termination flag driven by the chosen barrier. The
359
+ // global `completed` (late-push guard) always keys on FULL drain via
360
+ // notifyDrain — a "settled"-scoped consumer finishing does not make
361
+ // later loader pushes illegal.
362
+ let done = false;
363
+ const barrier = until === "settled" ? this.settled : this.fullySettled;
364
+ barrier.then(() => {
365
+ done = true;
258
366
  signalEmission();
259
367
  });
260
368
 
261
369
  // Batch rapid synchronous pushes with initial delay
262
370
  await new Promise((resolve) => setTimeout(resolve, 0));
263
371
 
264
- if (Object.keys(data).length > 0) {
265
- hasPendingEmission = false;
266
- yield cloneHandleData(data);
372
+ let seen = 0;
373
+ while (true) {
374
+ if (version > seen && Object.keys(data).length > 0) {
375
+ seen = version;
376
+ yield cloneHandleData(data);
377
+ }
378
+ if (done) break;
379
+ await waitForEmission(seen, () => done);
267
380
  }
381
+ },
268
382
 
269
- while (!completed) {
270
- await waitForEmission();
383
+ async *streamLate(): AsyncGenerator<HandleData, void, unknown> {
384
+ streamConsumed = true;
385
+ sealInternal();
386
+ // Re-evaluate: the store may have been sealed and drained BEFORE this
387
+ // consumer existed (seal() then stream()); sealInternal early-returns
388
+ // then, so the completed flag must be armed here.
389
+ notifyDrain();
390
+
391
+ // Skip everything the handler-barrier snapshot already carried; the
392
+ // document consumers (SSR seed + pre-hydration drain) deliver that
393
+ // state. This channel exists only for pushes that land AFTER `settled`
394
+ // — streaming loader bodies writing meta/breadcrumbs mid-body.
395
+ await this.settled;
396
+ let seen = version;
397
+ if (auxInflightCount === 0) {
398
+ // Auxiliary lane already drained: every loader push (if any) beat the
399
+ // handler barrier and rode the normal snapshot. Nothing late follows —
400
+ // handler pushes after settled are illegal by contract.
401
+ return;
402
+ }
271
403
 
272
- if (hasPendingEmission) {
273
- hasPendingEmission = false;
404
+ let done = false;
405
+ this.fullySettled.then(() => {
406
+ done = true;
407
+ signalEmission();
408
+ });
409
+
410
+ while (true) {
411
+ if (version > seen) {
412
+ seen = version;
274
413
  yield cloneHandleData(data);
275
414
  }
276
- }
277
-
278
- if (hasPendingEmission) {
279
- yield cloneHandleData(data);
415
+ if (done) break;
416
+ await waitForEmission(seen, () => done);
280
417
  }
281
418
  },
282
419
 
@@ -303,7 +440,7 @@ export function createHandleStore(): HandleStore {
303
440
  // segment, not accumulate on top of data from a different route.
304
441
  data[handleName][segmentId] = [...segmentHandles[handleName]];
305
442
  }
306
- hasPendingEmission = true;
443
+ version++;
307
444
  signalEmission();
308
445
  },
309
446
  };