@rangojs/router 0.0.0-experimental.15 → 0.0.0-experimental.151

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 (1284) hide show
  1. package/AGENTS.md +13 -0
  2. package/README.md +308 -451
  3. package/dist/__internal.d.ts +83 -0
  4. package/dist/__internal.d.ts.map +1 -0
  5. package/dist/__internal.js +19 -0
  6. package/dist/__internal.js.map +1 -0
  7. package/dist/__mocks__/version.d.ts +7 -0
  8. package/dist/__mocks__/version.d.ts.map +1 -0
  9. package/dist/__mocks__/version.js +7 -0
  10. package/dist/__mocks__/version.js.map +1 -0
  11. package/dist/__tests__/client-href.test.d.ts +2 -0
  12. package/dist/__tests__/client-href.test.d.ts.map +1 -0
  13. package/dist/__tests__/client-href.test.js +74 -0
  14. package/dist/__tests__/client-href.test.js.map +1 -0
  15. package/dist/__tests__/component-utils.test.d.ts +2 -0
  16. package/dist/__tests__/component-utils.test.d.ts.map +1 -0
  17. package/dist/__tests__/component-utils.test.js +51 -0
  18. package/dist/__tests__/component-utils.test.js.map +1 -0
  19. package/dist/__tests__/event-controller.test.d.ts +2 -0
  20. package/dist/__tests__/event-controller.test.d.ts.map +1 -0
  21. package/dist/__tests__/event-controller.test.js +538 -0
  22. package/dist/__tests__/event-controller.test.js.map +1 -0
  23. package/dist/__tests__/helpers/route-tree.d.ts +118 -0
  24. package/dist/__tests__/helpers/route-tree.d.ts.map +1 -0
  25. package/dist/__tests__/helpers/route-tree.js +374 -0
  26. package/dist/__tests__/helpers/route-tree.js.map +1 -0
  27. package/dist/__tests__/match-result.test.d.ts +2 -0
  28. package/dist/__tests__/match-result.test.d.ts.map +1 -0
  29. package/dist/__tests__/match-result.test.js +154 -0
  30. package/dist/__tests__/match-result.test.js.map +1 -0
  31. package/dist/__tests__/navigation-store.test.d.ts +2 -0
  32. package/dist/__tests__/navigation-store.test.d.ts.map +1 -0
  33. package/dist/__tests__/navigation-store.test.js +440 -0
  34. package/dist/__tests__/navigation-store.test.js.map +1 -0
  35. package/dist/__tests__/partial-update.test.d.ts +2 -0
  36. package/dist/__tests__/partial-update.test.d.ts.map +1 -0
  37. package/dist/__tests__/partial-update.test.js +1009 -0
  38. package/dist/__tests__/partial-update.test.js.map +1 -0
  39. package/dist/__tests__/reverse-types.test.d.ts +8 -0
  40. package/dist/__tests__/reverse-types.test.d.ts.map +1 -0
  41. package/dist/__tests__/reverse-types.test.js +656 -0
  42. package/dist/__tests__/reverse-types.test.js.map +1 -0
  43. package/dist/__tests__/route-definition.test.d.ts +2 -0
  44. package/dist/__tests__/route-definition.test.d.ts.map +1 -0
  45. package/dist/__tests__/route-definition.test.js +55 -0
  46. package/dist/__tests__/route-definition.test.js.map +1 -0
  47. package/dist/__tests__/router-helpers.test.d.ts +2 -0
  48. package/dist/__tests__/router-helpers.test.d.ts.map +1 -0
  49. package/dist/__tests__/router-helpers.test.js +377 -0
  50. package/dist/__tests__/router-helpers.test.js.map +1 -0
  51. package/dist/__tests__/router-integration-2.test.d.ts +2 -0
  52. package/dist/__tests__/router-integration-2.test.d.ts.map +1 -0
  53. package/dist/__tests__/router-integration-2.test.js +426 -0
  54. package/dist/__tests__/router-integration-2.test.js.map +1 -0
  55. package/dist/__tests__/router-integration.test.d.ts +2 -0
  56. package/dist/__tests__/router-integration.test.d.ts.map +1 -0
  57. package/dist/__tests__/router-integration.test.js +1051 -0
  58. package/dist/__tests__/router-integration.test.js.map +1 -0
  59. package/dist/__tests__/search-params.test.d.ts +5 -0
  60. package/dist/__tests__/search-params.test.d.ts.map +1 -0
  61. package/dist/__tests__/search-params.test.js +306 -0
  62. package/dist/__tests__/search-params.test.js.map +1 -0
  63. package/dist/__tests__/segment-system.test.d.ts +2 -0
  64. package/dist/__tests__/segment-system.test.d.ts.map +1 -0
  65. package/dist/__tests__/segment-system.test.js +627 -0
  66. package/dist/__tests__/segment-system.test.js.map +1 -0
  67. package/dist/__tests__/static-handler-types.test.d.ts +8 -0
  68. package/dist/__tests__/static-handler-types.test.d.ts.map +1 -0
  69. package/dist/__tests__/static-handler-types.test.js +63 -0
  70. package/dist/__tests__/static-handler-types.test.js.map +1 -0
  71. package/dist/__tests__/urls.test.d.ts +2 -0
  72. package/dist/__tests__/urls.test.d.ts.map +1 -0
  73. package/dist/__tests__/urls.test.js +421 -0
  74. package/dist/__tests__/urls.test.js.map +1 -0
  75. package/dist/__tests__/use-mount.test.d.ts +2 -0
  76. package/dist/__tests__/use-mount.test.d.ts.map +1 -0
  77. package/dist/__tests__/use-mount.test.js +35 -0
  78. package/dist/__tests__/use-mount.test.js.map +1 -0
  79. package/dist/bin/rango.d.ts +2 -0
  80. package/dist/bin/rango.d.ts.map +1 -0
  81. package/dist/bin/rango.js +1844 -237
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/{src/handles/index.ts → dist/handles/index.js} +1 -1
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/{src/network-error-thrower.tsx → dist/network-error-thrower.d.ts} +4 -8
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +7554 -2070
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +142 -61
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +329 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +489 -0
  815. package/skills/caching/SKILL.md +413 -26
  816. package/skills/catalog.json +271 -0
  817. package/skills/comparison/SKILL.md +50 -0
  818. package/skills/comparison/agents/openai.yaml +4 -0
  819. package/skills/comparison/references/framework-comparison.md +837 -0
  820. package/skills/composability/SKILL.md +278 -0
  821. package/skills/css/SKILL.md +76 -0
  822. package/skills/debug-manifest/SKILL.md +16 -18
  823. package/skills/defer-hydration/SKILL.md +235 -0
  824. package/skills/document-cache/SKILL.md +96 -63
  825. package/skills/fonts/SKILL.md +7 -5
  826. package/skills/handler-use/SKILL.md +364 -0
  827. package/skills/hooks/SKILL.md +76 -436
  828. package/skills/hooks/data.md +273 -0
  829. package/skills/hooks/handle-and-actions.md +103 -0
  830. package/skills/hooks/navigation.md +110 -0
  831. package/skills/hooks/outlets.md +41 -0
  832. package/skills/hooks/state.md +228 -0
  833. package/skills/hooks/urls.md +135 -0
  834. package/skills/host-router/SKILL.md +320 -0
  835. package/skills/i18n/SKILL.md +276 -0
  836. package/skills/intercept/SKILL.md +215 -16
  837. package/skills/layout/SKILL.md +147 -7
  838. package/skills/links/SKILL.md +304 -25
  839. package/skills/loader/SKILL.md +629 -55
  840. package/skills/middleware/SKILL.md +251 -38
  841. package/skills/migrate-nextjs/SKILL.md +745 -0
  842. package/skills/migrate-react-router/SKILL.md +153 -0
  843. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  844. package/skills/migrate-react-router/component-migration.md +196 -0
  845. package/skills/migrate-react-router/data-and-actions.md +225 -0
  846. package/skills/migrate-react-router/route-mapping.md +271 -0
  847. package/skills/mime-routes/SKILL.md +60 -21
  848. package/skills/observability/SKILL.md +202 -0
  849. package/skills/parallel/SKILL.md +296 -4
  850. package/skills/ppr/SKILL.md +658 -0
  851. package/skills/prerender/SKILL.md +487 -52
  852. package/skills/rango/SKILL.md +324 -29
  853. package/skills/react-compiler/SKILL.md +168 -0
  854. package/skills/response-routes/SKILL.md +264 -122
  855. package/skills/route/SKILL.md +359 -22
  856. package/skills/router-setup/SKILL.md +247 -34
  857. package/skills/scripts/SKILL.md +179 -0
  858. package/skills/server-actions/SKILL.md +776 -0
  859. package/skills/shell-manifest/SKILL.md +185 -0
  860. package/skills/streams-and-websockets/SKILL.md +283 -0
  861. package/skills/tailwind/SKILL.md +28 -4
  862. package/skills/testing/SKILL.md +126 -222
  863. package/skills/testing/bindings.md +103 -0
  864. package/skills/testing/cache-prerender.md +127 -0
  865. package/skills/testing/client-components.md +124 -0
  866. package/skills/testing/e2e-parity.md +125 -0
  867. package/skills/testing/flight.md +91 -0
  868. package/skills/testing/handles.md +131 -0
  869. package/skills/testing/loader.md +128 -0
  870. package/skills/testing/middleware.md +99 -0
  871. package/skills/testing/render-handler.md +122 -0
  872. package/skills/testing/response-routes.md +95 -0
  873. package/skills/testing/reverse-and-types.md +85 -0
  874. package/skills/testing/server-actions.md +107 -0
  875. package/skills/testing/server-tree.md +128 -0
  876. package/skills/testing/setup.md +123 -0
  877. package/skills/theme/SKILL.md +10 -9
  878. package/skills/typesafety/SKILL.md +45 -496
  879. package/skills/typesafety/env-and-bindings.md +254 -0
  880. package/skills/typesafety/generated-files-and-cli.md +335 -0
  881. package/skills/typesafety/params-and-search.md +153 -0
  882. package/skills/typesafety/route-types.md +209 -0
  883. package/skills/use-cache/SKILL.md +383 -0
  884. package/skills/vercel/SKILL.md +128 -0
  885. package/skills/view-transitions/SKILL.md +337 -0
  886. package/src/__augment-tests__/augment.ts +81 -0
  887. package/src/__augment-tests__/augmented.check.ts +116 -0
  888. package/src/__internal.ts +77 -44
  889. package/src/bin/rango.ts +275 -29
  890. package/src/browser/action-coordinator.ts +114 -0
  891. package/src/browser/action-fence.ts +47 -0
  892. package/src/browser/app-shell.ts +39 -0
  893. package/src/browser/app-version.ts +14 -0
  894. package/src/browser/connection-warmup.ts +134 -0
  895. package/src/browser/cookie-name.ts +140 -0
  896. package/src/browser/event-controller.ts +348 -212
  897. package/src/browser/history-state.ts +101 -0
  898. package/src/browser/index.ts +3 -3
  899. package/src/browser/intercept-utils.ts +52 -0
  900. package/src/browser/invalidate-client-cache.ts +52 -0
  901. package/src/browser/link-interceptor.ts +24 -4
  902. package/src/browser/logging.ts +39 -0
  903. package/src/browser/merge-segment-loaders.ts +23 -13
  904. package/src/browser/navigation-bridge.ts +385 -576
  905. package/src/browser/navigation-client.ts +249 -75
  906. package/src/browser/navigation-store-handle.ts +38 -0
  907. package/src/browser/navigation-store.ts +230 -124
  908. package/src/browser/navigation-transaction.ts +247 -0
  909. package/src/browser/network-error-handler.ts +88 -0
  910. package/src/browser/partial-update.ts +432 -365
  911. package/src/browser/prefetch/cache.ts +381 -0
  912. package/src/browser/prefetch/fetch.ts +462 -0
  913. package/src/browser/prefetch/observer.ts +65 -0
  914. package/src/browser/prefetch/policy.ts +48 -0
  915. package/src/browser/prefetch/queue.ts +209 -0
  916. package/src/browser/prefetch/resource-ready.ts +77 -0
  917. package/src/browser/rango-state.ts +194 -0
  918. package/src/browser/react/Link.tsx +284 -67
  919. package/src/browser/react/NavigationProvider.tsx +267 -109
  920. package/src/browser/react/ScrollRestoration.tsx +10 -6
  921. package/src/browser/react/context.ts +11 -0
  922. package/src/browser/react/filter-segment-order.ts +70 -0
  923. package/src/browser/react/index.ts +0 -48
  924. package/src/browser/react/location-state-shared.ts +272 -60
  925. package/src/browser/react/location-state.ts +90 -20
  926. package/src/browser/react/mount-context.ts +6 -1
  927. package/src/browser/react/nonce-context.ts +23 -0
  928. package/src/browser/react/shallow-equal.ts +27 -0
  929. package/src/browser/react/use-action.ts +35 -66
  930. package/src/browser/react/use-handle.ts +39 -126
  931. package/src/browser/react/use-href.tsx +8 -1
  932. package/src/browser/react/use-link-status.ts +39 -13
  933. package/src/browser/react/use-navigation.ts +53 -69
  934. package/src/browser/react/use-params.ts +75 -0
  935. package/src/browser/react/use-pathname.ts +47 -0
  936. package/src/browser/react/use-reverse.ts +106 -0
  937. package/src/browser/react/use-router.ts +98 -0
  938. package/src/browser/react/use-search-params.ts +51 -0
  939. package/src/browser/react/use-segments.ts +72 -99
  940. package/src/browser/response-adapter.ts +164 -0
  941. package/src/browser/rsc-router.tsx +355 -73
  942. package/src/browser/scroll-restoration.ts +140 -50
  943. package/src/browser/segment-reconciler.ts +253 -0
  944. package/src/browser/segment-structure-assert.ts +17 -1
  945. package/src/browser/server-action-bridge.ts +668 -613
  946. package/src/browser/types.ts +235 -51
  947. package/src/browser/validate-redirect-origin.ts +56 -0
  948. package/src/build/collect-fallback-refs.ts +107 -0
  949. package/src/build/generate-manifest.ts +243 -183
  950. package/src/build/generate-route-types.ts +41 -848
  951. package/src/build/index.ts +12 -7
  952. package/src/build/prefix-tree-utils.ts +123 -0
  953. package/src/build/route-trie.ts +218 -80
  954. package/src/build/route-types/ast-helpers.ts +25 -0
  955. package/src/build/route-types/ast-route-extraction.ts +105 -0
  956. package/src/build/route-types/codegen.ts +113 -0
  957. package/src/build/route-types/include-resolution.ts +812 -0
  958. package/src/build/route-types/param-extraction.ts +51 -0
  959. package/src/build/route-types/per-module-writer.ts +144 -0
  960. package/src/build/route-types/router-processing.ts +695 -0
  961. package/src/build/route-types/scan-filter.ts +85 -0
  962. package/src/build/route-types/source-scan.ts +216 -0
  963. package/src/build/runtime-discovery.ts +223 -0
  964. package/src/cache/background-task.ts +34 -0
  965. package/src/cache/cache-error.ts +104 -0
  966. package/src/cache/cache-key-utils.ts +88 -0
  967. package/src/cache/cache-policy.ts +199 -0
  968. package/src/cache/cache-runtime.ts +695 -0
  969. package/src/cache/cache-scope.ts +324 -335
  970. package/src/cache/cache-tag.ts +149 -0
  971. package/src/cache/cf/cf-base64.ts +33 -0
  972. package/src/cache/cf/cf-cache-constants.ts +127 -0
  973. package/src/cache/cf/cf-cache-store.ts +2602 -156
  974. package/src/cache/cf/cf-cache-types.ts +349 -0
  975. package/src/cache/cf/cf-kv-utils.ts +46 -0
  976. package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
  977. package/src/cache/cf/index.ts +17 -17
  978. package/src/cache/document-cache.ts +226 -102
  979. package/src/cache/handle-capture.ts +81 -0
  980. package/src/cache/handle-snapshot.ts +132 -0
  981. package/src/cache/index.ts +24 -35
  982. package/src/cache/memory-segment-store.ts +446 -30
  983. package/src/cache/profile-registry.ts +88 -0
  984. package/src/cache/read-through-swr.ts +178 -0
  985. package/src/cache/segment-codec.ts +295 -0
  986. package/src/cache/shell-snapshot.ts +464 -0
  987. package/src/cache/tag-invalidation.ts +230 -0
  988. package/src/cache/taint.ts +153 -0
  989. package/src/cache/types.ts +283 -211
  990. package/src/cache/vercel/index.ts +11 -0
  991. package/src/cache/vercel/vercel-cache-store.ts +1201 -0
  992. package/src/client.rsc.tsx +43 -21
  993. package/src/client.tsx +131 -347
  994. package/src/cloudflare/index.ts +11 -0
  995. package/src/cloudflare/tracing.ts +108 -0
  996. package/src/component-utils.ts +23 -4
  997. package/src/components/DefaultDocument.tsx +13 -3
  998. package/src/context-var.ts +168 -0
  999. package/src/debug.ts +19 -9
  1000. package/src/decode-loader-results.ts +52 -0
  1001. package/src/defer.ts +185 -0
  1002. package/src/deps/ssr.ts +4 -2
  1003. package/src/encode-kv.ts +49 -0
  1004. package/src/errors.ts +106 -10
  1005. package/src/escape-script.ts +52 -0
  1006. package/src/handle.ts +110 -35
  1007. package/src/handles/MetaTags.tsx +83 -59
  1008. package/src/handles/Scripts.tsx +183 -0
  1009. package/src/handles/breadcrumbs.ts +93 -0
  1010. package/src/handles/deferred-resolution.ts +127 -0
  1011. package/src/handles/is-thenable.ts +18 -0
  1012. package/src/handles/meta.ts +44 -53
  1013. package/src/handles/script.ts +244 -0
  1014. package/src/host/cookie-handler.ts +20 -65
  1015. package/src/host/errors.ts +21 -30
  1016. package/src/host/index.ts +13 -9
  1017. package/src/host/pattern-matcher.ts +50 -79
  1018. package/src/host/router.ts +151 -121
  1019. package/src/host/testing.ts +45 -32
  1020. package/src/host/types.ts +52 -11
  1021. package/src/host/utils.ts +2 -2
  1022. package/src/href-client.ts +192 -57
  1023. package/src/index.rsc.ts +180 -35
  1024. package/src/index.ts +245 -73
  1025. package/src/internal-debug.ts +9 -2
  1026. package/src/loader-store.ts +500 -0
  1027. package/src/loader.rsc.ts +31 -99
  1028. package/src/loader.ts +30 -12
  1029. package/src/missing-id-error.ts +68 -0
  1030. package/src/outlet-context.ts +1 -1
  1031. package/src/outlet-provider.tsx +41 -0
  1032. package/src/prerender/build-shell-capture.ts +447 -0
  1033. package/src/prerender/param-hash.ts +16 -14
  1034. package/src/prerender/shell-manifest-key.ts +20 -0
  1035. package/src/prerender/store.ts +131 -22
  1036. package/src/prerender.ts +460 -26
  1037. package/src/redirect-origin.ts +114 -0
  1038. package/src/regex-escape.ts +8 -0
  1039. package/src/render-error-thrower.tsx +20 -0
  1040. package/src/response-utils.ts +62 -0
  1041. package/src/reverse.ts +198 -128
  1042. package/src/root-error-boundary.tsx +42 -48
  1043. package/src/route-content-wrapper.tsx +22 -77
  1044. package/src/route-definition/dsl-helpers.ts +1116 -0
  1045. package/src/route-definition/helper-factories.ts +88 -0
  1046. package/src/route-definition/helpers-types.ts +506 -0
  1047. package/src/route-definition/index.ts +54 -0
  1048. package/src/route-definition/redirect.ts +134 -0
  1049. package/src/route-definition/resolve-handler-use.ts +160 -0
  1050. package/src/route-definition/use-item-types.ts +29 -0
  1051. package/src/route-definition.ts +1 -1481
  1052. package/src/route-map-builder.ts +120 -145
  1053. package/src/route-name.ts +53 -0
  1054. package/src/route-types.ts +71 -45
  1055. package/src/router/basename.ts +14 -0
  1056. package/src/router/content-negotiation.ts +305 -0
  1057. package/src/router/debug-manifest.ts +72 -0
  1058. package/src/router/error-handling.ts +54 -27
  1059. package/src/router/find-match.ts +259 -0
  1060. package/src/router/handler-context.ts +385 -125
  1061. package/src/router/instrument.ts +355 -0
  1062. package/src/router/intercept-resolution.ts +88 -28
  1063. package/src/router/lazy-includes.ts +260 -0
  1064. package/src/router/loader-resolution.ts +449 -157
  1065. package/src/router/logging.ts +106 -6
  1066. package/src/router/manifest.ts +144 -62
  1067. package/src/router/match-api.ts +224 -256
  1068. package/src/router/match-context.ts +4 -24
  1069. package/src/router/match-handlers.ts +499 -0
  1070. package/src/router/match-middleware/background-revalidation.ts +117 -93
  1071. package/src/router/match-middleware/cache-lookup.ts +308 -150
  1072. package/src/router/match-middleware/cache-store.ts +123 -51
  1073. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1074. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1075. package/src/router/match-pipelines.ts +11 -87
  1076. package/src/router/match-result.ts +143 -52
  1077. package/src/router/metrics.ts +235 -29
  1078. package/src/router/middleware-types.ts +110 -0
  1079. package/src/router/middleware.ts +526 -441
  1080. package/src/router/navigation-snapshot.ts +133 -0
  1081. package/src/router/params-util.ts +23 -0
  1082. package/src/router/parse-pattern.ts +115 -0
  1083. package/src/router/pattern-matching.ts +311 -142
  1084. package/src/router/prefetch-cache-ttl.ts +51 -0
  1085. package/src/router/prefetch-limits.ts +37 -0
  1086. package/src/router/prerender-match.ts +575 -0
  1087. package/src/router/preview-match.ts +102 -0
  1088. package/src/router/request-classification.ts +291 -0
  1089. package/src/router/revalidation.ts +203 -62
  1090. package/src/router/route-snapshot.ts +256 -0
  1091. package/src/router/router-context.ts +45 -48
  1092. package/src/router/router-interfaces.ts +564 -0
  1093. package/src/router/router-options.ts +784 -0
  1094. package/src/router/router-registry.ts +21 -0
  1095. package/src/router/segment-resolution/fresh.ts +812 -0
  1096. package/src/router/segment-resolution/helpers.ts +348 -0
  1097. package/src/router/segment-resolution/loader-cache.ts +315 -0
  1098. package/src/router/segment-resolution/loader-mask.ts +60 -0
  1099. package/src/router/segment-resolution/loader-snapshot.ts +259 -0
  1100. package/src/router/segment-resolution/mask-nested.ts +99 -0
  1101. package/src/router/segment-resolution/revalidation.ts +1340 -0
  1102. package/src/router/segment-resolution/static-store.ts +81 -0
  1103. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1104. package/src/router/segment-resolution/view-transition-default.ts +56 -0
  1105. package/src/router/segment-resolution.ts +25 -1354
  1106. package/src/router/segment-wrappers.ts +292 -0
  1107. package/src/router/state-cookie-name.ts +33 -0
  1108. package/src/router/substitute-pattern-params.ts +75 -0
  1109. package/src/router/telemetry-otel.ts +259 -0
  1110. package/src/router/telemetry.ts +385 -0
  1111. package/src/router/timeout.ts +128 -0
  1112. package/src/router/tracing.ts +215 -0
  1113. package/src/router/trie-matching.ts +240 -61
  1114. package/src/router/types.ts +23 -70
  1115. package/src/router/url-params.ts +57 -0
  1116. package/src/router.ts +795 -2390
  1117. package/src/rsc/capture-queue.ts +67 -0
  1118. package/src/rsc/full-payload.ts +70 -0
  1119. package/src/rsc/handler-context.ts +46 -0
  1120. package/src/rsc/handler.ts +956 -1164
  1121. package/src/rsc/helpers.ts +736 -19
  1122. package/src/rsc/index.ts +2 -25
  1123. package/src/rsc/json-route-result.ts +38 -0
  1124. package/src/rsc/loader-fetch.ts +305 -0
  1125. package/src/rsc/manifest-init.ts +77 -0
  1126. package/src/rsc/nonce.ts +23 -0
  1127. package/src/rsc/origin-guard.ts +155 -0
  1128. package/src/rsc/progressive-enhancement.ts +541 -0
  1129. package/src/rsc/redirect-guard.ts +100 -0
  1130. package/src/rsc/response-cache-serve.ts +238 -0
  1131. package/src/rsc/response-error.ts +104 -0
  1132. package/src/rsc/response-route-handler.ts +257 -0
  1133. package/src/rsc/rsc-rendering.ts +856 -0
  1134. package/src/rsc/runtime-warnings.ts +55 -0
  1135. package/src/rsc/server-action.ts +525 -0
  1136. package/src/rsc/shell-build-manifest.ts +316 -0
  1137. package/src/rsc/shell-capture-constants.ts +27 -0
  1138. package/src/rsc/shell-capture.ts +1716 -0
  1139. package/src/rsc/shell-serve.ts +226 -0
  1140. package/src/rsc/ssr-setup.ts +176 -0
  1141. package/src/rsc/transition-gate.ts +89 -0
  1142. package/src/rsc/types.ts +95 -12
  1143. package/src/runtime-env.ts +18 -0
  1144. package/src/search-params.ts +99 -82
  1145. package/src/segment-content-promise.ts +67 -0
  1146. package/src/segment-fragments.ts +124 -0
  1147. package/src/segment-loader-promise.ts +167 -0
  1148. package/src/segment-system.tsx +464 -135
  1149. package/src/serialize.ts +243 -0
  1150. package/src/server/context.ts +640 -85
  1151. package/src/server/cookie-parse.ts +32 -0
  1152. package/src/server/cookie-store.ts +337 -0
  1153. package/src/server/fetchable-loader-store.ts +11 -6
  1154. package/src/server/handle-store.ts +123 -42
  1155. package/src/server/loader-registry.ts +51 -100
  1156. package/src/server/request-context.ts +1069 -152
  1157. package/src/server.ts +15 -8
  1158. package/src/ssr/index.tsx +661 -140
  1159. package/src/ssr/inject-rsc-eager.ts +167 -0
  1160. package/src/ssr/preinit-client-references.ts +106 -0
  1161. package/src/ssr/ssr-root.tsx +261 -0
  1162. package/src/static-handler.ts +45 -18
  1163. package/src/testing/cache-status.ts +162 -0
  1164. package/src/testing/collect-handle.ts +46 -0
  1165. package/src/testing/dispatch.ts +813 -0
  1166. package/src/testing/dom.entry.ts +22 -0
  1167. package/src/testing/e2e/fixture.ts +188 -0
  1168. package/src/testing/e2e/index.ts +128 -0
  1169. package/src/testing/e2e/matchers.ts +35 -0
  1170. package/src/testing/e2e/page-helpers.ts +272 -0
  1171. package/src/testing/e2e/parity.ts +387 -0
  1172. package/src/testing/e2e/server.ts +195 -0
  1173. package/src/testing/flight-matchers.ts +97 -0
  1174. package/src/testing/flight-normalize.ts +11 -0
  1175. package/src/testing/flight-runtime.d.ts +57 -0
  1176. package/src/testing/flight-tree.ts +682 -0
  1177. package/src/testing/flight.entry.ts +52 -0
  1178. package/src/testing/flight.ts +257 -0
  1179. package/src/testing/generated-routes.ts +199 -0
  1180. package/src/testing/index.ts +105 -0
  1181. package/src/testing/internal/context.ts +380 -0
  1182. package/src/testing/internal/flight-client-globals.ts +30 -0
  1183. package/src/testing/internal/seed-vars.ts +54 -0
  1184. package/src/testing/render-handler.ts +371 -0
  1185. package/src/testing/render-route.tsx +584 -0
  1186. package/src/testing/run-loader.ts +385 -0
  1187. package/src/testing/run-middleware.ts +219 -0
  1188. package/src/testing/run-transition-when.ts +164 -0
  1189. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1190. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1191. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1192. package/src/testing/vitest-stubs/version.ts +5 -0
  1193. package/src/testing/vitest.ts +305 -0
  1194. package/src/theme/ThemeProvider.tsx +76 -98
  1195. package/src/theme/ThemeScript.tsx +12 -14
  1196. package/src/theme/constants.ts +57 -15
  1197. package/src/theme/index.ts +3 -20
  1198. package/src/theme/theme-context.ts +5 -35
  1199. package/src/theme/theme-script.ts +43 -39
  1200. package/src/theme/use-theme.ts +0 -3
  1201. package/src/types/boundaries.ts +123 -0
  1202. package/src/types/cache-types.ts +207 -0
  1203. package/src/types/error-types.ts +132 -0
  1204. package/src/types/global-namespace.ts +113 -0
  1205. package/src/types/handler-context.ts +850 -0
  1206. package/src/types/index.ts +81 -0
  1207. package/src/types/loader-types.ts +212 -0
  1208. package/src/types/request-scope.ts +112 -0
  1209. package/src/types/route-config.ts +138 -0
  1210. package/src/types/route-entry.ts +114 -0
  1211. package/src/types/segments.ts +271 -0
  1212. package/src/types.ts +1 -1795
  1213. package/src/urls/include-helper.ts +162 -0
  1214. package/src/urls/include-provider.ts +71 -0
  1215. package/src/urls/index.ts +44 -0
  1216. package/src/urls/path-helper-types.ts +418 -0
  1217. package/src/urls/path-helper.ts +280 -0
  1218. package/src/urls/pattern-types.ts +189 -0
  1219. package/src/urls/response-types.ts +109 -0
  1220. package/src/urls/type-extraction.ts +316 -0
  1221. package/src/urls/urls-function.ts +80 -0
  1222. package/src/urls.ts +1 -1352
  1223. package/src/use-loader.tsx +406 -141
  1224. package/src/vercel/index.ts +11 -0
  1225. package/src/vercel/tracing.ts +88 -0
  1226. package/src/vite/debug.ts +185 -0
  1227. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1228. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  1229. package/src/vite/discovery/discover-routers.ts +408 -0
  1230. package/src/vite/discovery/discovery-errors.ts +255 -0
  1231. package/src/vite/discovery/gate-state.ts +171 -0
  1232. package/src/vite/discovery/prerender-collection.ts +483 -0
  1233. package/src/vite/discovery/route-types-writer.ts +214 -0
  1234. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1235. package/src/vite/discovery/shell-prerender-phase.ts +397 -0
  1236. package/src/vite/discovery/state.ts +205 -0
  1237. package/src/vite/discovery/virtual-module-codegen.ts +293 -0
  1238. package/src/vite/index.ts +31 -2255
  1239. package/src/vite/inject-client-debug.ts +88 -0
  1240. package/src/vite/plugin-types.ts +336 -0
  1241. package/src/vite/plugins/cjs-to-esm.ts +90 -0
  1242. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1243. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1244. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1245. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1246. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1247. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1248. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
  1249. package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
  1250. package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
  1251. package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
  1252. package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
  1253. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1254. package/src/vite/plugins/expose-internal-ids.ts +805 -0
  1255. package/src/vite/plugins/performance-tracks.ts +89 -0
  1256. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1257. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1258. package/src/vite/plugins/vercel-output.ts +384 -0
  1259. package/src/vite/plugins/version-injector.ts +94 -0
  1260. package/src/vite/plugins/version-plugin.ts +271 -0
  1261. package/src/vite/plugins/virtual-entries.ts +267 -0
  1262. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1263. package/src/vite/rango.ts +600 -0
  1264. package/src/vite/router-discovery.ts +2120 -0
  1265. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
  1266. package/src/vite/utils/banner.ts +36 -0
  1267. package/src/vite/utils/bundle-analysis.ts +132 -0
  1268. package/src/vite/utils/client-chunks.ts +184 -0
  1269. package/src/vite/utils/directive-prologue.ts +40 -0
  1270. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1271. package/src/vite/utils/manifest-utils.ts +15 -0
  1272. package/src/vite/utils/package-resolution.ts +89 -0
  1273. package/src/vite/utils/prerender-utils.ts +268 -0
  1274. package/src/vite/utils/shared-utils.ts +271 -0
  1275. package/CLAUDE.md +0 -43
  1276. package/src/browser/lru-cache.ts +0 -69
  1277. package/src/browser/request-controller.ts +0 -164
  1278. package/src/browser/shallow.ts +0 -35
  1279. package/src/cache/memory-store.ts +0 -253
  1280. package/src/router.gen.ts +0 -6
  1281. package/src/static-handler.gen.ts +0 -5
  1282. package/src/urls.gen.ts +0 -8
  1283. package/src/vite/expose-internal-ids.ts +0 -1167
  1284. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
