@rangojs/router 0.0.0-experimental.f2d1a2f1 → 0.0.0-experimental.f4a8e8de

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 (1301) hide show
  1. package/AGENTS.md +8 -4
  2. package/README.md +318 -821
  3. package/dist/bin/rango.js +925 -271
  4. package/dist/testing/vitest.js +82 -0
  5. package/dist/types/__internal.d.ts +127 -0
  6. package/dist/types/bin/rango.d.ts +1 -0
  7. package/dist/types/browser/action-coordinator.d.ts +57 -0
  8. package/dist/types/browser/action-fence.d.ts +33 -0
  9. package/dist/types/browser/app-shell.d.ts +34 -0
  10. package/dist/types/browser/app-version.d.ts +6 -0
  11. package/dist/types/browser/connection-warmup.d.ts +31 -0
  12. package/dist/types/browser/cookie-name.d.ts +66 -0
  13. package/dist/types/browser/dev-discovery.d.ts +11 -0
  14. package/dist/types/browser/event-controller.d.ts +231 -0
  15. package/dist/types/browser/history-state.d.ts +26 -0
  16. package/dist/types/browser/index.d.ts +1 -0
  17. package/dist/types/browser/intercept-utils.d.ts +30 -0
  18. package/dist/types/browser/invalidate-client-cache.d.ts +17 -0
  19. package/dist/types/browser/link-interceptor.d.ts +53 -0
  20. package/dist/types/browser/logging.d.ts +33 -0
  21. package/dist/types/browser/merge-segment-loaders.d.ts +38 -0
  22. package/dist/types/browser/navigation-bridge.d.ts +39 -0
  23. package/dist/types/browser/navigation-client.d.ts +17 -0
  24. package/dist/types/browser/navigation-store-handle.d.ts +25 -0
  25. package/dist/types/browser/navigation-store.d.ts +85 -0
  26. package/dist/types/browser/navigation-transaction.d.ts +75 -0
  27. package/dist/types/browser/network-error-handler.d.ts +35 -0
  28. package/dist/types/browser/notify-listeners.d.ts +2 -0
  29. package/dist/types/browser/partial-update.d.ts +61 -0
  30. package/dist/types/browser/prefetch/cache.d.ts +224 -0
  31. package/dist/types/browser/prefetch/default-strategy.d.ts +31 -0
  32. package/dist/types/browser/prefetch/fetch.d.ts +52 -0
  33. package/dist/types/browser/prefetch/invalidation.d.ts +6 -0
  34. package/dist/types/browser/prefetch/loader.d.ts +12 -0
  35. package/dist/types/browser/prefetch/observer.d.ts +24 -0
  36. package/dist/types/browser/prefetch/policy.d.ts +13 -0
  37. package/dist/types/browser/prefetch/queue.d.ts +48 -0
  38. package/dist/types/browser/prefetch/resource-ready.d.ts +28 -0
  39. package/dist/types/browser/prefetch/runtime.d.ts +2 -0
  40. package/dist/types/browser/rango-state.d.ts +56 -0
  41. package/dist/types/browser/react/Link.d.ts +132 -0
  42. package/dist/types/browser/react/NavigationProvider.d.ts +88 -0
  43. package/dist/types/browser/react/ScrollRestoration.d.ts +78 -0
  44. package/dist/types/browser/react/context.d.ts +57 -0
  45. package/dist/types/browser/react/filter-segment-order.d.ts +35 -0
  46. package/dist/types/browser/react/index.d.ts +1 -0
  47. package/dist/types/browser/react/location-state-shared.d.ts +162 -0
  48. package/dist/types/browser/react/location-state.d.ts +29 -0
  49. package/dist/types/browser/react/mount-context.d.ts +23 -0
  50. package/dist/types/browser/react/nonce-context.d.ts +14 -0
  51. package/dist/types/browser/react/shallow-equal.d.ts +5 -0
  52. package/dist/types/browser/react/use-action.d.ts +61 -0
  53. package/dist/types/browser/react/use-handle.d.ts +21 -0
  54. package/dist/types/browser/react/use-href.d.ts +32 -0
  55. package/dist/types/browser/react/use-link-status.d.ts +36 -0
  56. package/dist/types/browser/react/use-mount.d.ts +24 -0
  57. package/dist/types/browser/react/use-navigation.d.ts +15 -0
  58. package/dist/types/browser/react/use-params.d.ts +21 -0
  59. package/dist/types/browser/react/use-pathname.d.ts +13 -0
  60. package/dist/types/browser/react/use-reverse.d.ts +40 -0
  61. package/dist/types/browser/react/use-router.d.ts +23 -0
  62. package/dist/types/browser/react/use-search-params.d.ts +19 -0
  63. package/dist/types/browser/react/use-segments.d.ts +29 -0
  64. package/dist/types/browser/response-adapter.d.ts +58 -0
  65. package/dist/types/browser/rsc-router.d.ts +146 -0
  66. package/dist/types/browser/scroll-restoration.d.ts +103 -0
  67. package/dist/types/browser/segment-reconciler.d.ts +74 -0
  68. package/dist/types/browser/segment-structure-assert.d.ts +16 -0
  69. package/dist/types/browser/server-action-bridge.d.ts +29 -0
  70. package/dist/types/browser/types.d.ts +546 -0
  71. package/dist/types/browser/validate-redirect-origin.d.ts +28 -0
  72. package/dist/types/build/collect-fallback-refs.d.ts +5 -0
  73. package/dist/types/build/generate-manifest.d.ts +106 -0
  74. package/dist/types/build/generate-route-types.d.ts +8 -0
  75. package/dist/types/build/index.d.ts +21 -0
  76. package/dist/types/build/merge-full-manifests.d.ts +3 -0
  77. package/dist/types/build/prefix-tree-utils.d.ts +56 -0
  78. package/dist/types/build/route-trie.d.ts +20 -0
  79. package/dist/types/build/route-types/ast-helpers.d.ts +3 -0
  80. package/dist/types/build/route-types/ast-route-extraction.d.ts +13 -0
  81. package/dist/types/build/route-types/codegen.d.ts +16 -0
  82. package/dist/types/build/route-types/include-resolution.d.ts +74 -0
  83. package/dist/types/build/route-types/param-extraction.d.ts +13 -0
  84. package/dist/types/build/route-types/per-module-writer.d.ts +20 -0
  85. package/dist/types/build/route-types/router-processing.d.ts +81 -0
  86. package/dist/types/build/route-types/scan-filter.d.ts +17 -0
  87. package/dist/types/build/route-types/source-scan.d.ts +13 -0
  88. package/dist/types/build/runtime-discovery.d.ts +24 -0
  89. package/dist/types/cache/background-task.d.ts +21 -0
  90. package/dist/types/cache/cache-error.d.ts +71 -0
  91. package/dist/types/cache/cache-exec-scope.d.ts +31 -0
  92. package/dist/types/cache/cache-key-utils.d.ts +43 -0
  93. package/dist/types/cache/cache-policy.d.ts +59 -0
  94. package/dist/types/cache/cache-runtime.d.ts +51 -0
  95. package/dist/types/cache/cache-scope.d.ts +215 -0
  96. package/dist/types/cache/cache-tag.d.ts +79 -0
  97. package/dist/types/cache/cf/cf-base64.d.ts +4 -0
  98. package/dist/types/cache/cf/cf-cache-constants.d.ts +112 -0
  99. package/dist/types/cache/cf/cf-cache-store.d.ts +616 -0
  100. package/dist/types/cache/cf/cf-cache-types.d.ts +365 -0
  101. package/dist/types/cache/cf/cf-kv-utils.d.ts +43 -0
  102. package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +15 -0
  103. package/dist/types/cache/cf/cf-zone-purge.d.ts +31 -0
  104. package/dist/types/cache/cf/index.d.ts +4 -0
  105. package/dist/types/cache/document-cache.d.ts +71 -0
  106. package/dist/types/cache/handle-capture.d.ts +23 -0
  107. package/dist/types/cache/handle-snapshot.d.ts +39 -0
  108. package/dist/types/cache/index.d.ts +9 -0
  109. package/dist/types/cache/memory-segment-store.d.ts +163 -0
  110. package/dist/types/cache/profile-registry.d.ts +40 -0
  111. package/dist/types/cache/read-through-swr.d.ts +61 -0
  112. package/dist/types/cache/search-params-filter.d.ts +64 -0
  113. package/dist/types/cache/segment-codec.d.ts +78 -0
  114. package/dist/types/cache/shell-snapshot.d.ts +186 -0
  115. package/dist/types/cache/tag-invalidation.d.ts +74 -0
  116. package/dist/types/cache/taint.d.ts +77 -0
  117. package/dist/types/cache/types.d.ts +503 -0
  118. package/dist/types/cache/vercel/index.d.ts +1 -0
  119. package/dist/types/cache/vercel/vercel-cache-store.d.ts +268 -0
  120. package/dist/types/client-urls/client-root.d.ts +38 -0
  121. package/dist/types/client-urls/client-urls.d.ts +5 -0
  122. package/dist/types/client-urls/navigation.d.ts +38 -0
  123. package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
  124. package/dist/types/client-urls/server-projection.d.ts +57 -0
  125. package/dist/types/client-urls/types.d.ts +132 -0
  126. package/dist/types/client.d.ts +191 -0
  127. package/dist/types/client.rsc.d.ts +41 -0
  128. package/dist/types/cloudflare/index.d.ts +7 -0
  129. package/dist/types/cloudflare/tracing.d.ts +57 -0
  130. package/dist/types/component-utils.d.ts +46 -0
  131. package/dist/types/components/DefaultDocument.d.ts +13 -0
  132. package/dist/types/context-var.d.ts +84 -0
  133. package/dist/types/debug.d.ts +57 -0
  134. package/dist/types/decode-loader-results.d.ts +42 -0
  135. package/dist/types/default-error-boundary.d.ts +10 -0
  136. package/dist/types/defer.d.ts +89 -0
  137. package/dist/types/deps/browser.d.ts +1 -0
  138. package/dist/types/deps/html-stream-client.d.ts +1 -0
  139. package/dist/types/deps/html-stream-server.d.ts +1 -0
  140. package/dist/types/deps/rsc.d.ts +1 -0
  141. package/dist/types/deps/ssr.d.ts +1 -0
  142. package/dist/types/dev-discovery-protocol.d.ts +5 -0
  143. package/dist/types/encode-kv.d.ts +35 -0
  144. package/dist/types/errors.d.ts +227 -0
  145. package/dist/types/escape-script.d.ts +44 -0
  146. package/dist/types/handle.d.ts +93 -0
  147. package/dist/types/handles/MetaTags.d.ts +17 -0
  148. package/dist/types/handles/Scripts.d.ts +38 -0
  149. package/dist/types/handles/breadcrumbs.d.ts +43 -0
  150. package/dist/types/handles/deferred-resolution.d.ts +53 -0
  151. package/dist/types/handles/is-thenable.d.ts +10 -0
  152. package/dist/types/handles/meta.d.ts +43 -0
  153. package/dist/types/handles/script.d.ts +139 -0
  154. package/dist/types/host/cookie-handler.d.ts +8 -0
  155. package/dist/types/host/errors.d.ts +40 -0
  156. package/dist/types/host/index.d.ts +33 -0
  157. package/dist/types/host/pattern-matcher.d.ts +30 -0
  158. package/dist/types/host/router.d.ts +12 -0
  159. package/dist/types/host/testing.d.ts +41 -0
  160. package/dist/types/host/types.d.ts +148 -0
  161. package/dist/types/host/utils.d.ts +20 -0
  162. package/dist/types/href-client.d.ts +214 -0
  163. package/dist/types/index.d.ts +113 -0
  164. package/dist/types/index.rsc.d.ts +52 -0
  165. package/dist/types/internal-debug.d.ts +1 -0
  166. package/dist/types/loader-redirect.d.ts +18 -0
  167. package/dist/types/loader-store.d.ts +193 -0
  168. package/dist/types/loader.d.ts +18 -0
  169. package/dist/types/loader.rsc.d.ts +18 -0
  170. package/dist/types/missing-id-error.d.ts +1 -0
  171. package/dist/types/outlet-context.d.ts +24 -0
  172. package/dist/types/outlet-provider.d.ts +14 -0
  173. package/dist/types/prerender/build-shell-capture.d.ts +104 -0
  174. package/dist/types/prerender/param-hash.d.ts +6 -0
  175. package/dist/types/prerender/shell-manifest-key.d.ts +18 -0
  176. package/dist/types/prerender/store.d.ts +63 -0
  177. package/dist/types/prerender.d.ts +292 -0
  178. package/dist/types/redirect-origin.d.ts +67 -0
  179. package/dist/types/regex-escape.d.ts +6 -0
  180. package/dist/types/render-error-thrower.d.ts +13 -0
  181. package/dist/types/response-utils.d.ts +35 -0
  182. package/dist/types/reverse.d.ts +206 -0
  183. package/dist/types/root-error-boundary.d.ts +32 -0
  184. package/dist/types/route-content-wrapper.d.ts +81 -0
  185. package/dist/types/route-definition/dsl-helpers.d.ts +130 -0
  186. package/dist/types/route-definition/helper-factories.d.ts +22 -0
  187. package/dist/types/route-definition/helpers-types.d.ts +393 -0
  188. package/dist/types/route-definition/index.d.ts +7 -0
  189. package/dist/types/route-definition/redirect.d.ts +48 -0
  190. package/dist/types/route-definition/resolve-handler-use.d.ts +19 -0
  191. package/dist/types/route-definition/use-item-types.d.ts +1 -0
  192. package/dist/types/route-definition.d.ts +1 -0
  193. package/dist/types/route-map-builder.d.ts +102 -0
  194. package/dist/types/route-name.d.ts +27 -0
  195. package/dist/types/route-types.d.ts +172 -0
  196. package/dist/types/router/basename.d.ts +10 -0
  197. package/dist/types/router/content-negotiation.d.ts +91 -0
  198. package/dist/types/router/debug-manifest.d.ts +7 -0
  199. package/dist/types/router/error-handling.d.ts +110 -0
  200. package/dist/types/router/find-match.d.ts +19 -0
  201. package/dist/types/router/handler-context.d.ts +41 -0
  202. package/dist/types/router/instrument.d.ts +191 -0
  203. package/dist/types/router/intercept-resolution.d.ts +91 -0
  204. package/dist/types/router/lazy-includes.d.ts +26 -0
  205. package/dist/types/router/loader-resolution.d.ts +85 -0
  206. package/dist/types/router/logging.d.ts +41 -0
  207. package/dist/types/router/manifest.d.ts +8 -0
  208. package/dist/types/router/match-api.d.ts +19 -0
  209. package/dist/types/router/match-context.d.ts +184 -0
  210. package/dist/types/router/match-handlers.d.ts +48 -0
  211. package/dist/types/router/match-middleware/background-revalidation.d.ts +113 -0
  212. package/dist/types/router/match-middleware/cache-lookup.d.ts +126 -0
  213. package/dist/types/router/match-middleware/cache-store.d.ts +112 -0
  214. package/dist/types/router/match-middleware/index.d.ts +80 -0
  215. package/dist/types/router/match-middleware/intercept-resolution.d.ts +116 -0
  216. package/dist/types/router/match-middleware/segment-resolution.d.ts +94 -0
  217. package/dist/types/router/match-pipelines.d.ts +103 -0
  218. package/dist/types/router/match-result.d.ts +114 -0
  219. package/dist/types/router/metrics.d.ts +6 -0
  220. package/dist/types/router/middleware-types.d.ts +74 -0
  221. package/dist/types/router/middleware.d.ts +116 -0
  222. package/dist/types/router/navigation-snapshot.d.ts +51 -0
  223. package/dist/types/router/params-util.d.ts +8 -0
  224. package/dist/types/router/parse-pattern.d.ts +38 -0
  225. package/dist/types/router/pattern-matching.d.ts +169 -0
  226. package/dist/types/router/prefetch-cache-ttl.d.ts +27 -0
  227. package/dist/types/router/prefetch-default.d.ts +28 -0
  228. package/dist/types/router/prefetch-limits.d.ts +20 -0
  229. package/dist/types/router/prerender-match.d.ts +53 -0
  230. package/dist/types/router/preview-match.d.ts +22 -0
  231. package/dist/types/router/request-classification.d.ts +104 -0
  232. package/dist/types/router/revalidation.d.ts +64 -0
  233. package/dist/types/router/route-snapshot.d.ts +112 -0
  234. package/dist/types/router/route-trie-builder.d.ts +77 -0
  235. package/dist/types/router/router-context.d.ts +137 -0
  236. package/dist/types/router/router-interfaces.d.ts +461 -0
  237. package/dist/types/router/router-options.d.ts +792 -0
  238. package/dist/types/router/router-registry.d.ts +15 -0
  239. package/dist/types/router/segment-resolution/fresh.d.ts +55 -0
  240. package/dist/types/router/segment-resolution/helpers.d.ts +93 -0
  241. package/dist/types/router/segment-resolution/loader-cache.d.ts +33 -0
  242. package/dist/types/router/segment-resolution/loader-mask.d.ts +44 -0
  243. package/dist/types/router/segment-resolution/loader-snapshot.d.ts +90 -0
  244. package/dist/types/router/segment-resolution/mask-nested.d.ts +53 -0
  245. package/dist/types/router/segment-resolution/revalidation.d.ts +85 -0
  246. package/dist/types/router/segment-resolution/static-store.d.ts +17 -0
  247. package/dist/types/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
  248. package/dist/types/router/segment-resolution/view-transition-default.d.ts +27 -0
  249. package/dist/types/router/segment-resolution.d.ts +3 -0
  250. package/dist/types/router/segment-wrappers.d.ts +53 -0
  251. package/dist/types/router/state-cookie-name.d.ts +1 -0
  252. package/dist/types/router/substitute-pattern-params.d.ts +23 -0
  253. package/dist/types/router/telemetry-otel.d.ts +113 -0
  254. package/dist/types/router/telemetry.d.ts +216 -0
  255. package/dist/types/router/timeout.d.ts +107 -0
  256. package/dist/types/router/tracing.d.ts +139 -0
  257. package/dist/types/router/transition-when.d.ts +13 -0
  258. package/dist/types/router/trie-matching.d.ts +32 -0
  259. package/dist/types/router/types.d.ts +98 -0
  260. package/dist/types/router/url-params.d.ts +26 -0
  261. package/dist/types/router.d.ts +7 -0
  262. package/dist/types/rsc/capture-queue.d.ts +49 -0
  263. package/dist/types/rsc/full-payload.d.ts +22 -0
  264. package/dist/types/rsc/handler-context.d.ts +32 -0
  265. package/dist/types/rsc/handler.d.ts +9 -0
  266. package/dist/types/rsc/helpers.d.ts +127 -0
  267. package/dist/types/rsc/index.d.ts +17 -0
  268. package/dist/types/rsc/json-route-result.d.ts +20 -0
  269. package/dist/types/rsc/loader-fetch.d.ts +14 -0
  270. package/dist/types/rsc/manifest-init.d.ts +18 -0
  271. package/dist/types/rsc/nonce.d.ts +28 -0
  272. package/dist/types/rsc/origin-guard.d.ts +50 -0
  273. package/dist/types/rsc/progressive-enhancement.d.ts +19 -0
  274. package/dist/types/rsc/redirect-guard.d.ts +37 -0
  275. package/dist/types/rsc/render-pipeline.d.ts +148 -0
  276. package/dist/types/rsc/response-cache-serve.d.ts +46 -0
  277. package/dist/types/rsc/response-error.d.ts +19 -0
  278. package/dist/types/rsc/response-route-handler.d.ts +29 -0
  279. package/dist/types/rsc/routine-plan.d.ts +124 -0
  280. package/dist/types/rsc/rsc-rendering.d.ts +18 -0
  281. package/dist/types/rsc/runtime-warnings.d.ts +22 -0
  282. package/dist/types/rsc/server-action.d.ts +68 -0
  283. package/dist/types/rsc/shell-build-manifest.d.ts +90 -0
  284. package/dist/types/rsc/shell-capture-constants.d.ts +44 -0
  285. package/dist/types/rsc/shell-capture.d.ts +406 -0
  286. package/dist/types/rsc/shell-serve.d.ts +189 -0
  287. package/dist/types/rsc/ssr-setup.d.ts +73 -0
  288. package/dist/types/rsc/stream-idle.d.ts +60 -0
  289. package/dist/types/rsc/transition-gate.d.ts +23 -0
  290. package/dist/types/rsc/types.d.ts +328 -0
  291. package/dist/types/runtime-env.d.ts +1 -0
  292. package/dist/types/search-params.d.ts +125 -0
  293. package/dist/types/segment-content-promise.d.ts +13 -0
  294. package/dist/types/segment-fragments.d.ts +79 -0
  295. package/dist/types/segment-loader-promise.d.ts +22 -0
  296. package/dist/types/segment-system.d.ts +86 -0
  297. package/dist/types/serialize.d.ts +164 -0
  298. package/dist/types/server/context.d.ts +510 -0
  299. package/dist/types/server/cookie-parse.d.ts +10 -0
  300. package/dist/types/server/cookie-store.d.ts +107 -0
  301. package/dist/types/server/fetchable-loader-store.d.ts +20 -0
  302. package/dist/types/server/handle-store.d.ts +131 -0
  303. package/dist/types/server/loader-registry.d.ts +32 -0
  304. package/dist/types/server/request-context.d.ts +707 -0
  305. package/dist/types/server/root-layout.d.ts +3 -0
  306. package/dist/types/server.d.ts +16 -0
  307. package/dist/types/ssr/index.d.ts +233 -0
  308. package/dist/types/ssr/inject-rsc-eager.d.ts +3 -0
  309. package/dist/types/ssr/preinit-client-references.d.ts +71 -0
  310. package/dist/types/ssr/ssr-root.d.ts +69 -0
  311. package/dist/types/static-handler.d.ts +71 -0
  312. package/dist/types/testing/cache-status.d.ts +63 -0
  313. package/dist/types/testing/collect-handle.d.ts +20 -0
  314. package/dist/types/testing/dispatch.d.ts +127 -0
  315. package/dist/types/testing/dom.entry.d.ts +15 -0
  316. package/dist/types/testing/e2e/fixture.d.ts +37 -0
  317. package/dist/types/testing/e2e/index.d.ts +31 -0
  318. package/dist/types/testing/e2e/matchers.d.ts +17 -0
  319. package/dist/types/testing/e2e/page-helpers.d.ts +86 -0
  320. package/dist/types/testing/e2e/parity.d.ts +111 -0
  321. package/dist/types/testing/e2e/server.d.ts +35 -0
  322. package/dist/types/testing/flight-matchers.d.ts +55 -0
  323. package/dist/types/testing/flight-normalize.d.ts +1 -0
  324. package/dist/types/testing/flight-tree.d.ts +192 -0
  325. package/dist/types/testing/flight.d.ts +115 -0
  326. package/dist/types/testing/flight.entry.d.ts +27 -0
  327. package/dist/types/testing/generated-routes.d.ts +66 -0
  328. package/dist/types/testing/index.d.ts +54 -0
  329. package/dist/types/testing/internal/context.d.ts +225 -0
  330. package/dist/types/testing/internal/flight-client-globals.d.ts +1 -0
  331. package/dist/types/testing/internal/seed-vars.d.ts +30 -0
  332. package/dist/types/testing/render-handler.d.ts +160 -0
  333. package/dist/types/testing/render-route.d.ts +265 -0
  334. package/dist/types/testing/run-loader.d.ts +195 -0
  335. package/dist/types/testing/run-middleware.d.ts +132 -0
  336. package/dist/types/testing/run-transition-when.d.ts +78 -0
  337. package/dist/types/testing/shell-status.d.ts +81 -0
  338. package/dist/types/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
  339. package/dist/types/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
  340. package/dist/types/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
  341. package/dist/types/testing/vitest-stubs/version.d.ts +1 -0
  342. package/dist/types/testing/vitest.d.ts +205 -0
  343. package/dist/types/theme/ThemeProvider.d.ts +13 -0
  344. package/dist/types/theme/ThemeScript.d.ts +45 -0
  345. package/dist/types/theme/constants.d.ts +39 -0
  346. package/dist/types/theme/index.d.ts +29 -0
  347. package/dist/types/theme/theme-context.d.ts +21 -0
  348. package/dist/types/theme/theme-script.d.ts +26 -0
  349. package/dist/types/theme/types.d.ts +162 -0
  350. package/dist/types/theme/use-theme.d.ts +8 -0
  351. package/dist/types/types/boundaries.d.ts +110 -0
  352. package/dist/types/types/cache-types.d.ts +191 -0
  353. package/dist/types/types/error-types.d.ts +114 -0
  354. package/dist/types/types/global-namespace.d.ts +90 -0
  355. package/dist/types/types/handler-context.d.ts +658 -0
  356. package/dist/types/types/index.d.ts +11 -0
  357. package/dist/types/types/loader-types.d.ts +208 -0
  358. package/dist/types/types/request-scope.d.ts +93 -0
  359. package/dist/types/types/route-config.d.ts +105 -0
  360. package/dist/types/types/route-entry.d.ts +98 -0
  361. package/dist/types/types/segments.d.ts +246 -0
  362. package/dist/types/types.d.ts +1 -0
  363. package/dist/types/urls/include-helper.d.ts +17 -0
  364. package/dist/types/urls/include-provider.d.ts +27 -0
  365. package/dist/types/urls/index.d.ts +6 -0
  366. package/dist/types/urls/path-helper-types.d.ts +198 -0
  367. package/dist/types/urls/path-helper.d.ts +12 -0
  368. package/dist/types/urls/pattern-types.d.ts +166 -0
  369. package/dist/types/urls/response-types.d.ts +67 -0
  370. package/dist/types/urls/type-extraction.d.ts +157 -0
  371. package/dist/types/urls/urls-function.d.ts +24 -0
  372. package/dist/types/urls.d.ts +1 -0
  373. package/dist/types/use-loader.d.ts +150 -0
  374. package/dist/types/vercel/index.d.ts +10 -0
  375. package/dist/types/vercel/tracing.d.ts +71 -0
  376. package/dist/types/vite/debug.d.ts +80 -0
  377. package/dist/types/vite/discovery/bundle-postprocess.d.ts +12 -0
  378. package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
  379. package/dist/types/vite/discovery/dev-prerender-cache.d.ts +65 -0
  380. package/dist/types/vite/discovery/discover-routers.d.ts +17 -0
  381. package/dist/types/vite/discovery/discovery-errors.d.ts +113 -0
  382. package/dist/types/vite/discovery/gate-state.d.ts +79 -0
  383. package/dist/types/vite/discovery/prerender-collection.d.ts +24 -0
  384. package/dist/types/vite/discovery/route-types-writer.d.ts +32 -0
  385. package/dist/types/vite/discovery/self-gen-tracking.d.ts +22 -0
  386. package/dist/types/vite/discovery/shell-prerender-phase.d.ts +40 -0
  387. package/dist/types/vite/discovery/state.d.ts +170 -0
  388. package/dist/types/vite/discovery/virtual-module-codegen.d.ts +15 -0
  389. package/dist/types/vite/encryption-key.d.ts +2 -0
  390. package/dist/types/vite/index.d.ts +11 -0
  391. package/dist/types/vite/inject-client-debug.d.ts +56 -0
  392. package/dist/types/vite/plugin-types.d.ts +298 -0
  393. package/dist/types/vite/plugins/cjs-to-esm.d.ts +6 -0
  394. package/dist/types/vite/plugins/client-ref-dedup.d.ts +40 -0
  395. package/dist/types/vite/plugins/client-ref-hashing.d.ts +35 -0
  396. package/dist/types/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
  397. package/dist/types/vite/plugins/expose-action-id.d.ts +18 -0
  398. package/dist/types/vite/plugins/expose-id-utils.d.ts +37 -0
  399. package/dist/types/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
  400. package/dist/types/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
  401. package/dist/types/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
  402. package/dist/types/vite/plugins/expose-ids/router-transform.d.ts +13 -0
  403. package/dist/types/vite/plugins/expose-ids/types.d.ts +29 -0
  404. package/dist/types/vite/plugins/expose-internal-ids.d.ts +16 -0
  405. package/dist/types/vite/plugins/performance-tracks.d.ts +25 -0
  406. package/dist/types/vite/plugins/refresh-cmd.d.ts +20 -0
  407. package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
  408. package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
  409. package/dist/types/vite/plugins/use-cache-transform.d.ts +20 -0
  410. package/dist/types/vite/plugins/vercel-output.d.ts +85 -0
  411. package/dist/types/vite/plugins/version-injector.d.ts +21 -0
  412. package/dist/types/vite/plugins/version-plugin.d.ts +19 -0
  413. package/dist/types/vite/plugins/virtual-entries.d.ts +36 -0
  414. package/dist/types/vite/plugins/virtual-stub-plugin.d.ts +7 -0
  415. package/dist/types/vite/rango.d.ts +29 -0
  416. package/dist/types/vite/router-discovery.d.ts +23 -0
  417. package/dist/types/vite/utils/ast-handler-extract.d.ts +64 -0
  418. package/dist/types/vite/utils/banner.d.ts +2 -0
  419. package/dist/types/vite/utils/bundle-analysis.d.ts +28 -0
  420. package/dist/types/vite/utils/client-chunks.d.ts +55 -0
  421. package/dist/types/vite/utils/directive-prologue.d.ts +16 -0
  422. package/dist/types/vite/utils/forward-user-plugins.d.ts +37 -0
  423. package/dist/types/vite/utils/manifest-utils.d.ts +7 -0
  424. package/dist/types/vite/utils/package-resolution.d.ts +6 -0
  425. package/dist/types/vite/utils/prerender-utils.d.ts +32 -0
  426. package/dist/types/vite/utils/shared-utils.d.ts +67 -0
  427. package/dist/types.backup/__internal.d.ts +127 -0
  428. package/dist/types.backup/bin/rango.d.ts +1 -0
  429. package/dist/types.backup/browser/action-coordinator.d.ts +57 -0
  430. package/dist/types.backup/browser/action-fence.d.ts +33 -0
  431. package/dist/types.backup/browser/app-shell.d.ts +34 -0
  432. package/dist/types.backup/browser/app-version.d.ts +6 -0
  433. package/dist/types.backup/browser/connection-warmup.d.ts +31 -0
  434. package/dist/types.backup/browser/cookie-name.d.ts +66 -0
  435. package/dist/types.backup/browser/event-controller.d.ts +221 -0
  436. package/dist/types.backup/browser/history-state.d.ts +26 -0
  437. package/dist/types.backup/browser/index.d.ts +1 -0
  438. package/dist/types.backup/browser/intercept-utils.d.ts +30 -0
  439. package/dist/types.backup/browser/invalidate-client-cache.d.ts +17 -0
  440. package/dist/types.backup/browser/link-interceptor.d.ts +43 -0
  441. package/dist/types.backup/browser/logging.d.ts +33 -0
  442. package/dist/types.backup/browser/merge-segment-loaders.d.ts +38 -0
  443. package/dist/types.backup/browser/navigation-bridge.d.ts +27 -0
  444. package/dist/types.backup/browser/navigation-client.d.ts +17 -0
  445. package/dist/types.backup/browser/navigation-store-handle.d.ts +25 -0
  446. package/dist/types.backup/browser/navigation-store.d.ts +95 -0
  447. package/dist/types.backup/browser/navigation-transaction.d.ts +75 -0
  448. package/dist/types.backup/browser/network-error-handler.d.ts +35 -0
  449. package/dist/types.backup/browser/partial-update.d.ts +61 -0
  450. package/dist/types.backup/browser/prefetch/cache.d.ts +183 -0
  451. package/dist/types.backup/browser/prefetch/fetch.d.ts +52 -0
  452. package/dist/types.backup/browser/prefetch/observer.d.ts +27 -0
  453. package/dist/types.backup/browser/prefetch/policy.d.ts +13 -0
  454. package/dist/types.backup/browser/prefetch/queue.d.ts +48 -0
  455. package/dist/types.backup/browser/prefetch/resource-ready.d.ts +28 -0
  456. package/dist/types.backup/browser/rango-state.d.ts +52 -0
  457. package/dist/types.backup/browser/react/Link.d.ts +140 -0
  458. package/dist/types.backup/browser/react/NavigationProvider.d.ts +88 -0
  459. package/dist/types.backup/browser/react/ScrollRestoration.d.ts +78 -0
  460. package/dist/types.backup/browser/react/context.d.ts +54 -0
  461. package/dist/types.backup/browser/react/filter-segment-order.d.ts +35 -0
  462. package/dist/types.backup/browser/react/index.d.ts +1 -0
  463. package/dist/types.backup/browser/react/location-state-shared.d.ts +162 -0
  464. package/dist/types.backup/browser/react/location-state.d.ts +29 -0
  465. package/dist/types.backup/browser/react/mount-context.d.ts +23 -0
  466. package/dist/types.backup/browser/react/nonce-context.d.ts +14 -0
  467. package/dist/types.backup/browser/react/shallow-equal.d.ts +5 -0
  468. package/dist/types.backup/browser/react/use-action.d.ts +61 -0
  469. package/dist/types.backup/browser/react/use-handle.d.ts +21 -0
  470. package/dist/types.backup/browser/react/use-href.d.ts +32 -0
  471. package/dist/types.backup/browser/react/use-link-status.d.ts +36 -0
  472. package/dist/types.backup/browser/react/use-mount.d.ts +24 -0
  473. package/dist/types.backup/browser/react/use-navigation.d.ts +15 -0
  474. package/dist/types.backup/browser/react/use-params.d.ts +21 -0
  475. package/dist/types.backup/browser/react/use-pathname.d.ts +13 -0
  476. package/dist/types.backup/browser/react/use-reverse.d.ts +40 -0
  477. package/dist/types.backup/browser/react/use-router.d.ts +23 -0
  478. package/dist/types.backup/browser/react/use-search-params.d.ts +19 -0
  479. package/dist/types.backup/browser/react/use-segments.d.ts +29 -0
  480. package/dist/types.backup/browser/response-adapter.d.ts +58 -0
  481. package/dist/types.backup/browser/rsc-router.d.ts +141 -0
  482. package/dist/types.backup/browser/scroll-restoration.d.ts +103 -0
  483. package/dist/types.backup/browser/segment-reconciler.d.ts +74 -0
  484. package/dist/types.backup/browser/segment-structure-assert.d.ts +16 -0
  485. package/dist/types.backup/browser/server-action-bridge.d.ts +29 -0
  486. package/dist/types.backup/browser/types.d.ts +530 -0
  487. package/dist/types.backup/browser/validate-redirect-origin.d.ts +28 -0
  488. package/dist/types.backup/build/collect-fallback-refs.d.ts +5 -0
  489. package/dist/types.backup/build/generate-manifest.d.ts +100 -0
  490. package/dist/types.backup/build/generate-route-types.d.ts +8 -0
  491. package/dist/types.backup/build/index.d.ts +21 -0
  492. package/dist/types.backup/build/prefix-tree-utils.d.ts +56 -0
  493. package/dist/types.backup/build/route-trie.d.ts +89 -0
  494. package/dist/types.backup/build/route-types/ast-helpers.d.ts +3 -0
  495. package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +13 -0
  496. package/dist/types.backup/build/route-types/codegen.d.ts +16 -0
  497. package/dist/types.backup/build/route-types/include-resolution.d.ts +74 -0
  498. package/dist/types.backup/build/route-types/param-extraction.d.ts +13 -0
  499. package/dist/types.backup/build/route-types/per-module-writer.d.ts +18 -0
  500. package/dist/types.backup/build/route-types/router-processing.d.ts +82 -0
  501. package/dist/types.backup/build/route-types/scan-filter.d.ts +17 -0
  502. package/dist/types.backup/build/route-types/source-scan.d.ts +13 -0
  503. package/dist/types.backup/build/runtime-discovery.d.ts +24 -0
  504. package/dist/types.backup/cache/background-task.d.ts +21 -0
  505. package/dist/types.backup/cache/cache-error.d.ts +71 -0
  506. package/dist/types.backup/cache/cache-key-utils.d.ts +35 -0
  507. package/dist/types.backup/cache/cache-policy.d.ts +59 -0
  508. package/dist/types.backup/cache/cache-runtime.d.ts +51 -0
  509. package/dist/types.backup/cache/cache-scope.d.ts +134 -0
  510. package/dist/types.backup/cache/cache-tag.d.ts +79 -0
  511. package/dist/types.backup/cache/cf/cf-base64.d.ts +4 -0
  512. package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +105 -0
  513. package/dist/types.backup/cache/cf/cf-cache-store.d.ts +481 -0
  514. package/dist/types.backup/cache/cf/cf-cache-types.d.ts +300 -0
  515. package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +22 -0
  516. package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +15 -0
  517. package/dist/types.backup/cache/cf/index.d.ts +3 -0
  518. package/dist/types.backup/cache/document-cache.d.ts +69 -0
  519. package/dist/types.backup/cache/handle-capture.d.ts +23 -0
  520. package/dist/types.backup/cache/handle-snapshot.d.ts +39 -0
  521. package/dist/types.backup/cache/index.d.ts +7 -0
  522. package/dist/types.backup/cache/memory-segment-store.d.ts +163 -0
  523. package/dist/types.backup/cache/profile-registry.d.ts +40 -0
  524. package/dist/types.backup/cache/read-through-swr.d.ts +60 -0
  525. package/dist/types.backup/cache/segment-codec.d.ts +78 -0
  526. package/dist/types.backup/cache/shell-snapshot.d.ts +162 -0
  527. package/dist/types.backup/cache/tag-invalidation.d.ts +74 -0
  528. package/dist/types.backup/cache/taint.d.ts +71 -0
  529. package/dist/types.backup/cache/types.d.ts +407 -0
  530. package/dist/types.backup/cache/vercel/index.d.ts +1 -0
  531. package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +267 -0
  532. package/dist/types.backup/client.d.ts +184 -0
  533. package/dist/types.backup/client.rsc.d.ts +39 -0
  534. package/dist/types.backup/cloudflare/index.d.ts +7 -0
  535. package/dist/types.backup/cloudflare/tracing.d.ts +53 -0
  536. package/dist/types.backup/component-utils.d.ts +46 -0
  537. package/dist/types.backup/components/DefaultDocument.d.ts +13 -0
  538. package/dist/types.backup/context-var.d.ts +84 -0
  539. package/dist/types.backup/debug.d.ts +57 -0
  540. package/dist/types.backup/decode-loader-results.d.ts +5 -0
  541. package/dist/types.backup/default-error-boundary.d.ts +10 -0
  542. package/dist/types.backup/defer.d.ts +89 -0
  543. package/dist/types.backup/deps/browser.d.ts +1 -0
  544. package/dist/types.backup/deps/html-stream-client.d.ts +1 -0
  545. package/dist/types.backup/deps/html-stream-server.d.ts +1 -0
  546. package/dist/types.backup/deps/rsc.d.ts +1 -0
  547. package/dist/types.backup/deps/ssr.d.ts +1 -0
  548. package/dist/types.backup/encode-kv.d.ts +35 -0
  549. package/dist/types.backup/errors.d.ts +226 -0
  550. package/dist/types.backup/escape-script.d.ts +44 -0
  551. package/dist/types.backup/handle.d.ts +93 -0
  552. package/dist/types.backup/handles/MetaTags.d.ts +17 -0
  553. package/dist/types.backup/handles/Scripts.d.ts +38 -0
  554. package/dist/types.backup/handles/breadcrumbs.d.ts +43 -0
  555. package/dist/types.backup/handles/deferred-resolution.d.ts +53 -0
  556. package/dist/types.backup/handles/is-thenable.d.ts +12 -0
  557. package/dist/types.backup/handles/meta.d.ts +43 -0
  558. package/dist/types.backup/handles/script.d.ts +139 -0
  559. package/dist/types.backup/host/cookie-handler.d.ts +8 -0
  560. package/dist/types.backup/host/errors.d.ts +40 -0
  561. package/dist/types.backup/host/index.d.ts +33 -0
  562. package/dist/types.backup/host/pattern-matcher.d.ts +30 -0
  563. package/dist/types.backup/host/router.d.ts +12 -0
  564. package/dist/types.backup/host/testing.d.ts +41 -0
  565. package/dist/types.backup/host/types.d.ts +148 -0
  566. package/dist/types.backup/host/utils.d.ts +20 -0
  567. package/dist/types.backup/href-client.d.ts +214 -0
  568. package/dist/types.backup/index.d.ts +112 -0
  569. package/dist/types.backup/index.rsc.d.ts +51 -0
  570. package/dist/types.backup/internal-debug.d.ts +1 -0
  571. package/dist/types.backup/loader-store.d.ts +193 -0
  572. package/dist/types.backup/loader.d.ts +18 -0
  573. package/dist/types.backup/loader.rsc.d.ts +18 -0
  574. package/dist/types.backup/missing-id-error.d.ts +1 -0
  575. package/dist/types.backup/outlet-context.d.ts +12 -0
  576. package/dist/types.backup/outlet-provider.d.ts +12 -0
  577. package/dist/types.backup/prerender/build-shell-capture.d.ts +104 -0
  578. package/dist/types.backup/prerender/param-hash.d.ts +6 -0
  579. package/dist/types.backup/prerender/shell-manifest-key.d.ts +18 -0
  580. package/dist/types.backup/prerender/store.d.ts +62 -0
  581. package/dist/types.backup/prerender.d.ts +292 -0
  582. package/dist/types.backup/redirect-origin.d.ts +55 -0
  583. package/dist/types.backup/regex-escape.d.ts +6 -0
  584. package/dist/types.backup/render-error-thrower.d.ts +13 -0
  585. package/dist/types.backup/response-utils.d.ts +35 -0
  586. package/dist/types.backup/reverse.d.ts +206 -0
  587. package/dist/types.backup/root-error-boundary.d.ts +32 -0
  588. package/dist/types.backup/route-content-wrapper.d.ts +40 -0
  589. package/dist/types.backup/route-definition/dsl-helpers.d.ts +130 -0
  590. package/dist/types.backup/route-definition/helper-factories.d.ts +22 -0
  591. package/dist/types.backup/route-definition/helpers-types.d.ts +392 -0
  592. package/dist/types.backup/route-definition/index.d.ts +7 -0
  593. package/dist/types.backup/route-definition/redirect.d.ts +48 -0
  594. package/dist/types.backup/route-definition/resolve-handler-use.d.ts +19 -0
  595. package/dist/types.backup/route-definition/use-item-types.d.ts +1 -0
  596. package/dist/types.backup/route-definition.d.ts +1 -0
  597. package/dist/types.backup/route-map-builder.d.ts +127 -0
  598. package/dist/types.backup/route-name.d.ts +27 -0
  599. package/dist/types.backup/route-types.d.ts +172 -0
  600. package/dist/types.backup/router/basename.d.ts +10 -0
  601. package/dist/types.backup/router/content-negotiation.d.ts +91 -0
  602. package/dist/types.backup/router/debug-manifest.d.ts +7 -0
  603. package/dist/types.backup/router/error-handling.d.ts +76 -0
  604. package/dist/types.backup/router/find-match.d.ts +19 -0
  605. package/dist/types.backup/router/handler-context.d.ts +41 -0
  606. package/dist/types.backup/router/instrument.d.ts +161 -0
  607. package/dist/types.backup/router/intercept-resolution.d.ts +79 -0
  608. package/dist/types.backup/router/lazy-includes.d.ts +26 -0
  609. package/dist/types.backup/router/loader-resolution.d.ts +63 -0
  610. package/dist/types.backup/router/logging.d.ts +41 -0
  611. package/dist/types.backup/router/manifest.d.ts +8 -0
  612. package/dist/types.backup/router/match-api.d.ts +19 -0
  613. package/dist/types.backup/router/match-context.d.ts +184 -0
  614. package/dist/types.backup/router/match-handlers.d.ts +49 -0
  615. package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +113 -0
  616. package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +113 -0
  617. package/dist/types.backup/router/match-middleware/cache-store.d.ts +112 -0
  618. package/dist/types.backup/router/match-middleware/index.d.ts +80 -0
  619. package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +116 -0
  620. package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +94 -0
  621. package/dist/types.backup/router/match-pipelines.d.ts +103 -0
  622. package/dist/types.backup/router/match-result.d.ts +114 -0
  623. package/dist/types.backup/router/metrics.d.ts +6 -0
  624. package/dist/types.backup/router/middleware-types.d.ts +74 -0
  625. package/dist/types.backup/router/middleware.d.ts +116 -0
  626. package/dist/types.backup/router/navigation-snapshot.d.ts +22 -0
  627. package/dist/types.backup/router/params-util.d.ts +8 -0
  628. package/dist/types.backup/router/parse-pattern.d.ts +38 -0
  629. package/dist/types.backup/router/pattern-matching.d.ts +169 -0
  630. package/dist/types.backup/router/prefetch-cache-ttl.d.ts +27 -0
  631. package/dist/types.backup/router/prefetch-limits.d.ts +20 -0
  632. package/dist/types.backup/router/prerender-match.d.ts +50 -0
  633. package/dist/types.backup/router/preview-match.d.ts +22 -0
  634. package/dist/types.backup/router/request-classification.d.ts +104 -0
  635. package/dist/types.backup/router/revalidation.d.ts +57 -0
  636. package/dist/types.backup/router/route-snapshot.d.ts +112 -0
  637. package/dist/types.backup/router/router-context.d.ts +137 -0
  638. package/dist/types.backup/router/router-interfaces.d.ts +432 -0
  639. package/dist/types.backup/router/router-options.d.ts +738 -0
  640. package/dist/types.backup/router/router-registry.d.ts +15 -0
  641. package/dist/types.backup/router/segment-resolution/fresh.d.ts +55 -0
  642. package/dist/types.backup/router/segment-resolution/helpers.d.ts +93 -0
  643. package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +33 -0
  644. package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +44 -0
  645. package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +90 -0
  646. package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +53 -0
  647. package/dist/types.backup/router/segment-resolution/revalidation.d.ts +85 -0
  648. package/dist/types.backup/router/segment-resolution/static-store.d.ts +17 -0
  649. package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
  650. package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +28 -0
  651. package/dist/types.backup/router/segment-resolution.d.ts +3 -0
  652. package/dist/types.backup/router/segment-wrappers.d.ts +53 -0
  653. package/dist/types.backup/router/state-cookie-name.d.ts +1 -0
  654. package/dist/types.backup/router/substitute-pattern-params.d.ts +23 -0
  655. package/dist/types.backup/router/telemetry-otel.d.ts +113 -0
  656. package/dist/types.backup/router/telemetry.d.ts +215 -0
  657. package/dist/types.backup/router/timeout.d.ts +68 -0
  658. package/dist/types.backup/router/tracing.d.ts +125 -0
  659. package/dist/types.backup/router/trie-matching.d.ts +32 -0
  660. package/dist/types.backup/router/types.d.ts +98 -0
  661. package/dist/types.backup/router/url-params.d.ts +26 -0
  662. package/dist/types.backup/router.d.ts +7 -0
  663. package/dist/types.backup/rsc/capture-queue.d.ts +6 -0
  664. package/dist/types.backup/rsc/full-payload.d.ts +22 -0
  665. package/dist/types.backup/rsc/handler-context.d.ts +31 -0
  666. package/dist/types.backup/rsc/handler.d.ts +9 -0
  667. package/dist/types.backup/rsc/helpers.d.ts +213 -0
  668. package/dist/types.backup/rsc/index.d.ts +17 -0
  669. package/dist/types.backup/rsc/json-route-result.d.ts +20 -0
  670. package/dist/types.backup/rsc/loader-fetch.d.ts +14 -0
  671. package/dist/types.backup/rsc/manifest-init.d.ts +18 -0
  672. package/dist/types.backup/rsc/nonce.d.ts +28 -0
  673. package/dist/types.backup/rsc/origin-guard.d.ts +50 -0
  674. package/dist/types.backup/rsc/progressive-enhancement.d.ts +19 -0
  675. package/dist/types.backup/rsc/redirect-guard.d.ts +35 -0
  676. package/dist/types.backup/rsc/response-cache-serve.d.ts +46 -0
  677. package/dist/types.backup/rsc/response-error.d.ts +19 -0
  678. package/dist/types.backup/rsc/response-route-handler.d.ts +29 -0
  679. package/dist/types.backup/rsc/rsc-rendering.d.ts +23 -0
  680. package/dist/types.backup/rsc/runtime-warnings.d.ts +22 -0
  681. package/dist/types.backup/rsc/server-action.d.ts +68 -0
  682. package/dist/types.backup/rsc/shell-build-manifest.d.ts +84 -0
  683. package/dist/types.backup/rsc/shell-capture-constants.d.ts +27 -0
  684. package/dist/types.backup/rsc/shell-capture.d.ts +374 -0
  685. package/dist/types.backup/rsc/shell-serve.d.ts +136 -0
  686. package/dist/types.backup/rsc/ssr-setup.d.ts +48 -0
  687. package/dist/types.backup/rsc/transition-gate.d.ts +27 -0
  688. package/dist/types.backup/rsc/types.d.ts +290 -0
  689. package/dist/types.backup/runtime-env.d.ts +1 -0
  690. package/dist/types.backup/search-params.d.ts +125 -0
  691. package/dist/types.backup/segment-content-promise.d.ts +13 -0
  692. package/dist/types.backup/segment-fragments.d.ts +56 -0
  693. package/dist/types.backup/segment-loader-promise.d.ts +22 -0
  694. package/dist/types.backup/segment-system.d.ts +84 -0
  695. package/dist/types.backup/serialize.d.ts +164 -0
  696. package/dist/types.backup/server/context.d.ts +494 -0
  697. package/dist/types.backup/server/cookie-parse.d.ts +10 -0
  698. package/dist/types.backup/server/cookie-store.d.ts +107 -0
  699. package/dist/types.backup/server/fetchable-loader-store.d.ts +20 -0
  700. package/dist/types.backup/server/handle-store.d.ts +100 -0
  701. package/dist/types.backup/server/loader-registry.d.ts +32 -0
  702. package/dist/types.backup/server/request-context.d.ts +596 -0
  703. package/dist/types.backup/server/root-layout.d.ts +3 -0
  704. package/dist/types.backup/server.d.ts +15 -0
  705. package/dist/types.backup/ssr/index.d.ts +233 -0
  706. package/dist/types.backup/ssr/inject-rsc-eager.d.ts +3 -0
  707. package/dist/types.backup/ssr/preinit-client-references.d.ts +71 -0
  708. package/dist/types.backup/ssr/ssr-root.d.ts +69 -0
  709. package/dist/types.backup/static-handler.d.ts +57 -0
  710. package/dist/types.backup/testing/cache-status.d.ts +63 -0
  711. package/dist/types.backup/testing/collect-handle.d.ts +20 -0
  712. package/dist/types.backup/testing/dispatch.d.ts +123 -0
  713. package/dist/types.backup/testing/dom.entry.d.ts +15 -0
  714. package/dist/types.backup/testing/e2e/fixture.d.ts +37 -0
  715. package/dist/types.backup/testing/e2e/index.d.ts +30 -0
  716. package/dist/types.backup/testing/e2e/matchers.d.ts +17 -0
  717. package/dist/types.backup/testing/e2e/page-helpers.d.ts +62 -0
  718. package/dist/types.backup/testing/e2e/parity.d.ts +111 -0
  719. package/dist/types.backup/testing/e2e/server.d.ts +35 -0
  720. package/dist/types.backup/testing/flight-matchers.d.ts +55 -0
  721. package/dist/types.backup/testing/flight-normalize.d.ts +1 -0
  722. package/dist/types.backup/testing/flight-tree.d.ts +192 -0
  723. package/dist/types.backup/testing/flight.d.ts +115 -0
  724. package/dist/types.backup/testing/flight.entry.d.ts +27 -0
  725. package/dist/types.backup/testing/generated-routes.d.ts +66 -0
  726. package/dist/types.backup/testing/index.d.ts +52 -0
  727. package/dist/types.backup/testing/internal/context.d.ts +225 -0
  728. package/dist/types.backup/testing/internal/flight-client-globals.d.ts +1 -0
  729. package/dist/types.backup/testing/internal/seed-vars.d.ts +30 -0
  730. package/dist/types.backup/testing/render-handler.d.ts +160 -0
  731. package/dist/types.backup/testing/render-route.d.ts +246 -0
  732. package/dist/types.backup/testing/run-loader.d.ts +186 -0
  733. package/dist/types.backup/testing/run-middleware.d.ts +132 -0
  734. package/dist/types.backup/testing/run-transition-when.d.ts +77 -0
  735. package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
  736. package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
  737. package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
  738. package/dist/types.backup/testing/vitest-stubs/version.d.ts +1 -0
  739. package/dist/types.backup/testing/vitest.d.ts +205 -0
  740. package/dist/types.backup/theme/ThemeProvider.d.ts +13 -0
  741. package/dist/types.backup/theme/ThemeScript.d.ts +45 -0
  742. package/dist/types.backup/theme/constants.d.ts +39 -0
  743. package/dist/types.backup/theme/index.d.ts +29 -0
  744. package/dist/types.backup/theme/theme-context.d.ts +21 -0
  745. package/dist/types.backup/theme/theme-script.d.ts +26 -0
  746. package/dist/types.backup/theme/types.d.ts +162 -0
  747. package/dist/types.backup/theme/use-theme.d.ts +8 -0
  748. package/dist/types.backup/types/boundaries.d.ts +93 -0
  749. package/dist/types.backup/types/cache-types.d.ts +191 -0
  750. package/dist/types.backup/types/error-types.d.ts +114 -0
  751. package/dist/types.backup/types/global-namespace.d.ts +90 -0
  752. package/dist/types.backup/types/handler-context.d.ts +658 -0
  753. package/dist/types.backup/types/index.d.ts +11 -0
  754. package/dist/types.backup/types/loader-types.d.ts +182 -0
  755. package/dist/types.backup/types/request-scope.d.ts +93 -0
  756. package/dist/types.backup/types/route-config.d.ts +105 -0
  757. package/dist/types.backup/types/route-entry.d.ts +95 -0
  758. package/dist/types.backup/types/segments.d.ts +234 -0
  759. package/dist/types.backup/types.d.ts +1 -0
  760. package/dist/types.backup/urls/include-helper.d.ts +17 -0
  761. package/dist/types.backup/urls/include-provider.d.ts +27 -0
  762. package/dist/types.backup/urls/index.d.ts +6 -0
  763. package/dist/types.backup/urls/path-helper-types.d.ts +197 -0
  764. package/dist/types.backup/urls/path-helper.d.ts +12 -0
  765. package/dist/types.backup/urls/pattern-types.d.ts +166 -0
  766. package/dist/types.backup/urls/response-types.d.ts +67 -0
  767. package/dist/types.backup/urls/type-extraction.d.ts +157 -0
  768. package/dist/types.backup/urls/urls-function.d.ts +24 -0
  769. package/dist/types.backup/urls.d.ts +1 -0
  770. package/dist/types.backup/use-loader.d.ts +150 -0
  771. package/dist/types.backup/vercel/index.d.ts +10 -0
  772. package/dist/types.backup/vercel/tracing.d.ts +70 -0
  773. package/dist/types.backup/vite/debug.d.ts +80 -0
  774. package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +12 -0
  775. package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +65 -0
  776. package/dist/types.backup/vite/discovery/discover-routers.d.ts +17 -0
  777. package/dist/types.backup/vite/discovery/discovery-errors.d.ts +113 -0
  778. package/dist/types.backup/vite/discovery/gate-state.d.ts +79 -0
  779. package/dist/types.backup/vite/discovery/prerender-collection.d.ts +24 -0
  780. package/dist/types.backup/vite/discovery/route-types-writer.d.ts +32 -0
  781. package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +22 -0
  782. package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +40 -0
  783. package/dist/types.backup/vite/discovery/state.d.ts +162 -0
  784. package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +15 -0
  785. package/dist/types.backup/vite/index.d.ts +11 -0
  786. package/dist/types.backup/vite/inject-client-debug.d.ts +56 -0
  787. package/dist/types.backup/vite/plugin-types.d.ts +298 -0
  788. package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +6 -0
  789. package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +40 -0
  790. package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +35 -0
  791. package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
  792. package/dist/types.backup/vite/plugins/expose-action-id.d.ts +18 -0
  793. package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +37 -0
  794. package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
  795. package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
  796. package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
  797. package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +13 -0
  798. package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +29 -0
  799. package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +6 -0
  800. package/dist/types.backup/vite/plugins/performance-tracks.d.ts +25 -0
  801. package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +20 -0
  802. package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +20 -0
  803. package/dist/types.backup/vite/plugins/vercel-output.d.ts +85 -0
  804. package/dist/types.backup/vite/plugins/version-injector.d.ts +21 -0
  805. package/dist/types.backup/vite/plugins/version-plugin.d.ts +19 -0
  806. package/dist/types.backup/vite/plugins/virtual-entries.d.ts +36 -0
  807. package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +7 -0
  808. package/dist/types.backup/vite/rango.d.ts +29 -0
  809. package/dist/types.backup/vite/router-discovery.d.ts +23 -0
  810. package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +64 -0
  811. package/dist/types.backup/vite/utils/banner.d.ts +2 -0
  812. package/dist/types.backup/vite/utils/bundle-analysis.d.ts +28 -0
  813. package/dist/types.backup/vite/utils/client-chunks.d.ts +55 -0
  814. package/dist/types.backup/vite/utils/directive-prologue.d.ts +16 -0
  815. package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +37 -0
  816. package/dist/types.backup/vite/utils/manifest-utils.d.ts +7 -0
  817. package/dist/types.backup/vite/utils/package-resolution.d.ts +6 -0
  818. package/dist/types.backup/vite/utils/prerender-utils.d.ts +32 -0
  819. package/dist/types.backup/vite/utils/shared-utils.d.ts +55 -0
  820. package/dist/vite/index.js +9695 -3592
  821. package/package.json +119 -39
  822. package/skills/api-client/SKILL.md +211 -0
  823. package/skills/breadcrumbs/SKILL.md +82 -5
  824. package/skills/bundle-analysis/SKILL.md +159 -0
  825. package/skills/cache-guide/SKILL.md +232 -34
  826. package/skills/caching/SKILL.md +375 -19
  827. package/skills/catalog.json +283 -0
  828. package/skills/cloudflare/SKILL.md +151 -0
  829. package/skills/cloudflare/agents/openai.yaml +4 -0
  830. package/skills/cloudflare/references/d1-and-local-dev.md +131 -0
  831. package/skills/cloudflare/references/streaming-and-deploy.md +107 -0
  832. package/skills/cloudflare/references/webhooks-and-crypto.md +147 -0
  833. package/skills/comparison/SKILL.md +50 -0
  834. package/skills/comparison/agents/openai.yaml +4 -0
  835. package/skills/comparison/references/framework-comparison.md +844 -0
  836. package/skills/composability/SKILL.md +124 -4
  837. package/skills/css/SKILL.md +76 -0
  838. package/skills/debug-manifest/SKILL.md +5 -11
  839. package/skills/defer-hydration/SKILL.md +235 -0
  840. package/skills/deployment-caching/SKILL.md +176 -0
  841. package/skills/document-cache/SKILL.md +116 -58
  842. package/skills/fonts/SKILL.md +1 -1
  843. package/skills/handler-use/SKILL.md +12 -10
  844. package/skills/hooks/SKILL.md +73 -699
  845. package/skills/hooks/data.md +273 -0
  846. package/skills/hooks/handle-and-actions.md +103 -0
  847. package/skills/hooks/navigation.md +110 -0
  848. package/skills/hooks/outlets.md +62 -0
  849. package/skills/hooks/state.md +228 -0
  850. package/skills/hooks/urls.md +135 -0
  851. package/skills/host-router/SKILL.md +129 -27
  852. package/skills/i18n/SKILL.md +276 -0
  853. package/skills/intercept/SKILL.md +75 -19
  854. package/skills/layout/SKILL.md +40 -19
  855. package/skills/links/SKILL.md +211 -17
  856. package/skills/loader/SKILL.md +230 -25
  857. package/skills/middleware/SKILL.md +58 -13
  858. package/skills/migrate-nextjs/SKILL.md +267 -33
  859. package/skills/migrate-nextjs/backend-host-swap.md +120 -0
  860. package/skills/migrate-react-router/SKILL.md +59 -671
  861. package/skills/migrate-react-router/component-migration.md +196 -0
  862. package/skills/migrate-react-router/data-and-actions.md +225 -0
  863. package/skills/migrate-react-router/route-mapping.md +271 -0
  864. package/skills/mime-routes/SKILL.md +55 -18
  865. package/skills/observability/SKILL.md +231 -0
  866. package/skills/parallel/SKILL.md +50 -10
  867. package/skills/ppr/SKILL.md +904 -0
  868. package/skills/prerender/SKILL.md +130 -68
  869. package/skills/rango/SKILL.md +321 -26
  870. package/skills/react-compiler/SKILL.md +168 -0
  871. package/skills/response-routes/SKILL.md +172 -52
  872. package/skills/route/SKILL.md +123 -9
  873. package/skills/router-setup/SKILL.md +53 -9
  874. package/skills/scripts/SKILL.md +179 -0
  875. package/skills/server-actions/SKILL.md +776 -0
  876. package/skills/shell-manifest/SKILL.md +185 -0
  877. package/skills/streams-and-websockets/SKILL.md +1 -1
  878. package/skills/tailwind/SKILL.md +28 -4
  879. package/skills/testing/SKILL.md +131 -0
  880. package/skills/testing/bindings.md +103 -0
  881. package/skills/testing/cache-prerender.md +172 -0
  882. package/skills/testing/client-components.md +131 -0
  883. package/skills/testing/e2e-parity.md +125 -0
  884. package/skills/testing/flight.md +91 -0
  885. package/skills/testing/handles.md +131 -0
  886. package/skills/testing/loader.md +128 -0
  887. package/skills/testing/middleware.md +99 -0
  888. package/skills/testing/render-handler.md +122 -0
  889. package/skills/testing/response-routes.md +95 -0
  890. package/skills/testing/reverse-and-types.md +85 -0
  891. package/skills/testing/server-actions.md +107 -0
  892. package/skills/testing/server-tree.md +128 -0
  893. package/skills/testing/setup.md +123 -0
  894. package/skills/theme/SKILL.md +1 -1
  895. package/skills/typesafety/SKILL.md +45 -628
  896. package/skills/typesafety/env-and-bindings.md +254 -0
  897. package/skills/typesafety/generated-files-and-cli.md +342 -0
  898. package/skills/typesafety/params-and-search.md +153 -0
  899. package/skills/typesafety/route-types.md +213 -0
  900. package/skills/use-cache/SKILL.md +121 -15
  901. package/skills/vercel/SKILL.md +149 -0
  902. package/skills/view-transitions/SKILL.md +341 -0
  903. package/src/__augment-tests__/augment.ts +81 -0
  904. package/src/__augment-tests__/augmented.check.ts +116 -0
  905. package/src/__internal.ts +0 -65
  906. package/src/browser/action-coordinator.ts +53 -36
  907. package/src/browser/action-fence.ts +47 -0
  908. package/src/browser/app-shell.ts +14 -27
  909. package/src/browser/connection-warmup.ts +134 -0
  910. package/src/browser/cookie-name.ts +140 -0
  911. package/src/browser/dev-discovery.ts +66 -0
  912. package/src/browser/event-controller.ts +400 -168
  913. package/src/browser/history-state.ts +21 -0
  914. package/src/browser/index.ts +3 -3
  915. package/src/browser/invalidate-client-cache.ts +52 -0
  916. package/src/browser/link-interceptor.ts +469 -20
  917. package/src/browser/logging.ts +28 -0
  918. package/src/browser/merge-segment-loaders.ts +6 -4
  919. package/src/browser/navigation-bridge.ts +164 -69
  920. package/src/browser/navigation-client.ts +199 -96
  921. package/src/browser/navigation-store-handle.ts +38 -0
  922. package/src/browser/navigation-store.ts +165 -345
  923. package/src/browser/navigation-transaction.ts +9 -59
  924. package/src/browser/network-error-handler.ts +34 -7
  925. package/src/browser/notify-listeners.ts +22 -0
  926. package/src/browser/partial-update.ts +219 -163
  927. package/src/browser/prefetch/cache.ts +240 -97
  928. package/src/browser/prefetch/default-strategy.ts +74 -0
  929. package/src/browser/prefetch/fetch.ts +317 -51
  930. package/src/browser/prefetch/invalidation.ts +30 -0
  931. package/src/browser/prefetch/loader.ts +111 -0
  932. package/src/browser/prefetch/observer.ts +50 -22
  933. package/src/browser/prefetch/queue.ts +25 -7
  934. package/src/browser/prefetch/runtime.ts +6 -0
  935. package/src/browser/rango-state.ts +177 -114
  936. package/src/browser/react/Link.tsx +115 -75
  937. package/src/browser/react/NavigationProvider.tsx +194 -143
  938. package/src/browser/react/ScrollRestoration.tsx +10 -6
  939. package/src/browser/react/context.ts +4 -0
  940. package/src/browser/react/filter-segment-order.ts +66 -7
  941. package/src/browser/react/index.ts +0 -48
  942. package/src/browser/react/location-state-shared.ts +178 -8
  943. package/src/browser/react/location-state.ts +39 -14
  944. package/src/browser/react/use-action.ts +6 -15
  945. package/src/browser/react/use-handle.ts +17 -14
  946. package/src/browser/react/use-href.tsx +8 -1
  947. package/src/browser/react/use-link-status.ts +33 -8
  948. package/src/browser/react/use-navigation.ts +10 -5
  949. package/src/browser/react/use-params.ts +11 -11
  950. package/src/browser/react/use-reverse.ts +106 -0
  951. package/src/browser/react/use-router.ts +21 -6
  952. package/src/browser/react/use-search-params.ts +0 -5
  953. package/src/browser/react/use-segments.ts +11 -21
  954. package/src/browser/response-adapter.ts +99 -8
  955. package/src/browser/rsc-router.tsx +230 -42
  956. package/src/browser/scroll-restoration.ts +37 -22
  957. package/src/browser/segment-reconciler.ts +31 -21
  958. package/src/browser/segment-structure-assert.ts +2 -2
  959. package/src/browser/server-action-bridge.ts +262 -65
  960. package/src/browser/types.ts +132 -47
  961. package/src/browser/validate-redirect-origin.ts +43 -16
  962. package/src/build/collect-fallback-refs.ts +107 -0
  963. package/src/build/generate-manifest.ts +213 -184
  964. package/src/build/generate-route-types.ts +3 -1
  965. package/src/build/index.ts +11 -3
  966. package/src/build/merge-full-manifests.ts +161 -0
  967. package/src/build/prefix-tree-utils.ts +123 -0
  968. package/src/build/route-trie.ts +43 -280
  969. package/src/build/route-types/ast-route-extraction.ts +15 -8
  970. package/src/build/route-types/codegen.ts +16 -5
  971. package/src/build/route-types/include-resolution.ts +513 -64
  972. package/src/build/route-types/param-extraction.ts +6 -3
  973. package/src/build/route-types/per-module-writer.ts +33 -12
  974. package/src/build/route-types/router-processing.ts +312 -204
  975. package/src/build/route-types/scan-filter.ts +1 -1
  976. package/src/build/route-types/source-scan.ts +216 -0
  977. package/src/build/runtime-discovery.ts +32 -29
  978. package/src/cache/cache-error.ts +104 -0
  979. package/src/cache/cache-exec-scope.ts +47 -0
  980. package/src/cache/cache-key-utils.ts +73 -15
  981. package/src/cache/cache-policy.ts +108 -34
  982. package/src/cache/cache-runtime.ts +566 -121
  983. package/src/cache/cache-scope.ts +383 -105
  984. package/src/cache/cache-tag.ts +149 -0
  985. package/src/cache/cf/cf-base64.ts +33 -0
  986. package/src/cache/cf/cf-cache-constants.ts +134 -0
  987. package/src/cache/cf/cf-cache-store.ts +3028 -391
  988. package/src/cache/cf/cf-cache-types.ts +417 -0
  989. package/src/cache/cf/cf-kv-utils.ts +84 -0
  990. package/src/cache/cf/cf-tag-marker-memo.ts +108 -0
  991. package/src/cache/cf/cf-zone-purge.ts +101 -0
  992. package/src/cache/cf/index.ts +11 -16
  993. package/src/cache/document-cache.ts +184 -53
  994. package/src/cache/handle-snapshot.ts +92 -1
  995. package/src/cache/index.ts +32 -20
  996. package/src/cache/memory-segment-store.ts +286 -37
  997. package/src/cache/profile-registry.ts +46 -31
  998. package/src/cache/read-through-swr.ts +66 -16
  999. package/src/cache/search-params-filter.ts +118 -0
  1000. package/src/cache/segment-codec.ts +80 -25
  1001. package/src/cache/shell-snapshot.ts +516 -0
  1002. package/src/cache/tag-invalidation.ts +230 -0
  1003. package/src/cache/taint.ts +28 -9
  1004. package/src/cache/types.ts +323 -100
  1005. package/src/cache/vercel/index.ts +11 -0
  1006. package/src/cache/vercel/vercel-cache-store.ts +1264 -0
  1007. package/src/client-urls/client-root.tsx +161 -0
  1008. package/src/client-urls/client-urls.ts +665 -0
  1009. package/src/client-urls/navigation.ts +237 -0
  1010. package/src/client-urls/revalidation-protocol.ts +56 -0
  1011. package/src/client-urls/server-projection.ts +563 -0
  1012. package/src/client-urls/types.ts +178 -0
  1013. package/src/client.rsc.tsx +48 -21
  1014. package/src/client.tsx +77 -67
  1015. package/src/cloudflare/index.ts +11 -0
  1016. package/src/cloudflare/tracing.ts +112 -0
  1017. package/src/component-utils.ts +19 -0
  1018. package/src/components/DefaultDocument.tsx +8 -2
  1019. package/src/context-var.ts +18 -6
  1020. package/src/decode-loader-results.ts +160 -0
  1021. package/src/defer.ts +185 -0
  1022. package/src/deps/ssr.ts +4 -2
  1023. package/src/dev-discovery-protocol.ts +11 -0
  1024. package/src/encode-kv.ts +49 -0
  1025. package/src/errors.ts +44 -4
  1026. package/src/escape-script.ts +52 -0
  1027. package/src/handle.ts +67 -37
  1028. package/src/handles/MetaTags.tsx +24 -53
  1029. package/src/handles/Scripts.tsx +183 -0
  1030. package/src/handles/breadcrumbs.ts +35 -8
  1031. package/src/handles/deferred-resolution.ts +134 -0
  1032. package/src/handles/is-thenable.ts +16 -0
  1033. package/src/handles/meta.ts +14 -40
  1034. package/src/handles/script.ts +244 -0
  1035. package/src/host/cookie-handler.ts +9 -60
  1036. package/src/host/errors.ts +13 -22
  1037. package/src/host/index.ts +9 -2
  1038. package/src/host/pattern-matcher.ts +23 -52
  1039. package/src/host/router.ts +107 -99
  1040. package/src/host/testing.ts +40 -27
  1041. package/src/host/types.ts +37 -4
  1042. package/src/host/utils.ts +1 -1
  1043. package/src/href-client.ts +137 -22
  1044. package/src/index.rsc.ts +105 -12
  1045. package/src/index.ts +102 -14
  1046. package/src/internal-debug.ts +11 -10
  1047. package/src/loader-redirect.tsx +47 -0
  1048. package/src/loader-store.ts +500 -0
  1049. package/src/loader.rsc.ts +20 -13
  1050. package/src/loader.ts +12 -11
  1051. package/src/missing-id-error.ts +68 -0
  1052. package/src/outlet-context.ts +12 -0
  1053. package/src/outlet-provider.tsx +16 -6
  1054. package/src/prerender/build-shell-capture.ts +453 -0
  1055. package/src/prerender/param-hash.ts +16 -16
  1056. package/src/prerender/shell-manifest-key.ts +20 -0
  1057. package/src/prerender/store.ts +47 -38
  1058. package/src/prerender.ts +81 -13
  1059. package/src/redirect-origin.ts +143 -0
  1060. package/src/regex-escape.ts +8 -0
  1061. package/src/render-error-thrower.tsx +20 -0
  1062. package/src/response-utils.ts +34 -0
  1063. package/src/reverse.ts +65 -40
  1064. package/src/root-error-boundary.tsx +1 -19
  1065. package/src/route-content-wrapper.tsx +112 -78
  1066. package/src/route-definition/dsl-helpers.ts +300 -313
  1067. package/src/route-definition/helper-factories.ts +28 -140
  1068. package/src/route-definition/helpers-types.ts +92 -62
  1069. package/src/route-definition/index.ts +1 -2
  1070. package/src/route-definition/redirect.ts +44 -11
  1071. package/src/route-definition/resolve-handler-use.ts +6 -1
  1072. package/src/route-definition/use-item-types.ts +29 -0
  1073. package/src/route-map-builder.ts +102 -74
  1074. package/src/route-types.ts +19 -46
  1075. package/src/router/basename.ts +14 -0
  1076. package/src/router/content-negotiation.ts +120 -30
  1077. package/src/router/error-handling.ts +110 -29
  1078. package/src/router/find-match.ts +129 -30
  1079. package/src/router/handler-context.ts +41 -57
  1080. package/src/router/instrument.ts +401 -0
  1081. package/src/router/intercept-resolution.ts +98 -21
  1082. package/src/router/lazy-includes.ts +82 -58
  1083. package/src/router/loader-resolution.ts +401 -85
  1084. package/src/router/logging.ts +0 -6
  1085. package/src/router/manifest.ts +74 -40
  1086. package/src/router/match-api.ts +91 -55
  1087. package/src/router/match-context.ts +0 -22
  1088. package/src/router/match-handlers.ts +268 -171
  1089. package/src/router/match-middleware/background-revalidation.ts +40 -24
  1090. package/src/router/match-middleware/cache-lookup.ts +316 -302
  1091. package/src/router/match-middleware/cache-store.ts +134 -52
  1092. package/src/router/match-middleware/intercept-resolution.ts +0 -22
  1093. package/src/router/match-middleware/segment-resolution.ts +0 -22
  1094. package/src/router/match-pipelines.ts +1 -42
  1095. package/src/router/match-result.ts +76 -79
  1096. package/src/router/metrics.ts +17 -36
  1097. package/src/router/middleware-types.ts +20 -110
  1098. package/src/router/middleware.ts +275 -173
  1099. package/src/router/navigation-snapshot.ts +51 -60
  1100. package/src/router/params-util.ts +23 -0
  1101. package/src/router/parse-pattern.ts +115 -0
  1102. package/src/router/pattern-matching.ts +134 -154
  1103. package/src/router/prefetch-cache-ttl.ts +51 -0
  1104. package/src/router/prefetch-default.ts +59 -0
  1105. package/src/router/prefetch-limits.ts +37 -0
  1106. package/src/router/prerender-match.ts +159 -69
  1107. package/src/router/preview-match.ts +6 -2
  1108. package/src/router/request-classification.ts +50 -69
  1109. package/src/router/revalidation.ts +146 -83
  1110. package/src/router/route-snapshot.ts +14 -3
  1111. package/src/router/route-trie-builder.ts +334 -0
  1112. package/src/router/router-context.ts +6 -29
  1113. package/src/router/router-interfaces.ts +168 -38
  1114. package/src/router/router-options.ts +235 -11
  1115. package/src/router/router-registry.ts +2 -5
  1116. package/src/router/segment-resolution/fresh.ts +163 -88
  1117. package/src/router/segment-resolution/helpers.ts +96 -18
  1118. package/src/router/segment-resolution/loader-cache.ts +187 -39
  1119. package/src/router/segment-resolution/loader-mask.ts +60 -0
  1120. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  1121. package/src/router/segment-resolution/mask-nested.ts +99 -0
  1122. package/src/router/segment-resolution/revalidation.ts +316 -321
  1123. package/src/router/segment-resolution/static-store.ts +55 -15
  1124. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1125. package/src/router/segment-resolution/view-transition-default.ts +60 -0
  1126. package/src/router/segment-resolution.ts +5 -1
  1127. package/src/router/segment-wrappers.ts +6 -5
  1128. package/src/router/state-cookie-name.ts +33 -0
  1129. package/src/router/substitute-pattern-params.ts +75 -0
  1130. package/src/router/telemetry-otel.ts +171 -200
  1131. package/src/router/telemetry.ts +106 -20
  1132. package/src/router/timeout.ts +53 -22
  1133. package/src/router/tracing.ts +235 -0
  1134. package/src/router/transition-when.ts +76 -0
  1135. package/src/router/trie-matching.ts +170 -64
  1136. package/src/router/types.ts +9 -63
  1137. package/src/router/url-params.ts +13 -5
  1138. package/src/router.ts +248 -77
  1139. package/src/rsc/capture-queue.ts +218 -0
  1140. package/src/rsc/full-payload.ts +77 -0
  1141. package/src/rsc/handler-context.ts +4 -2
  1142. package/src/rsc/handler.ts +562 -284
  1143. package/src/rsc/helpers.ts +179 -9
  1144. package/src/rsc/index.ts +2 -5
  1145. package/src/rsc/json-route-result.ts +38 -0
  1146. package/src/rsc/loader-fetch.ts +116 -40
  1147. package/src/rsc/manifest-init.ts +55 -56
  1148. package/src/rsc/nonce.ts +10 -1
  1149. package/src/rsc/origin-guard.ts +39 -25
  1150. package/src/rsc/progressive-enhancement.ts +377 -84
  1151. package/src/rsc/redirect-guard.ts +102 -0
  1152. package/src/rsc/render-pipeline.ts +611 -0
  1153. package/src/rsc/response-cache-serve.ts +259 -0
  1154. package/src/rsc/response-error.ts +79 -12
  1155. package/src/rsc/response-route-handler.ts +73 -212
  1156. package/src/rsc/routine-plan.ts +359 -0
  1157. package/src/rsc/rsc-rendering.ts +1624 -171
  1158. package/src/rsc/runtime-warnings.ts +23 -10
  1159. package/src/rsc/server-action.ts +420 -139
  1160. package/src/rsc/shell-build-manifest.ts +336 -0
  1161. package/src/rsc/shell-capture-constants.ts +45 -0
  1162. package/src/rsc/shell-capture.ts +2063 -0
  1163. package/src/rsc/shell-serve.ts +337 -0
  1164. package/src/rsc/ssr-setup.ts +111 -16
  1165. package/src/rsc/stream-idle.ts +137 -0
  1166. package/src/rsc/transition-gate.ts +86 -0
  1167. package/src/rsc/types.ts +91 -5
  1168. package/src/runtime-env.ts +18 -0
  1169. package/src/search-params.ts +35 -30
  1170. package/src/segment-fragments.ts +165 -0
  1171. package/src/segment-loader-promise.ts +49 -4
  1172. package/src/segment-system.tsx +441 -153
  1173. package/src/serialize.ts +243 -0
  1174. package/src/server/context.ts +416 -55
  1175. package/src/server/cookie-parse.ts +32 -0
  1176. package/src/server/cookie-store.ts +162 -15
  1177. package/src/server/handle-store.ts +190 -70
  1178. package/src/server/loader-registry.ts +33 -42
  1179. package/src/server/request-context.ts +805 -177
  1180. package/src/server.ts +7 -2
  1181. package/src/ssr/index.tsx +631 -183
  1182. package/src/ssr/inject-rsc-eager.ts +167 -0
  1183. package/src/ssr/preinit-client-references.ts +106 -0
  1184. package/src/ssr/ssr-root.tsx +262 -0
  1185. package/src/static-handler.ts +28 -15
  1186. package/src/testing/cache-status.ts +162 -0
  1187. package/src/testing/collect-handle.ts +46 -0
  1188. package/src/testing/dispatch.ts +951 -0
  1189. package/src/testing/dom.entry.ts +22 -0
  1190. package/src/testing/e2e/fixture.ts +188 -0
  1191. package/src/testing/e2e/index.ts +147 -0
  1192. package/src/testing/e2e/matchers.ts +35 -0
  1193. package/src/testing/e2e/page-helpers.ts +319 -0
  1194. package/src/testing/e2e/parity.ts +400 -0
  1195. package/src/testing/e2e/server.ts +195 -0
  1196. package/src/testing/flight-matchers.ts +97 -0
  1197. package/src/testing/flight-normalize.ts +11 -0
  1198. package/src/testing/flight-runtime.d.ts +57 -0
  1199. package/src/testing/flight-tree.ts +682 -0
  1200. package/src/testing/flight.entry.ts +52 -0
  1201. package/src/testing/flight.ts +257 -0
  1202. package/src/testing/generated-routes.ts +199 -0
  1203. package/src/testing/index.ts +121 -0
  1204. package/src/testing/internal/context.ts +380 -0
  1205. package/src/testing/internal/flight-client-globals.ts +30 -0
  1206. package/src/testing/internal/seed-vars.ts +54 -0
  1207. package/src/testing/render-handler.ts +371 -0
  1208. package/src/testing/render-route.tsx +667 -0
  1209. package/src/testing/run-loader.ts +423 -0
  1210. package/src/testing/run-middleware.ts +219 -0
  1211. package/src/testing/run-transition-when.ts +197 -0
  1212. package/src/testing/shell-status.ts +206 -0
  1213. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1214. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1215. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1216. package/src/testing/vitest-stubs/version.ts +5 -0
  1217. package/src/testing/vitest.ts +305 -0
  1218. package/src/theme/ThemeProvider.tsx +56 -84
  1219. package/src/theme/ThemeScript.tsx +7 -9
  1220. package/src/theme/constants.ts +52 -13
  1221. package/src/theme/index.ts +0 -7
  1222. package/src/theme/theme-context.ts +1 -5
  1223. package/src/theme/theme-script.ts +22 -21
  1224. package/src/theme/use-theme.ts +0 -3
  1225. package/src/types/boundaries.ts +15 -35
  1226. package/src/types/cache-types.ts +13 -4
  1227. package/src/types/error-types.ts +30 -90
  1228. package/src/types/global-namespace.ts +54 -41
  1229. package/src/types/handler-context.ts +121 -30
  1230. package/src/types/index.ts +3 -10
  1231. package/src/types/loader-types.ts +38 -7
  1232. package/src/types/request-scope.ts +8 -22
  1233. package/src/types/route-config.ts +20 -52
  1234. package/src/types/route-entry.ts +3 -6
  1235. package/src/types/segments.ts +147 -14
  1236. package/src/urls/include-helper.ts +38 -64
  1237. package/src/urls/include-provider.ts +71 -0
  1238. package/src/urls/index.ts +2 -11
  1239. package/src/urls/path-helper-types.ts +76 -24
  1240. package/src/urls/path-helper.ts +30 -110
  1241. package/src/urls/pattern-types.ts +101 -19
  1242. package/src/urls/response-types.ts +20 -19
  1243. package/src/urls/type-extraction.ts +98 -154
  1244. package/src/urls/urls-function.ts +1 -19
  1245. package/src/use-loader.tsx +355 -109
  1246. package/src/vercel/index.ts +11 -0
  1247. package/src/vercel/tracing.ts +89 -0
  1248. package/src/vite/debug.ts +102 -3
  1249. package/src/vite/discovery/bundle-postprocess.ts +18 -14
  1250. package/src/vite/discovery/client-urls-projection.ts +322 -0
  1251. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1252. package/src/vite/discovery/discover-routers.ts +178 -151
  1253. package/src/vite/discovery/discovery-errors.ts +255 -0
  1254. package/src/vite/discovery/gate-state.ts +171 -0
  1255. package/src/vite/discovery/prerender-collection.ts +125 -70
  1256. package/src/vite/discovery/route-types-writer.ts +40 -84
  1257. package/src/vite/discovery/self-gen-tracking.ts +27 -1
  1258. package/src/vite/discovery/shell-prerender-phase.ts +397 -0
  1259. package/src/vite/discovery/state.ts +104 -6
  1260. package/src/vite/discovery/virtual-module-codegen.ts +226 -87
  1261. package/src/vite/encryption-key.ts +29 -0
  1262. package/src/vite/index.ts +12 -0
  1263. package/src/vite/inject-client-debug.ts +88 -0
  1264. package/src/vite/plugin-types.ts +243 -10
  1265. package/src/vite/plugins/cjs-to-esm.ts +16 -19
  1266. package/src/vite/plugins/client-ref-dedup.ts +16 -11
  1267. package/src/vite/plugins/client-ref-hashing.ts +28 -15
  1268. package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
  1269. package/src/vite/plugins/expose-action-id.ts +50 -97
  1270. package/src/vite/plugins/expose-id-utils.ts +88 -55
  1271. package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
  1272. package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
  1273. package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
  1274. package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
  1275. package/src/vite/plugins/expose-internal-ids.ts +551 -486
  1276. package/src/vite/plugins/performance-tracks.ts +25 -22
  1277. package/src/vite/plugins/refresh-cmd.ts +1 -1
  1278. package/src/vite/plugins/server-ref-hashing.ts +74 -0
  1279. package/src/vite/plugins/server-reference-pattern.ts +10 -0
  1280. package/src/vite/plugins/use-cache-transform.ts +73 -83
  1281. package/src/vite/plugins/vercel-output.ts +384 -0
  1282. package/src/vite/plugins/version-injector.ts +39 -29
  1283. package/src/vite/plugins/version-plugin.ts +45 -40
  1284. package/src/vite/plugins/virtual-entries.ts +193 -30
  1285. package/src/vite/rango.ts +240 -128
  1286. package/src/vite/router-discovery.ts +1518 -174
  1287. package/src/vite/utils/ast-handler-extract.ts +26 -35
  1288. package/src/vite/utils/bundle-analysis.ts +10 -15
  1289. package/src/vite/utils/client-chunks.ts +184 -0
  1290. package/src/vite/utils/directive-prologue.ts +40 -0
  1291. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1292. package/src/vite/utils/manifest-utils.ts +1 -59
  1293. package/src/vite/utils/package-resolution.ts +2 -73
  1294. package/src/vite/utils/prerender-utils.ts +96 -49
  1295. package/src/vite/utils/shared-utils.ts +156 -43
  1296. package/src/browser/action-response-classifier.ts +0 -99
  1297. package/src/browser/react/use-client-cache.ts +0 -58
  1298. package/src/browser/shallow.ts +0 -40
  1299. package/src/handles/index.ts +0 -7
  1300. package/src/network-error-thrower.tsx +0 -23
  1301. package/src/router/middleware-cookies.ts +0 -55
