@rangojs/router 0.0.0-experimental.140 → 0.0.0-experimental.142

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 (914) hide show
  1. package/AGENTS.md +6 -10
  2. package/README.md +17 -0
  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.map +1 -0
  82. package/dist/browser/event-controller.d.ts +191 -0
  83. package/dist/browser/event-controller.d.ts.map +1 -0
  84. package/dist/browser/event-controller.js +559 -0
  85. package/dist/browser/event-controller.js.map +1 -0
  86. package/dist/browser/index.d.ts +2 -0
  87. package/dist/browser/index.d.ts.map +1 -0
  88. package/dist/browser/index.js +14 -0
  89. package/dist/browser/index.js.map +1 -0
  90. package/dist/browser/link-interceptor.d.ts +38 -0
  91. package/dist/browser/link-interceptor.d.ts.map +1 -0
  92. package/dist/browser/link-interceptor.js +99 -0
  93. package/dist/browser/link-interceptor.js.map +1 -0
  94. package/dist/browser/logging.d.ts +10 -0
  95. package/dist/browser/logging.d.ts.map +1 -0
  96. package/dist/browser/logging.js +29 -0
  97. package/dist/browser/logging.js.map +1 -0
  98. package/dist/browser/lru-cache.d.ts +17 -0
  99. package/dist/browser/lru-cache.d.ts.map +1 -0
  100. package/dist/browser/lru-cache.js +50 -0
  101. package/dist/browser/lru-cache.js.map +1 -0
  102. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  103. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  104. package/dist/browser/merge-segment-loaders.js +102 -0
  105. package/dist/browser/merge-segment-loaders.js.map +1 -0
  106. package/dist/browser/navigation-bridge.d.ts +102 -0
  107. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  108. package/dist/browser/navigation-bridge.js +708 -0
  109. package/dist/browser/navigation-bridge.js.map +1 -0
  110. package/dist/browser/navigation-client.d.ts +25 -0
  111. package/dist/browser/navigation-client.d.ts.map +1 -0
  112. package/dist/browser/navigation-client.js +157 -0
  113. package/dist/browser/navigation-client.js.map +1 -0
  114. package/dist/browser/navigation-store.d.ts +101 -0
  115. package/dist/browser/navigation-store.d.ts.map +1 -0
  116. package/dist/browser/navigation-store.js +625 -0
  117. package/dist/browser/navigation-store.js.map +1 -0
  118. package/dist/browser/partial-update.d.ts +75 -0
  119. package/dist/browser/partial-update.d.ts.map +1 -0
  120. package/dist/browser/partial-update.js +426 -0
  121. package/dist/browser/partial-update.js.map +1 -0
  122. package/dist/browser/react/Link.d.ts +86 -0
  123. package/dist/browser/react/Link.d.ts.map +1 -0
  124. package/dist/browser/react/Link.js +128 -0
  125. package/dist/browser/react/Link.js.map +1 -0
  126. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  127. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  128. package/dist/browser/react/NavigationProvider.js +216 -0
  129. package/dist/browser/react/NavigationProvider.js.map +1 -0
  130. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  132. package/dist/browser/react/ScrollRestoration.js +57 -0
  133. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  134. package/dist/browser/react/context.d.ts +46 -0
  135. package/dist/browser/react/context.d.ts.map +1 -0
  136. package/dist/browser/react/context.js +10 -0
  137. package/dist/browser/react/context.js.map +1 -0
  138. package/dist/browser/react/index.d.ts +11 -0
  139. package/dist/browser/react/index.d.ts.map +1 -0
  140. package/dist/browser/react/index.js +22 -0
  141. package/dist/browser/react/index.js.map +1 -0
  142. package/dist/browser/react/location-state-shared.d.ts +63 -0
  143. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  144. package/dist/browser/react/location-state-shared.js +81 -0
  145. package/dist/browser/react/location-state-shared.js.map +1 -0
  146. package/dist/browser/react/location-state.d.ts +23 -0
  147. package/dist/browser/react/location-state.d.ts.map +1 -0
  148. package/dist/browser/react/location-state.js +29 -0
  149. package/dist/browser/react/location-state.js.map +1 -0
  150. package/dist/browser/react/mount-context.d.ts +24 -0
  151. package/dist/browser/react/mount-context.d.ts.map +1 -0
  152. package/dist/browser/react/mount-context.js +24 -0
  153. package/dist/browser/react/mount-context.js.map +1 -0
  154. package/dist/browser/react/use-action.d.ts +64 -0
  155. package/dist/browser/react/use-action.d.ts.map +1 -0
  156. package/dist/browser/react/use-action.js +134 -0
  157. package/dist/browser/react/use-action.js.map +1 -0
  158. package/dist/browser/react/use-client-cache.d.ts +41 -0
  159. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  160. package/dist/browser/react/use-client-cache.js +39 -0
  161. package/dist/browser/react/use-client-cache.js.map +1 -0
  162. package/dist/browser/react/use-handle.d.ts +31 -0
  163. package/dist/browser/react/use-handle.d.ts.map +1 -0
  164. package/dist/browser/react/use-handle.js +144 -0
  165. package/dist/browser/react/use-handle.js.map +1 -0
  166. package/dist/browser/react/use-href.d.ts +33 -0
  167. package/dist/browser/react/use-href.d.ts.map +1 -0
  168. package/dist/browser/react/use-href.js +39 -0
  169. package/dist/browser/react/use-href.js.map +1 -0
  170. package/dist/browser/react/use-link-status.d.ts +37 -0
  171. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  172. package/dist/browser/react/use-link-status.js +99 -0
  173. package/dist/browser/react/use-link-status.js.map +1 -0
  174. package/dist/browser/react/use-mount.d.ts +25 -0
  175. package/dist/browser/react/use-mount.d.ts.map +1 -0
  176. package/dist/browser/react/use-mount.js +30 -0
  177. package/dist/browser/react/use-mount.js.map +1 -0
  178. package/dist/browser/react/use-navigation.d.ts +27 -0
  179. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  180. package/dist/browser/react/use-navigation.js +87 -0
  181. package/dist/browser/react/use-navigation.js.map +1 -0
  182. package/dist/browser/react/use-segments.d.ts +38 -0
  183. package/dist/browser/react/use-segments.d.ts.map +1 -0
  184. package/dist/browser/react/use-segments.js +130 -0
  185. package/dist/browser/react/use-segments.js.map +1 -0
  186. package/dist/browser/request-controller.d.ts +26 -0
  187. package/dist/browser/request-controller.d.ts.map +1 -0
  188. package/dist/browser/request-controller.js +147 -0
  189. package/dist/browser/request-controller.js.map +1 -0
  190. package/dist/browser/rsc-router.d.ts +129 -0
  191. package/dist/browser/rsc-router.d.ts.map +1 -0
  192. package/dist/browser/rsc-router.js +195 -0
  193. package/dist/browser/rsc-router.js.map +1 -0
  194. package/dist/browser/scroll-restoration.d.ts +93 -0
  195. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  196. package/dist/browser/scroll-restoration.js +321 -0
  197. package/dist/browser/scroll-restoration.js.map +1 -0
  198. package/dist/browser/segment-structure-assert.d.ts +17 -0
  199. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  200. package/dist/browser/segment-structure-assert.js +59 -0
  201. package/dist/browser/segment-structure-assert.js.map +1 -0
  202. package/dist/browser/server-action-bridge.d.ts +26 -0
  203. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  204. package/dist/browser/server-action-bridge.js +668 -0
  205. package/dist/browser/server-action-bridge.js.map +1 -0
  206. package/dist/browser/shallow.d.ts +12 -0
  207. package/dist/browser/shallow.d.ts.map +1 -0
  208. package/dist/browser/shallow.js +34 -0
  209. package/dist/browser/shallow.js.map +1 -0
  210. package/dist/browser/types.d.ts +369 -0
  211. package/dist/browser/types.d.ts.map +1 -0
  212. package/dist/browser/types.js +2 -0
  213. package/dist/browser/types.js.map +1 -0
  214. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  216. package/dist/build/__tests__/generate-cli.test.js +237 -0
  217. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  218. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  220. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  221. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  222. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  224. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  225. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  226. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  228. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  230. package/dist/build/generate-manifest.d.ts +81 -0
  231. package/dist/build/generate-manifest.d.ts.map +1 -0
  232. package/dist/build/generate-manifest.js +276 -0
  233. package/dist/build/generate-manifest.js.map +1 -0
  234. package/dist/build/generate-route-types.d.ts +115 -0
  235. package/dist/build/generate-route-types.d.ts.map +1 -0
  236. package/dist/build/generate-route-types.js +740 -0
  237. package/dist/build/generate-route-types.js.map +1 -0
  238. package/dist/build/index.d.ts +21 -0
  239. package/dist/build/index.d.ts.map +1 -0
  240. package/dist/build/index.js +21 -0
  241. package/dist/build/index.js.map +1 -0
  242. package/dist/build/route-trie.d.ts +71 -0
  243. package/dist/build/route-trie.d.ts.map +1 -0
  244. package/dist/build/route-trie.js +175 -0
  245. package/dist/build/route-trie.js.map +1 -0
  246. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  248. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  249. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  250. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  252. package/dist/cache/__tests__/document-cache.test.js +345 -0
  253. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  254. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  258. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  260. package/dist/cache/__tests__/memory-store.test.js +367 -0
  261. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  262. package/dist/cache/cache-scope.d.ts +102 -0
  263. package/dist/cache/cache-scope.d.ts.map +1 -0
  264. package/dist/cache/cache-scope.js +440 -0
  265. package/dist/cache/cache-scope.js.map +1 -0
  266. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  270. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  272. package/dist/cache/cf/cf-cache-store.js +242 -0
  273. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  274. package/dist/cache/cf/index.d.ts +14 -0
  275. package/dist/cache/cf/index.d.ts.map +1 -0
  276. package/dist/cache/cf/index.js +17 -0
  277. package/dist/cache/cf/index.js.map +1 -0
  278. package/dist/cache/document-cache.d.ts +64 -0
  279. package/dist/cache/document-cache.d.ts.map +1 -0
  280. package/dist/cache/document-cache.js +228 -0
  281. package/dist/cache/document-cache.js.map +1 -0
  282. package/dist/cache/index.d.ts +19 -0
  283. package/dist/cache/index.d.ts.map +1 -0
  284. package/dist/cache/index.js +21 -0
  285. package/dist/cache/index.js.map +1 -0
  286. package/dist/cache/memory-segment-store.d.ts +110 -0
  287. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  288. package/dist/cache/memory-segment-store.js +117 -0
  289. package/dist/cache/memory-segment-store.js.map +1 -0
  290. package/dist/cache/memory-store.d.ts +41 -0
  291. package/dist/cache/memory-store.d.ts.map +1 -0
  292. package/dist/cache/memory-store.js +191 -0
  293. package/dist/cache/memory-store.js.map +1 -0
  294. package/dist/cache/types.d.ts +317 -0
  295. package/dist/cache/types.d.ts.map +1 -0
  296. package/dist/cache/types.js +12 -0
  297. package/dist/cache/types.js.map +1 -0
  298. package/dist/client.d.ts +248 -0
  299. package/dist/client.d.ts.map +1 -0
  300. package/dist/client.js +367 -0
  301. package/dist/client.js.map +1 -0
  302. package/dist/client.rsc.d.ts +26 -0
  303. package/dist/client.rsc.d.ts.map +1 -0
  304. package/dist/client.rsc.js +46 -0
  305. package/dist/client.rsc.js.map +1 -0
  306. package/dist/component-utils.d.ts +36 -0
  307. package/dist/component-utils.d.ts.map +1 -0
  308. package/dist/component-utils.js +61 -0
  309. package/dist/component-utils.js.map +1 -0
  310. package/dist/components/DefaultDocument.d.ts +13 -0
  311. package/dist/components/DefaultDocument.d.ts.map +1 -0
  312. package/dist/components/DefaultDocument.js +15 -0
  313. package/dist/components/DefaultDocument.js.map +1 -0
  314. package/dist/debug.d.ts +58 -0
  315. package/dist/debug.d.ts.map +1 -0
  316. package/dist/debug.js +157 -0
  317. package/dist/debug.js.map +1 -0
  318. package/dist/default-error-boundary.d.ts +11 -0
  319. package/dist/default-error-boundary.d.ts.map +1 -0
  320. package/dist/default-error-boundary.js +45 -0
  321. package/dist/default-error-boundary.js.map +1 -0
  322. package/dist/deps/browser.d.ts +2 -0
  323. package/dist/deps/browser.d.ts.map +1 -0
  324. package/dist/deps/browser.js +3 -0
  325. package/dist/deps/browser.js.map +1 -0
  326. package/dist/deps/html-stream-client.d.ts +2 -0
  327. package/dist/deps/html-stream-client.d.ts.map +1 -0
  328. package/dist/deps/html-stream-client.js +3 -0
  329. package/dist/deps/html-stream-client.js.map +1 -0
  330. package/dist/deps/html-stream-server.d.ts +2 -0
  331. package/dist/deps/html-stream-server.d.ts.map +1 -0
  332. package/dist/deps/html-stream-server.js +3 -0
  333. package/dist/deps/html-stream-server.js.map +1 -0
  334. package/dist/deps/rsc.d.ts +2 -0
  335. package/dist/deps/rsc.d.ts.map +1 -0
  336. package/dist/deps/rsc.js +4 -0
  337. package/dist/deps/rsc.js.map +1 -0
  338. package/dist/deps/ssr.d.ts +2 -0
  339. package/dist/deps/ssr.d.ts.map +1 -0
  340. package/dist/deps/ssr.js +3 -0
  341. package/dist/deps/ssr.js.map +1 -0
  342. package/dist/errors.d.ts +174 -0
  343. package/dist/errors.d.ts.map +1 -0
  344. package/dist/errors.js +241 -0
  345. package/dist/errors.js.map +1 -0
  346. package/dist/handle.d.ts +78 -0
  347. package/dist/handle.d.ts.map +1 -0
  348. package/dist/handle.js +82 -0
  349. package/dist/handle.js.map +1 -0
  350. package/dist/handles/MetaTags.d.ts +14 -0
  351. package/dist/handles/MetaTags.d.ts.map +1 -0
  352. package/dist/handles/MetaTags.js +136 -0
  353. package/dist/handles/MetaTags.js.map +1 -0
  354. package/dist/handles/index.d.ts +6 -0
  355. package/dist/handles/index.d.ts.map +1 -0
  356. package/dist/handles/index.js +6 -0
  357. package/dist/handles/index.js.map +1 -0
  358. package/dist/handles/meta.d.ts +39 -0
  359. package/dist/handles/meta.d.ts.map +1 -0
  360. package/dist/handles/meta.js +202 -0
  361. package/dist/handles/meta.js.map +1 -0
  362. package/dist/host/__tests__/errors.test.d.ts +2 -0
  363. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  364. package/dist/host/__tests__/errors.test.js +76 -0
  365. package/dist/host/__tests__/errors.test.js.map +1 -0
  366. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  370. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  372. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  374. package/dist/host/__tests__/router.test.d.ts +2 -0
  375. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  376. package/dist/host/__tests__/router.test.js +241 -0
  377. package/dist/host/__tests__/router.test.js.map +1 -0
  378. package/dist/host/__tests__/testing.test.d.ts +2 -0
  379. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  380. package/dist/host/__tests__/testing.test.js +64 -0
  381. package/dist/host/__tests__/testing.test.js.map +1 -0
  382. package/dist/host/__tests__/utils.test.d.ts +2 -0
  383. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  384. package/dist/host/__tests__/utils.test.js +29 -0
  385. package/dist/host/__tests__/utils.test.js.map +1 -0
  386. package/dist/host/cookie-handler.d.ts +34 -0
  387. package/dist/host/cookie-handler.d.ts.map +1 -0
  388. package/dist/host/cookie-handler.js +124 -0
  389. package/dist/host/cookie-handler.js.map +1 -0
  390. package/dist/host/errors.d.ts +56 -0
  391. package/dist/host/errors.d.ts.map +1 -0
  392. package/dist/host/errors.js +79 -0
  393. package/dist/host/errors.js.map +1 -0
  394. package/dist/host/index.d.ts +29 -0
  395. package/dist/host/index.d.ts.map +1 -0
  396. package/dist/host/index.js +32 -0
  397. package/dist/host/index.js.map +1 -0
  398. package/dist/host/pattern-matcher.d.ts +36 -0
  399. package/dist/host/pattern-matcher.d.ts.map +1 -0
  400. package/dist/host/pattern-matcher.js +172 -0
  401. package/dist/host/pattern-matcher.js.map +1 -0
  402. package/dist/host/router.d.ts +26 -0
  403. package/dist/host/router.d.ts.map +1 -0
  404. package/dist/host/router.js +218 -0
  405. package/dist/host/router.js.map +1 -0
  406. package/dist/host/testing.d.ts +36 -0
  407. package/dist/host/testing.d.ts.map +1 -0
  408. package/dist/host/testing.js +55 -0
  409. package/dist/host/testing.js.map +1 -0
  410. package/dist/host/types.d.ts +115 -0
  411. package/dist/host/types.d.ts.map +1 -0
  412. package/dist/host/types.js +7 -0
  413. package/dist/host/types.js.map +1 -0
  414. package/dist/host/utils.d.ts +21 -0
  415. package/dist/host/utils.d.ts.map +1 -0
  416. package/dist/host/utils.js +23 -0
  417. package/dist/host/utils.js.map +1 -0
  418. package/dist/href-client.d.ts +131 -0
  419. package/dist/href-client.d.ts.map +1 -0
  420. package/dist/href-client.js +64 -0
  421. package/dist/href-client.js.map +1 -0
  422. package/dist/href-context.d.ts +29 -0
  423. package/dist/href-context.d.ts.map +1 -0
  424. package/dist/href-context.js +21 -0
  425. package/dist/href-context.js.map +1 -0
  426. package/dist/index.d.ts +73 -0
  427. package/dist/index.d.ts.map +1 -0
  428. package/dist/index.js +91 -0
  429. package/dist/index.js.map +1 -0
  430. package/dist/index.rsc.d.ts +32 -0
  431. package/dist/index.rsc.d.ts.map +1 -0
  432. package/dist/index.rsc.js +40 -0
  433. package/dist/index.rsc.js.map +1 -0
  434. package/dist/internal-debug.d.ts +2 -0
  435. package/dist/internal-debug.d.ts.map +1 -0
  436. package/dist/internal-debug.js +5 -0
  437. package/dist/internal-debug.js.map +1 -0
  438. package/dist/loader.d.ts +14 -0
  439. package/dist/loader.d.ts.map +1 -0
  440. package/dist/loader.js +20 -0
  441. package/dist/loader.js.map +1 -0
  442. package/dist/loader.rsc.d.ts +19 -0
  443. package/dist/loader.rsc.d.ts.map +1 -0
  444. package/dist/loader.rsc.js +99 -0
  445. package/dist/loader.rsc.js.map +1 -0
  446. package/dist/network-error-thrower.d.ts +17 -0
  447. package/dist/network-error-thrower.d.ts.map +1 -0
  448. package/dist/network-error-thrower.js +14 -0
  449. package/dist/network-error-thrower.js.map +1 -0
  450. package/dist/outlet-context.d.ts +13 -0
  451. package/dist/outlet-context.d.ts.map +1 -0
  452. package/dist/outlet-context.js +3 -0
  453. package/dist/outlet-context.js.map +1 -0
  454. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  456. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  457. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  458. package/dist/prerender/param-hash.d.ts +16 -0
  459. package/dist/prerender/param-hash.d.ts.map +1 -0
  460. package/dist/prerender/param-hash.js +36 -0
  461. package/dist/prerender/param-hash.js.map +1 -0
  462. package/dist/prerender/store.d.ts +38 -0
  463. package/dist/prerender/store.d.ts.map +1 -0
  464. package/dist/prerender/store.js +61 -0
  465. package/dist/prerender/store.js.map +1 -0
  466. package/dist/prerender.d.ts +66 -0
  467. package/dist/prerender.d.ts.map +1 -0
  468. package/dist/prerender.js +57 -0
  469. package/dist/prerender.js.map +1 -0
  470. package/dist/reverse.d.ts +196 -0
  471. package/dist/reverse.d.ts.map +1 -0
  472. package/dist/reverse.js +78 -0
  473. package/dist/reverse.js.map +1 -0
  474. package/dist/root-error-boundary.d.ts +33 -0
  475. package/dist/root-error-boundary.d.ts.map +1 -0
  476. package/dist/root-error-boundary.js +165 -0
  477. package/dist/root-error-boundary.js.map +1 -0
  478. package/dist/route-content-wrapper.d.ts +46 -0
  479. package/dist/route-content-wrapper.d.ts.map +1 -0
  480. package/dist/route-content-wrapper.js +77 -0
  481. package/dist/route-content-wrapper.js.map +1 -0
  482. package/dist/route-definition.d.ts +421 -0
  483. package/dist/route-definition.d.ts.map +1 -0
  484. package/dist/route-definition.js +868 -0
  485. package/dist/route-definition.js.map +1 -0
  486. package/dist/route-map-builder.d.ts +155 -0
  487. package/dist/route-map-builder.d.ts.map +1 -0
  488. package/dist/route-map-builder.js +237 -0
  489. package/dist/route-map-builder.js.map +1 -0
  490. package/dist/route-types.d.ts +165 -0
  491. package/dist/route-types.d.ts.map +1 -0
  492. package/dist/route-types.js +7 -0
  493. package/dist/route-types.js.map +1 -0
  494. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  496. package/dist/router/__tests__/handler-context.test.js +65 -0
  497. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  498. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  502. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  503. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  504. package/dist/router/__tests__/match-context.test.js +92 -0
  505. package/dist/router/__tests__/match-context.test.js.map +1 -0
  506. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  508. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  509. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  510. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  511. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  512. package/dist/router/__tests__/match-result.test.js +457 -0
  513. package/dist/router/__tests__/match-result.test.js.map +1 -0
  514. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  515. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  516. package/dist/router/__tests__/on-error.test.js +678 -0
  517. package/dist/router/__tests__/on-error.test.js.map +1 -0
  518. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  520. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  521. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  522. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  526. package/dist/router/error-handling.d.ts +77 -0
  527. package/dist/router/error-handling.d.ts.map +1 -0
  528. package/dist/router/error-handling.js +202 -0
  529. package/dist/router/error-handling.js.map +1 -0
  530. package/dist/router/handler-context.d.ts +20 -0
  531. package/dist/router/handler-context.d.ts.map +1 -0
  532. package/dist/router/handler-context.js +198 -0
  533. package/dist/router/handler-context.js.map +1 -0
  534. package/dist/router/intercept-resolution.d.ts +66 -0
  535. package/dist/router/intercept-resolution.d.ts.map +1 -0
  536. package/dist/router/intercept-resolution.js +246 -0
  537. package/dist/router/intercept-resolution.js.map +1 -0
  538. package/dist/router/loader-resolution.d.ts +64 -0
  539. package/dist/router/loader-resolution.d.ts.map +1 -0
  540. package/dist/router/loader-resolution.js +284 -0
  541. package/dist/router/loader-resolution.js.map +1 -0
  542. package/dist/router/logging.d.ts +15 -0
  543. package/dist/router/logging.d.ts.map +1 -0
  544. package/dist/router/logging.js +99 -0
  545. package/dist/router/logging.js.map +1 -0
  546. package/dist/router/manifest.d.ts +22 -0
  547. package/dist/router/manifest.d.ts.map +1 -0
  548. package/dist/router/manifest.js +181 -0
  549. package/dist/router/manifest.js.map +1 -0
  550. package/dist/router/match-api.d.ts +35 -0
  551. package/dist/router/match-api.d.ts.map +1 -0
  552. package/dist/router/match-api.js +406 -0
  553. package/dist/router/match-api.js.map +1 -0
  554. package/dist/router/match-context.d.ts +206 -0
  555. package/dist/router/match-context.d.ts.map +1 -0
  556. package/dist/router/match-context.js +17 -0
  557. package/dist/router/match-context.js.map +1 -0
  558. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  560. package/dist/router/match-middleware/background-revalidation.js +75 -0
  561. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  562. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  564. package/dist/router/match-middleware/cache-lookup.js +257 -0
  565. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  566. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  567. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  568. package/dist/router/match-middleware/cache-store.js +108 -0
  569. package/dist/router/match-middleware/cache-store.js.map +1 -0
  570. package/dist/router/match-middleware/index.d.ts +81 -0
  571. package/dist/router/match-middleware/index.d.ts.map +1 -0
  572. package/dist/router/match-middleware/index.js +80 -0
  573. package/dist/router/match-middleware/index.js.map +1 -0
  574. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  576. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  577. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  578. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  580. package/dist/router/match-middleware/segment-resolution.js +53 -0
  581. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  582. package/dist/router/match-pipelines.d.ts +147 -0
  583. package/dist/router/match-pipelines.d.ts.map +1 -0
  584. package/dist/router/match-pipelines.js +82 -0
  585. package/dist/router/match-pipelines.js.map +1 -0
  586. package/dist/router/match-result.d.ts +126 -0
  587. package/dist/router/match-result.d.ts.map +1 -0
  588. package/dist/router/match-result.js +93 -0
  589. package/dist/router/match-result.js.map +1 -0
  590. package/dist/router/metrics.d.ts +20 -0
  591. package/dist/router/metrics.d.ts.map +1 -0
  592. package/dist/router/metrics.js +47 -0
  593. package/dist/router/metrics.js.map +1 -0
  594. package/dist/router/middleware.d.ts +249 -0
  595. package/dist/router/middleware.d.ts.map +1 -0
  596. package/dist/router/middleware.js +434 -0
  597. package/dist/router/middleware.js.map +1 -0
  598. package/dist/router/middleware.test.d.ts +2 -0
  599. package/dist/router/middleware.test.d.ts.map +1 -0
  600. package/dist/router/middleware.test.js +816 -0
  601. package/dist/router/middleware.test.js.map +1 -0
  602. package/dist/router/pattern-matching.d.ts +149 -0
  603. package/dist/router/pattern-matching.d.ts.map +1 -0
  604. package/dist/router/pattern-matching.js +349 -0
  605. package/dist/router/pattern-matching.js.map +1 -0
  606. package/dist/router/revalidation.d.ts +44 -0
  607. package/dist/router/revalidation.d.ts.map +1 -0
  608. package/dist/router/revalidation.js +147 -0
  609. package/dist/router/revalidation.js.map +1 -0
  610. package/dist/router/router-context.d.ts +135 -0
  611. package/dist/router/router-context.d.ts.map +1 -0
  612. package/dist/router/router-context.js +36 -0
  613. package/dist/router/router-context.js.map +1 -0
  614. package/dist/router/segment-resolution.d.ts +127 -0
  615. package/dist/router/segment-resolution.d.ts.map +1 -0
  616. package/dist/router/segment-resolution.js +919 -0
  617. package/dist/router/segment-resolution.js.map +1 -0
  618. package/dist/router/trie-matching.d.ts +40 -0
  619. package/dist/router/trie-matching.d.ts.map +1 -0
  620. package/dist/router/trie-matching.js +127 -0
  621. package/dist/router/trie-matching.js.map +1 -0
  622. package/dist/router/types.d.ts +136 -0
  623. package/dist/router/types.d.ts.map +1 -0
  624. package/dist/router/types.js +7 -0
  625. package/dist/router/types.js.map +1 -0
  626. package/dist/router.d.ts +753 -0
  627. package/dist/router.d.ts.map +1 -0
  628. package/dist/router.gen.d.ts +6 -0
  629. package/dist/router.gen.d.ts.map +1 -0
  630. package/dist/router.gen.js +6 -0
  631. package/dist/router.gen.js.map +1 -0
  632. package/dist/router.js +1304 -0
  633. package/dist/router.js.map +1 -0
  634. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  636. package/dist/rsc/__tests__/helpers.test.js +140 -0
  637. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  638. package/dist/rsc/handler.d.ts +45 -0
  639. package/dist/rsc/handler.d.ts.map +1 -0
  640. package/dist/rsc/handler.js +1172 -0
  641. package/dist/rsc/handler.js.map +1 -0
  642. package/dist/rsc/helpers.d.ts +16 -0
  643. package/dist/rsc/helpers.d.ts.map +1 -0
  644. package/dist/rsc/helpers.js +55 -0
  645. package/dist/rsc/helpers.js.map +1 -0
  646. package/dist/rsc/index.d.ts +22 -0
  647. package/dist/rsc/index.d.ts.map +1 -0
  648. package/dist/rsc/index.js +23 -0
  649. package/dist/rsc/index.js.map +1 -0
  650. package/dist/rsc/nonce.d.ts +9 -0
  651. package/dist/rsc/nonce.d.ts.map +1 -0
  652. package/dist/rsc/nonce.js +18 -0
  653. package/dist/rsc/nonce.js.map +1 -0
  654. package/dist/rsc/types.d.ts +206 -0
  655. package/dist/rsc/types.d.ts.map +1 -0
  656. package/dist/rsc/types.js +8 -0
  657. package/dist/rsc/types.js.map +1 -0
  658. package/dist/search-params.d.ts +103 -0
  659. package/dist/search-params.d.ts.map +1 -0
  660. package/dist/search-params.js +74 -0
  661. package/dist/search-params.js.map +1 -0
  662. package/dist/segment-system.d.ts +75 -0
  663. package/dist/segment-system.d.ts.map +1 -0
  664. package/dist/segment-system.js +336 -0
  665. package/dist/segment-system.js.map +1 -0
  666. package/dist/server/context.d.ts +245 -0
  667. package/dist/server/context.d.ts.map +1 -0
  668. package/dist/server/context.js +197 -0
  669. package/dist/server/context.js.map +1 -0
  670. package/dist/server/fetchable-loader-store.d.ts +18 -0
  671. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  672. package/dist/server/fetchable-loader-store.js +18 -0
  673. package/dist/server/fetchable-loader-store.js.map +1 -0
  674. package/dist/server/handle-store.d.ts +85 -0
  675. package/dist/server/handle-store.d.ts.map +1 -0
  676. package/dist/server/handle-store.js +142 -0
  677. package/dist/server/handle-store.js.map +1 -0
  678. package/dist/server/loader-registry.d.ts +55 -0
  679. package/dist/server/loader-registry.d.ts.map +1 -0
  680. package/dist/server/loader-registry.js +132 -0
  681. package/dist/server/loader-registry.js.map +1 -0
  682. package/dist/server/request-context.d.ts +226 -0
  683. package/dist/server/request-context.d.ts.map +1 -0
  684. package/dist/server/request-context.js +290 -0
  685. package/dist/server/request-context.js.map +1 -0
  686. package/dist/server/root-layout.d.ts +4 -0
  687. package/dist/server/root-layout.d.ts.map +1 -0
  688. package/dist/server/root-layout.js +5 -0
  689. package/dist/server/root-layout.js.map +1 -0
  690. package/dist/server.d.ts +15 -0
  691. package/dist/server.d.ts.map +1 -0
  692. package/dist/server.js +20 -0
  693. package/dist/server.js.map +1 -0
  694. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  698. package/dist/ssr/index.d.ts +98 -0
  699. package/dist/ssr/index.d.ts.map +1 -0
  700. package/dist/ssr/index.js +158 -0
  701. package/dist/ssr/index.js.map +1 -0
  702. package/dist/static-handler.d.ts +50 -0
  703. package/dist/static-handler.d.ts.map +1 -0
  704. package/dist/static-handler.gen.d.ts +5 -0
  705. package/dist/static-handler.gen.d.ts.map +1 -0
  706. package/dist/static-handler.gen.js +5 -0
  707. package/dist/static-handler.gen.js.map +1 -0
  708. package/dist/static-handler.js +29 -0
  709. package/dist/static-handler.js.map +1 -0
  710. package/dist/theme/ThemeProvider.d.ts +20 -0
  711. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  712. package/dist/theme/ThemeProvider.js +240 -0
  713. package/dist/theme/ThemeProvider.js.map +1 -0
  714. package/dist/theme/ThemeScript.d.ts +48 -0
  715. package/dist/theme/ThemeScript.d.ts.map +1 -0
  716. package/dist/theme/ThemeScript.js +13 -0
  717. package/dist/theme/ThemeScript.js.map +1 -0
  718. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  719. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  720. package/dist/theme/__tests__/theme.test.js +103 -0
  721. package/dist/theme/__tests__/theme.test.js.map +1 -0
  722. package/dist/theme/constants.d.ts +29 -0
  723. package/dist/theme/constants.d.ts.map +1 -0
  724. package/dist/theme/constants.js +48 -0
  725. package/dist/theme/constants.js.map +1 -0
  726. package/dist/theme/index.d.ts +31 -0
  727. package/dist/theme/index.d.ts.map +1 -0
  728. package/dist/theme/index.js +36 -0
  729. package/dist/theme/index.js.map +1 -0
  730. package/dist/theme/theme-context.d.ts +40 -0
  731. package/dist/theme/theme-context.d.ts.map +1 -0
  732. package/dist/theme/theme-context.js +60 -0
  733. package/dist/theme/theme-context.js.map +1 -0
  734. package/dist/theme/theme-script.d.ts +27 -0
  735. package/dist/theme/theme-script.d.ts.map +1 -0
  736. package/dist/theme/theme-script.js +147 -0
  737. package/dist/theme/theme-script.js.map +1 -0
  738. package/dist/theme/types.d.ts +163 -0
  739. package/dist/theme/types.d.ts.map +1 -0
  740. package/dist/theme/types.js +11 -0
  741. package/dist/theme/types.js.map +1 -0
  742. package/dist/theme/use-theme.d.ts +12 -0
  743. package/dist/theme/use-theme.d.ts.map +1 -0
  744. package/dist/theme/use-theme.js +40 -0
  745. package/dist/theme/use-theme.js.map +1 -0
  746. package/dist/types.d.ts +1479 -0
  747. package/dist/types.d.ts.map +1 -0
  748. package/dist/types.js +10 -0
  749. package/dist/types.js.map +1 -0
  750. package/dist/urls.d.ts +441 -0
  751. package/dist/urls.d.ts.map +1 -0
  752. package/dist/urls.gen.d.ts +8 -0
  753. package/dist/urls.gen.d.ts.map +1 -0
  754. package/dist/urls.gen.js +8 -0
  755. package/dist/urls.gen.js.map +1 -0
  756. package/dist/urls.js +443 -0
  757. package/dist/urls.js.map +1 -0
  758. package/dist/use-loader.d.ts +127 -0
  759. package/dist/use-loader.d.ts.map +1 -0
  760. package/dist/use-loader.js +237 -0
  761. package/dist/use-loader.js.map +1 -0
  762. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  763. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  766. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  767. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  770. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  771. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  774. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  775. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  777. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  778. package/dist/vite/ast-handler-extract.d.ts +49 -0
  779. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  780. package/dist/vite/ast-handler-extract.js +249 -0
  781. package/dist/vite/ast-handler-extract.js.map +1 -0
  782. package/dist/vite/expose-action-id.d.ts +19 -0
  783. package/dist/vite/expose-action-id.d.ts.map +1 -0
  784. package/dist/vite/expose-action-id.js +250 -0
  785. package/dist/vite/expose-action-id.js.map +1 -0
  786. package/dist/vite/expose-id-utils.d.ts +69 -0
  787. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  788. package/dist/vite/expose-id-utils.js +289 -0
  789. package/dist/vite/expose-id-utils.js.map +1 -0
  790. package/dist/vite/expose-internal-ids.d.ts +22 -0
  791. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  792. package/dist/vite/expose-internal-ids.js +886 -0
  793. package/dist/vite/expose-internal-ids.js.map +1 -0
  794. package/dist/vite/index.d.ts +149 -0
  795. package/dist/vite/index.d.ts.map +1 -0
  796. package/dist/vite/index.js +82 -15
  797. package/dist/vite/index.js.bak +5448 -0
  798. package/dist/vite/index.js.map +1 -0
  799. package/dist/vite/index.named-routes.gen.ts +103 -0
  800. package/dist/vite/package-resolution.d.ts +43 -0
  801. package/dist/vite/package-resolution.d.ts.map +1 -0
  802. package/dist/vite/package-resolution.js +112 -0
  803. package/dist/vite/package-resolution.js.map +1 -0
  804. package/dist/vite/virtual-entries.d.ts +25 -0
  805. package/dist/vite/virtual-entries.d.ts.map +1 -0
  806. package/dist/vite/virtual-entries.js +110 -0
  807. package/dist/vite/virtual-entries.js.map +1 -0
  808. package/package.json +19 -18
  809. package/skills/api-client/SKILL.md +1 -1
  810. package/skills/breadcrumbs/SKILL.md +1 -1
  811. package/skills/cache-guide/SKILL.md +1 -1
  812. package/skills/caching/SKILL.md +17 -1
  813. package/skills/catalog.json +265 -0
  814. package/skills/comparison/references/framework-comparison.md +1 -1
  815. package/skills/composability/SKILL.md +1 -1
  816. package/skills/debug-manifest/SKILL.md +1 -1
  817. package/skills/document-cache/SKILL.md +9 -1
  818. package/skills/fonts/SKILL.md +1 -1
  819. package/skills/handler-use/SKILL.md +1 -1
  820. package/skills/hooks/SKILL.md +54 -892
  821. package/skills/hooks/data.md +273 -0
  822. package/skills/hooks/handle-and-actions.md +103 -0
  823. package/skills/hooks/navigation.md +110 -0
  824. package/skills/hooks/outlets.md +41 -0
  825. package/skills/hooks/state.md +228 -0
  826. package/skills/hooks/urls.md +135 -0
  827. package/skills/host-router/SKILL.md +1 -1
  828. package/skills/i18n/SKILL.md +1 -1
  829. package/skills/intercept/SKILL.md +8 -1
  830. package/skills/layout/SKILL.md +1 -1
  831. package/skills/links/SKILL.md +1 -1
  832. package/skills/loader/SKILL.md +8 -1
  833. package/skills/middleware/SKILL.md +1 -1
  834. package/skills/migrate-nextjs/SKILL.md +133 -1
  835. package/skills/migrate-react-router/SKILL.md +42 -816
  836. package/skills/migrate-react-router/cloudflare-workers.md +129 -0
  837. package/skills/migrate-react-router/component-migration.md +196 -0
  838. package/skills/migrate-react-router/data-and-actions.md +225 -0
  839. package/skills/migrate-react-router/route-mapping.md +271 -0
  840. package/skills/mime-routes/SKILL.md +1 -1
  841. package/skills/observability/SKILL.md +1 -1
  842. package/skills/parallel/SKILL.md +8 -1
  843. package/skills/ppr/SKILL.md +448 -348
  844. package/skills/prerender/SKILL.md +8 -1
  845. package/skills/rango/SKILL.md +14 -14
  846. package/skills/response-routes/SKILL.md +1 -1
  847. package/skills/route/SKILL.md +1 -1
  848. package/skills/router-setup/SKILL.md +1 -1
  849. package/skills/scripts/SKILL.md +1 -1
  850. package/skills/server-actions/SKILL.md +3 -2
  851. package/skills/shell-manifest/SKILL.md +1 -1
  852. package/skills/streams-and-websockets/SKILL.md +1 -1
  853. package/skills/tailwind/SKILL.md +1 -1
  854. package/skills/testing/SKILL.md +1 -1
  855. package/skills/theme/SKILL.md +1 -1
  856. package/skills/typesafety/SKILL.md +44 -919
  857. package/skills/typesafety/env-and-bindings.md +254 -0
  858. package/skills/typesafety/generated-files-and-cli.md +305 -0
  859. package/skills/typesafety/params-and-search.md +153 -0
  860. package/skills/typesafety/route-types.md +209 -0
  861. package/skills/use-cache/SKILL.md +7 -1
  862. package/skills/vercel/SKILL.md +1 -1
  863. package/skills/view-transitions/SKILL.md +1 -1
  864. package/src/browser/event-controller.ts +41 -10
  865. package/src/browser/logging.ts +10 -0
  866. package/src/browser/merge-segment-loaders.ts +6 -4
  867. package/src/browser/navigation-client.ts +5 -1
  868. package/src/browser/navigation-store.ts +46 -6
  869. package/src/browser/partial-update.ts +27 -15
  870. package/src/browser/prefetch/cache.ts +26 -4
  871. package/src/browser/prefetch/fetch.ts +27 -17
  872. package/src/browser/react/Link.tsx +13 -3
  873. package/src/browser/react/NavigationProvider.tsx +21 -19
  874. package/src/browser/scroll-restoration.ts +7 -5
  875. package/src/browser/segment-reconciler.ts +31 -21
  876. package/src/browser/types.ts +12 -0
  877. package/src/cache/cache-runtime.ts +203 -23
  878. package/src/cache/cf/cf-cache-store.ts +8 -0
  879. package/src/cache/document-cache.ts +20 -9
  880. package/src/cache/index.ts +0 -5
  881. package/src/cache/memory-segment-store.ts +53 -2
  882. package/src/cache/segment-codec.ts +4 -4
  883. package/src/cache/shell-snapshot.ts +417 -0
  884. package/src/cache/types.ts +86 -0
  885. package/src/cache/vercel/vercel-cache-store.ts +143 -108
  886. package/src/index.rsc.ts +1 -5
  887. package/src/index.ts +1 -17
  888. package/src/router/manifest.ts +13 -5
  889. package/src/router/match-api.ts +70 -30
  890. package/src/router/match-handlers.ts +6 -2
  891. package/src/router/match-result.ts +35 -15
  892. package/src/router/middleware.ts +10 -3
  893. package/src/router/request-classification.ts +20 -7
  894. package/src/router/route-snapshot.ts +10 -0
  895. package/src/router/segment-resolution/fresh.ts +25 -4
  896. package/src/router/segment-resolution/loader-cache.ts +57 -8
  897. package/src/router/segment-resolution/loader-mask.ts +26 -3
  898. package/src/router/segment-resolution/loader-snapshot.ts +170 -0
  899. package/src/rsc/nonce.ts +10 -1
  900. package/src/rsc/rsc-rendering.ts +310 -89
  901. package/src/rsc/shell-capture.ts +707 -66
  902. package/src/rsc/shell-serve.ts +150 -0
  903. package/src/server/context.ts +7 -0
  904. package/src/server/cookie-store.ts +6 -0
  905. package/src/server/request-context.ts +85 -46
  906. package/src/ssr/index.tsx +45 -6
  907. package/src/theme/ThemeProvider.tsx +36 -26
  908. package/src/urls/index.ts +1 -0
  909. package/src/urls/path-helper.ts +5 -0
  910. package/src/urls/pattern-types.ts +36 -0
  911. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  912. package/src/vite/router-discovery.ts +78 -15
  913. package/src/cache/shell-cache.ts +0 -386
  914. package/src/server/live.ts +0 -130
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Integrated PPR shell serving (Axis 2, see docs/design/ppr-shell-resume.md).
3
+ *
4
+ * PPR is opt-in per PAGE ROUTE via the `ppr` path option
5
+ * (`path(pattern, Handler, { name, ppr: true | PartialPrerenderProps })`) and the
6
+ * serving logic is INTEGRAL to the render pipeline — there is no middleware to
7
+ * mount. This module owns the config/key/store plumbing the render layer
8
+ * (rsc-rendering.ts) uses at its COMMIT POINT, which sits after the WHOLE
9
+ * middleware chain (global `router.use()` chain AND route DSL `middleware()`,
10
+ * both of which wrap the render pass): any middleware rejection/redirect wins
11
+ * before a single shell byte is written.
12
+ *
13
+ * The shell store is the app-level `createRouter({ cache })` store
14
+ * (`requestCtx._cacheStore`). A store without the `getShell`/`putShell` family
15
+ * degrades a ppr route to axis 1 with a once-per-key warning (the declared
16
+ * intent cannot be honored — unlike an undeclared route, which is silent).
17
+ */
18
+
19
+ import React from "react";
20
+ import type { EntryData } from "../server/context.js";
21
+ import { sortedSearchString } from "../cache/cache-key-utils.js";
22
+ import type { ShellCacheEntry, SegmentCacheStore } from "../cache/types.js";
23
+
24
+ /** Debug/status header the browser (and e2e assertions) can read: HIT | MISS. */
25
+ export const SHELL_STATUS_HEADER = "x-rango-shell";
26
+
27
+ /**
28
+ * Default shell ttl (seconds) for `ppr: true` and for a PartialPrerenderProps
29
+ * that omits `ttl`.
30
+ */
31
+ export const DEFAULT_PPR_TTL_SECONDS = 300;
32
+
33
+ /** The route's ppr option normalized to a concrete policy. */
34
+ export interface ResolvedPprConfig {
35
+ ttl: number;
36
+ swr?: number;
37
+ tags?: string[];
38
+ }
39
+
40
+ /**
41
+ * Normalize the matched page route's `ppr` path option. Returns null when the
42
+ * route does not declare `ppr` (or declares `ppr: false`) — the caller then does
43
+ * NOTHING: no store read, no capture, no logs. Pure axis 1, zero cost.
44
+ *
45
+ * PPR is a DOCUMENT-level property of the page route; there is no subtree
46
+ * inheritance (declaring it on a layout is not supported — a follow-up).
47
+ */
48
+ export function resolvePprConfig(
49
+ entry: EntryData | undefined | null,
50
+ ): ResolvedPprConfig | null {
51
+ if (!entry || entry.type !== "route") return null;
52
+ const ppr = entry.ppr;
53
+ if (ppr === undefined || ppr === false) return null;
54
+ if (ppr === true) return { ttl: DEFAULT_PPR_TTL_SECONDS };
55
+ return {
56
+ ttl: ppr.ttl ?? DEFAULT_PPR_TTL_SECONDS,
57
+ swr: ppr.swr,
58
+ tags: ppr.tags,
59
+ };
60
+ }
61
+
62
+ /**
63
+ * Shell cache key: host + pathname + sorted search + a `:shell` namespace suffix
64
+ * (so it can never collide with a document-cache key; the store further isolates
65
+ * the shell family internally).
66
+ *
67
+ * The key includes the request HOST: in a multi-tenant host-router deployment
68
+ * (one worker, one shared KV/runtime-cache store) a host-less key would serve
69
+ * tenant A's captured shell to tenant B's users.
70
+ */
71
+ export function buildShellKey(url: URL): string {
72
+ const sorted = sortedSearchString(url.searchParams);
73
+ const searchSuffix = sorted ? `?${sorted}` : "";
74
+ return `${url.host}${url.pathname}${searchSuffix}:shell`;
75
+ }
76
+
77
+ /**
78
+ * React version captured at prerender time is the invalidation gate: a stored
79
+ * shell whose reactVersion differs from the running React cannot be resumed (the
80
+ * postponed blob is build-coupled), so it is treated as a miss — the recapture
81
+ * overwrites the same key and the entry otherwise ages out via TTL.
82
+ */
83
+ export function isValidShellHit(entry: ShellCacheEntry): boolean {
84
+ return entry.reactVersion === React.version;
85
+ }
86
+
87
+ /** Decode a base64 prelude back into bytes for stream composition. */
88
+ export function base64ToBytes(b64: string): Uint8Array {
89
+ const binary = atob(b64);
90
+ const bytes = new Uint8Array(binary.length);
91
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
92
+ return bytes;
93
+ }
94
+
95
+ /** True when the store implements the shell entry family. */
96
+ export function hasShellFamily(
97
+ store: SegmentCacheStore | undefined,
98
+ ): store is SegmentCacheStore & {
99
+ getShell: NonNullable<SegmentCacheStore["getShell"]>;
100
+ putShell: NonNullable<SegmentCacheStore["putShell"]>;
101
+ } {
102
+ return !!store?.getShell && !!store?.putShell;
103
+ }
104
+
105
+ /** Keys already warned about a missing shell store family (once per key). */
106
+ const warnedMissingStore = new Set<string>();
107
+
108
+ /**
109
+ * Warn once per key that a route declared `ppr` but the app-level cache store
110
+ * does not implement the shell family (getShell/putShell), so the route stays on
111
+ * axis 1. Unlike an undeclared route (silent), a declared route that cannot be
112
+ * honored deserves a diagnostic.
113
+ */
114
+ export function warnShellStoreMissingOnce(key: string): void {
115
+ if (warnedMissingStore.has(key)) return;
116
+ warnedMissingStore.add(key);
117
+ console.warn(
118
+ `[rango] Route for "${key}" declares the ppr path option, but the app-level ` +
119
+ "cache store does not implement the shell family (getShell/putShell), so " +
120
+ "the route is served on axis 1 without a shell. Use MemorySegmentCacheStore, " +
121
+ "CFCacheStore, or VercelCacheStore (or add the family to your custom store) " +
122
+ "via createRouter({ cache }).",
123
+ );
124
+ }
125
+
126
+ /** Keys already warned about an active per-request nonce (once per key). */
127
+ const warnedNonceActive = new Set<string>();
128
+
129
+ /**
130
+ * Warn once per key that a route declared `ppr` but a per-request CSP nonce is
131
+ * active for the request, so the route stays on axis 1 (a shared shell would
132
+ * freeze one request's nonce for every visitor — useNonce() renders it into every
133
+ * nonced script/style/meta and the browser's CSP would then reject the frozen
134
+ * nonce for all but the capture request). The nonce blocks capture whether it came
135
+ * from the `createRouter({ nonce })` provider or from a direct `ctx.set(nonce, …)`
136
+ * token write in middleware. Same declared-intent-cannot-be-honored doctrine as
137
+ * the missing-store warning above (an undeclared route stays silent).
138
+ */
139
+ export function warnPprNonceActiveOnce(key: string): void {
140
+ if (warnedNonceActive.has(key)) return;
141
+ warnedNonceActive.add(key);
142
+ console.warn(
143
+ `[rango] Route for "${key}" declares the ppr path option, but a per-request ` +
144
+ "CSP nonce is active for this request (from createRouter({ nonce }) or a " +
145
+ "ctx.set(nonce, …) token write in middleware), so the route is served on " +
146
+ "axis 1 without a shell. A shell is shared per host+URL; baking one " +
147
+ "request's nonce into it would break CSP for every other visitor. Drop the " +
148
+ "ppr option on this route, or stop setting a per-request nonce for it.",
149
+ );
150
+ }
@@ -233,6 +233,13 @@ export type EntryData =
233
233
  staticHandlerId?: string;