package/src/ssr/index.tsx CHANGED
@@ -1,14 +1,12 @@
1
1
  import React from "react";
2
- import { initHandleDataSync } from "../browser/react/use-handle.js";
3
- import { initSegmentsSync } from "../browser/react/use-segments.js";
4
- import { initThemeConfigSync } from "../theme/theme-context.js";
5
- import { ThemeProvider } from "../theme/ThemeProvider.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 { ResolvedThemeConfig, Theme } from "../theme/types.js";
11
- import type { EventController, DerivedNavigationState } from "../browser/event-controller.js";
7
+ import type { HeadScriptsOption } from "../vite/plugin-types.js";
8
+
9
+ export { installClientReferencePreinit } from "./preinit-client-references.js";
12
10
 
13
11
  /**
14
12
  * Options for injectRSCPayload
@@ -25,10 +23,64 @@ export interface InjectRSCPayloadOptions {
25
23
  */
26
24
  interface RenderToReadableStreamOptions {
27
25
  bootstrapScriptContent?: string;
26
+ bootstrapModules?: string[];
28
27
  nonce?: string;
29
28
  formState?: unknown;
30
29
  }
31
30
 
31
+ /**
32
+ * ReadableStream with the allReady promise added by react-dom/server.edge.
33
+ */
34
+ interface ReactDOMReadableStream extends ReadableStream<Uint8Array> {
35
+ allReady: Promise<void>;
36
+ }
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
+
32
84
  /**
33
85
  * Options for the renderHTML function
34
86
  */