package/src/ssr/index.tsx CHANGED
@@ -1,18 +1,12 @@
1
1
  import React from "react";
2
- import { renderSegments } from "../segment-system.js";
3
- import { filterSegmentOrder } from "../browser/react/filter-segment-order.js";
4
- import { ThemeProvider } from "../theme/ThemeProvider.js";
5
- import { NonceContext } from "../browser/react/nonce-context.js";
6
- import { NavigationStoreContext } from "../browser/react/context.js";
7
- import type { NavigationStoreContextValue } from "../browser/react/context.js";
8
- import type { HandleData } from "../browser/types.js";
2
+ import { createSsrRootComponent } from "./ssr-root.js";
3
+ import { injectRSCPayloadEager } from "./inject-rsc-eager.js";
4
+ import { runWithPreinitNonce } from "./preinit-client-references.js";
5
+ import { SHELL_CAPTURE_MAX_WAIT_MS } from "../rsc/shell-capture-constants.js";
9
6
  import type { ErrorPhase } from "../types.js";
10
- import type { ResolvedSegment } from "../types.js";
11
- import type { ResolvedThemeConfig, Theme } from "../theme/types.js";
12
- import type {
13
- EventController,
14
- DerivedNavigationState,
15
- } from "../browser/event-controller.js";
7
+ import type { HeadScriptsOption } from "../vite/plugin-types.js";
8
+
9
+ export { installClientReferencePreinit } from "./preinit-client-references.js";
16
10
 
