@rangojs/router 0.0.0-experimental.141 → 0.0.0-experimental.143

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 (918) 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 +84 -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 +21 -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 +35 -1
  813. package/skills/catalog.json +265 -0
  814. package/skills/comparison/references/framework-comparison.md +1 -1
  815. package/skills/composability/SKILL.md +33 -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 +9 -1
  842. package/skills/parallel/SKILL.md +10 -1
  843. package/skills/ppr/SKILL.md +331 -32
  844. package/skills/prerender/SKILL.md +8 -1
  845. package/skills/rango/SKILL.md +12 -12
  846. package/skills/response-routes/SKILL.md +1 -1
  847. package/skills/route/SKILL.md +9 -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 +45 -919
  857. package/skills/typesafety/env-and-bindings.md +254 -0
  858. package/skills/typesafety/generated-files-and-cli.md +335 -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/document-cache.ts +20 -9
  879. package/src/cache/memory-segment-store.ts +53 -2
  880. package/src/cache/segment-codec.ts +4 -4
  881. package/src/cache/shell-snapshot.ts +50 -1
  882. package/src/cache/types.ts +25 -5
  883. package/src/cache/vercel/vercel-cache-store.ts +131 -107
  884. package/src/cloudflare/tracing.ts +7 -8
  885. package/src/index.rsc.ts +1 -0
  886. package/src/index.ts +12 -8
  887. package/src/route-definition/helpers-types.ts +5 -4
  888. package/src/route-map-builder.ts +24 -1
  889. package/src/router/find-match.ts +15 -1
  890. package/src/router/instrument.ts +9 -4
  891. package/src/router/manifest.ts +13 -5
  892. package/src/router/match-api.ts +70 -30
  893. package/src/router/match-handlers.ts +176 -135
  894. package/src/router/match-result.ts +35 -15
  895. package/src/router/middleware.ts +46 -32
  896. package/src/router/request-classification.ts +20 -7
  897. package/src/router/route-snapshot.ts +10 -0
  898. package/src/router/router-interfaces.ts +9 -0
  899. package/src/router/segment-resolution/fresh.ts +25 -4
  900. package/src/router/segment-resolution/loader-cache.ts +57 -8
  901. package/src/router/segment-resolution/loader-mask.ts +26 -3
  902. package/src/router/segment-resolution/loader-snapshot.ts +251 -0
  903. package/src/router/telemetry-otel.ts +6 -8
  904. package/src/router/tracing.ts +14 -5
  905. package/src/router.ts +15 -6
  906. package/src/rsc/handler.ts +46 -30
  907. package/src/rsc/nonce.ts +10 -1
  908. package/src/rsc/rsc-rendering.ts +39 -8
  909. package/src/rsc/shell-capture.ts +201 -13
  910. package/src/rsc/shell-serve.ts +26 -0
  911. package/src/server/cookie-store.ts +6 -0
  912. package/src/server/request-context.ts +33 -0
  913. package/src/ssr/index.tsx +7 -0
  914. package/src/testing/dispatch.ts +142 -37
  915. package/src/urls/path-helper-types.ts +9 -4
  916. package/src/vercel/tracing.ts +7 -7
  917. package/src/vite/discovery/dev-prerender-cache.ts +117 -0
  918. package/src/vite/router-discovery.ts +78 -15
@@ -122,3 +122,29 @@ export function warnShellStoreMissingOnce(key: string): void {
122
122
  "via createRouter({ cache }).",
123
123
  );