@@ -45,6 +97,14 @@ export interface SSRRenderOptions {
45
97
  * Nonce for Content Security Policy (CSP)
46
98
  */
47
99
  nonce?: string;
100
+
101
+ /**
102
+ * SSR stream mode.
103
+ *
104
+ * - `"stream"` (default) — start flushing HTML immediately.
105
+ * - `"allReady"` — await `stream.allReady` before returning.
106
+ */
107
+ streamMode?: import("../router/router-options.js").SSRStreamMode;
48
108
  }
49
109
 
50
110
  /**
@@ -52,24 +112,26 @@ export interface SSRRenderOptions {
52
112
  */
53
113
  export interface SSRDependencies<TEnv = unknown> {
54
114
  /**
55
- * createFromReadableStream from @vitejs/plugin-rsc/ssr
115
+ * createFromReadableStream from @rangojs/router/internal/deps/ssr
56
116
  */
57
- createFromReadableStream: <T>(stream: ReadableStream<Uint8Array>) => Promise<T>;
117
+ createFromReadableStream: <T>(
118
+ stream: ReadableStream<Uint8Array>,
119
+ ) => Promise<T>;
58
120
 
59
121
  /**
60
122
  * renderToReadableStream from react-dom/server.edge
61
123
  */
62
124
  renderToReadableStream: (
63
125
  element: React.ReactNode,
64
- options?: RenderToReadableStreamOptions
65
- ) => Promise<ReadableStream<Uint8Array>>;
126
+ options?: RenderToReadableStreamOptions,
127
+ ) => Promise<ReactDOMReadableStream>;
66
128
 