17
11
  /**
18
12
  * Options for injectRSCPayload
@@ -29,6 +23,7 @@ export interface InjectRSCPayloadOptions {
29
23
  */
30
24
  interface RenderToReadableStreamOptions {
31
25
  bootstrapScriptContent?: string;
26
+ bootstrapModules?: string[];
32
27
  nonce?: string;
33
28
  formState?: unknown;
34
29
  }
@@ -40,6 +35,52 @@ interface ReactDOMReadableStream extends ReadableStream<Uint8Array> {
40
35
  allReady: Promise<void>;
41
36
  }
42
37
 
38
+ /**
39
+ * Options for prerender from react-dom/static.edge
40
+ */
41
+ interface PrerenderOptions {
42
+ signal?: AbortSignal;
43
+ bootstrapScriptContent?: string;
44
+ bootstrapModules?: string[];
45
+ onError?: (error: unknown) => void;
46
+ }
47
+
48
+ /**
49
+ * Result of prerender from react-dom/static.edge. `postponed` is React's
50
+ * opaque resume state — non-null when the render was aborted with pending
51
+ * holes, null when the shell completed with nothing left to stream.
52
+ */
53
+ interface PrerenderResult {
54
+ prelude: ReadableStream<Uint8Array>;
55
+ postponed: unknown;
56
+ }
57
+
58
+ /**
59
+ * prerender from react-dom/static.edge
60
+ */
61
+ type PrerenderFn = (
62
+ element: React.ReactNode,
63
+ options?: PrerenderOptions,
64
+ ) => Promise<PrerenderResult>;
65
+
66
+ /**
67
+ * Options for resume from react-dom/server.edge
68
+ */
69
+ interface ResumeOptions {
70
+ onError?: (error: unknown) => void;
71
+ nonce?: string;
72
+ }
73
+
74
+ /**
75
+ * resume from react-dom/server.edge — continues a prerendered render, emitting
76
+ * only the postponed holes.
77
+ */
78
+ type ResumeFn = (
79
+ element: React.ReactNode,
80
+ postponedState: unknown,
81
+ options?: ResumeOptions,
82
+ ) => Promise<ReactDOMReadableStream>;
83
+
43
84
  /**
44
85
  * Options for the renderHTML function
45
86
  */