234
234
  /** Response type for non-RSC routes (json, text, image, any) */
235
235
  responseType?: string;
236
+ /**
237
+ * PPR (partial pre-rendering) opt-in from the path() `ppr` option. A
238
+ * document-level property of the page route: `true` uses the default
239
+ * shell policy, an object carries ttl/swr/tags. Read by the integrated
240
+ * PPR serve path (rsc/shell-serve.ts resolvePprConfig).
241
+ */
242
+ ppr?: boolean | import("../urls/pattern-types.js").PartialPrerenderProps;
236
243
  } & EntryPropCommon &
237
244
  EntryPropDatas &
238
245
  EntryPropSegments &
@@ -164,6 +164,12 @@ function assertNotInsideShellCapture(ctx: unknown, fnName: string): void {
164
164
  typeof ctx === "object" &&
165
165
  (ctx as { _shellCaptureRun?: unknown })._shellCaptureRun === true
166
166
  ) {
167
+ // Flag the capture context BEFORE throwing: inside an executing bake-lane
168
+ // loader this throw is swallowed by wrapLoaderPromise into per-loader error
169
+ // UI, which would bake silently into the shared shell. The capture checks
170
+ // the flag after the render and refuses (shell-capture.ts).
171
+ (ctx as { _shellCaptureGuardTripped?: string })._shellCaptureGuardTripped =
172
+ fnName;
167
173
  throw new Error(
168
174
  `${fnName}() cannot be called while capturing a shared shell ` +
169
175
  `(shell-cache middleware). The captured shell is served to every user ` +
@@ -50,7 +50,6 @@ import type { Theme, ResolvedThemeConfig } from "../theme/types.js";
50
50
  import type { ExecutionContext, RequestScope } from "../types/request-scope.js";
51
51
  import type { TransitionWhenFn } from "../types/segments.js";
52
52
  import type { ResolvedTracing } from "../router/tracing.js";
53
- import { fireAndForgetWaitUntil } from "../types/request-scope.js";
54
53
  import {
55
54
  THEME_COOKIE,
56
55
  isValidTheme,
@@ -174,52 +173,53 @@ export interface RequestContext<
174
173
  /** @internal Cache store for segment caching (optional, used by CacheScope) */
175
174
  _cacheStore?: SegmentCacheStore;
176
175
 
177
- /**
178
- * @internal PPR shell-resume signal. Set by the shell-cache middleware on a
179
- * validated shell HIT before it awaits next(); read in the render orchestration
180
- * (rsc-rendering) to call the resume strategy instead of a full fizz render. The
181
- * middleware sets it optimistically — the render layer is the final authority
182
- * (nonce/formState/allReady bypass) and marks the response only when it actually
183
- * resumed. Single-request; the middleware clears it in a finally.
184
- */
185
- _shellResume?: { postponed: string | null };
186
-
187
- /**
188
- * @internal PPR shell-capture DESCRIPTOR ("a capture of this document is
189
- * wanted"). Set by the shell-cache middleware BEFORE its single foreground
190
- * next() on a MISS or SWR stale hit, and read by the render orchestration
191
- * (rsc-rendering) AFTER the response is built to schedule a background capture
192
- * task. Its mere presence must NOT change the foreground render — loader
193
- * masking and the cookie/header capture guard key off `_shellCaptureRun`, not
194
- * this descriptor. `store` carries the SAME store the middleware resolved for
195
- * its getShell read (options.store ?? _cacheStore), so a store-attached
196
- * middleware writes captures where it reads them; without it an explicit
197
- * options.store distinct from the app-level _cacheStore would read one store
198
- * and write another and the shell would never HIT. `tags` is left unset here —
199
- * the background capture collects the shell's own (non-loader) request tags
200
- * from its derived render. Single-request; the middleware clears it in a
201
- * finally after next() settles.
202
- */
203
- _shellCapture?: {
204
- key: string;
205
- ttl?: number;
206
- swr?: number;
207
- tags?: string[];
208
- store?: SegmentCacheStore<any>;
209
- };
210
-
211
176
  /**
212
177
  * @internal PPR shell-capture ACTIVE marker. True ONLY inside the background
213
178
  * capture task's derived request context (built by shell-capture.ts). This is
214
179
  * the switch every capture-specific behavior reads: loader masking
215
180
  * (loader-mask.ts isShellCaptureActive / fresh.ts emitStreaming) and the
216
181
  * cookies()/headers() capture guard (cookie-store.ts
217
- * assertNotInsideShellCapture). The foreground render never sets it — even when
218
- * `_shellCapture` (the "capture wanted" descriptor) is present — so the served
219
- * response is byte-identical to axis 1.
182
+ * assertNotInsideShellCapture). The foreground render never sets it, so the
183
+ * served response is byte-identical to axis 1. The capture descriptor itself
184
+ * (key/ttl/swr/tags/store) is NOT threaded through the request context — the
185
+ * integrated PPR serve path (rsc/shell-serve.ts + rsc-rendering.ts) builds it
186
+ * locally and passes it to scheduleShellCapture directly.
220
187
  */
221
188
  _shellCaptureRun?: boolean;
222
189
 
190
+ /**
191
+ * @internal Bake-lane loader containers collected DURING a shell capture:
192
+ * segment-key -> the loader's (pre-wrap) result promise. Populated by
193
+ * resolveLoaderData for loaders on entries with no renderable loading() (the
194
+ * bake lane — they execute at capture instead of being masked; see
195
+ * docs/design/loader-container-bake.md). Drained by captureAndStoreShell
196
+ * after the shell quiesces: settled containers are promise-elided,
197
+ * Flight-serialized, and pinned into the snapshot's loader family; a
198
+ * REJECTED container refuses the capture (error UI must never bake into the
199
+ * shared shell). Own property of the capture's derived context only.
200
+ */
201
+ _shellCaptureLoaderRecords?: Map<string, Promise<unknown>>;
202
+
203
+ /**
204
+ * @internal Loader-family snapshot seed for a shell HIT's tail render:
205
+ * segment-key -> the capture's elided container (already Flight-deserialized
206
+ * by serveShellHit). resolveLoaderData overlays it onto the fresh run's
207
+ * container (recorded paths pinned, hole-marker paths keep the fresh nested
208
+ * promises) so the payload's baked bytes match the frozen prelude. Own
209
+ * property of the HIT tail's derived context only.
210
+ */
211
+ _shellLoaderSeed?: Map<string, unknown>;
212
+
213
+ /**
214
+ * @internal Set (to the offending fn name) by the cookies()/headers()
215
+ * capture guard when it throws DURING a capture render. Load-bearing for the
216
+ * bake lane: a guard throw inside an executing loader is swallowed by
217
+ * wrapLoaderPromise into per-loader error UI, which would otherwise bake
218
+ * silently into the shared shell — the capture checks this flag after the
219
+ * render and refuses instead. Deterministic, so the capture does not retry.
220
+ */
221
+ _shellCaptureGuardTripped?: string;
222
+
223
223
  /**
224
224
  * @internal Handler-owned registry of explicit per-scope stores from
225
225
  * cache({ store }). Created once per createRSCHandler() and threaded into
@@ -267,6 +267,19 @@ export interface RequestContext<
267
267
  /** @internal Registered onResponse callbacks */
268
268
  _onResponseCallbacks: Array<(response: Response) => Response>;
269
269
 
270
+ /**
271
+ * @internal Promises of the background tasks scheduled via this context's
272
+ * waitUntil (deferred cache writes, revalidations, consumer tasks). The PPR
273
+ * shell capture drains this list BEFORE its match/render as an ORDERING EDGE:
274
+ * every foreground deferred cache write is scheduled here before the capture
275
+ * task is, so settling the list first guarantees the capture's cache reads
276
+ * observe the foreground's generation instead of racing it (see
277
+ * shell-capture.ts). Tasks whose scheduling fn carries
278
+ * UNTRACKED_BACKGROUND_TASK are not tracked (the capture task itself —
279
+ * tracking it would make that drain await its own promise).
280
+ */
281
+ _pendingBackgroundTasks?: Array<Promise<unknown>>;
282
+
270
283
  /**
271
284
  * Current theme setting (only available when theme is enabled in router config)
272
285
  *
@@ -495,8 +508,6 @@ export type PublicRequestContext<
495
508
  | "_handleStore"
496
509
  | "_transitionWhen"
497
510
  | "_cacheStore"
498
- | "_shellResume"
499
- | "_shellCapture"
500
511
  | "_shellCaptureRun"
501
512
  | "_explicitTaggedStores"
502
513
  | "_requestTags"
@@ -535,6 +546,17 @@ export type PublicRequestContext<
535
546
  | "res"
536
547
  >;
537
548
 
549
+ /**
550
+ * Marker for a waitUntil-scheduled fn whose task promise must NOT enter
551
+ * _pendingBackgroundTasks. Used by the PPR shell capture for its own task:
552
+ * the capture's pre-render write barrier settles that list, so tracking the
553
+ * capture itself would make the drain wait on its own (still-running) promise.
554
+ * @internal
555
+ */
556
+ export const UNTRACKED_BACKGROUND_TASK: unique symbol = Symbol.for(
557
+ "rango.untrackedBackgroundTask",
558
+ );
559
+
538
560
  // AsyncLocalStorage instance for request context
539
561
  const requestContextStorage = new AsyncLocalStorage<RequestContext<any>>();
540
562
 
@@ -946,20 +968,37 @@ export function createRequestContext<TEnv>(
946
968
  _cacheProfiles: cacheProfiles,
947
969
 
948
970
  waitUntil(fn: () => Promise<void>): void {
971
+ // Wrap in Promise.resolve().then(fn) so a SYNCHRONOUS throw in a
972
+ // non-async callback becomes a rejected promise handed to the host's
973
+ // waitUntil (logged as a background failure), instead of escaping into
974
+ // the request flow. Mirrors fireAndForgetWaitUntil's deferral.
975
+ const task = Promise.resolve().then(fn);
976
+ // Track the task promise so the PPR shell capture can settle the
977
+ // foreground's deferred cache writes before its own match/render (the
978
+ // ordering edge; see _pendingBackgroundTasks). The capture task itself
979
+ // opts out via the marker — the drain must never await its own promise.
980
+ if (
981
+ !(fn as { [UNTRACKED_BACKGROUND_TASK]?: boolean })[
982
+ UNTRACKED_BACKGROUND_TASK
983
+ ]
984
+ ) {
985
+ ctx._pendingBackgroundTasks?.push(task);
986
+ }
949
987
  if (executionContext?.waitUntil) {
950
- // Wrap in Promise.resolve().then(fn) so a SYNCHRONOUS throw in a
951
- // non-async callback becomes a rejected promise handed to the host's
952
- // waitUntil (logged as a background failure), instead of escaping into
953
- // the request flow. Mirrors fireAndForgetWaitUntil's deferral.
954
- executionContext.waitUntil(Promise.resolve().then(fn));
988
+ executionContext.waitUntil(task);
955
989
  } else {
956
- fireAndForgetWaitUntil(fn);
990
+ // Node/dev fallback: fire-and-forget with error logging (the same
991
+ // policy fireAndForgetWaitUntil applies).
992
+ task.catch((err) =>
993
+ console.error("[waitUntil] Background task failed:", err),
994
+ );
957
995
  }
958
996
  },
959
997
 
960
998
  executionContext,
961
999
 
962
1000
  _onResponseCallbacks: [],
1001
+ _pendingBackgroundTasks: [],
963
1002
 
964
1003
  onResponse(callback: (response: Response) => Response): void {
965
1004
  assertNotInsideCacheExec(ctx, "onResponse");
package/src/ssr/index.tsx CHANGED
@@ -173,13 +173,25 @@ export interface SSRDependencies<TEnv = unknown> {
173
173
  const DEFAULT_SHELL_CAPTURE_MAX_WAIT_MS = 5000;
174
174
 
175
175
  /**
176
- * Fixed number of macrotask hops between `quiesce` resolving and the abort. By
177
- * the time `quiesce` resolves the Flight input is byte-quiet and frozen, so
178
- * these hops are deterministic: they only give React's fizz worker turns to
179
- * flush the settled shell and mark still-pending boundaries as POSTPONED (rather
180
- * than errored) before controller.abort() lands. Not a wall-clock wait.
176
+ * Fixed number of macrotask hops between `quiesce` resolving and the abort. These
177
+ * give React's fizz worker turns to flush the settled shell into the prelude and
178
+ * mark still-pending boundaries as POSTPONED (rather than errored) before
179
+ * controller.abort() lands. Not a wall-clock wait.
180
+ *
181
+ * Why 16 and not the original 2: under the REPLAY-ONLY capture model
182
+ * (docs/design/ppr-shell-resume.md), the capture Flight render serializes ring-3
183
+ * cached segments that are ALREADY serialized, so it emits the whole shell payload
184
+ * in the first tick and the gate declares quiesce almost immediately (~a few ms).
185
+ * On the old fresh-execution path the Flight dribbled out as handlers ran, so
186
+ * Flight-quiet effectively meant "the shell has rendered" and 2 hops sufficed. Under
187
+ * replay, Flight-quiet fires BEFORE the fizz side has consumed the instant payload
188
+ * and rendered the shell to `<body>`, so the fizz needs a real buffer of turns after
189
+ * quiesce — otherwise the abort lands on an unrendered tree (empty prelude, root
190
+ * postpone) and the sanity gate refuses. Still task-based (masked loaders never
191
+ * emit, so more hops never lets a hole settle); a cold worker whose first
192
+ * attempt still under-renders heals on the in-place retry. Bounded by maxWaitMs.
181
193
  */
182
- const POST_QUIESCE_TASK_HOPS = 2;
194
+ const POST_QUIESCE_TASK_HOPS = 16;
183
195
 
184
196
  /**
185
197
  * Route an SSR error through the deps.onError notification callback with the
@@ -398,6 +410,7 @@ export function createShellCaptureHandler<TEnv = unknown>(
398
410
  ) {
399
411
  const { createFromReadableStream, loadBootstrapScriptContent, prerender } =
400
412
  deps;
413
+ const onError = deps.onError;
401
414
 
402
415
  if (!prerender) {
403
416
  throw new Error(
@@ -437,7 +450,33 @@ export function createShellCaptureHandler<TEnv = unknown>(
437
450
  const prerenderPromise = prerender(<SsrRoot />, {
438
451
  signal: controller.signal,
439
452
  bootstrapScriptContent,
453
+ // Abort is how capture WORKS: once the shell is quiet we abort() to freeze
454
+ // the prelude and let the still-pending holes postpone. React reports the
455
+ // abort reason for each pending boundary through onError. Without an onError
456
+ // here React falls back to console.error, so every capture that still has a
457
+ // live hole at abort time (the normal case, and every cold-module capture
458
+ // where the shell is not yet done) dumps a DOMException [AbortError] stack —
459
+ // once per pending boundary. That is EXPECTED degradation, not a failure, so
460
+ // swallow the abort here. Genuine shell render errors (a component throwing)
461
+ // are NOT the abort and still surface through the deps.onError channel, the
462
+ // same one renderHTML uses. See docs/design/ppr-shell-resume.md.
463
+ onError: (error: unknown) => {
464
+ if (
465
+ controller.signal.aborted &&
466
+ (error as { name?: string } | null)?.name === "AbortError"
467
+ ) {
468
+ return;
469
+ }
470
+ reportRenderError(onError, error);
471
+ },
440
472
  });
473
+ // Pre-attach a no-op catch: the real await sits AFTER quiesce + the
474
+ // post-quiesce hops, so an early prerender rejection (e.g. a bake-lane
475
+ // loader tripping the identity guard within milliseconds) would otherwise
476
+ // spend several turns handler-less and crash the worker as an unhandled
477
+ // rejection. The actual rejection handling still happens at the await
478
+ // below; this parallel handler only keeps the gap crash-free.
479
+ prerenderPromise.catch(() => {});
441
480
 
442
481
  // Wait for the caller's quiesce signal. By the time it resolves the Flight
443
482
  // input is byte-quiet and FROZEN by the capture gate (shell-capture.ts
@@ -109,27 +109,6 @@ function applyThemeToDocument(theme: Theme, config: ResolvedThemeConfig): void {
109
109
  }
110
110
  }
111
111
 
112
- function getStoredTheme(config: ResolvedThemeConfig): Theme {
113
- const { storageKey, themes, defaultTheme, enableSystem } = config;
114
-
115
- let stored = readThemeFromCookie(storageKey);
116
-
117
- if (!stored) {
118
- stored = readThemeFromStorage(storageKey);
119
- }
120
-
121
- if (stored) {
122
- if (stored === "system" && enableSystem) {
123
- return "system";
124
- }
125
- if (themes.includes(stored)) {
126
- return stored as Theme;
127
- }
128
- }
129
-
130
- return defaultTheme;
131
- }
132
-
133
112
  export function ThemeProvider({
134
113
  config,
135
114
  initialTheme,
@@ -137,17 +116,48 @@ export function ThemeProvider({
137
116
  }: ThemeProviderProps): React.ReactNode {
138
117
  const [mounted, setMounted] = useState(false);
139
118
 
140
- const [theme, setThemeState] = useState<Theme>(() => {
141
- if (initialTheme) return initialTheme;
142
- if (typeof window === "undefined") return config.defaultTheme;
143
- return getStoredTheme(config);
144
- });
119
+ // HYDRATION PARITY: this initializer is the server (SSR/resume) render AND
120
+ // the client's hydration render — both must produce the same value. It must
121
+ // NEVER read cookie/localStorage: whenever the payload's initialTheme
122
+ // differs from the visitor's stored theme (a PPR shell HIT deliberately
123
+ // replays the CAPTURE's initialTheme), a storage-reading initializer makes
124
+ // the client's first render diverge from the server tree. Any raw-theme text
125
+ // (a toggle label) then fails hydration, React regenerates the tree, and the
126
+ // FOUC-applied class is wiped from <html>. The visitor's stored theme is
127
+ // applied by the post-mount re-sync effect below instead.
128
+ const [theme, setThemeState] = useState<Theme>(
129
+ () => initialTheme ?? config.defaultTheme,
130
+ );
145
131
 
146
132
  const [systemTheme, setSystemTheme] = useState<ResolvedTheme>("light");
147
133
 
148
134
  useEffect(() => {
149
135
  setMounted(true);
150
136
  setSystemTheme(getSystemTheme());
137
+ // Re-sync state from an EXPLICITLY stored theme after mount. initialTheme
138
+ // comes from the payload and can legitimately differ from the visitor's
139
+ // stored theme — on a PPR shell HIT it is deliberately the CAPTURE's theme
140
+ // (the resume tree must match the frozen prelude; see
141
+ // ShellCacheEntry.initialTheme). The FOUC script already applied the stored
142
+ // theme to the document pre-paint; this brings the provider state (toggles,
143
+ // useTheme readers) in line with it, and is the ONLY place the provider
144
+ // reads storage (the initializer must not — see the parity note above).
145
+ // Only an explicit cookie/localStorage value re-syncs — a defaultTheme
146
+ // fallback must not override a server-provided initialTheme when the
147
+ // visitor never chose a theme.
148
+ // First VALID candidate wins — an empty/garbage cookie value (e.g. a
149
+ // deleted cookie leaving "theme=") must not shadow a valid localStorage
150
+ // value behind a bare null-coalesce.
151
+ const explicit =
152
+ [
153
+ readThemeFromCookie(config.storageKey),
154
+ readThemeFromStorage(config.storageKey),
155
+ ].find((v) => v !== null && isValidTheme(v, config)) ?? null;
156
+ if (explicit !== null && explicit !== theme) {
157
+ setThemeState(explicit as Theme);
158
+ applyThemeToDocument(explicit as Theme, config);
159
+ }
160
+ // eslint-disable-next-line react-hooks/exhaustive-deps
151
161
  }, []);
152
162
 
153
163
  const setTheme = useCallback(
package/src/urls/index.ts CHANGED
@@ -11,6 +11,7 @@ export type {
11
11
  UnnamedRoute,
12
12
  LocalOnlyInclude,
13
13
  PathOptions,
14
+ PartialPrerenderProps,
14
15
  UrlPatterns,
15
16
  IncludeOptions,
16
17
  } from "./pattern-types.js";
@@ -175,6 +175,11 @@ export function createPathHelper<TEnv>(): PathFn<TEnv> {
175
175
  ...(resolveResponseType(options)
176
176
  ? { responseType: resolveResponseType(options) }
177
177
  : {}),
178
+ // PPR shell-caching opt-in (document-level). Stored raw; the integrated
179
+ // serve path normalizes it via resolvePprConfig (rsc/shell-serve.ts).
180
+ ...(options?.ppr !== undefined && options.ppr !== false
181
+ ? { ppr: options.ppr }
182
+ : {}),
178
183
  };
179
184
 
180
185
  if (isStaticHandler(handler) && handler.$$id && ctx.namePrefix) {
@@ -35,12 +35,48 @@ export type LocalOnlyInclude = string & { [LOCAL_ONLY_BRAND]: void };
35
35
  /**
36
36
  * Options for path() function
37
37
  */
38
+ /**
39
+ * Options for the `ppr` path option (PPR shell caching — Axis 2, see
40
+ * docs/design/ppr-shell-resume.md and the /ppr skill). Declaring
41
+ * `ppr: true | PartialPrerenderProps` on a page route opts that DOCUMENT into
42
+ * shell capture: the rendered HTML shell (everything that is not a live hole) is
43
+ * cached and, on a later GET, flushed immediately while fizz resumes only the
44
+ * holes. Serving is integral to the router — there is no middleware to mount;
45
+ * the shell store is the app-level `createRouter({ cache })` store (which must
46
+ * implement the `getShell`/`putShell` family).
47
+ */
48
+ export interface PartialPrerenderProps {
49
+ /**
50
+ * Shell time-to-live in seconds. Defaults to 300 (`ppr: true` uses the same
51
+ * default).
52
+ */
53
+ ttl?: number;
54
+ /**
55
+ * Stale-while-revalidate window in seconds: a stale shell is still served
56
+ * while a background recapture refreshes it.
57
+ */
58
+ swr?: number;
59
+ /**
60
+ * Operational tags attached to the captured shell entry for
61
+ * `updateTag()`/`revalidateTag()`-driven eviction. UNIONED with the tags the
62
+ * capture render auto-collects (the shell's own non-loader request tags).
63
+ */
64
+ tags?: string[];
65
+ }
66
+
38
67
  export interface PathOptions<
39
68
  TName extends string = string,
40
69
  TSearch extends SearchSchema = {},
41
70
  > {
42
71
  /** Route name for href() lookups */
43
72
  name?: TName;
73
+ /**
74
+ * PPR shell caching opt-in for this page route (document-level). `true` uses
75
+ * the default policy (ttl 300); an object sets ttl/swr/tags. See
76
+ * {@link PartialPrerenderProps}. Routes without this option are pure axis 1 —
77
+ * no capture, no store reads, no logs.
78
+ */
79
+ ppr?: boolean | PartialPrerenderProps;
44
80
  /** Search param schema for typed query parameters */
45
81
  search?: TSearch;
46
82
  /** Trailing slash behavior: "never" (redirect /path/ to /path), "always" (redirect /path to /path/), "ignore" (match both) */