67
129
  /**
68
- * injectRSCPayload from rsc-html-stream/server
130
+ * injectRSCPayload from @rangojs/router/internal/deps/html-stream-server
69
131
  */
70
132
  injectRSCPayload: (
71
133
  rscStream: ReadableStream<Uint8Array>,
72
- options?: InjectRSCPayloadOptions
134
+ options?: InjectRSCPayloadOptions,
73
135
  ) => TransformStream<Uint8Array, Uint8Array>;
74
136
 
75
137
  /**
@@ -78,6 +140,29 @@ export interface SSRDependencies<TEnv = unknown> {
78
140
  */
79
141
  loadBootstrapScriptContent: () => Promise<string>;
80
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
+
81
166
  /**
82
167
  * Optional callback invoked when an error occurs during SSR rendering.
83
168
  *
@@ -98,73 +183,232 @@ export interface SSRDependencies<TEnv = unknown> {
98
183
  }
99
184
 
100
185
  /**
101
- * 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.
102
206
  */
103
- interface RscPayload {
104
- root: React.ReactNode;
105
- metadata?: {
106
- handles?: AsyncGenerator<HandleData, void, unknown>;
107
- matched?: string[];
108
- pathname?: string;
109
- themeConfig?: ResolvedThemeConfig | null;
110
- initialTheme?: Theme;
111
- };
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
+ }
227
+ }
228
+
229
+ /**
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.
232
+ */
233
+ function macrotask(): Promise<void> {
234
+ return new Promise((resolve) => setTimeout(resolve, 0));
112
235
  }