124
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
+ }
@@ -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 ` +
@@ -187,6 +187,39 @@ export interface RequestContext<
187
187
  */
188
188
  _shellCaptureRun?: boolean;
189
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
+
190
223
  /**
191
224
  * @internal Handler-owned registry of explicit per-scope stores from
192
225
  * cache({ store }). Created once per createRSCHandler() and threaded into
package/src/ssr/index.tsx CHANGED
@@ -470,6 +470,13 @@ export function createShellCaptureHandler<TEnv = unknown>(
470
470
  reportRenderError(onError, error);
471
471
  },
472
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(() => {});
473
480
 
474
481
  // Wait for the caller's quiesce signal. By the time it resolves the Flight
475
482
  // input is byte-quiet and FROZEN by the capture gate (shell-capture.ts
@@ -55,6 +55,14 @@
55
55
  * metadata.category, while the request still degrades-to-miss exactly as before.
56
56
  * (A thrown response-route HANDLER error is the one onError path NOT covered —
57
57
  * see "DOES NOT support" below.)
58
+ * - createRouter({ telemetry }) match-transaction lifecycle: request.start opens
59
+ * the transaction before the global middleware chain, request.end closes it
60
+ * after finalizeResponse (segmentCount 0 / cacheHit false — dispatch renders no
61
+ * RSC segments and holds no match-cache state), and a thrown non-Response error
62
+ * emits request.error with phase "routing". All three carry the same requestId
63
+ * (getRequestId). Emission is gated entirely on a configured sink; with none,
64
+ * dispatch does zero new work and stays byte-identical for existing callers.
65
+ * Lets a consumer unit-test their sink wiring in-process instead of only at e2e.
58
66
  *
59
67
  * What dispatch DOES NOT support (and why):
60
68
  * - RSC component routes — rendering requires the Flight serializer + React
@@ -76,6 +84,13 @@
76
84
  * merged cookies/headers all match production; only the Flight-embedded
77
85
  * location-state entries are absent. Cover location-state restoration across a
78
86
  * partial redirect with an e2e test.
87
+ * - Telemetry cache.decision / loader.* / handler.error events: these fire from
88
+ * the real match()/matchPartial() + RSC render + loader pipeline (match-
89
+ * handlers.ts, loader-resolution.ts, segment-resolution), none of which
90
+ * dispatch runs. Synthesizing them here would be faking (the events would not
91
+ * reflect a real cache lookup or loader run), so dispatch emits only the
92
+ * request.start/end/error lifecycle above; cover cache/loader telemetry with an
93
+ * e2e test driving a real RSC request.
79
94
  *
80
95
  * dispatch reuses router.previewMatch(), which itself runs content negotiation
81
96
  * and resolves route middleware from the matched entry tree, so dispatch's
@@ -127,6 +142,8 @@ import { isWebSocketUpgradeResponse } from "../response-utils.js";
127
142
  import { invokeOnError } from "../router/error-handling.js";
128
143
  import type { OnErrorCallback } from "../types/error-types.js";
129
144
  import type { Rango } from "../router/router-interfaces.js";
145
+ import { getRequestId, resolveSink, safeEmit } from "../router/telemetry.js";
146
+ import type { TelemetrySink } from "../router/telemetry.js";
130
147
 
131
148
  /**
132
149
  * The internal subset of the router surface dispatch depends on. The public
@@ -140,6 +157,13 @@ interface DispatchableRouter<TEnv> {
140
157
  routeMap: Record<string, unknown>;
141
158
  middleware: MiddlewareEntry<TEnv>[];
142
159
  onError?: OnErrorCallback<TEnv>;
160
+ /**
161
+ * Optional telemetry sink from createRouter({ telemetry }) (RangoInternal
162
+ * field). dispatch emits the match-transaction lifecycle events onto it so a
163
+ * consumer can unit-test their sink wiring in-process; undefined keeps dispatch
164
+ * byte-identical for every existing caller.
165
+ */
166
+ telemetry?: TelemetrySink;
143
167
  findMatch(pathname: string): Promise<{
144
168
  redirectTo?: string;
145
169
  routeKey?: string;
@@ -444,6 +468,19 @@ export async function dispatch<TEnv = any>(
444
468
  const isPartial = url.searchParams.has("_rsc_partial");
445
469
  const isAction = url.searchParams.has("_rsc_action");
446
470
 
471
+ // Telemetry: mirror the router's match-transaction lifecycle onto the
472
+ // configured sink so a consumer can unit-test createRouter({ telemetry })
473
+ // wiring in-process (the dogfood gap the RSC-free dispatch left — see
474
+ // tests/cloudflare-basic/test/cache-status.test.ts). Every emit is gated on
475
+ // `sink` truthiness: with no sink configured dispatch does zero new work and
476
+ // stays byte-identical for existing callers. Only request.start/end/error are
477
+ // reachable here — cache.decision and loader.* originate in the real match()/
478
+ // matchPartial() + RSC render pipeline dispatch deliberately does not run
479
+ // (module header), so fabricating them would violate the no-fake rule.
480
+ const sink = router.telemetry;
481
+ const telemetryRequestId = sink ? getRequestId(req) : undefined;
482
+ const telemetryStart = sink ? performance.now() : 0;
483
+
447
484
  return runWithRequestContext(requestContext, async () => {
448
485
  // Set params before middleware/handler run, so global middleware sees
449
486
  // ctx.params (production sets them during matching, before middleware).
@@ -658,44 +695,112 @@ export async function dispatch<TEnv = any>(
658
695
  return callResponseRoute();
659
696
  };
660
697
 
661
- // Global (pattern-matched) middleware wraps coreHandler, exactly as
662
- // production wraps coreHandler with executeMiddleware (handler.ts).
663
- const globalMatches = matchMiddleware(url.pathname, router.middleware);
664
- const mwResponse =
665
- globalMatches.length === 0
666
- ? await coreHandler()
667
- : await executeMiddleware<TEnv>(
668
- globalMatches,
669
- req,
670
- env,
671
- variables,
672
- coreHandler,
673
- reverse,
674
- );
675
-
676
- // Match production's global-chain exit (handler.ts): on a partial/action
677
- // request a middleware 3xx redirect is converted to a Flight-safe response
678
- // so fetch() does not auto-follow it; every path then drains onResponse
679
- // callbacks via finalizeResponse. dispatch is RSC-free, so the
680
- // createRedirectFlightResponse stand-in falls back to the no-state
681
- // 204 + X-RSC-Redirect (see the location-state divergence in the header).
682
- let finalResponse: Response;
683
- if (isPartial || isAction) {
684
- const intercepted = interceptRedirectForPartial(
685
- mwResponse,
686
- (redirectUrl) => createSimpleRedirectResponse(redirectUrl),
687
- );
688
- finalResponse = finalizeResponse(intercepted ?? mwResponse);
689
- } else {
690
- finalResponse = finalizeResponse(mwResponse);
698
+ // request.start opens the match transaction, mirroring match-handlers.ts.
699
+ // transaction is always "match" (dispatch has no matchPartial split);
700
+ // isPartial carries the ?_rsc_partial signal the same way production does.
701
+ if (sink) {
702
+ safeEmit(resolveSink(sink), {
703
+ type: "request.start",
704
+ timestamp: telemetryStart,
705
+ requestId: telemetryRequestId,
706
+ method: req.method,
707
+ pathname: url.pathname,
708
+ transaction: "match",
709
+ isPartial,
710
+ });
691
711
  }
692
712
 
693
- // Mirror production's single open-redirect chokepoint (handler.ts): every
694
- // browser-followed (3xx + Location) redirect is same-origin guarded before
695
- // it leaves -- a cross-origin Location is rewritten to the basename root
696
- // unless redirect(url, { external: true }) opted out. Soft partial/action
697
- // redirects are 204 + X-RSC-Redirect and pass through untouched (the client
698
- // validates them), so this is a no-op for them.
699
- return guardOutgoingRedirect(finalResponse, url.origin, router.basename);
713
+ try {
714
+ // Global (pattern-matched) middleware wraps coreHandler, exactly as
715
+ // production wraps coreHandler with executeMiddleware (handler.ts).
716
+ const globalMatches = matchMiddleware(url.pathname, router.middleware);
717
+ const mwResponse =
718
+ globalMatches.length === 0
719
+ ? await coreHandler()
720
+ : await executeMiddleware<TEnv>(
721
+ globalMatches,
722
+ req,
723
+ env,
724
+ variables,
725
+ coreHandler,
726
+ reverse,
727
+ );
728
+
729
+ // Match production's global-chain exit (handler.ts): on a partial/action
730
+ // request a middleware 3xx redirect is converted to a Flight-safe response
731
+ // so fetch() does not auto-follow it; every path then drains onResponse
732
+ // callbacks via finalizeResponse. dispatch is RSC-free, so the
733
+ // createRedirectFlightResponse stand-in falls back to the no-state
734
+ // 204 + X-RSC-Redirect (see the location-state divergence in the header).
735
+ let finalResponse: Response;
736
+ if (isPartial || isAction) {
737
+ const intercepted = interceptRedirectForPartial(
738
+ mwResponse,
739
+ (redirectUrl) => createSimpleRedirectResponse(redirectUrl),
740
+ );
741
+ finalResponse = finalizeResponse(intercepted ?? mwResponse);
742
+ } else {
743
+ finalResponse = finalizeResponse(mwResponse);
744
+ }
745
+
746
+ // request.end closes the transaction. dispatch produces no RSC segments and
747
+ // holds no match-cache state, so segmentCount/cacheHit are 0/false — the
748
+ // same shape production emits for its own redirect (segment-less) result.
749
+ if (sink) {
750
+ safeEmit(resolveSink(sink), {
751
+ type: "request.end",
752
+ timestamp: performance.now(),
753
+ requestId: telemetryRequestId,
754
+ method: req.method,
755
+ pathname: url.pathname,
756
+ transaction: "match",
757
+ durationMs: performance.now() - telemetryStart,
758
+ segmentCount: 0,
759
+ cacheHit: false,
760
+ });
761
+ }
762
+
763
+ // Mirror production's single open-redirect chokepoint (handler.ts): every
764
+ // browser-followed (3xx + Location) redirect is same-origin guarded before
765
+ // it leaves -- a cross-origin Location is rewritten to the basename root
766
+ // unless redirect(url, { external: true }) opted out. Soft partial/action
767
+ // redirects are 204 + X-RSC-Redirect and pass through untouched (the client
768
+ // validates them), so this is a no-op for them.
769
+ return guardOutgoingRedirect(finalResponse, url.origin, router.basename);
770
+ } catch (error) {
771
+ if (sink) {
772
+ if (error instanceof Response) {
773
+ // executeMiddleware absorbs a middleware-thrown Response and returns it
774
+ // (middleware.ts:566), so a thrown Response never actually reaches this
775
+ // level in dispatch. Defensive: if one ever does it is a completed
776
+ // request from the consumer's seat (a short-circuit redirect), so mirror
777
+ // plan 002 / match-handlers.ts and emit request.end, not request.error.
778
+ safeEmit(resolveSink(sink), {
779
+ type: "request.end",
780
+ timestamp: performance.now(),
781
+ requestId: telemetryRequestId,
782
+ method: req.method,
783
+ pathname: url.pathname,
784
+ transaction: "match",
785
+ durationMs: performance.now() - telemetryStart,
786
+ segmentCount: 0,
787
+ cacheHit: false,
788
+ });
789
+ } else {
790
+ safeEmit(resolveSink(sink), {
791
+ type: "request.error",
792
+ timestamp: performance.now(),
793
+ requestId: telemetryRequestId,
794
+ method: req.method,
795
+ pathname: url.pathname,
796
+ transaction: "match",
797
+ error: error instanceof Error ? error : new Error(String(error)),
798
+ phase: "routing",
799
+ durationMs: performance.now() - telemetryStart,
800
+ });
801
+ }
802
+ }
803
+ throw error;
804
+ }
700
805
  });
701
806
  }
@@ -268,9 +268,16 @@ export type PathHelpers<TEnv> = {
268
268
  * `{ handler, use? }` whose `use` is scoped to that slot only. Per-slot
269
269
  * merge order is `handler.use` → shared `use` → slot-local `use`, with
270
270
  * narrowest scope winning for last-write-wins items like `loading()`.
271
+ *
272
+ * Not generic over the slots record: an inferred type parameter makes the
273
+ * object literal an inference site, which suppresses contextual typing of
274
+ * arrow slot handlers (`(ctx) => ...` was implicit any). Bare handlers infer
275
+ * now; a descriptor's `handler:` arrow still needs an explicit ctx annotation
276
+ * because StaticHandlerDefinition's own `.handler` joins the contextual union
277
+ * (two callables — see parallel-slot-handler-types.test.ts).
271
278
  */
272
- parallel: <
273
- TSlots extends Record<
279
+ parallel: (
280
+ slots: Record<
274
281
  `@${string}`,
275
282
  | Handler<any, any, TEnv>
276
283
  | ReactNode
@@ -283,8 +290,6 @@ export type PathHelpers<TEnv> = {
283
290
  use?: () => ParallelUseItem[];
284
291
  }
285
292
  >,
286
- >(
287
- slots: TSlots,
288
293
  use?: () => ParallelUseItem[],
289
294
  ) => ParallelItem;
290
295
 
@@ -44,15 +44,15 @@ import {
44
44
  } from "../router/telemetry-otel.js";
45
45
  import type {
46
46
  RouterTracingConfig,
47
- TracePhaseToggles,
47
+ TracingToggleOptions,
48
48
  } from "../router/tracing.js";
49
49
 
50
- /** Options for createVercelTracing. */
51
- export interface VercelTracingOptions {
52
- /** Master switch. Defaults to true. */
53
- enabled?: boolean;
54
- /** Per-phase span toggles. Omitted phases default to enabled. */
55
- spans?: TracePhaseToggles;
50
+ /**
51
+ * Options for createVercelTracing. Extends the shared
52
+ * {@link TracingToggleOptions} (`enabled` + per-phase `spans`) with the
53
+ * Vercel-specific tracer selectors.
54
+ */
55
+ export interface VercelTracingOptions extends TracingToggleOptions {
56
56
  /**
57
57
  * OTel instrumentation-scope name passed to `trace.getTracer()`. Defaults to
58
58
  * `"rango"`. Ignored when `tracer` is provided.
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Dev prerender result cache — memoizes /__rsc_prerender responses between
3
+ * HMR edits (issue #654).
4
+ *
5
+ * Freshness invariant (why identity keying is correct): the endpoint
6
+ * re-imports the user's entry module through a Vite module runner on every
7
+ * request. When ANY module in the entry → router → urls → handler chain was
8
+ * invalidated (file edit propagates up the importer graph), that import
9
+ * re-executes the entry, `createRouter()` re-runs, and `RouterRegistry.set`
10
+ * (router.ts) replaces the router instance with a NEW object. When nothing
11
+ * was invalidated, the import is a module-cache hit and the instance is the
12
+ * SAME object. Router-instance identity therefore IS the HMR generation:
13
+ * keying the cache on it gives "serve cached until an edit invalidates the
14
+ * chain" without any watcher bookkeeping, and the WeakMap lets every stale
15
+ * generation's bucket be garbage-collected the moment the registry drops
16
+ * the old instance.
17
+ *
18
+ * Staleness envelope: a cached body can only go stale through NON-module
19
+ * inputs (a getParams() reading a database, fs content outside the module
20
+ * graph). Production freezes those at build time, so serving them frozen
21
+ * between edits makes dev MORE faithful to production, not less — the
22
+ * pre-#654 behavior of re-rendering per request was the anomaly.
23
+ */
24
+
25
+ import type { SerializedSegmentData } from "../../cache/types.js";
26
+
27
+ /** Structural slice of `matchForPrerender`'s result the payload derivation needs. */
28
+ export interface DevPrerenderMatchPayloadSource {
29
+ segments: SerializedSegmentData[];
30
+ handles: string;
31
+ interceptSegments?: SerializedSegmentData[];
32
+ interceptHandles?: string;
33
+ }
34
+
35
+ /** Serialized response bodies for the two endpoint variants of one render. */
36
+ export interface DevPrerenderPayloadBodies {
37
+ /** `intercept != 1` response: the route's own segments + handles. */
38
+ main: string;
39
+ /**
40
+ * `intercept=1` response: main + intercept segments with the MERGED handle
41
+ * string. Falls back to `main` byte-for-byte when the route has no
42
+ * intercept segments — mirroring the endpoint's historical behavior.
43
+ */
44
+ intercept: string;
45
+ }
46
+
47
+ export interface DevPrerenderCache {
48
+ get(router: object, key: string): string | undefined;
49
+ set(router: object, key: string, body: string): void;
50
+ }
51
+
52
+ /**
53
+ * Derive both variant bodies from one matchForPrerender result, so a single
54
+ * render warms the main AND intercept cache keys (matchForPrerender computes
55
+ * intercept segments unconditionally either way — see prerender-match.ts
56
+ * step 14).
57
+ */
58
+ export function payloadBodiesFromResult(
59
+ result: DevPrerenderMatchPayloadSource,
60
+ ): DevPrerenderPayloadBodies {
61
+ const main = JSON.stringify({
62
+ segments: result.segments,
63
+ handles: result.handles,
64
+ });
65
+ const intercept = result.interceptSegments?.length
66
+ ? JSON.stringify({
67
+ segments: [...result.segments, ...result.interceptSegments],
68
+ handles: result.interceptHandles ?? "",
69
+ })
70
+ : main;
71
+ return { main, intercept };
72
+ }
73
+
74
+ /**
75
+ * Cache key for one endpoint request shape. `pathname` and `routeName` come
76
+ * straight from the query; `passthrough` selects the getParams-checked match
77
+ * path; `intercept` selects which variant body is served. All four dimensions
78
+ * change the response, so all four are in the key.
79
+ */
80
+ export function devPrerenderCacheKey(
81
+ pathname: string,
82
+ opts: { intercept: boolean; passthrough: boolean; routeName: string | null },
83
+ ): string {
84
+ return `${pathname}|i=${opts.intercept ? 1 : 0}|p=${opts.passthrough ? 1 : 0}|r=${opts.routeName ?? ""}`;
85
+ }
86
+
87
+ /**
88
+ * Per-router FIFO cap: a dev session that visits an unbounded set of
89
+ * prerendered pathnames (e.g. crawling param routes) must not grow one
90
+ * bucket without limit. 500 rendered payloads is far beyond any interactive
91
+ * session; eviction order does not matter for correctness (a miss just
92
+ * re-renders).
93
+ */
94
+ const MAX_ENTRIES_PER_ROUTER = 500;
95
+
96
+ export function createDevPrerenderCache(
97
+ maxEntriesPerRouter: number = MAX_ENTRIES_PER_ROUTER,
98
+ ): DevPrerenderCache {
99
+ const buckets = new WeakMap<object, Map<string, string>>();
100
+ return {
101
+ get(router: object, key: string): string | undefined {
102
+ return buckets.get(router)?.get(key);
103
+ },
104
+ set(router: object, key: string, body: string): void {
105
+ let bucket = buckets.get(router);
106
+ if (!bucket) {
107
+ bucket = new Map();
108
+ buckets.set(router, bucket);
109
+ }
110
+ if (!bucket.has(key) && bucket.size >= maxEntriesPerRouter) {
111
+ const oldest = bucket.keys().next().value;
112
+ if (oldest !== undefined) bucket.delete(oldest);
113
+ }
114
+ bucket.set(key, body);
115
+ },
116
+ };
117
+ }
@@ -44,6 +44,11 @@ import {
44
44
  } from "./discovery/self-gen-tracking.js";
45
45
  import { discoverRouters } from "./discovery/discover-routers.js";
46
46
  import { describeDiscoveryFailure } from "./discovery/discovery-errors.js";
47
+ import {
48
+ createDevPrerenderCache,
49
+ devPrerenderCacheKey,
50
+ payloadBodiesFromResult,
51
+ } from "./discovery/dev-prerender-cache.js";
47
52
  import {
48
53
  writeCombinedRouteTypesWithTracking,
49
54
  writeRouteTypesFiles,
@@ -828,6 +833,15 @@ export function createRouterDiscoveryPlugin(
828
833
  // Registry from the main server's RSC environment (populated by discoverRouters)
829
834
  let mainRegistry: Map<string, any> | null = null;
830
835
 
836
+ // Memoized /__rsc_prerender render results, keyed by router-instance
837
+ // identity (#654). The per-request entry re-import below is what makes
838
+ // identity a valid freshness key: an HMR-invalidated chain re-runs
839
+ // createRouter() and replaces the registry instance, so cached bodies
840
+ // for the old instance become unreachable; an untouched chain returns
841
+ // the same instance and the cached body is byte-identical to a fresh
842
+ // render. See dev-prerender-cache.ts for the full invariant.
843
+ const devPrerenderCache = createDevPrerenderCache();
844
+
831
845
  // Push discovery state (manifest, trie, precomputed entries) to the
832
846
  // server module so runtime request handling uses the current routes.
833
847
  // Shared by initial discovery and HMR-triggered re-discovery.
@@ -918,9 +932,28 @@ export function createRouterDiscoveryPlugin(
918
932
 
919
933
  if (!registry) {
920
934
  // No main registry: the RSC env has no module runner (Cloudflare dev).
921
- // Lazily create a Node.js temp server for prerender evaluation.
922
- if (!prerenderNodeRegistry) {
923
- await getOrCreateTempServer();
935
+ // Lazily create a Node.js temp server for prerender evaluation, and
936
+ // re-import the entry through it on EVERY request — the temp server
937
+ // has its own file watcher, so a handler-only edit (a file without
938
+ // urls()/createRouter() that the main watcher's route-file sniff
939
+ // ignores) invalidates its module graph; the re-import re-evaluates
940
+ // exactly the dirty subgraph and re-registers fresh router
941
+ // instances. Before #654 the cached registry was only refreshed on
942
+ // route-file edits, so handler-only edits served stale prerender
943
+ // content on this path. Warm-cache re-imports are module-cache hits.
944
+ const tempRscEnv = await getOrCreateTempServer();
945
+ if (tempRscEnv) {
946
+ try {
947
+ await importEntryAndRegistry(tempRscEnv);
948
+ } catch (err: any) {
949
+ console.warn(
950
+ `[rango] Dev prerender module refresh failed: ${err.message}`,
951
+ );
952
+ res.statusCode = 500;
953
+ res.end(`Prerender handler error: ${err.message}`);
954
+ logResult(500, "temp module refresh failed");
955
+ return;
956
+ }
924
957
  }
925
958
  registry = prerenderNodeRegistry;
926
959
  }
@@ -936,8 +969,38 @@ export function createRouterDiscoveryPlugin(
936
969
  const wantRouteName = url.searchParams.get("routeName");
937
970
  const wantPassthrough = url.searchParams.get("passthrough") === "1";
938
971
 
972
+ // One render warms BOTH variant keys (matchForPrerender computes the
973
+ // intercept segments unconditionally), so a route's main and modal
974
+ // variants cost a single render per HMR generation.
975
+ const variantDims = {
976
+ passthrough: wantPassthrough,
977
+ routeName: wantRouteName,
978
+ };
979
+ const keyMain = devPrerenderCacheKey(pathname, {
980
+ intercept: false,
981
+ ...variantDims,
982
+ });
983
+ const keyIntercept = devPrerenderCacheKey(pathname, {
984
+ intercept: true,
985
+ ...variantDims,
986
+ });
987
+ const requestedKey = wantIntercept ? keyIntercept : keyMain;
988
+
939
989
  for (const [, routerInstance] of registry) {
940
990
  if (!routerInstance.matchForPrerender) continue;
991
+ // Cache is consulted per router IN LOOP ORDER so multi-router
992
+ // fall-through semantics are identical to the uncached path: a
993
+ // router that never produced a payload for this key still runs
994
+ // its matchForPrerender (cheap trie miss / intentionally-uncached
995
+ // error retry) before the next router is considered.
996
+ const cached = devPrerenderCache.get(routerInstance, requestedKey);
997
+ if (cached !== undefined) {
998
+ res.setHeader("content-type", "application/json");
999
+ res.setHeader("x-rango-prerender-cache", "HIT");
1000
+ res.end(cached);
1001
+ logResult(200, "cache hit");
1002
+ return;
1003
+ }
941
1004
  try {
942
1005
  const result = await routerInstance.matchForPrerender(
943
1006
  pathname,
@@ -953,19 +1016,19 @@ export function createRouterDiscoveryPlugin(
953
1016
  // This prevents returning the wrong entry when multiple routers
954
1017
  // have prerenderable routes sharing the same pathname.
955
1018
  if (wantRouteName && result.routeName !== wantRouteName) continue;
1019
+ // Pre-encoded MERGED handle string in the intercept body comes
1020
+ // from the producer (handles are Flight-encoded so
1021
+ // Promise/ReactNode values survive the wire).
1022
+ const bodies = payloadBodiesFromResult(result);
1023
+ devPrerenderCache.set(routerInstance, keyMain, bodies.main);
1024
+ devPrerenderCache.set(
1025
+ routerInstance,
1026
+ keyIntercept,
1027
+ bodies.intercept,
1028
+ );
956
1029
  res.setHeader("content-type", "application/json");
957
- let payload: Record<string, unknown>;
958
- if (wantIntercept && result.interceptSegments?.length) {
959
- payload = {
960
- segments: [...result.segments, ...result.interceptSegments],
961
- // Pre-encoded MERGED handle string from the producer (handles are
962
- // Flight-encoded so Promise/ReactNode values survive the wire).
963
- handles: result.interceptHandles ?? "",
964
- };
965
- } else {
966
- payload = { segments: result.segments, handles: result.handles };
967
- }
968
- res.end(JSON.stringify(payload));
1030
+ res.setHeader("x-rango-prerender-cache", "MISS");
1031
+ res.end(wantIntercept ? bodies.intercept : bodies.main);
969
1032
  logResult(200, `match ${result.routeName}`);
970
1033
  return;
971
1034
  } catch (err: any) {