@@ -71,7 +112,7 @@ export interface SSRRenderOptions {
71
112
  */
72
113
  export interface SSRDependencies<TEnv = unknown> {
73
114
  /**
74
- * createFromReadableStream from @vitejs/plugin-rsc/ssr
115
+ * createFromReadableStream from @rangojs/router/internal/deps/ssr
75
116
  */
76
117
  createFromReadableStream: <T>(
77
118
  stream: ReadableStream<Uint8Array>,
@@ -86,7 +127,7 @@ export interface SSRDependencies<TEnv = unknown> {
86
127
  ) => Promise<ReactDOMReadableStream>;
87
128
 
88
129
  /**
89
- * injectRSCPayload from rsc-html-stream/server
130
+ * injectRSCPayload from @rangojs/router/internal/deps/html-stream-server
90
131
  */
91
132
  injectRSCPayload: (
92
133
  rscStream: ReadableStream<Uint8Array>,
@@ -99,6 +140,29 @@ export interface SSRDependencies<TEnv = unknown> {
99
140
  */
100
141
  loadBootstrapScriptContent: () => Promise<string>;
101
142
 
143
+ /**
144
+ * Document script strategy; the generated virtual SSR entry threads the
145
+ * `rango({ headScripts })` plugin option here (canonical docs on
146
+ * `RangoBaseOptions.headScripts` in vite/plugin-types.ts). The
147
+ * bootstrapModules conversion runs ONLY on an explicit `"preinit"`:
148
+ * undefined keeps the inline bootstrap verbatim, so a custom SSR entry that
149
+ * never installed the preinit hook cannot drift into the half-converted
150
+ * state on upgrade (the generated entry always passes an explicit value).
151
+ */
152
+ headScripts?: HeadScriptsOption;
153
+
154
+ /**
155
+ * prerender from react-dom/static.edge. Optional; required only by
156
+ * {@link createShellCaptureHandler} for PPR shell capture.
157
+ */
158
+ prerender?: PrerenderFn;
159
+
160
+ /**
161
+ * resume from react-dom/server.edge. Optional; required only by
162
+ * {@link createShellResumeHandler} for resuming a postponed shell.
163
+ */
164
+ resume?: ResumeFn;
165
+
102
166
  /**
103
167
  * Optional callback invoked when an error occurs during SSR rendering.
104
168
  *
@@ -119,94 +183,232 @@ export interface SSRDependencies<TEnv = unknown> {
119
183
  }
120
184
 
121
185
  /**
122
- * RSC payload type (minimal interface for SSR)
186
+ * Fixed number of macrotask hops between `quiesce` resolving and the abort. These
187
+ * give React's fizz worker turns to flush the settled shell into the prelude and
188
+ * mark still-pending boundaries as POSTPONED (rather than errored) before
189
+ * controller.abort() lands. Not a wall-clock wait.
190
+ *
191
+ * Why 16 and not the original 2: under the REPLAY-ONLY capture model
192
+ * (docs/design/ppr-shell-resume.md), the capture Flight render serializes ring-3
193
+ * cached segments that are ALREADY serialized, so it emits the whole shell payload
194
+ * in the first tick and the gate declares quiesce almost immediately (~a few ms).
195
+ * On the old fresh-execution path the Flight dribbled out as handlers ran, so
196
+ * Flight-quiet effectively meant "the shell has rendered" and 2 hops sufficed.
197
+ *
198
+ * Hops alone are NOT render-readiness: fizz cannot emit even <html> until the
199
+ * payload root settles, which waits on every referenced client-module LOAD —
200
+ * real module-runner I/O in dev (100ms+ cold), which no fixed count of near-
201
+ * zero-cost task hops can buy. captureShellHTML therefore awaits the payload-
202
+ * settled signal (SsrRootOptions.onPayloadSettled, deadline-bounded) between
203
+ * quiesce and these hops; the hops then only flush the settled tree and mark
204
+ * pending boundaries POSTPONED. Still task-based (masked loaders never emit,
205
+ * so more hops never lets a hole settle). Bounded by maxWaitMs end to end.
123
206
  */
124
- interface RscPayload {
125
- metadata?: {
126
- segments?: ResolvedSegment[];
127
- rootLayout?: React.ComponentType<{ children: React.ReactNode }>;
128
- handles?: AsyncGenerator<HandleData, void, unknown>;
129
- matched?: string[];
130
- pathname?: string;
131
- params?: Record<string, string>;
132
- basename?: string;
133
- themeConfig?: ResolvedThemeConfig | null;
134
- initialTheme?: Theme;
135
- version?: string;
136
- };
207
+ const POST_QUIESCE_TASK_HOPS = 16;
208
+
209
+ /**
210
+ * Route an SSR error through the deps.onError notification callback with the
211
+ * "rendering" phase. Swallows callback failures so a broken reporter never
212
+ * masks the original error. Shared by renderHTML, capture, and resume so the
213
+ * onError contract is identical across all three handlers.
214
+ */
215
+ function reportRenderError(
216
+ onError: SSRDependencies["onError"],
217
+ error: unknown,
218
+ ): void {
219
+ if (onError) {
220
+ const errorObj = error instanceof Error ? error : new Error(String(error));
221
+ try {
222
+ onError(errorObj, { phase: "rendering" });
223
+ } catch (callbackError) {
224
+ console.error("[SSRHandler.onError] Callback error:", callbackError);
225
+ }
226
+ }
137
227
  }
138
228
 
139
229
  /**
140
- * Consume an async generator and return a Promise that resolves with the final value.
141
- * Used for SSR where we need to await all handle data before rendering.
230
+ * Yield one macrotask. Used by capture to let React's fizz worker flush the
231
+ * shell and mark still-pending boundaries as postponed before the abort.
142
232
  */
143
- async function consumeAsyncGenerator(
144
- generator: AsyncGenerator<HandleData, void, unknown>,
145
- ): Promise<HandleData> {
146
- let lastData: HandleData = {};
147
- for await (const data of generator) {
148
- lastData = data;
233
+ function macrotask(): Promise<void> {
234
+ return new Promise((resolve) => setTimeout(resolve, 0));
235
+ }
236
+
237
+ /**
238
+ * A timeout promise paired with a cancel() so the pending timer is cleared once
239
+ * the race is decided — otherwise the maxWait timer keeps the event loop alive
240
+ * for the full duration even after `quiesce` won.
241
+ */
242
+ function createCancelableTimeout(ms: number): {
243
+ promise: Promise<void>;
244
+ cancel: () => void;
245
+ } {
246
+ let id: ReturnType<typeof setTimeout> | undefined;
247
+ const promise = new Promise<void>((resolve) => {
248
+ id = setTimeout(resolve, ms);
249
+ });
250
+ return { promise, cancel: () => clearTimeout(id) };
251
+ }
252
+
253
+ /**
254
+ * True when a debugger is attached outside a production build: a breakpoint
255
+ * pauses script execution but not wall-clock, so the capture deadline would
256
+ * expire mid-inspection and push the key into refusal/backoff while debugging.
257
+ * Next.js precedent (packages/next/src/export/worker.ts): its static-page
258
+ * timeout race is disabled when NODE_OPTIONS contains --inspect. The gate is
259
+ * the bare `process.env.NODE_ENV !== "production"` token — the build define
260
+ * folds exactly that token to a literal (same dev signal as shell-capture.ts's
261
+ * isDevMode), and it covers dev servers that never set NODE_ENV, the common
262
+ * debug case. A production worker launched with --inspect in NODE_OPTIONS
263
+ * keeps the capture's safety bound unconditionally. Every probe is guarded:
264
+ * `process` reads are optional-chained and the node:inspector import is
265
+ * try/caught, so non-Node runtimes (workerd) resolve to false instead of
266
+ * breaking.
267
+ */
268
+ export async function isDebuggerAttached(): Promise<boolean> {
269
+ if (process.env.NODE_ENV === "production") return false;
270
+ try {
271
+ // Substring match also catches --inspect-brk / --inspect=PORT.
272
+ if (globalThis.process?.env?.NODE_OPTIONS?.includes("--inspect")) {
273
+ return true;
274
+ }
275
+ if (globalThis.process?.execArgv?.some((a) => a.startsWith("--inspect"))) {
276
+ return true;
277
+ }
278
+ const inspector = await import("node:inspector");
279
+ return inspector.url() !== undefined;
280
+ } catch {
281
+ return false;
149
282
  }
150
- return lastData;
151
283
  }
152
284
 
153
285
  /**
154
- * Create a minimal event controller for SSR.
155
- * This provides the correct pathname so useNavigation returns the right value during SSR.
286
+ * Drain a ReadableStream fully into a single Uint8Array. Capture buffers the
287
+ * whole prelude so it can be stored and later prepended byte-for-byte.
156
288
  */
157
- function createSsrEventController(opts: {
158
- pathname: string;
159
- params?: Record<string, string>;
160
- handleData?: HandleData;
161
- matched?: string[];
162
- }): EventController {
163
- const location = new URL(opts.pathname, "http://localhost");
164
- let params = opts.params ?? {};
165
- const handleState = {
166
- data: opts.handleData ?? {},
167
- segmentOrder: filterSegmentOrder(opts.matched ?? []),
168
- };
169
- const state: DerivedNavigationState = {
170
- state: "idle",
171
- isStreaming: false,
172
- isNavigating: false,
173
- location,
174
- pendingUrl: null,
175
- inflightActions: [],
176
- };
289
+ async function readStreamToUint8Array(
290
+ stream: ReadableStream<Uint8Array>,
291
+ ): Promise<Uint8Array> {
292
+ const reader = stream.getReader();
293
+ const chunks: Uint8Array[] = [];
294
+ let total = 0;
295
+ try {
296
+ while (true) {
297
+ const { done, value } = await reader.read();
298
+ if (done) break;
299
+ chunks.push(value);
300
+ total += value.length;
301
+ }
302
+ } catch (error) {
303
+ // Mid-read abort path (documented): the prelude stream errors with our
304
+ // abort reason while we are still reading it. Cancel the source before
305
+ // rethrowing so it is not left uncancelled; releaseLock always runs in
306
+ // finally. Mirrors src/rsc/rsc-rendering.ts's serve-side reader cleanup.
307
+ reader.cancel(error).catch(() => {});
308
+ throw error;
309
+ } finally {
310
+ reader.releaseLock();
311
+ }
312
+ const out = new Uint8Array(total);
313
+ let offset = 0;
314
+ for (const chunk of chunks) {
315
+ out.set(chunk, offset);
316
+ offset += chunk.length;
317
+ }
318
+ return out;
319
+ }
177
320
 
178
- return {
179
- getState: () => state,
180
- getLocation: () => location,
181
- subscribe: () => () => {},
182
- getActionState: () => ({
183
- state: "idle",
184
- actionId: null,
185
- payload: null,
186
- error: null,
187
- result: null,
188
- }),
189
- subscribeToAction: () => () => {},
190
- subscribeToHandles: () => () => {},
191
- setHandleData: () => {},
192
- getHandleState: () => handleState,
193
- setParams: (nextParams) => {
194
- params = nextParams;
195
- },
196
- getParams: () => params,
197
- setLocation: () => {},
198
- startNavigation: () => {
199
- throw new Error("Navigation not supported during SSR");
200
- },
201
- abortNavigation: () => {},
202
- startAction: () => {
203
- throw new Error("Actions not supported during SSR");
321
+ /**
322
+ * A minimal HTML stream for the resume DATA variant: one empty chunk, then
323
+ * close.
324
+ *
325
+ * injectRSCPayload only resolves its internal flight-data promise (and thus
326
+ * only writes the Flight payload <script> pushes) from inside transform()'s
327
+ * scheduled callback. A stream that closes without ever emitting a chunk never
328
+ * runs transform, so its flush() awaits a promise that is never resolved and
329
+ * the output deadlocks. Emitting a single empty chunk runs transform once,
330
+ * which is enough for the payload to be written and the trailer appended.
331
+ */
332
+ function createDataVariantHtmlStream(): ReadableStream<Uint8Array> {
333
+ return new ReadableStream({
334
+ start(controller) {
335
+ controller.enqueue(new Uint8Array(0));
336
+ controller.close();
204
337
  },
205
- abortAllActions: () => {},
206
- getCurrentNavigation: () => null,
207
- getInflightActions: () => new Map(),
208
- hadAnyConcurrentActions: () => false,
209
- };
338
+ });
339
+ }
340
+
341
+ /**
342
+ * Options for the captureShellHTML function returned by
343
+ * {@link createShellCaptureHandler}.
344
+ */
345
+ interface ShellCaptureOptions {
346
+ /** Caller-provided promise that resolves once the cached content settled. */
347
+ quiesce: Promise<void>;
348
+ /** Upper bound on how long to wait for `quiesce`. Default SHELL_CAPTURE_MAX_WAIT_MS. */
349
+ maxWaitMs?: number;
350
+ }
351
+
352
+ /**
353
+ * Result of a successful shell capture. `prelude` is the raw prelude bytes;
354
+ * `postponed` is React's resume state serialized to JSON, or null when the
355
+ * shell completed with no holes (the DATA variant).
356
+ */
357
+ interface ShellCaptureResult {
358
+ prelude: Uint8Array;
359
+ postponed: string | null;
360
+ }
361
+
362
+ /**
363
+ * Options for the resumeShellHTML function returned by
364
+ * {@link createShellResumeHandler}.
365
+ */
366
+ interface ShellResumeOptions {
367
+ /** JSON from capture; null selects the DATA variant (no fizz). */
368
+ postponed: string | null;
369
+ /** Nonce for CSP. */
370
+ nonce?: string;
371
+ }
372
+
373
+ /**
374
+ * The exact shape plugin-rsc's loadBootstrapScriptContent returns in both dev
375
+ * and build: a single dynamic import of the browser entry, nothing else.
376
+ * Escapes/other statements never appear in that generated content; anything
377
+ * that doesn't match falls back to inline bootstrapScriptContent unchanged.
378
+ */
379
+ const BOOTSTRAP_IMPORT_ONLY_RE =
380
+ /^\s*import\(\s*(["'])([^"'\\]+)\1\s*\)\s*;?\s*$/;
381
+
382
+ /**
383
+ * Prefer bootstrapModules over the inline import() bootstrap. When the content
384
+ * is exactly `import("<entry-url>")`, hand Fizz the URL instead: React then
385
+ * emits a `<link rel="modulepreload" fetchpriority="low">` hint in the head
386
+ * plus the executing `<script type="module" src async>` at end of shell — the
387
+ * entry fetch starts with the first flushed bytes instead of when the parser
388
+ * reaches an opaque inline script that only reveals the URL once executed.
389
+ * Fizz stamps the request nonce on both tags (the inline form needed that
390
+ * too), and under PPR both land in the stored prelude; on resume React has
391
+ * already cleared the bootstrap fields from the postponed state, so nothing
392
+ * re-emits.
393
+ */
394
+ function resolveBootstrapOptions(
395
+ content: string,
396
+ headScripts: SSRDependencies["headScripts"],
397
+ ): Pick<
398
+ RenderToReadableStreamOptions,
399
+ "bootstrapScriptContent" | "bootstrapModules"
400
+ > {
401
+ // Explicit opt-in only: undefined (a custom SSR entry that predates the
402
+ // option, which also never installed the preinit hook) keeps the inline
403
+ // bootstrap byte-for-byte — converting by default would break CSPs that
404
+ // allowlist the known inline import() via a script hash.
405
+ if (headScripts !== "preinit") {
406
+ return { bootstrapScriptContent: content };
407
+ }
408
+ const match = BOOTSTRAP_IMPORT_ONLY_RE.exec(content);
409
+ return match
410
+ ? { bootstrapModules: [match[2]!] }
411
+ : { bootstrapScriptContent: content };
210
412
  }
211
413
 
212
414
  /**
@@ -214,10 +416,10 @@ function createSsrEventController(opts: {
214
416
  *
215
417
  * @example
216
418
  * ```tsx
217
- * import { createSSRHandler } from "rsc-router/ssr";
218
- * import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
419
+ * import { createSSRHandler } from "@rangojs/router/ssr";
420
+ * import { createFromReadableStream } from "@rangojs/router/internal/deps/ssr";
219
421
  * import { renderToReadableStream } from "react-dom/server.edge";
220
- * import { injectRSCPayload } from "rsc-html-stream/server";
422
+ * import { injectRSCPayload } from "@rangojs/router/internal/deps/html-stream-server";
221
423
  *
222
424
  * export const renderHTML = createSSRHandler({
223
425
  * createFromReadableStream,
@@ -255,93 +457,27 @@ export function createSSRHandler<TEnv = unknown>(deps: SSRDependencies<TEnv>) {
255
457
  // - rscStream2: For browser hydration (inject as __FLIGHT_DATA__)
256
458
  const [rscStream1, rscStream2] = rscStream.tee();
257
459
 
258
- // Deserialize RSC stream to React tree
259
- let payload: Promise<RscPayload> | undefined;
260
- let handlesPromise: Promise<HandleData> | undefined;
261
- let ssrContextValue: NavigationStoreContextValue | undefined;
262
- function SsrRoot() {
263
- payload ??= createFromReadableStream<RscPayload>(rscStream1);
264
- const resolved = React.use(payload);
265
-
266
- const themeConfig = resolved.metadata?.themeConfig ?? null;
267
- const pathname = resolved.metadata?.pathname ?? "/";
268
-
269
- // Await handles before creating SSR event controller so hooks can
270
- // read request-local handle data via NavigationStoreContext.
271
- // The handles property is an async generator that yields on each push
272
- // Memoize the promise since async generators can only be iterated once
273
- let handleData: HandleData = {};
274
- if (resolved.metadata?.handles) {
275
- handlesPromise ??= consumeAsyncGenerator(resolved.metadata.handles);
276
- handleData = React.use(handlesPromise);
277
- }
278
-
279
- // Create SSR context with request-local pathname/params/handles.
280
- ssrContextValue ??= {
281
- store: null as any,
282
- eventController: createSsrEventController({
283
- pathname,
284
- params: resolved.metadata?.params,
285
- handleData,
286
- matched: resolved.metadata?.matched,
287
- }),
288
- navigate: async () => {},
289
- refresh: async () => {},
290
- version: resolved.metadata?.version,
291
- basename: resolved.metadata?.basename,
292
- };
293
-
294
- // Build content tree from segments.
295
- // Order must match NavigationProvider: NavigationStoreContext > ThemeProvider > content
296
- const reconstructedRoot = renderSegments(
297
- resolved.metadata?.segments ?? [],
298
- {
299
- rootLayout: resolved.metadata?.rootLayout,
300
- },
301
- );
302
- let content: React.ReactNode =
303
- reconstructedRoot instanceof Promise
304
- ? React.use(reconstructedRoot)
305
- : reconstructedRoot;
306
-
307
- // Wrap content with ThemeProvider if theme is enabled
308
- if (themeConfig) {
309
- content = (
310
- <ThemeProvider
311
- config={themeConfig}
312
- initialTheme={resolved.metadata?.initialTheme}
313
- >
314
- {content}
315
- </ThemeProvider>
316
- );
317
- }
318
-
319
- // Wrap with NonceContext so client components (e.g. MetaTags) can
320
- // apply CSP nonces to inline scripts during SSR. Always present to
321
- // match the browser-side NavigationProvider tree shape for hydration.
322
- content = (
323
- <NonceContext.Provider value={nonce}>{content}</NonceContext.Provider>
324
- );
325
-
326
- // Wrap with NavigationStoreContext for useNavigation hook
327
- return (
328
- <NavigationStoreContext.Provider value={ssrContextValue!}>
329
- {content}
330
- </NavigationStoreContext.Provider>
331
- );
332
- }
460
+ const SsrRoot = createSsrRootComponent({
461
+ createFromReadableStream,
462
+ rscStream: rscStream1,
463
+ nonce,
464
+ });
333
465
 
334
466
  // Get bootstrap script content
335
467
  const bootstrapScriptContent = await loadBootstrapScriptContent();
336
468
 
337
469
  // Render React tree to HTML stream
338
470
  // Pass formState for useActionState progressive enhancement if provided
339
- // Pass nonce for CSP if provided
340
- const htmlStream = await renderToReadableStream(<SsrRoot />, {
341
- bootstrapScriptContent,
342
- formState,
343
- nonce,
344
- });
471
+ // Pass nonce for CSP if provided. runWithPreinitNonce makes the same
472
+ // nonce visible to the client-reference preinit hook (ALS the hook is
473
+ // isolate-global, the nonce per request).
474
+ const htmlStream = await runWithPreinitNonce(nonce, () =>
475
+ renderToReadableStream(<SsrRoot />, {
476
+ ...resolveBootstrapOptions(bootstrapScriptContent, deps.headScripts),
477
+ formState,
478
+ nonce,
479
+ }),
480
+ );
345
481
 
346
482
  // Wait for all Suspense boundaries to resolve when streamMode is "allReady".
347
483
  // This buffers the entire HTML before flushing — used for bots that
@@ -353,16 +489,328 @@ export function createSSRHandler<TEnv = unknown>(deps: SSRDependencies<TEnv>) {
353
489
  // Inject RSC payload into HTML as <script nonce="...">__FLIGHT_DATA__</script>
354
490
  return htmlStream.pipeThrough(injectRSCPayload(rscStream2, { nonce }));
355
491
  } catch (error) {
356
- // Invoke onError callback if provided
357
- if (onError) {
358
- const errorObj =
359
- error instanceof Error ? error : new Error(String(error));
360
- try {
361
- onError(errorObj, { phase: "rendering" });
362
- } catch (callbackError) {
363
- console.error("[SSRHandler.onError] Callback error:", callbackError);
492
+ reportRenderError(onError, error);
493
+ throw error;
494
+ }
495
+ };
496
+ }
497
+
498
+ /**
499
+ * Create the PPR shell capture handler.
500
+ *
501
+ * captureShellHTML prerenders the shell over the (cached, loader-masked) Flight
502
+ * stream, aborts once the shell settles, and returns the prelude bytes plus the
503
+ * postponed resume state for storage. The stored pair is later served by
504
+ * {@link createShellResumeHandler}. See docs/design/ppr-shell-resume.md.
505
+ *
506
+ * Throws at creation if `deps.prerender` is missing — capture cannot run
507
+ * without react-dom/static.edge's prerender.
508
+ */
509
+ export function createShellCaptureHandler<TEnv = unknown>(
510
+ deps: SSRDependencies<TEnv>,
511
+ ) {
512
+ const { createFromReadableStream, loadBootstrapScriptContent, prerender } =
513
+ deps;
514
+ const onError = deps.onError;
515
+
516
+ if (!prerender) {
517
+ throw new Error(
518
+ "[createShellCaptureHandler] Missing `prerender` dependency (react-dom/static.edge). " +
519
+ "PPR shell capture requires the prerender export; wire it in the SSR virtual entry.",
520
+ );
521
+ }
522
+
523
+ /**
524
+ * Prerender the shell and return the stored artifacts, or null when the
525
+ * shell degraded (root postpone / hung handles) and must not be cached.
526
+ *
527
+ * @param rscStream - Flight stream to render the shell over. Not teed and not
528
+ * piped through injectRSCPayload: the hydration payload is produced fresh
529
+ * per request by the resume/serve pass.
530
+ * @param opts - quiesce signal and maxWait guard.
531
+ */
532
+ return async function captureShellHTML(
533
+ rscStream: ReadableStream<Uint8Array>,
534
+ opts: ShellCaptureOptions,
535
+ ): Promise<ShellCaptureResult | null> {
536
+ const maxWaitMs = opts.maxWaitMs ?? SHELL_CAPTURE_MAX_WAIT_MS;
537
+
538
+ // Arm the maxWaitMs deadline BEFORE the first await so it bounds the ENTIRE
539
+ // capture, the bootstrap-script load included. loadBootstrapScriptContent()
540
+ // used to run before the timer, so a hung/slow bootstrap load hung
541
+ // captureShellHTML with no upper bound and held the background capture task
542
+ // open. One deadline, shared by the bootstrap race below and the quiesce
543
+ // race, keeps the whole path "bounded by maxWaitMs like every quiesce input".
544
+ // Debugger attached (non-production, see isDebuggerAttached): a paused process
545
+ // must not burn the budget, so the deadline becomes a never-resolving
546
+ // promise (the Next.js approach) — no timer, so it cannot hold the event
547
+ // loop open either.
548
+ const deadline = (await isDebuggerAttached())
549
+ ? { promise: new Promise<void>(() => {}), cancel: () => {} }
550
+ : createCancelableTimeout(maxWaitMs);
551
+ try {
552
+ // No nonce (nonce'd requests never reach capture); no formState.
553
+ // payloadSettled: fires when the Flight payload root settles — i.e.
554
+ // every client-module load the payload references completed and fizz
555
+ // can actually emit the tree. The abort below gates on it (bounded by
556
+ // the same deadline): Flight byte-quiet alone is NOT render-readiness.
557
+ let settlePayload!: () => void;
558
+ const payloadSettled = new Promise<void>((resolve) => {
559
+ settlePayload = resolve;
560
+ });
561
+ const SsrRoot = createSsrRootComponent({
562
+ createFromReadableStream,
563
+ rscStream,
564
+ onPayloadSettled: settlePayload,
565
+ });
566
+
567
+ // Bootstrap load raced against the deadline. A load that never resolves
568
+ // within maxWaitMs is the same bounded no-shell degrade as a shell that
569
+ // never goes quiet: return null, do not hang. A load that REJECTS is a
570
+ // genuine error and still propagates (it is not the deadline). `null` is
571
+ // the deadline sentinel — disjoint from the load's `Promise<string>`, so
572
+ // the race narrows to `string | null` with no wrapper. The no-op catch
573
+ // keeps a late rejection off the unhandledRejection path when the deadline
574
+ // already won; a rejection that lands first still propagates out.
575
+ const load = loadBootstrapScriptContent();
576
+ load.catch(() => {});
577
+ const bootstrapScriptContent = await Promise.race([
578
+ load,
579
+ deadline.promise.then(() => null),
580
+ ]);
581
+ if (bootstrapScriptContent === null) {
582
+ return null;
583
+ }
584
+
585
+ // Start prerender first, then run the abort schedule concurrently. When
586
+ // holes are pending, prerender's promise settles only after abort(); when
587
+ // the shell completes with no holes it settles on its own and the later
588
+ // abort() is a harmless no-op (the DATA variant).
589
+ const controller = new AbortController();
590
+ // Private reason object: the deliberate abort is identified by object
591
+ // IDENTITY in both the onError below and the post-await catch. React
592
+ // propagates this EXACT object to onError for every still-pending boundary
593
+ // (verified identity-preserving), and rejects/errors the prelude with it.
594
+ const abortReason = { rangoShellCaptureAbort: true };
595
+ const prerenderPromise = prerender(<SsrRoot />, {
596
+ signal: controller.signal,
597
+ ...resolveBootstrapOptions(bootstrapScriptContent, deps.headScripts),
598
+ // Abort is how capture WORKS: once the shell is quiet we abort() to
599
+ // freeze the prelude and let the still-pending holes postpone. React
600
+ // reports the abort reason for each pending boundary through onError.
601
+ // Without an onError here React falls back to console.error, so every
602
+ // capture that still has a live hole at abort time (the normal case)
603
+ // dumps a stack once per pending boundary. That is EXPECTED degradation,
604
+ // so swallow OUR abort — matched by IDENTITY (error === abortReason).
605
+ // Discriminate by identity, NOT error.name: capture aborts before
606
+ // awaiting, so signal.aborted is unconditionally true and a name check
607
+ // swallowed genuine AbortError-named throws (a component's own
608
+ // fetch/AbortController cancellation) as if they were our abort. Genuine
609
+ // render errors are NOT our sentinel and still surface through
610
+ // deps.onError, the same channel renderHTML uses. See
611
+ // docs/design/ppr-shell-resume.md.
612
+ onError: (error: unknown) => {
613
+ if (error === abortReason) {
614
+ return;
615
+ }
616
+ reportRenderError(onError, error);
617
+ },
618
+ });
619
+ // Pre-attach a no-op catch: the real await sits AFTER quiesce + the
620
+ // post-quiesce hops, so an early prerender rejection (e.g. a bake-lane
621
+ // loader tripping the identity guard within milliseconds) would otherwise
622
+ // spend several turns handler-less and crash the worker as an unhandled
623
+ // rejection. The actual rejection handling still happens at the await
624
+ // below; this parallel handler only keeps the gap crash-free.
625
+ prerenderPromise.catch(() => {});
626
+
627
+ // Wait for the caller's quiesce signal, bounded by the SAME deadline. By
628
+ // the time it resolves the Flight input is byte-quiet and FROZEN by the
629
+ // capture gate (shell-capture.ts gateFlightForCapture), so there is no
630
+ // wall-clock debounce here — maxWaitMs is only the pathological guard for a
631
+ // shell that never goes quiet (a root postpone / hung handle).
632
+ await Promise.race([opts.quiesce, deadline.promise]);
633
+ // Then wait for fizz RENDER-READINESS, bounded by the same deadline:
634
+ // the payload root settles only after every client-module load the
635
+ // payload references completed (real module-runner I/O in dev; 100ms+
636
+ // on a cold graph). Flight byte-quiet does NOT imply this — a fully
637
+ // REPLAYED (prerendered) route's Flight stream finishes in ~1-3ms and
638
+ // an abort taken on quiet-plus-task-hops alone landed BEFORE fizz could
639
+ // emit <html>, freezing a zero-byte prelude: the eternal-MISS shape
640
+ // this route class showed on every cold graph (dev cold boots, GH
641
+ // runners) while ordinary routes — whose live handler execution keeps
642
+ // Flight noisy long enough — never hit it. Masked-loader holes do not
643
+ // block payload settlement (they postpone below the root), so this
644
+ // await costs a genuinely hole-y shell nothing; a payload that NEVER
645
+ // settles (hung handles) degrades at the deadline exactly as before.
646
+ // A prerender that SETTLES first (early success or a hard rejection)
647
+ // ends the wait immediately — fizz is already done either way.
648
+ const prerenderSettled = prerenderPromise.then(
649
+ () => {},
650
+ () => {},
651
+ );
652
+ await Promise.race([payloadSettled, prerenderSettled, deadline.promise]);
653
+ // Fixed task hops before the abort: give React's fizz worker turns to flush
654
+ // the now-complete shell and mark the still-pending boundaries as POSTPONED
655
+ // rather than errored. Deterministic (the byte set is already frozen and
656
+ // the payload is settled), so a fixed count of turns suffices — no
657
+ // wall-clock. Ready-but-queued fizz render work (however large — a multi-MB
658
+ // outlined boundary) can never lose this race: tracked-postpones pings run
659
+ // on scheduleMicrotask, so every runnable task drains before the FIRST
660
+ // setTimeout hop fires; only tasks parked on genuinely pending promises
661
+ // (masked loaders, real per-request I/O) remain, and those are exactly the
662
+ // holes that must postpone (issue #702).
663
+ for (let i = 0; i < POST_QUIESCE_TASK_HOPS; i++) {
664
+ await macrotask();
665
+ }
666
+ controller.abort(abortReason);
667
+
668
+ // A hard prerender rejection (fatal shell error) propagates. Expected
669
+ // degradation surfaces three ways and all return null: a trivial prelude
670
+ // (sanity gate below), the prerender REJECTING with our abort reason, or
671
+ // the prelude STREAM erroring with our abort reason mid-read — both abort
672
+ // shapes happen when our own abort lands before the shell completed (seen
673
+ // on dev cold paths, where module transform / first-render latency
674
+ // outlasts flight quiesce; a later request re-captures against warm
675
+ // modules and succeeds).
676
+ let prelude: Uint8Array;
677
+ let postponed: unknown;
678
+ try {
679
+ const result = await prerenderPromise;
680
+ prelude = await readStreamToUint8Array(result.prelude);
681
+ postponed = result.postponed;
682
+ } catch (error) {
683
+ // Identity match: swallow ONLY our own deliberate abort
684
+ // (error === abortReason). Not error.name — capture aborts before this
685
+ // await, so signal.aborted is always true, and a name check let a
686
+ // genuine AbortError-named throw masquerade as our abort and degrade
687
+ // into a retryable no-shell, hiding real failures from reportCacheError.
688
+ if (error === abortReason) {
689
+ return null;
364
690
  }
691
+ throw error;
365
692
  }
693
+
694
+ // Sanity gate: a prelude with no `<body` is the no-shell failure mode.
695
+ // Return null and store nothing; the request falls back to axis 1 and a
696
+ // later request re-captures. The dominant real-world cause is a loader
697
+ // route WITHOUT a route-level loading() boundary: renderSegments' loading-
698
+ // less branch awaits loader data at TREE-BUILD, so the masked loader pins
699
+ // the whole tree above <body> (root postpone). Root-postponing layouts and
700
+ // hung handles degrade the same way. shell-capture.ts logs a once-per-key
701
+ // warning so the eternal-MISS shape is diagnosable.
702
+ if (!new TextDecoder().decode(prelude).includes("<body")) {
703
+ return null;
704
+ }
705
+
706
+ return {
707
+ prelude,
708
+ postponed: postponed == null ? null : JSON.stringify(postponed),
709
+ };
710
+ } finally {
711
+ deadline.cancel();
712
+ }
713
+ };
714
+ }
715
+
716
+ /**
717
+ * Create the PPR shell resume handler.
718
+ *
719
+ * resumeShellHTML produces the per-request live portion of the document: for a
720
+ * postponed shell it resumes fizz over a fresh SsrRoot to emit only the holes;
721
+ * for the DATA variant it emits only the fresh Flight payload scripts. The
722
+ * caller (shell-cache middleware) prepends the stored prelude bytes to form the
723
+ * composite response. See docs/design/ppr-shell-resume.md.
724
+ */
725
+ export function createShellResumeHandler<TEnv = unknown>(
726
+ deps: SSRDependencies<TEnv>,
727
+ ) {
728
+ const { createFromReadableStream, resume, onError } = deps;
729
+
730
+ /**
731
+ * @param rscStream - Fresh full Flight stream for this request.
732
+ * @param opts - postponed state (null = DATA variant) and optional nonce.
733
+ */
734
+ return async function resumeShellHTML(
735
+ rscStream: ReadableStream<Uint8Array>,
736
+ opts: ShellResumeOptions,
737
+ ): Promise<ReadableStream<Uint8Array>> {
738
+ const { postponed, nonce } = opts;
739
+
740
+ try {
741
+ if (postponed === null) {
742
+ // DATA variant: the stored prelude is the complete shell. No fizz runs;
743
+ // the eager injector pumps the fresh Flight payload scripts without
744
+ // needing an HTML chunk to trigger it (the stock injector deadlocked on
745
+ // a chunkless stream — see createDataVariantHtmlStream, kept for the
746
+ // batching invariant's sake).
747
+ return createDataVariantHtmlStream().pipeThrough(
748
+ injectRSCPayloadEager(rscStream, { nonce }),
749
+ );
750
+ }
751
+
752
+ if (!resume) {
753
+ throw new Error(
754
+ "[createShellResumeHandler] Missing `resume` dependency (react-dom/server.edge). " +
755
+ "Resuming a postponed shell requires the resume export; wire it in the SSR virtual entry.",
756
+ );
757
+ }
758
+
759
+ // Tee: one branch deserializes into the SsrRoot VDOM that resume() replays
760
+ // (a fresh instance is fine — replay matches structure, not identity), the
761
+ // other feeds the fresh hydration payload to injectRSCPayload.
762
+ const [rscStream1, rscStream2] = rscStream.tee();
763
+
764
+ const SsrRoot = createSsrRootComponent({
765
+ createFromReadableStream,
766
+ rscStream: rscStream1,
767
+ nonce,
768
+ });
769
+
770
+ // EAGER injection (resume-only): the stored prelude — a complete document
771
+ // through </body></html> — is already on the wire ahead of this stream,
772
+ // so a Flight <script> is valid as the first tail byte. The stock
773
+ // injector waits for the first fizz chunk, which only appears when the
774
+ // first hole's loaders resolve — parking the whole hydration payload
775
+ // (root row included) behind the slowest live loader. See
776
+ // inject-rsc-eager.ts for the measured failure mode.
777
+ //
778
+ // EAGER HANDOVER: return the injector's readable BEFORE awaiting
779
+ // resume(). react-dom's resume() promise resolves only when the resumed
780
+ // shell (everything above the postponed holes) completes — which waits
781
+ // on the live loaders — so `await resume(...).pipeThrough(...)` parked
782
+ // the already-flowing Flight bytes a second time, behind the handshake
783
+ // instead of the stream (measured: injector output at +9ms, first tail
784
+ // byte on the wire at +735ms). Piping fizz in when it materializes lets
785
+ // serveShellHit start draining Flight immediately; pipeTo closes the
786
+ // writable on completion, which runs the injector's flush (trailer). A
787
+ // resume() rejection aborts the writable so the response errors instead
788
+ // of hanging.
789
+ const injector = injectRSCPayloadEager(rscStream2, { nonce });
790
+ void (async () => {
791
+ try {
792
+ // Nonce wrap mirrors renderHTML: client references first discovered
793
+ // during resume (holes the shell never rendered) preinit into the
794
+ // resumed stream and need the per-request nonce.
795
+ const resumed = await runWithPreinitNonce(nonce, () =>
796
+ resume(<SsrRoot />, JSON.parse(postponed), {
797
+ onError: (error) => reportRenderError(onError, error),
798
+ nonce,
799
+ }),
800
+ );
801
+ await resumed.pipeTo(injector.writable);
802
+ } catch (error) {
803
+ reportRenderError(onError, error);
804
+ try {
805
+ await injector.writable.abort(error);
806
+ } catch {
807
+ // Writable already errored/closed; the readable side has the error.
808
+ }
809
+ }
810
+ })();
811
+ return injector.readable;
812
+ } catch (error) {
813
+ reportRenderError(onError, error);
366
814
  throw error;
367
815
  }
368
816
  };