113
236
 
114
237
  /**
115
- * Consume an async generator and return a Promise that resolves with the final value.
116
- * Used for SSR where we need to await all handle data before rendering.
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.
117
241
  */
118
- async function consumeAsyncGenerator(
119
- generator: AsyncGenerator<HandleData, void, unknown>
120
- ): Promise<HandleData> {
121
- let lastData: HandleData = {};
122
- for await (const data of generator) {
123
- lastData = data;
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;
124
282
  }
125
- return lastData;
126
283
  }
127
284
 
128
285
  /**
129
- * Create a minimal event controller for SSR.
130
- * 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.
131
288
  */
132
- function createSsrEventController(pathname: string): EventController {
133
- const location = new URL(pathname, "http://localhost");
134
- const state: DerivedNavigationState = {
135
- state: "idle",
136
- isStreaming: false,
137
- location,
138
- pendingUrl: null,
139
- inflightActions: [],
140
- };
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
+ }
141
320
 
142
- return {
143
- getState: () => state,
144
- subscribe: () => () => {},
145
- getActionState: () => ({
146
- state: "idle",
147
- actionId: null,
148
- payload: null,
149
- error: null,
150
- result: null,
151
- }),
152
- subscribeToAction: () => () => {},
153
- subscribeToHandles: () => () => {},
154
- setHandleData: () => {},
155
- getHandleState: () => ({ data: {}, segmentOrder: [] }),
156
- setLocation: () => {},
157
- startNavigation: () => {
158
- throw new Error("Navigation not supported during SSR");
159
- },
160
- abortNavigation: () => {},
161
- startAction: () => {
162
- 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();
163
337
  },
164
- abortAllActions: () => {},
165
- getCurrentNavigation: () => null,
166
- getInflightActions: () => new Map(),
167
- };
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 };
168
412
  }
169
413
 
170
414
  /**
@@ -172,10 +416,10 @@ function createSsrEventController(pathname: string): EventController {
172
416
  *
173
417
  * @example
174
418
  * ```tsx
175
- * import { createSSRHandler } from "rsc-router/ssr";
176
- * import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
419
+ * import { createSSRHandler } from "@rangojs/router/ssr";
420
+ * import { createFromReadableStream } from "@rangojs/router/internal/deps/ssr";
177
421
  * import { renderToReadableStream } from "react-dom/server.edge";
178
- * import { injectRSCPayload } from "rsc-html-stream/server";
422
+ * import { injectRSCPayload } from "@rangojs/router/internal/deps/html-stream-server";
179
423
  *
180
424
  * export const renderHTML = createSSRHandler({
181
425
  * createFromReadableStream,
@@ -203,9 +447,9 @@ export function createSSRHandler<TEnv = unknown>(deps: SSRDependencies<TEnv>) {
203
447
  */
204
448
  return async function renderHTML(
205
449
  rscStream: ReadableStream<Uint8Array>,
206
- options?: SSRRenderOptions
450
+ options?: SSRRenderOptions,
207
451
  ): Promise<ReadableStream<Uint8Array>> {
208
- const { nonce, formState } = options ?? {};
452
+ const { nonce, formState, streamMode } = options ?? {};
209
453
 
210
454
  try {
211
455
  // Tee the stream:
@@ -213,83 +457,360 @@ export function createSSRHandler<TEnv = unknown>(deps: SSRDependencies<TEnv>) {
213
457
  // - rscStream2: For browser hydration (inject as __FLIGHT_DATA__)
214
458
  const [rscStream1, rscStream2] = rscStream.tee();
215
459
 
216
- // Deserialize RSC stream to React tree
217
- let payload: Promise<RscPayload> | undefined;
218
- let handlesPromise: Promise<HandleData> | undefined;
219
- let ssrContextValue: NavigationStoreContextValue | undefined;
220
- function SsrRoot() {
221
- payload ??= createFromReadableStream<RscPayload>(rscStream1);
222
- const resolved = React.use(payload);
223
-
224
- // Initialize segments state before children render (for useSegments hook)
225
- initSegmentsSync(resolved.metadata?.matched, resolved.metadata?.pathname);
226
-
227
- // Initialize theme config for MetaTags to render theme script
228
- const themeConfig = resolved.metadata?.themeConfig ?? null;
229
- initThemeConfigSync(themeConfig);
230
-
231
- // Await handles and initialize state before children render
232
- // The handles property is an async generator that yields on each push
233
- // Memoize the promise since async generators can only be iterated once
234
- if (resolved.metadata?.handles) {
235
- handlesPromise ??= consumeAsyncGenerator(resolved.metadata.handles);
236
- const handleData = React.use(handlesPromise);
237
- initHandleDataSync(handleData, resolved.metadata.matched);
238
- }
239
-
240
- // Create SSR context with correct pathname for useNavigation
241
- ssrContextValue ??= {
242
- store: null as any,
243
- eventController: createSsrEventController(resolved.metadata?.pathname ?? "/"),
244
- navigate: async () => {},
245
- refresh: async () => {},
246
- };
247
-
248
- // Build content tree with all necessary providers
249
- // Order must match NavigationProvider: NavigationStoreContext > ThemeProvider > content
250
- let content: React.ReactNode = resolved.root;
251
-
252
- // Wrap content with ThemeProvider if theme is enabled
253
- if (themeConfig) {
254
- content = (
255
- <ThemeProvider config={themeConfig} initialTheme={resolved.metadata?.initialTheme}>
256
- {content}
257
- </ThemeProvider>
258
- );
259
- }
260
-
261
- // Wrap with NavigationStoreContext for useNavigation hook
262
- return (
263
- <NavigationStoreContext.Provider value={ssrContextValue}>
264
- {content}
265
- </NavigationStoreContext.Provider>
266
- );
267
- }
460
+ const SsrRoot = createSsrRootComponent({
461
+ createFromReadableStream,
462
+ rscStream: rscStream1,
463
+ nonce,
464
+ });
268
465
 
269
466
  // Get bootstrap script content
270
467
  const bootstrapScriptContent = await loadBootstrapScriptContent();
271
468
 
272
469
  // Render React tree to HTML stream
273
470
  // Pass formState for useActionState progressive enhancement if provided
274
- // Pass nonce for CSP if provided
275
- const htmlStream = await renderToReadableStream(<SsrRoot />, {
276
- bootstrapScriptContent,
277
- formState,
278
- nonce,
279
- });
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
+ );
481
+
482
+ // Wait for all Suspense boundaries to resolve when streamMode is "allReady".
483
+ // This buffers the entire HTML before flushing — used for bots that
484
+ // cannot process streamed HTML.
485
+ if (streamMode === "allReady") {
486
+ await htmlStream.allReady;
487
+ }
280
488
 
281
489
  // Inject RSC payload into HTML as <script nonce="...">__FLIGHT_DATA__</script>
282
490
  return htmlStream.pipeThrough(injectRSCPayload(rscStream2, { nonce }));
283
491
  } catch (error) {
284
- // Invoke onError callback if provided
285
- if (onError) {
286
- const errorObj = error instanceof Error ? error : new Error(String(error));
287
- try {
288
- onError(errorObj, { phase: "rendering" });
289
- } catch (callbackError) {
290
- 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;
291
690
  }
691
+ throw error;
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
+ );
292
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);
293
814
  throw error;
294
815
  }
295
816
  };