@rangojs/router 0.0.0-experimental.13 → 0.0.0-experimental.130

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 (1214) hide show
  1. package/AGENTS.md +9 -0
  2. package/README.md +1040 -5
  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 +1712 -212
  82. package/dist/bin/rango.js.map +1 -0
  83. package/dist/browser/event-controller.d.ts +191 -0
  84. package/dist/browser/event-controller.d.ts.map +1 -0
  85. package/dist/browser/event-controller.js +559 -0
  86. package/dist/browser/event-controller.js.map +1 -0
  87. package/dist/browser/index.d.ts +2 -0
  88. package/dist/browser/index.d.ts.map +1 -0
  89. package/dist/browser/index.js +14 -0
  90. package/dist/browser/index.js.map +1 -0
  91. package/dist/browser/link-interceptor.d.ts +38 -0
  92. package/dist/browser/link-interceptor.d.ts.map +1 -0
  93. package/dist/browser/link-interceptor.js +99 -0
  94. package/dist/browser/link-interceptor.js.map +1 -0
  95. package/dist/browser/logging.d.ts +10 -0
  96. package/dist/browser/logging.d.ts.map +1 -0
  97. package/dist/browser/logging.js +29 -0
  98. package/dist/browser/logging.js.map +1 -0
  99. package/dist/browser/lru-cache.d.ts +17 -0
  100. package/dist/browser/lru-cache.d.ts.map +1 -0
  101. package/dist/browser/lru-cache.js +50 -0
  102. package/dist/browser/lru-cache.js.map +1 -0
  103. package/dist/browser/merge-segment-loaders.d.ts +39 -0
  104. package/dist/browser/merge-segment-loaders.d.ts.map +1 -0
  105. package/dist/browser/merge-segment-loaders.js +102 -0
  106. package/dist/browser/merge-segment-loaders.js.map +1 -0
  107. package/dist/browser/navigation-bridge.d.ts +102 -0
  108. package/dist/browser/navigation-bridge.d.ts.map +1 -0
  109. package/dist/browser/navigation-bridge.js +708 -0
  110. package/dist/browser/navigation-bridge.js.map +1 -0
  111. package/dist/browser/navigation-client.d.ts +25 -0
  112. package/dist/browser/navigation-client.d.ts.map +1 -0
  113. package/dist/browser/navigation-client.js +157 -0
  114. package/dist/browser/navigation-client.js.map +1 -0
  115. package/dist/browser/navigation-store.d.ts +101 -0
  116. package/dist/browser/navigation-store.d.ts.map +1 -0
  117. package/dist/browser/navigation-store.js +625 -0
  118. package/dist/browser/navigation-store.js.map +1 -0
  119. package/dist/browser/partial-update.d.ts +75 -0
  120. package/dist/browser/partial-update.d.ts.map +1 -0
  121. package/dist/browser/partial-update.js +426 -0
  122. package/dist/browser/partial-update.js.map +1 -0
  123. package/dist/browser/react/Link.d.ts +86 -0
  124. package/dist/browser/react/Link.d.ts.map +1 -0
  125. package/dist/browser/react/Link.js +128 -0
  126. package/dist/browser/react/Link.js.map +1 -0
  127. package/dist/browser/react/NavigationProvider.d.ts +63 -0
  128. package/dist/browser/react/NavigationProvider.d.ts.map +1 -0
  129. package/dist/browser/react/NavigationProvider.js +216 -0
  130. package/dist/browser/react/NavigationProvider.js.map +1 -0
  131. package/dist/browser/react/ScrollRestoration.d.ts +75 -0
  132. package/dist/browser/react/ScrollRestoration.d.ts.map +1 -0
  133. package/dist/browser/react/ScrollRestoration.js +57 -0
  134. package/dist/browser/react/ScrollRestoration.js.map +1 -0
  135. package/dist/browser/react/context.d.ts +46 -0
  136. package/dist/browser/react/context.d.ts.map +1 -0
  137. package/dist/browser/react/context.js +10 -0
  138. package/dist/browser/react/context.js.map +1 -0
  139. package/dist/browser/react/index.d.ts +11 -0
  140. package/dist/browser/react/index.d.ts.map +1 -0
  141. package/dist/browser/react/index.js +22 -0
  142. package/dist/browser/react/index.js.map +1 -0
  143. package/dist/browser/react/location-state-shared.d.ts +63 -0
  144. package/dist/browser/react/location-state-shared.d.ts.map +1 -0
  145. package/dist/browser/react/location-state-shared.js +81 -0
  146. package/dist/browser/react/location-state-shared.js.map +1 -0
  147. package/dist/browser/react/location-state.d.ts +23 -0
  148. package/dist/browser/react/location-state.d.ts.map +1 -0
  149. package/dist/browser/react/location-state.js +29 -0
  150. package/dist/browser/react/location-state.js.map +1 -0
  151. package/dist/browser/react/mount-context.d.ts +24 -0
  152. package/dist/browser/react/mount-context.d.ts.map +1 -0
  153. package/dist/browser/react/mount-context.js +24 -0
  154. package/dist/browser/react/mount-context.js.map +1 -0
  155. package/dist/browser/react/use-action.d.ts +64 -0
  156. package/dist/browser/react/use-action.d.ts.map +1 -0
  157. package/dist/browser/react/use-action.js +134 -0
  158. package/dist/browser/react/use-action.js.map +1 -0
  159. package/dist/browser/react/use-client-cache.d.ts +41 -0
  160. package/dist/browser/react/use-client-cache.d.ts.map +1 -0
  161. package/{src/browser/react/use-client-cache.ts → dist/browser/react/use-client-cache.js} +9 -26
  162. package/dist/browser/react/use-client-cache.js.map +1 -0
  163. package/dist/browser/react/use-handle.d.ts +31 -0
  164. package/dist/browser/react/use-handle.d.ts.map +1 -0
  165. package/dist/browser/react/use-handle.js +144 -0
  166. package/dist/browser/react/use-handle.js.map +1 -0
  167. package/dist/browser/react/use-href.d.ts +33 -0
  168. package/dist/browser/react/use-href.d.ts.map +1 -0
  169. package/dist/browser/react/use-href.js +39 -0
  170. package/dist/browser/react/use-href.js.map +1 -0
  171. package/dist/browser/react/use-link-status.d.ts +37 -0
  172. package/dist/browser/react/use-link-status.d.ts.map +1 -0
  173. package/dist/browser/react/use-link-status.js +99 -0
  174. package/dist/browser/react/use-link-status.js.map +1 -0
  175. package/dist/browser/react/use-mount.d.ts +25 -0
  176. package/dist/browser/react/use-mount.d.ts.map +1 -0
  177. package/dist/browser/react/use-mount.js +30 -0
  178. package/dist/browser/react/use-mount.js.map +1 -0
  179. package/dist/browser/react/use-navigation.d.ts +27 -0
  180. package/dist/browser/react/use-navigation.d.ts.map +1 -0
  181. package/dist/browser/react/use-navigation.js +87 -0
  182. package/dist/browser/react/use-navigation.js.map +1 -0
  183. package/dist/browser/react/use-segments.d.ts +38 -0
  184. package/dist/browser/react/use-segments.d.ts.map +1 -0
  185. package/dist/browser/react/use-segments.js +130 -0
  186. package/dist/browser/react/use-segments.js.map +1 -0
  187. package/dist/browser/request-controller.d.ts +26 -0
  188. package/dist/browser/request-controller.d.ts.map +1 -0
  189. package/dist/browser/request-controller.js +147 -0
  190. package/dist/browser/request-controller.js.map +1 -0
  191. package/dist/browser/rsc-router.d.ts +129 -0
  192. package/dist/browser/rsc-router.d.ts.map +1 -0
  193. package/dist/browser/rsc-router.js +195 -0
  194. package/dist/browser/rsc-router.js.map +1 -0
  195. package/dist/browser/scroll-restoration.d.ts +93 -0
  196. package/dist/browser/scroll-restoration.d.ts.map +1 -0
  197. package/dist/browser/scroll-restoration.js +321 -0
  198. package/dist/browser/scroll-restoration.js.map +1 -0
  199. package/dist/browser/segment-structure-assert.d.ts +17 -0
  200. package/dist/browser/segment-structure-assert.d.ts.map +1 -0
  201. package/dist/browser/segment-structure-assert.js +59 -0
  202. package/dist/browser/segment-structure-assert.js.map +1 -0
  203. package/dist/browser/server-action-bridge.d.ts +26 -0
  204. package/dist/browser/server-action-bridge.d.ts.map +1 -0
  205. package/dist/browser/server-action-bridge.js +668 -0
  206. package/dist/browser/server-action-bridge.js.map +1 -0
  207. package/dist/browser/shallow.d.ts +12 -0
  208. package/dist/browser/shallow.d.ts.map +1 -0
  209. package/dist/browser/shallow.js +34 -0
  210. package/dist/browser/shallow.js.map +1 -0
  211. package/dist/browser/types.d.ts +369 -0
  212. package/dist/browser/types.d.ts.map +1 -0
  213. package/dist/browser/types.js +2 -0
  214. package/dist/browser/types.js.map +1 -0
  215. package/dist/build/__tests__/generate-cli.test.d.ts +2 -0
  216. package/dist/build/__tests__/generate-cli.test.d.ts.map +1 -0
  217. package/dist/build/__tests__/generate-cli.test.js +237 -0
  218. package/dist/build/__tests__/generate-cli.test.js.map +1 -0
  219. package/dist/build/__tests__/generate-manifest.test.d.ts +2 -0
  220. package/dist/build/__tests__/generate-manifest.test.d.ts.map +1 -0
  221. package/dist/build/__tests__/generate-manifest.test.js +119 -0
  222. package/dist/build/__tests__/generate-manifest.test.js.map +1 -0
  223. package/dist/build/__tests__/generate-route-types.test.d.ts +2 -0
  224. package/dist/build/__tests__/generate-route-types.test.d.ts.map +1 -0
  225. package/dist/build/__tests__/generate-route-types.test.js +620 -0
  226. package/dist/build/__tests__/generate-route-types.test.js.map +1 -0
  227. package/dist/build/__tests__/per-router-manifest.test.d.ts +2 -0
  228. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +1 -0
  229. package/dist/build/__tests__/per-router-manifest.test.js +308 -0
  230. package/dist/build/__tests__/per-router-manifest.test.js.map +1 -0
  231. package/dist/build/generate-manifest.d.ts +81 -0
  232. package/dist/build/generate-manifest.d.ts.map +1 -0
  233. package/dist/build/generate-manifest.js +276 -0
  234. package/dist/build/generate-manifest.js.map +1 -0
  235. package/dist/build/generate-route-types.d.ts +115 -0
  236. package/dist/build/generate-route-types.d.ts.map +1 -0
  237. package/dist/build/generate-route-types.js +740 -0
  238. package/dist/build/generate-route-types.js.map +1 -0
  239. package/dist/build/index.d.ts +21 -0
  240. package/dist/build/index.d.ts.map +1 -0
  241. package/dist/build/index.js +21 -0
  242. package/dist/build/index.js.map +1 -0
  243. package/dist/build/route-trie.d.ts +71 -0
  244. package/dist/build/route-trie.d.ts.map +1 -0
  245. package/dist/build/route-trie.js +175 -0
  246. package/dist/build/route-trie.js.map +1 -0
  247. package/dist/cache/__tests__/cache-scope.test.d.ts +2 -0
  248. package/dist/cache/__tests__/cache-scope.test.d.ts.map +1 -0
  249. package/dist/cache/__tests__/cache-scope.test.js +208 -0
  250. package/dist/cache/__tests__/cache-scope.test.js.map +1 -0
  251. package/dist/cache/__tests__/document-cache.test.d.ts +2 -0
  252. package/dist/cache/__tests__/document-cache.test.d.ts.map +1 -0
  253. package/dist/cache/__tests__/document-cache.test.js +345 -0
  254. package/dist/cache/__tests__/document-cache.test.js.map +1 -0
  255. package/dist/cache/__tests__/memory-segment-store.test.d.ts +2 -0
  256. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +1 -0
  257. package/dist/cache/__tests__/memory-segment-store.test.js +425 -0
  258. package/dist/cache/__tests__/memory-segment-store.test.js.map +1 -0
  259. package/dist/cache/__tests__/memory-store.test.d.ts +2 -0
  260. package/dist/cache/__tests__/memory-store.test.d.ts.map +1 -0
  261. package/dist/cache/__tests__/memory-store.test.js +367 -0
  262. package/dist/cache/__tests__/memory-store.test.js.map +1 -0
  263. package/dist/cache/cache-scope.d.ts +102 -0
  264. package/dist/cache/cache-scope.d.ts.map +1 -0
  265. package/dist/cache/cache-scope.js +440 -0
  266. package/dist/cache/cache-scope.js.map +1 -0
  267. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +2 -0
  268. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +1 -0
  269. package/dist/cache/cf/__tests__/cf-cache-store.test.js +330 -0
  270. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +1 -0
  271. package/dist/cache/cf/cf-cache-store.d.ts +165 -0
  272. package/dist/cache/cf/cf-cache-store.d.ts.map +1 -0
  273. package/dist/cache/cf/cf-cache-store.js +242 -0
  274. package/dist/cache/cf/cf-cache-store.js.map +1 -0
  275. package/dist/cache/cf/index.d.ts +14 -0
  276. package/dist/cache/cf/index.d.ts.map +1 -0
  277. package/dist/cache/cf/index.js +17 -0
  278. package/dist/cache/cf/index.js.map +1 -0
  279. package/dist/cache/document-cache.d.ts +64 -0
  280. package/dist/cache/document-cache.d.ts.map +1 -0
  281. package/dist/cache/document-cache.js +228 -0
  282. package/dist/cache/document-cache.js.map +1 -0
  283. package/dist/cache/index.d.ts +19 -0
  284. package/dist/cache/index.d.ts.map +1 -0
  285. package/dist/cache/index.js +21 -0
  286. package/dist/cache/index.js.map +1 -0
  287. package/dist/cache/memory-segment-store.d.ts +110 -0
  288. package/dist/cache/memory-segment-store.d.ts.map +1 -0
  289. package/dist/cache/memory-segment-store.js +117 -0
  290. package/dist/cache/memory-segment-store.js.map +1 -0
  291. package/dist/cache/memory-store.d.ts +41 -0
  292. package/dist/cache/memory-store.d.ts.map +1 -0
  293. package/dist/cache/memory-store.js +191 -0
  294. package/dist/cache/memory-store.js.map +1 -0
  295. package/dist/cache/types.d.ts +317 -0
  296. package/dist/cache/types.d.ts.map +1 -0
  297. package/dist/cache/types.js +12 -0
  298. package/dist/cache/types.js.map +1 -0
  299. package/dist/client.d.ts +248 -0
  300. package/dist/client.d.ts.map +1 -0
  301. package/dist/client.js +367 -0
  302. package/dist/client.js.map +1 -0
  303. package/dist/client.rsc.d.ts +26 -0
  304. package/dist/client.rsc.d.ts.map +1 -0
  305. package/dist/client.rsc.js +46 -0
  306. package/dist/client.rsc.js.map +1 -0
  307. package/dist/component-utils.d.ts +36 -0
  308. package/dist/component-utils.d.ts.map +1 -0
  309. package/dist/component-utils.js +61 -0
  310. package/dist/component-utils.js.map +1 -0
  311. package/dist/components/DefaultDocument.d.ts +13 -0
  312. package/dist/components/DefaultDocument.d.ts.map +1 -0
  313. package/dist/components/DefaultDocument.js +15 -0
  314. package/dist/components/DefaultDocument.js.map +1 -0
  315. package/dist/debug.d.ts +58 -0
  316. package/dist/debug.d.ts.map +1 -0
  317. package/dist/debug.js +157 -0
  318. package/dist/debug.js.map +1 -0
  319. package/dist/default-error-boundary.d.ts +11 -0
  320. package/dist/default-error-boundary.d.ts.map +1 -0
  321. package/dist/default-error-boundary.js +45 -0
  322. package/dist/default-error-boundary.js.map +1 -0
  323. package/dist/deps/browser.d.ts +2 -0
  324. package/dist/deps/browser.d.ts.map +1 -0
  325. package/dist/deps/browser.js +3 -0
  326. package/dist/deps/browser.js.map +1 -0
  327. package/dist/deps/html-stream-client.d.ts +2 -0
  328. package/dist/deps/html-stream-client.d.ts.map +1 -0
  329. package/dist/deps/html-stream-client.js +3 -0
  330. package/dist/deps/html-stream-client.js.map +1 -0
  331. package/dist/deps/html-stream-server.d.ts +2 -0
  332. package/dist/deps/html-stream-server.d.ts.map +1 -0
  333. package/dist/deps/html-stream-server.js +3 -0
  334. package/dist/deps/html-stream-server.js.map +1 -0
  335. package/dist/deps/rsc.d.ts +2 -0
  336. package/dist/deps/rsc.d.ts.map +1 -0
  337. package/dist/deps/rsc.js +4 -0
  338. package/dist/deps/rsc.js.map +1 -0
  339. package/dist/deps/ssr.d.ts +2 -0
  340. package/dist/deps/ssr.d.ts.map +1 -0
  341. package/dist/deps/ssr.js +3 -0
  342. package/dist/deps/ssr.js.map +1 -0
  343. package/dist/errors.d.ts +174 -0
  344. package/dist/errors.d.ts.map +1 -0
  345. package/dist/errors.js +241 -0
  346. package/dist/errors.js.map +1 -0
  347. package/dist/handle.d.ts +78 -0
  348. package/dist/handle.d.ts.map +1 -0
  349. package/dist/handle.js +82 -0
  350. package/dist/handle.js.map +1 -0
  351. package/dist/handles/MetaTags.d.ts +14 -0
  352. package/dist/handles/MetaTags.d.ts.map +1 -0
  353. package/dist/handles/MetaTags.js +136 -0
  354. package/dist/handles/MetaTags.js.map +1 -0
  355. package/dist/handles/index.d.ts +6 -0
  356. package/dist/handles/index.d.ts.map +1 -0
  357. package/{src/handles/index.ts → dist/handles/index.js} +1 -1
  358. package/dist/handles/index.js.map +1 -0
  359. package/dist/handles/meta.d.ts +39 -0
  360. package/dist/handles/meta.d.ts.map +1 -0
  361. package/dist/handles/meta.js +202 -0
  362. package/dist/handles/meta.js.map +1 -0
  363. package/dist/host/__tests__/errors.test.d.ts +2 -0
  364. package/dist/host/__tests__/errors.test.d.ts.map +1 -0
  365. package/dist/host/__tests__/errors.test.js +76 -0
  366. package/dist/host/__tests__/errors.test.js.map +1 -0
  367. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +2 -0
  368. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +1 -0
  369. package/dist/host/__tests__/pattern-comprehensive.test.js +732 -0
  370. package/dist/host/__tests__/pattern-comprehensive.test.js.map +1 -0
  371. package/dist/host/__tests__/pattern-matcher.test.d.ts +2 -0
  372. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +1 -0
  373. package/dist/host/__tests__/pattern-matcher.test.js +251 -0
  374. package/dist/host/__tests__/pattern-matcher.test.js.map +1 -0
  375. package/dist/host/__tests__/router.test.d.ts +2 -0
  376. package/dist/host/__tests__/router.test.d.ts.map +1 -0
  377. package/dist/host/__tests__/router.test.js +241 -0
  378. package/dist/host/__tests__/router.test.js.map +1 -0
  379. package/dist/host/__tests__/testing.test.d.ts +2 -0
  380. package/dist/host/__tests__/testing.test.d.ts.map +1 -0
  381. package/dist/host/__tests__/testing.test.js +64 -0
  382. package/dist/host/__tests__/testing.test.js.map +1 -0
  383. package/dist/host/__tests__/utils.test.d.ts +2 -0
  384. package/dist/host/__tests__/utils.test.d.ts.map +1 -0
  385. package/dist/host/__tests__/utils.test.js +29 -0
  386. package/dist/host/__tests__/utils.test.js.map +1 -0
  387. package/dist/host/cookie-handler.d.ts +34 -0
  388. package/dist/host/cookie-handler.d.ts.map +1 -0
  389. package/dist/host/cookie-handler.js +124 -0
  390. package/dist/host/cookie-handler.js.map +1 -0
  391. package/dist/host/errors.d.ts +56 -0
  392. package/dist/host/errors.d.ts.map +1 -0
  393. package/dist/host/errors.js +79 -0
  394. package/dist/host/errors.js.map +1 -0
  395. package/dist/host/index.d.ts +29 -0
  396. package/dist/host/index.d.ts.map +1 -0
  397. package/dist/host/index.js +32 -0
  398. package/dist/host/index.js.map +1 -0
  399. package/dist/host/pattern-matcher.d.ts +36 -0
  400. package/dist/host/pattern-matcher.d.ts.map +1 -0
  401. package/dist/host/pattern-matcher.js +172 -0
  402. package/dist/host/pattern-matcher.js.map +1 -0
  403. package/dist/host/router.d.ts +26 -0
  404. package/dist/host/router.d.ts.map +1 -0
  405. package/dist/host/router.js +218 -0
  406. package/dist/host/router.js.map +1 -0
  407. package/dist/host/testing.d.ts +36 -0
  408. package/dist/host/testing.d.ts.map +1 -0
  409. package/dist/host/testing.js +55 -0
  410. package/dist/host/testing.js.map +1 -0
  411. package/dist/host/types.d.ts +115 -0
  412. package/dist/host/types.d.ts.map +1 -0
  413. package/dist/host/types.js +7 -0
  414. package/dist/host/types.js.map +1 -0
  415. package/dist/host/utils.d.ts +21 -0
  416. package/dist/host/utils.d.ts.map +1 -0
  417. package/dist/host/utils.js +23 -0
  418. package/dist/host/utils.js.map +1 -0
  419. package/dist/href-client.d.ts +131 -0
  420. package/dist/href-client.d.ts.map +1 -0
  421. package/dist/href-client.js +64 -0
  422. package/dist/href-client.js.map +1 -0
  423. package/{src/href-context.ts → dist/href-context.d.ts} +7 -11
  424. package/dist/href-context.d.ts.map +1 -0
  425. package/dist/href-context.js +21 -0
  426. package/dist/href-context.js.map +1 -0
  427. package/dist/index.d.ts +73 -0
  428. package/dist/index.d.ts.map +1 -0
  429. package/dist/index.js +91 -0
  430. package/dist/index.js.map +1 -0
  431. package/dist/index.rsc.d.ts +32 -0
  432. package/dist/index.rsc.d.ts.map +1 -0
  433. package/dist/index.rsc.js +40 -0
  434. package/dist/index.rsc.js.map +1 -0
  435. package/dist/internal-debug.d.ts +2 -0
  436. package/dist/internal-debug.d.ts.map +1 -0
  437. package/dist/internal-debug.js +5 -0
  438. package/dist/internal-debug.js.map +1 -0
  439. package/dist/loader.d.ts +14 -0
  440. package/dist/loader.d.ts.map +1 -0
  441. package/dist/loader.js +20 -0
  442. package/dist/loader.js.map +1 -0
  443. package/dist/loader.rsc.d.ts +19 -0
  444. package/dist/loader.rsc.d.ts.map +1 -0
  445. package/dist/loader.rsc.js +99 -0
  446. package/dist/loader.rsc.js.map +1 -0
  447. package/dist/network-error-thrower.d.ts +17 -0
  448. package/dist/network-error-thrower.d.ts.map +1 -0
  449. package/dist/network-error-thrower.js +14 -0
  450. package/dist/network-error-thrower.js.map +1 -0
  451. package/dist/outlet-context.d.ts +13 -0
  452. package/dist/outlet-context.d.ts.map +1 -0
  453. package/dist/outlet-context.js +3 -0
  454. package/dist/outlet-context.js.map +1 -0
  455. package/dist/prerender/__tests__/param-hash.test.d.ts +2 -0
  456. package/dist/prerender/__tests__/param-hash.test.d.ts.map +1 -0
  457. package/dist/prerender/__tests__/param-hash.test.js +148 -0
  458. package/dist/prerender/__tests__/param-hash.test.js.map +1 -0
  459. package/dist/prerender/param-hash.d.ts +16 -0
  460. package/dist/prerender/param-hash.d.ts.map +1 -0
  461. package/dist/prerender/param-hash.js +36 -0
  462. package/dist/prerender/param-hash.js.map +1 -0
  463. package/dist/prerender/store.d.ts +38 -0
  464. package/dist/prerender/store.d.ts.map +1 -0
  465. package/dist/prerender/store.js +61 -0
  466. package/dist/prerender/store.js.map +1 -0
  467. package/dist/prerender.d.ts +66 -0
  468. package/dist/prerender.d.ts.map +1 -0
  469. package/dist/prerender.js +57 -0
  470. package/dist/prerender.js.map +1 -0
  471. package/dist/reverse.d.ts +196 -0
  472. package/dist/reverse.d.ts.map +1 -0
  473. package/dist/reverse.js +78 -0
  474. package/dist/reverse.js.map +1 -0
  475. package/dist/root-error-boundary.d.ts +33 -0
  476. package/dist/root-error-boundary.d.ts.map +1 -0
  477. package/dist/root-error-boundary.js +165 -0
  478. package/dist/root-error-boundary.js.map +1 -0
  479. package/dist/route-content-wrapper.d.ts +46 -0
  480. package/dist/route-content-wrapper.d.ts.map +1 -0
  481. package/dist/route-content-wrapper.js +77 -0
  482. package/dist/route-content-wrapper.js.map +1 -0
  483. package/dist/route-definition.d.ts +421 -0
  484. package/dist/route-definition.d.ts.map +1 -0
  485. package/dist/route-definition.js +868 -0
  486. package/dist/route-definition.js.map +1 -0
  487. package/dist/route-map-builder.d.ts +155 -0
  488. package/dist/route-map-builder.d.ts.map +1 -0
  489. package/dist/route-map-builder.js +237 -0
  490. package/dist/route-map-builder.js.map +1 -0
  491. package/dist/route-types.d.ts +165 -0
  492. package/dist/route-types.d.ts.map +1 -0
  493. package/dist/route-types.js +7 -0
  494. package/dist/route-types.js.map +1 -0
  495. package/dist/router/__tests__/handler-context.test.d.ts +2 -0
  496. package/dist/router/__tests__/handler-context.test.d.ts.map +1 -0
  497. package/dist/router/__tests__/handler-context.test.js +65 -0
  498. package/dist/router/__tests__/handler-context.test.js.map +1 -0
  499. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +2 -0
  500. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +1 -0
  501. package/dist/router/__tests__/loader-cycle-detection.test.js +221 -0
  502. package/dist/router/__tests__/loader-cycle-detection.test.js.map +1 -0
  503. package/dist/router/__tests__/match-context.test.d.ts +2 -0
  504. package/dist/router/__tests__/match-context.test.d.ts.map +1 -0
  505. package/dist/router/__tests__/match-context.test.js +92 -0
  506. package/dist/router/__tests__/match-context.test.js.map +1 -0
  507. package/dist/router/__tests__/match-pipelines.test.d.ts +2 -0
  508. package/dist/router/__tests__/match-pipelines.test.d.ts.map +1 -0
  509. package/dist/router/__tests__/match-pipelines.test.js +417 -0
  510. package/dist/router/__tests__/match-pipelines.test.js.map +1 -0
  511. package/dist/router/__tests__/match-result.test.d.ts +2 -0
  512. package/dist/router/__tests__/match-result.test.d.ts.map +1 -0
  513. package/dist/router/__tests__/match-result.test.js +457 -0
  514. package/dist/router/__tests__/match-result.test.js.map +1 -0
  515. package/dist/router/__tests__/on-error.test.d.ts +2 -0
  516. package/dist/router/__tests__/on-error.test.d.ts.map +1 -0
  517. package/dist/router/__tests__/on-error.test.js +678 -0
  518. package/dist/router/__tests__/on-error.test.js.map +1 -0
  519. package/dist/router/__tests__/pattern-matching.test.d.ts +2 -0
  520. package/dist/router/__tests__/pattern-matching.test.d.ts.map +1 -0
  521. package/dist/router/__tests__/pattern-matching.test.js +629 -0
  522. package/dist/router/__tests__/pattern-matching.test.js.map +1 -0
  523. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +2 -0
  524. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +1 -0
  525. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +155 -0
  526. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +1 -0
  527. package/dist/router/error-handling.d.ts +77 -0
  528. package/dist/router/error-handling.d.ts.map +1 -0
  529. package/dist/router/error-handling.js +202 -0
  530. package/dist/router/error-handling.js.map +1 -0
  531. package/dist/router/handler-context.d.ts +20 -0
  532. package/dist/router/handler-context.d.ts.map +1 -0
  533. package/dist/router/handler-context.js +198 -0
  534. package/dist/router/handler-context.js.map +1 -0
  535. package/dist/router/intercept-resolution.d.ts +66 -0
  536. package/dist/router/intercept-resolution.d.ts.map +1 -0
  537. package/dist/router/intercept-resolution.js +246 -0
  538. package/dist/router/intercept-resolution.js.map +1 -0
  539. package/dist/router/loader-resolution.d.ts +64 -0
  540. package/dist/router/loader-resolution.d.ts.map +1 -0
  541. package/dist/router/loader-resolution.js +284 -0
  542. package/dist/router/loader-resolution.js.map +1 -0
  543. package/dist/router/logging.d.ts +15 -0
  544. package/dist/router/logging.d.ts.map +1 -0
  545. package/dist/router/logging.js +99 -0
  546. package/dist/router/logging.js.map +1 -0
  547. package/dist/router/manifest.d.ts +22 -0
  548. package/dist/router/manifest.d.ts.map +1 -0
  549. package/dist/router/manifest.js +181 -0
  550. package/dist/router/manifest.js.map +1 -0
  551. package/dist/router/match-api.d.ts +35 -0
  552. package/dist/router/match-api.d.ts.map +1 -0
  553. package/dist/router/match-api.js +406 -0
  554. package/dist/router/match-api.js.map +1 -0
  555. package/dist/router/match-context.d.ts +206 -0
  556. package/dist/router/match-context.d.ts.map +1 -0
  557. package/dist/router/match-context.js +17 -0
  558. package/dist/router/match-context.js.map +1 -0
  559. package/dist/router/match-middleware/background-revalidation.d.ts +127 -0
  560. package/dist/router/match-middleware/background-revalidation.d.ts.map +1 -0
  561. package/dist/router/match-middleware/background-revalidation.js +75 -0
  562. package/dist/router/match-middleware/background-revalidation.js.map +1 -0
  563. package/dist/router/match-middleware/cache-lookup.d.ts +112 -0
  564. package/dist/router/match-middleware/cache-lookup.d.ts.map +1 -0
  565. package/dist/router/match-middleware/cache-lookup.js +257 -0
  566. package/dist/router/match-middleware/cache-lookup.js.map +1 -0
  567. package/dist/router/match-middleware/cache-store.d.ts +113 -0
  568. package/dist/router/match-middleware/cache-store.d.ts.map +1 -0
  569. package/dist/router/match-middleware/cache-store.js +108 -0
  570. package/dist/router/match-middleware/cache-store.js.map +1 -0
  571. package/dist/router/match-middleware/index.d.ts +81 -0
  572. package/dist/router/match-middleware/index.d.ts.map +1 -0
  573. package/dist/router/match-middleware/index.js +80 -0
  574. package/dist/router/match-middleware/index.js.map +1 -0
  575. package/dist/router/match-middleware/intercept-resolution.d.ts +117 -0
  576. package/dist/router/match-middleware/intercept-resolution.d.ts.map +1 -0
  577. package/dist/router/match-middleware/intercept-resolution.js +134 -0
  578. package/dist/router/match-middleware/intercept-resolution.js.map +1 -0
  579. package/dist/router/match-middleware/segment-resolution.d.ts +99 -0
  580. package/dist/router/match-middleware/segment-resolution.d.ts.map +1 -0
  581. package/dist/router/match-middleware/segment-resolution.js +53 -0
  582. package/dist/router/match-middleware/segment-resolution.js.map +1 -0
  583. package/dist/router/match-pipelines.d.ts +147 -0
  584. package/dist/router/match-pipelines.d.ts.map +1 -0
  585. package/dist/router/match-pipelines.js +82 -0
  586. package/dist/router/match-pipelines.js.map +1 -0
  587. package/dist/router/match-result.d.ts +126 -0
  588. package/dist/router/match-result.d.ts.map +1 -0
  589. package/dist/router/match-result.js +93 -0
  590. package/dist/router/match-result.js.map +1 -0
  591. package/dist/router/metrics.d.ts +20 -0
  592. package/dist/router/metrics.d.ts.map +1 -0
  593. package/dist/router/metrics.js +47 -0
  594. package/dist/router/metrics.js.map +1 -0
  595. package/dist/router/middleware.d.ts +249 -0
  596. package/dist/router/middleware.d.ts.map +1 -0
  597. package/dist/router/middleware.js +434 -0
  598. package/dist/router/middleware.js.map +1 -0
  599. package/dist/router/middleware.test.d.ts +2 -0
  600. package/dist/router/middleware.test.d.ts.map +1 -0
  601. package/dist/router/middleware.test.js +816 -0
  602. package/dist/router/middleware.test.js.map +1 -0
  603. package/dist/router/pattern-matching.d.ts +149 -0
  604. package/dist/router/pattern-matching.d.ts.map +1 -0
  605. package/dist/router/pattern-matching.js +349 -0
  606. package/dist/router/pattern-matching.js.map +1 -0
  607. package/dist/router/revalidation.d.ts +44 -0
  608. package/dist/router/revalidation.d.ts.map +1 -0
  609. package/dist/router/revalidation.js +147 -0
  610. package/dist/router/revalidation.js.map +1 -0
  611. package/dist/router/router-context.d.ts +135 -0
  612. package/dist/router/router-context.d.ts.map +1 -0
  613. package/dist/router/router-context.js +36 -0
  614. package/dist/router/router-context.js.map +1 -0
  615. package/dist/router/segment-resolution.d.ts +127 -0
  616. package/dist/router/segment-resolution.d.ts.map +1 -0
  617. package/dist/router/segment-resolution.js +919 -0
  618. package/dist/router/segment-resolution.js.map +1 -0
  619. package/dist/router/trie-matching.d.ts +40 -0
  620. package/dist/router/trie-matching.d.ts.map +1 -0
  621. package/dist/router/trie-matching.js +127 -0
  622. package/dist/router/trie-matching.js.map +1 -0
  623. package/dist/router/types.d.ts +136 -0
  624. package/dist/router/types.d.ts.map +1 -0
  625. package/dist/router/types.js +7 -0
  626. package/dist/router/types.js.map +1 -0
  627. package/dist/router.d.ts +753 -0
  628. package/dist/router.d.ts.map +1 -0
  629. package/dist/router.gen.d.ts +6 -0
  630. package/dist/router.gen.d.ts.map +1 -0
  631. package/dist/router.gen.js +6 -0
  632. package/dist/router.gen.js.map +1 -0
  633. package/dist/router.js +1304 -0
  634. package/dist/router.js.map +1 -0
  635. package/dist/rsc/__tests__/helpers.test.d.ts +2 -0
  636. package/dist/rsc/__tests__/helpers.test.d.ts.map +1 -0
  637. package/dist/rsc/__tests__/helpers.test.js +140 -0
  638. package/dist/rsc/__tests__/helpers.test.js.map +1 -0
  639. package/dist/rsc/handler.d.ts +45 -0
  640. package/dist/rsc/handler.d.ts.map +1 -0
  641. package/dist/rsc/handler.js +1172 -0
  642. package/dist/rsc/handler.js.map +1 -0
  643. package/dist/rsc/helpers.d.ts +16 -0
  644. package/dist/rsc/helpers.d.ts.map +1 -0
  645. package/dist/rsc/helpers.js +55 -0
  646. package/dist/rsc/helpers.js.map +1 -0
  647. package/dist/rsc/index.d.ts +22 -0
  648. package/dist/rsc/index.d.ts.map +1 -0
  649. package/dist/rsc/index.js +23 -0
  650. package/dist/rsc/index.js.map +1 -0
  651. package/dist/rsc/nonce.d.ts +9 -0
  652. package/dist/rsc/nonce.d.ts.map +1 -0
  653. package/dist/rsc/nonce.js +18 -0
  654. package/dist/rsc/nonce.js.map +1 -0
  655. package/dist/rsc/types.d.ts +206 -0
  656. package/dist/rsc/types.d.ts.map +1 -0
  657. package/dist/rsc/types.js +8 -0
  658. package/dist/rsc/types.js.map +1 -0
  659. package/dist/search-params.d.ts +103 -0
  660. package/dist/search-params.d.ts.map +1 -0
  661. package/dist/search-params.js +74 -0
  662. package/dist/search-params.js.map +1 -0
  663. package/dist/segment-system.d.ts +75 -0
  664. package/dist/segment-system.d.ts.map +1 -0
  665. package/dist/segment-system.js +336 -0
  666. package/dist/segment-system.js.map +1 -0
  667. package/dist/server/context.d.ts +245 -0
  668. package/dist/server/context.d.ts.map +1 -0
  669. package/dist/server/context.js +197 -0
  670. package/dist/server/context.js.map +1 -0
  671. package/dist/server/fetchable-loader-store.d.ts +18 -0
  672. package/dist/server/fetchable-loader-store.d.ts.map +1 -0
  673. package/dist/server/fetchable-loader-store.js +18 -0
  674. package/dist/server/fetchable-loader-store.js.map +1 -0
  675. package/dist/server/handle-store.d.ts +85 -0
  676. package/dist/server/handle-store.d.ts.map +1 -0
  677. package/dist/server/handle-store.js +142 -0
  678. package/dist/server/handle-store.js.map +1 -0
  679. package/dist/server/loader-registry.d.ts +55 -0
  680. package/dist/server/loader-registry.d.ts.map +1 -0
  681. package/dist/server/loader-registry.js +132 -0
  682. package/dist/server/loader-registry.js.map +1 -0
  683. package/dist/server/request-context.d.ts +226 -0
  684. package/dist/server/request-context.d.ts.map +1 -0
  685. package/dist/server/request-context.js +290 -0
  686. package/dist/server/request-context.js.map +1 -0
  687. package/dist/server/root-layout.d.ts +4 -0
  688. package/dist/server/root-layout.d.ts.map +1 -0
  689. package/dist/server/root-layout.js +5 -0
  690. package/dist/server/root-layout.js.map +1 -0
  691. package/dist/server.d.ts +15 -0
  692. package/dist/server.d.ts.map +1 -0
  693. package/dist/server.js +20 -0
  694. package/dist/server.js.map +1 -0
  695. package/dist/ssr/__tests__/ssr-handler.test.d.ts +2 -0
  696. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +1 -0
  697. package/dist/ssr/__tests__/ssr-handler.test.js +132 -0
  698. package/dist/ssr/__tests__/ssr-handler.test.js.map +1 -0
  699. package/dist/ssr/index.d.ts +98 -0
  700. package/dist/ssr/index.d.ts.map +1 -0
  701. package/dist/ssr/index.js +158 -0
  702. package/dist/ssr/index.js.map +1 -0
  703. package/dist/static-handler.d.ts +50 -0
  704. package/dist/static-handler.d.ts.map +1 -0
  705. package/dist/static-handler.gen.d.ts +5 -0
  706. package/dist/static-handler.gen.d.ts.map +1 -0
  707. package/dist/static-handler.gen.js +5 -0
  708. package/dist/static-handler.gen.js.map +1 -0
  709. package/dist/static-handler.js +29 -0
  710. package/dist/static-handler.js.map +1 -0
  711. package/dist/testing/vitest.js +82 -0
  712. package/dist/theme/ThemeProvider.d.ts +20 -0
  713. package/dist/theme/ThemeProvider.d.ts.map +1 -0
  714. package/dist/theme/ThemeProvider.js +240 -0
  715. package/dist/theme/ThemeProvider.js.map +1 -0
  716. package/dist/theme/ThemeScript.d.ts +48 -0
  717. package/dist/theme/ThemeScript.d.ts.map +1 -0
  718. package/dist/theme/ThemeScript.js +13 -0
  719. package/dist/theme/ThemeScript.js.map +1 -0
  720. package/dist/theme/__tests__/theme.test.d.ts +2 -0
  721. package/dist/theme/__tests__/theme.test.d.ts.map +1 -0
  722. package/dist/theme/__tests__/theme.test.js +103 -0
  723. package/dist/theme/__tests__/theme.test.js.map +1 -0
  724. package/dist/theme/constants.d.ts +29 -0
  725. package/dist/theme/constants.d.ts.map +1 -0
  726. package/dist/theme/constants.js +48 -0
  727. package/dist/theme/constants.js.map +1 -0
  728. package/dist/theme/index.d.ts +31 -0
  729. package/dist/theme/index.d.ts.map +1 -0
  730. package/dist/theme/index.js +36 -0
  731. package/dist/theme/index.js.map +1 -0
  732. package/dist/theme/theme-context.d.ts +40 -0
  733. package/dist/theme/theme-context.d.ts.map +1 -0
  734. package/dist/theme/theme-context.js +60 -0
  735. package/dist/theme/theme-context.js.map +1 -0
  736. package/dist/theme/theme-script.d.ts +27 -0
  737. package/dist/theme/theme-script.d.ts.map +1 -0
  738. package/dist/theme/theme-script.js +147 -0
  739. package/dist/theme/theme-script.js.map +1 -0
  740. package/dist/theme/types.d.ts +163 -0
  741. package/dist/theme/types.d.ts.map +1 -0
  742. package/dist/theme/types.js +11 -0
  743. package/dist/theme/types.js.map +1 -0
  744. package/dist/theme/use-theme.d.ts +12 -0
  745. package/dist/theme/use-theme.d.ts.map +1 -0
  746. package/dist/theme/use-theme.js +40 -0
  747. package/dist/theme/use-theme.js.map +1 -0
  748. package/dist/types.d.ts +1479 -0
  749. package/dist/types.d.ts.map +1 -0
  750. package/dist/types.js +10 -0
  751. package/dist/types.js.map +1 -0
  752. package/dist/urls.d.ts +441 -0
  753. package/dist/urls.d.ts.map +1 -0
  754. package/dist/urls.gen.d.ts +8 -0
  755. package/dist/urls.gen.d.ts.map +1 -0
  756. package/dist/urls.gen.js +8 -0
  757. package/dist/urls.gen.js.map +1 -0
  758. package/dist/urls.js +443 -0
  759. package/dist/urls.js.map +1 -0
  760. package/dist/use-loader.d.ts +127 -0
  761. package/dist/use-loader.d.ts.map +1 -0
  762. package/dist/use-loader.js +237 -0
  763. package/dist/use-loader.js.map +1 -0
  764. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +2 -0
  765. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +1 -0
  766. package/dist/vite/__tests__/ast-handler-extract.test.js +294 -0
  767. package/dist/vite/__tests__/ast-handler-extract.test.js.map +1 -0
  768. package/dist/vite/__tests__/expose-id-utils.test.d.ts +2 -0
  769. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +1 -0
  770. package/dist/vite/__tests__/expose-id-utils.test.js +224 -0
  771. package/dist/vite/__tests__/expose-id-utils.test.js.map +1 -0
  772. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +2 -0
  773. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +1 -0
  774. package/dist/vite/__tests__/expose-internal-ids.test.js +647 -0
  775. package/dist/vite/__tests__/expose-internal-ids.test.js.map +1 -0
  776. package/dist/vite/__tests__/expose-router-id.test.d.ts +2 -0
  777. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +1 -0
  778. package/dist/vite/__tests__/expose-router-id.test.js +39 -0
  779. package/dist/vite/__tests__/expose-router-id.test.js.map +1 -0
  780. package/dist/vite/ast-handler-extract.d.ts +49 -0
  781. package/dist/vite/ast-handler-extract.d.ts.map +1 -0
  782. package/dist/vite/ast-handler-extract.js +249 -0
  783. package/dist/vite/ast-handler-extract.js.map +1 -0
  784. package/dist/vite/expose-action-id.d.ts +19 -0
  785. package/dist/vite/expose-action-id.d.ts.map +1 -0
  786. package/dist/vite/expose-action-id.js +250 -0
  787. package/dist/vite/expose-action-id.js.map +1 -0
  788. package/dist/vite/expose-id-utils.d.ts +69 -0
  789. package/dist/vite/expose-id-utils.d.ts.map +1 -0
  790. package/dist/vite/expose-id-utils.js +289 -0
  791. package/dist/vite/expose-id-utils.js.map +1 -0
  792. package/dist/vite/expose-internal-ids.d.ts +22 -0
  793. package/dist/vite/expose-internal-ids.d.ts.map +1 -0
  794. package/dist/vite/expose-internal-ids.js +886 -0
  795. package/dist/vite/expose-internal-ids.js.map +1 -0
  796. package/dist/vite/index.d.ts +149 -0
  797. package/dist/vite/index.d.ts.map +1 -0
  798. package/dist/vite/index.js +6263 -2733
  799. package/dist/vite/index.js.bak +5448 -0
  800. package/dist/vite/index.js.map +1 -0
  801. package/dist/vite/package-resolution.d.ts +43 -0
  802. package/dist/vite/package-resolution.d.ts.map +1 -0
  803. package/{src/vite/package-resolution.ts → dist/vite/package-resolution.js} +53 -66
  804. package/dist/vite/package-resolution.js.map +1 -0
  805. package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  806. package/dist/vite/virtual-entries.d.ts +25 -0
  807. package/dist/vite/virtual-entries.d.ts.map +1 -0
  808. package/{src/vite/virtual-entries.ts → dist/vite/virtual-entries.js} +12 -16
  809. package/dist/vite/virtual-entries.js.map +1 -0
  810. package/package.json +123 -68
  811. package/skills/api-client/SKILL.md +211 -0
  812. package/skills/breadcrumbs/SKILL.md +312 -0
  813. package/skills/bundle-analysis/SKILL.md +159 -0
  814. package/skills/cache-guide/SKILL.md +486 -0
  815. package/skills/caching/SKILL.md +349 -24
  816. package/skills/composability/SKILL.md +197 -0
  817. package/skills/css/SKILL.md +76 -0
  818. package/skills/debug-manifest/SKILL.md +12 -8
  819. package/skills/document-cache/SKILL.md +87 -62
  820. package/skills/fonts/SKILL.md +6 -4
  821. package/skills/handler-use/SKILL.md +364 -0
  822. package/skills/hooks/SKILL.md +557 -79
  823. package/skills/host-router/SKILL.md +278 -0
  824. package/skills/i18n/SKILL.md +276 -0
  825. package/skills/intercept/SKILL.md +175 -8
  826. package/skills/layout/SKILL.md +128 -5
  827. package/skills/links/SKILL.md +304 -25
  828. package/skills/loader/SKILL.md +604 -54
  829. package/skills/middleware/SKILL.md +213 -37
  830. package/skills/migrate-nextjs/SKILL.md +584 -0
  831. package/skills/migrate-react-router/SKILL.md +769 -0
  832. package/skills/mime-routes/SKILL.md +41 -10
  833. package/skills/observability/SKILL.md +172 -0
  834. package/skills/parallel/SKILL.md +276 -3
  835. package/skills/prerender/SKILL.md +432 -52
  836. package/skills/rango/SKILL.md +313 -21
  837. package/skills/react-compiler/SKILL.md +168 -0
  838. package/skills/response-routes/SKILL.md +248 -120
  839. package/skills/route/SKILL.md +287 -21
  840. package/skills/router-setup/SKILL.md +231 -33
  841. package/skills/server-actions/SKILL.md +775 -0
  842. package/skills/streams-and-websockets/SKILL.md +283 -0
  843. package/skills/tailwind/SKILL.md +27 -3
  844. package/skills/testing/SKILL.md +129 -0
  845. package/skills/testing/bindings.md +89 -0
  846. package/skills/testing/cache-prerender.md +124 -0
  847. package/skills/testing/client-components.md +122 -0
  848. package/skills/testing/e2e-parity.md +125 -0
  849. package/skills/testing/flight.md +92 -0
  850. package/skills/testing/handles.md +129 -0
  851. package/skills/testing/loader.md +128 -0
  852. package/skills/testing/middleware.md +99 -0
  853. package/skills/testing/render-handler.md +121 -0
  854. package/skills/testing/response-routes.md +95 -0
  855. package/skills/testing/reverse-and-types.md +84 -0
  856. package/skills/testing/server-actions.md +107 -0
  857. package/skills/testing/server-tree.md +128 -0
  858. package/skills/testing/setup.md +120 -0
  859. package/skills/theme/SKILL.md +9 -8
  860. package/skills/typesafety/SKILL.md +547 -107
  861. package/skills/use-cache/SKILL.md +355 -0
  862. package/skills/view-transitions/SKILL.md +294 -0
  863. package/src/__augment-tests__/augment.ts +81 -0
  864. package/src/__augment-tests__/augmented.check.ts +116 -0
  865. package/src/__internal.ts +77 -44
  866. package/src/bin/rango.ts +312 -15
  867. package/src/browser/action-coordinator.ts +114 -0
  868. package/src/browser/action-fence.ts +47 -0
  869. package/src/browser/app-shell.ts +39 -0
  870. package/src/browser/app-version.ts +14 -0
  871. package/src/browser/cookie-name.ts +140 -0
  872. package/src/browser/event-controller.ts +162 -200
  873. package/src/browser/history-state.ts +101 -0
  874. package/src/browser/index.ts +3 -3
  875. package/src/browser/intercept-utils.ts +52 -0
  876. package/src/browser/invalidate-client-cache.ts +52 -0
  877. package/src/browser/link-interceptor.ts +24 -4
  878. package/src/browser/logging.ts +11 -0
  879. package/src/browser/merge-segment-loaders.ts +20 -12
  880. package/src/browser/navigation-bridge.ts +323 -563
  881. package/src/browser/navigation-client.ts +219 -75
  882. package/src/browser/navigation-store-handle.ts +38 -0
  883. package/src/browser/navigation-store.ts +104 -112
  884. package/src/browser/navigation-transaction.ts +247 -0
  885. package/src/browser/network-error-handler.ts +61 -0
  886. package/src/browser/partial-update.ts +328 -348
  887. package/src/browser/prefetch/cache.ts +324 -0
  888. package/src/browser/prefetch/fetch.ts +357 -0
  889. package/src/browser/prefetch/observer.ts +65 -0
  890. package/src/browser/prefetch/policy.ts +48 -0
  891. package/src/browser/prefetch/queue.ts +194 -0
  892. package/src/browser/prefetch/resource-ready.ts +77 -0
  893. package/src/browser/rango-state.ts +194 -0
  894. package/src/browser/react/Link.tsx +253 -71
  895. package/src/browser/react/NavigationProvider.tsx +155 -34
  896. package/src/browser/react/ScrollRestoration.tsx +10 -6
  897. package/src/browser/react/context.ts +11 -0
  898. package/src/browser/react/filter-segment-order.ts +53 -0
  899. package/src/browser/react/index.ts +0 -48
  900. package/src/browser/react/location-state-shared.ts +260 -60
  901. package/src/browser/react/location-state.ts +90 -20
  902. package/src/browser/react/mount-context.ts +6 -1
  903. package/src/browser/react/nonce-context.ts +23 -0
  904. package/src/browser/react/shallow-equal.ts +27 -0
  905. package/src/browser/react/use-action.ts +35 -66
  906. package/src/browser/react/use-handle.ts +39 -126
  907. package/src/browser/react/use-link-status.ts +6 -9
  908. package/src/browser/react/use-navigation.ts +44 -68
  909. package/src/browser/react/use-params.ts +75 -0
  910. package/src/browser/react/use-pathname.ts +47 -0
  911. package/src/browser/react/use-reverse.ts +106 -0
  912. package/src/browser/react/use-router.ts +98 -0
  913. package/src/browser/react/use-search-params.ts +51 -0
  914. package/src/browser/react/use-segments.ts +72 -99
  915. package/src/browser/response-adapter.ts +124 -0
  916. package/src/browser/rsc-router.tsx +290 -72
  917. package/src/browser/scroll-restoration.ts +132 -49
  918. package/src/browser/segment-reconciler.ts +243 -0
  919. package/src/browser/segment-structure-assert.ts +17 -1
  920. package/src/browser/server-action-bridge.ts +621 -613
  921. package/src/browser/types.ts +175 -50
  922. package/src/browser/validate-redirect-origin.ts +56 -0
  923. package/src/build/collect-fallback-refs.ts +107 -0
  924. package/src/build/generate-manifest.ts +123 -56
  925. package/src/build/generate-route-types.ts +41 -1038
  926. package/src/build/index.ts +9 -6
  927. package/src/build/prefix-tree-utils.ts +123 -0
  928. package/src/build/route-trie.ts +165 -34
  929. package/src/build/route-types/ast-helpers.ts +25 -0
  930. package/src/build/route-types/ast-route-extraction.ts +98 -0
  931. package/src/build/route-types/codegen.ts +113 -0
  932. package/src/build/route-types/include-resolution.ts +418 -0
  933. package/src/build/route-types/param-extraction.ts +51 -0
  934. package/src/build/route-types/per-module-writer.ts +131 -0
  935. package/src/build/route-types/router-processing.ts +651 -0
  936. package/src/build/route-types/scan-filter.ts +85 -0
  937. package/src/build/route-types/source-scan.ts +118 -0
  938. package/src/build/runtime-discovery.ts +220 -0
  939. package/src/cache/background-task.ts +34 -0
  940. package/src/cache/cache-error.ts +104 -0
  941. package/src/cache/cache-key-utils.ts +44 -0
  942. package/src/cache/cache-policy.ts +165 -0
  943. package/src/cache/cache-runtime.ts +444 -0
  944. package/src/cache/cache-scope.ts +231 -325
  945. package/src/cache/cache-tag.ts +98 -0
  946. package/src/cache/cf/cf-cache-store.ts +2644 -75
  947. package/src/cache/cf/index.ts +17 -17
  948. package/src/cache/document-cache.ts +172 -92
  949. package/src/cache/handle-capture.ts +81 -0
  950. package/src/cache/handle-snapshot.ts +104 -0
  951. package/src/cache/index.ts +11 -35
  952. package/src/cache/memory-segment-store.ts +307 -30
  953. package/src/cache/profile-registry.ts +49 -0
  954. package/src/cache/read-through-swr.ts +164 -0
  955. package/src/cache/segment-codec.ts +240 -0
  956. package/src/cache/tag-invalidation.ts +230 -0
  957. package/src/cache/taint.ts +153 -0
  958. package/src/cache/types.ts +94 -211
  959. package/src/client.rsc.tsx +8 -21
  960. package/src/client.tsx +123 -347
  961. package/src/cloudflare/index.ts +11 -0
  962. package/src/cloudflare/tracing.ts +109 -0
  963. package/src/component-utils.ts +23 -4
  964. package/src/components/DefaultDocument.tsx +5 -1
  965. package/src/context-var.ts +168 -0
  966. package/src/debug.ts +19 -9
  967. package/src/decode-loader-results.ts +36 -0
  968. package/src/defer.ts +196 -0
  969. package/src/deps/ssr.ts +0 -1
  970. package/src/errors.ts +106 -10
  971. package/src/handle.ts +76 -23
  972. package/src/handles/MetaTags.tsx +73 -34
  973. package/src/handles/breadcrumbs.ts +77 -0
  974. package/src/handles/meta.ts +30 -52
  975. package/src/host/cookie-handler.ts +21 -51
  976. package/src/host/errors.ts +8 -32
  977. package/src/host/index.ts +12 -9
  978. package/src/host/pattern-matcher.ts +34 -77
  979. package/src/host/router.ts +151 -121
  980. package/src/host/testing.ts +45 -32
  981. package/src/host/types.ts +52 -11
  982. package/src/host/utils.ts +2 -2
  983. package/src/href-client.ts +192 -57
  984. package/src/index.rsc.ts +174 -34
  985. package/src/index.ts +241 -73
  986. package/src/internal-debug.ts +8 -4
  987. package/src/loader-store.ts +500 -0
  988. package/src/loader.rsc.ts +31 -99
  989. package/src/loader.ts +30 -12
  990. package/src/missing-id-error.ts +68 -0
  991. package/src/network-error-thrower.tsx +4 -7
  992. package/src/outlet-context.ts +1 -1
  993. package/src/outlet-provider.tsx +41 -0
  994. package/src/prerender/param-hash.ts +14 -13
  995. package/src/prerender/store.ts +121 -21
  996. package/src/prerender.ts +445 -24
  997. package/src/redirect-origin.ts +100 -0
  998. package/src/response-utils.ts +37 -0
  999. package/src/reverse.ts +198 -128
  1000. package/src/root-error-boundary.tsx +42 -48
  1001. package/src/route-content-wrapper.tsx +10 -72
  1002. package/src/route-definition/dsl-helpers.ts +1116 -0
  1003. package/src/route-definition/helper-factories.ts +90 -0
  1004. package/src/route-definition/helpers-types.ts +506 -0
  1005. package/src/route-definition/index.ts +55 -0
  1006. package/src/route-definition/redirect.ts +135 -0
  1007. package/src/route-definition/resolve-handler-use.ts +161 -0
  1008. package/src/route-definition/use-item-types.ts +32 -0
  1009. package/src/route-definition.ts +1 -1450
  1010. package/src/route-map-builder.ts +82 -144
  1011. package/src/route-name.ts +53 -0
  1012. package/src/route-types.ts +72 -41
  1013. package/src/router/basename.ts +14 -0
  1014. package/src/router/content-negotiation.ts +215 -0
  1015. package/src/router/debug-manifest.ts +72 -0
  1016. package/src/router/error-handling.ts +22 -26
  1017. package/src/router/find-match.ts +181 -0
  1018. package/src/router/handler-context.ts +372 -125
  1019. package/src/router/instrument.ts +308 -0
  1020. package/src/router/intercept-resolution.ts +34 -27
  1021. package/src/router/lazy-includes.ts +200 -0
  1022. package/src/router/loader-resolution.ts +381 -147
  1023. package/src/router/logging.ts +106 -6
  1024. package/src/router/manifest.ts +88 -51
  1025. package/src/router/match-api.ts +162 -245
  1026. package/src/router/match-context.ts +4 -24
  1027. package/src/router/match-handlers.ts +440 -0
  1028. package/src/router/match-middleware/background-revalidation.ts +90 -89
  1029. package/src/router/match-middleware/cache-lookup.ts +297 -150
  1030. package/src/router/match-middleware/cache-store.ts +75 -33
  1031. package/src/router/match-middleware/intercept-resolution.ts +44 -43
  1032. package/src/router/match-middleware/segment-resolution.ts +64 -22
  1033. package/src/router/match-pipelines.ts +11 -87
  1034. package/src/router/match-result.ts +121 -50
  1035. package/src/router/metrics.ts +219 -28
  1036. package/src/router/middleware-types.ts +93 -0
  1037. package/src/router/middleware.ts +421 -413
  1038. package/src/router/navigation-snapshot.ts +131 -0
  1039. package/src/router/params-util.ts +23 -0
  1040. package/src/router/pattern-matching.ts +263 -79
  1041. package/src/router/prerender-match.ts +541 -0
  1042. package/src/router/preview-match.ts +100 -0
  1043. package/src/router/request-classification.ts +276 -0
  1044. package/src/router/revalidation.ts +143 -44
  1045. package/src/router/route-snapshot.ts +244 -0
  1046. package/src/router/router-context.ts +41 -47
  1047. package/src/router/router-interfaces.ts +525 -0
  1048. package/src/router/router-options.ts +726 -0
  1049. package/src/router/router-registry.ts +21 -0
  1050. package/src/router/segment-resolution/fresh.ts +748 -0
  1051. package/src/router/segment-resolution/helpers.ts +313 -0
  1052. package/src/router/segment-resolution/loader-cache.ts +207 -0
  1053. package/src/router/segment-resolution/revalidation.ts +1322 -0
  1054. package/src/router/segment-resolution/static-store.ts +81 -0
  1055. package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
  1056. package/src/router/segment-resolution/view-transition-default.ts +36 -0
  1057. package/src/router/segment-resolution.ts +24 -1354
  1058. package/src/router/segment-wrappers.ts +289 -0
  1059. package/src/router/state-cookie-name.ts +33 -0
  1060. package/src/router/substitute-pattern-params.ts +56 -0
  1061. package/src/router/telemetry-otel.ts +261 -0
  1062. package/src/router/telemetry.ts +377 -0
  1063. package/src/router/timeout.ts +128 -0
  1064. package/src/router/tracing.ts +206 -0
  1065. package/src/router/trie-matching.ts +172 -60
  1066. package/src/router/types.ts +23 -70
  1067. package/src/router/url-params.ts +44 -0
  1068. package/src/router.ts +748 -2376
  1069. package/src/rsc/handler-context.ts +46 -0
  1070. package/src/rsc/handler.ts +861 -1141
  1071. package/src/rsc/helpers.ts +269 -19
  1072. package/src/rsc/index.ts +1 -21
  1073. package/src/rsc/json-route-result.ts +38 -0
  1074. package/src/rsc/loader-fetch.ts +235 -0
  1075. package/src/rsc/manifest-init.ts +77 -0
  1076. package/src/rsc/nonce.ts +14 -0
  1077. package/src/rsc/origin-guard.ts +155 -0
  1078. package/src/rsc/progressive-enhancement.ts +413 -0
  1079. package/src/rsc/redirect-guard.ts +99 -0
  1080. package/src/rsc/response-error.ts +104 -0
  1081. package/src/rsc/response-route-handler.ts +374 -0
  1082. package/src/rsc/rsc-rendering.ts +261 -0
  1083. package/src/rsc/runtime-warnings.ts +55 -0
  1084. package/src/rsc/server-action.ts +376 -0
  1085. package/src/rsc/ssr-setup.ts +144 -0
  1086. package/src/rsc/types.ts +58 -12
  1087. package/src/runtime-env.ts +18 -0
  1088. package/src/search-params.ts +70 -74
  1089. package/src/segment-content-promise.ts +67 -0
  1090. package/src/segment-loader-promise.ts +134 -0
  1091. package/src/segment-system.tsx +292 -134
  1092. package/src/serialize.ts +243 -0
  1093. package/src/server/context.ts +439 -85
  1094. package/src/server/cookie-store.ts +265 -0
  1095. package/src/server/fetchable-loader-store.ts +11 -6
  1096. package/src/server/handle-store.ts +112 -31
  1097. package/src/server/loader-registry.ts +23 -82
  1098. package/src/server/request-context.ts +724 -143
  1099. package/src/server.ts +26 -164
  1100. package/src/ssr/index.tsx +113 -36
  1101. package/src/static-handler.ts +45 -18
  1102. package/src/testing/cache-status.ts +162 -0
  1103. package/src/testing/collect-handle.ts +40 -0
  1104. package/src/testing/dispatch.ts +618 -0
  1105. package/src/testing/dom.entry.ts +22 -0
  1106. package/src/testing/e2e/fixture.ts +188 -0
  1107. package/src/testing/e2e/index.ts +128 -0
  1108. package/src/testing/e2e/matchers.ts +35 -0
  1109. package/src/testing/e2e/page-helpers.ts +272 -0
  1110. package/src/testing/e2e/parity.ts +387 -0
  1111. package/src/testing/e2e/server.ts +195 -0
  1112. package/src/testing/flight-matchers.ts +97 -0
  1113. package/src/testing/flight-normalize.ts +11 -0
  1114. package/src/testing/flight-runtime.d.ts +57 -0
  1115. package/src/testing/flight-tree.ts +682 -0
  1116. package/src/testing/flight.entry.ts +52 -0
  1117. package/src/testing/flight.ts +232 -0
  1118. package/src/testing/generated-routes.ts +183 -0
  1119. package/src/testing/index.ts +99 -0
  1120. package/src/testing/internal/context.ts +348 -0
  1121. package/src/testing/internal/flight-client-globals.ts +30 -0
  1122. package/src/testing/internal/seed-vars.ts +54 -0
  1123. package/src/testing/render-handler.ts +330 -0
  1124. package/src/testing/render-route.tsx +566 -0
  1125. package/src/testing/run-loader.ts +378 -0
  1126. package/src/testing/run-middleware.ts +205 -0
  1127. package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
  1128. package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
  1129. package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
  1130. package/src/testing/vitest-stubs/version.ts +5 -0
  1131. package/src/testing/vitest.ts +305 -0
  1132. package/src/theme/ThemeProvider.tsx +21 -67
  1133. package/src/theme/ThemeScript.tsx +5 -11
  1134. package/src/theme/constants.ts +5 -14
  1135. package/src/theme/index.ts +3 -20
  1136. package/src/theme/theme-context.ts +5 -35
  1137. package/src/theme/theme-script.ts +21 -32
  1138. package/src/theme/use-theme.ts +0 -3
  1139. package/src/types/boundaries.ts +123 -0
  1140. package/src/types/cache-types.ts +207 -0
  1141. package/src/types/error-types.ts +132 -0
  1142. package/src/types/global-namespace.ts +113 -0
  1143. package/src/types/handler-context.ts +839 -0
  1144. package/src/types/index.ts +79 -0
  1145. package/src/types/loader-types.ts +212 -0
  1146. package/src/types/request-scope.ts +107 -0
  1147. package/src/types/route-config.ts +126 -0
  1148. package/src/types/route-entry.ts +114 -0
  1149. package/src/types/segments.ts +171 -0
  1150. package/src/types.ts +1 -1795
  1151. package/src/urls/include-helper.ts +160 -0
  1152. package/src/urls/index.ts +43 -0
  1153. package/src/urls/path-helper-types.ts +386 -0
  1154. package/src/urls/path-helper.ts +275 -0
  1155. package/src/urls/pattern-types.ts +124 -0
  1156. package/src/urls/response-types.ts +109 -0
  1157. package/src/urls/type-extraction.ts +291 -0
  1158. package/src/urls/urls-function.ts +81 -0
  1159. package/src/urls.ts +1 -1323
  1160. package/src/use-loader.tsx +406 -141
  1161. package/src/vite/debug.ts +185 -0
  1162. package/src/vite/discovery/bundle-postprocess.ts +182 -0
  1163. package/src/vite/discovery/discover-routers.ts +389 -0
  1164. package/src/vite/discovery/discovery-errors.ts +194 -0
  1165. package/src/vite/discovery/gate-state.ts +171 -0
  1166. package/src/vite/discovery/prerender-collection.ts +467 -0
  1167. package/src/vite/discovery/route-types-writer.ts +214 -0
  1168. package/src/vite/discovery/self-gen-tracking.ts +73 -0
  1169. package/src/vite/discovery/state.ts +161 -0
  1170. package/src/vite/discovery/virtual-module-codegen.ts +183 -0
  1171. package/src/vite/index.ts +17 -2259
  1172. package/src/vite/plugin-types.ts +221 -0
  1173. package/src/vite/plugins/cjs-to-esm.ts +83 -0
  1174. package/src/vite/plugins/client-ref-dedup.ts +120 -0
  1175. package/src/vite/plugins/client-ref-hashing.ts +118 -0
  1176. package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
  1177. package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
  1178. package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
  1179. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
  1180. package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +13 -87
  1181. package/src/vite/plugins/expose-ids/export-analysis.ts +338 -0
  1182. package/src/vite/plugins/expose-ids/handler-transform.ts +141 -0
  1183. package/src/vite/plugins/expose-ids/loader-transform.ts +57 -0
  1184. package/src/vite/plugins/expose-ids/router-transform.ts +124 -0
  1185. package/src/vite/plugins/expose-ids/types.ts +45 -0
  1186. package/src/vite/plugins/expose-internal-ids.ts +806 -0
  1187. package/src/vite/plugins/performance-tracks.ts +89 -0
  1188. package/src/vite/plugins/refresh-cmd.ts +127 -0
  1189. package/src/vite/plugins/use-cache-transform.ts +313 -0
  1190. package/src/vite/plugins/version-injector.ts +79 -0
  1191. package/src/vite/plugins/version-plugin.ts +275 -0
  1192. package/src/vite/plugins/virtual-entries.ts +108 -0
  1193. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  1194. package/src/vite/rango.ts +444 -0
  1195. package/src/vite/router-discovery.ts +1581 -0
  1196. package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +193 -37
  1197. package/src/vite/utils/banner.ts +36 -0
  1198. package/src/vite/utils/bundle-analysis.ts +132 -0
  1199. package/src/vite/utils/client-chunks.ts +184 -0
  1200. package/src/vite/utils/forward-user-plugins.ts +171 -0
  1201. package/src/vite/utils/manifest-utils.ts +15 -0
  1202. package/src/vite/utils/package-resolution.ts +89 -0
  1203. package/src/vite/utils/prerender-utils.ts +223 -0
  1204. package/src/vite/utils/shared-utils.ts +219 -0
  1205. package/CLAUDE.md +0 -43
  1206. package/src/browser/lru-cache.ts +0 -69
  1207. package/src/browser/request-controller.ts +0 -164
  1208. package/src/browser/shallow.ts +0 -35
  1209. package/src/cache/memory-store.ts +0 -253
  1210. package/src/router.gen.ts +0 -6
  1211. package/src/static-handler.gen.ts +0 -5
  1212. package/src/urls.gen.ts +0 -8
  1213. package/src/vite/expose-internal-ids.ts +0 -1167
  1214. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Prefetch Cache
3
+ *
4
+ * In-memory cache storing eagerly-decoded prefetch payloads for instant,
5
+ * already-warm cache hits on subsequent navigation. A prefetch fetches the
6
+ * RSC partial AND decodes it (createFromFetch) up front — decoding the Flight
7
+ * stream resolves the route's client references, so the route's JS chunks are
8
+ * imported during prefetch rather than on click. The decoded payload is reused
9
+ * verbatim by navigation, so a prefetched click loads no new code. Two key
10
+ * scopes are in play:
11
+ * - Wildcard (default): built by `buildPrefetchKey(rangoState, target)` —
12
+ * shape `rangoState\0/target?...`. Shared across all source pages and
13
+ * invalidated automatically when Rango state bumps (deploy or
14
+ * server-action invalidation).
15
+ * - Source-scoped: built by `buildSourceKey(rangoState, sourceHref, target)`
16
+ * — shape `rangoState\0sourceHref\0/target?...`. Embeds the Rango state
17
+ * (so rotation invalidates source-scoped entries too) plus the source
18
+ * href (so each originating page gets its own slot). Populated when the
19
+ * server tags a response with `X-RSC-Prefetch-Scope: source` (intercept
20
+ * modals etc.), OR when a Link opts in with `prefetchKey=":source"` — in
21
+ * both cases so source-sensitive responses cannot bleed into navigations
22
+ * from other pages.
23
+ *
24
+ * Also tracks in-flight prefetch promises. Each promise resolves to the
25
+ * decoded prefetch entry (or null), letting navigation adopt a
26
+ * still-downloading prefetch without issuing a duplicate request. A
27
+ * single promise can be registered under multiple alias keys (see
28
+ * `setInflightPromiseWithAliases`) so same-source navigations adopt via
29
+ * their source key while cross-source ones fall through to the wildcard
30
+ * alias — with consume/clear atomically removing every alias.
31
+ *
32
+ * Replaces the previous browser HTTP cache approach which was unreliable
33
+ * due to response draining race conditions and browser inconsistencies.
34
+ *
35
+ * State here lives in module-level singletons (cache, inflight, generation,
36
+ * cacheTTL, etc.) rather than a per-instance factory. This is correct because
37
+ * exactly one router is live per document — an SPA navigation crossing a
38
+ * host-router boundary forces a full document reload — so the singletons are
39
+ * effectively per-document. Unit tests reset them via clearPrefetchCache().
40
+ */
41
+
42
+ import { abortAllPrefetches } from "./queue.js";
43
+ import { invalidateRangoState } from "../rango-state.js";
44
+ import type { RscPayload } from "../types.js";
45
+
46
+ /**
47
+ * A prefetch that has been fetched AND eagerly decoded. Storing the decoded
48
+ * payload (not the raw Response) is what makes a prefetched navigation "warm":
49
+ * decoding the Flight stream during prefetch pulls the route's client chunks,
50
+ * so the click reuses ready elements and loads no new JS.
51
+ */
52
+ export interface DecodedPrefetch {
53
+ /** The eagerly-decoded RSC payload. Reused verbatim by navigation. */
54
+ payload: Promise<RscPayload>;
55
+ /**
56
+ * Resolves when the underlying RSC stream finishes draining. Navigation
57
+ * forwards this as its streamComplete so scroll/revalidation gating is
58
+ * unchanged from the fresh-fetch path.
59
+ */
60
+ streamComplete: Promise<void>;
61
+ /**
62
+ * Prefetch scope as tagged by the server via `X-RSC-Prefetch-Scope`.
63
+ * `"source"` means the response is source-page-sensitive and must not be
64
+ * reused by a navigation from a different page — navigation enforces this
65
+ * when it adopted an inflight entry through the wildcard key.
66
+ */
67
+ scope: "source" | "wildcard";
68
+ }
69
+
70
+ let cacheTTL = 300_000;
71
+
72
+ /**
73
+ * Initialize the prefetch cache with the configured TTL.
74
+ * Called once at app startup with the value from server metadata.
75
+ * A TTL of 0 disables the in-memory cache and all prefetching.
76
+ */
77
+ export function initPrefetchCache(ttlMs: number): void {
78
+ cacheTTL = ttlMs;
79
+ }
80
+
81
+ /**
82
+ * Check if the prefetch cache is disabled (TTL <= 0).
83
+ * When disabled, no prefetch requests should be issued.
84
+ */
85
+ export function isPrefetchCacheDisabled(): boolean {
86
+ return cacheTTL <= 0;
87
+ }
88
+ const MAX_PREFETCH_CACHE_SIZE = 50;
89
+
90
+ interface PrefetchCacheEntry {
91
+ entry: DecodedPrefetch;
92
+ timestamp: number;
93
+ }
94
+
95
+ const cache = new Map<string, PrefetchCacheEntry>();
96
+ const inflight = new Set<string>();
97
+
98
+ const inflightPromises = new Map<string, Promise<DecodedPrefetch | null>>();
99
+
100
+ const inflightAliases = new Map<string, string[]>();
101
+
102
+ const adoptedKeys = new Set<string>();
103
+
104
+ let generation = 0;
105
+
106
+ /**
107
+ * Build a cache key by combining a scope prefix with the target URL.
108
+ *
109
+ * Low-level primitive — callers that want a specific scope should use
110
+ * one of:
111
+ * - Wildcard (source-agnostic): prefix is the Rango state value from
112
+ * `getRangoState()`. Shared across all source pages. Invalidated
113
+ * automatically when Rango state bumps (deploy or server-action).
114
+ * Key shape: `rangoState\0/target?...`.
115
+ * - Source-scoped: use `buildSourceKey()`. Key shape:
116
+ * `rangoState\0sourceHref\0/target?...` — embeds the Rango state so
117
+ * rotation invalidates source-scoped entries alongside wildcard ones,
118
+ * plus the source page href so the key is unique per originating page.
119
+ * Populated either when the server tags a response with
120
+ * `X-RSC-Prefetch-Scope: source` (intercept modals, etc.) or when a
121
+ * Link opts in via `prefetchKey=":source"`.
122
+ *
123
+ * The `_rsc_segments` query param that travels in the target URL means
124
+ * clients with different mounted segment trees naturally get different
125
+ * keys — so segment-level diffs remain consistent across both scopes.
126
+ */
127
+ export function buildPrefetchKey(prefix: string, targetUrl: URL): string {
128
+ return prefix + "\0" + targetUrl.pathname + targetUrl.search;
129
+ }
130
+
131
+ /**
132
+ * Build a source-scoped cache key. Key shape:
133
+ * `rangoState\0sourceHref\0/target?...`.
134
+ *
135
+ * - `rangoState` is included so state rotation invalidates source-scoped
136
+ * entries alongside wildcard ones.
137
+ * - `sourceHref` makes the key unique per originating page.
138
+ */
139
+ export function buildSourceKey(
140
+ rangoState: string,
141
+ sourceHref: string,
142
+ targetUrl: URL,
143
+ ): string {
144
+ return buildPrefetchKey(rangoState + "\0" + sourceHref, targetUrl);
145
+ }
146
+
147
+ /**
148
+ * Walk an inflight key plus any sibling aliases registered via
149
+ * `setInflightPromiseWithAliases`, invoking `fn` for each.
150
+ */
151
+ function forEachAlias(key: string, fn: (k: string) => void): void {
152
+ const aliases = inflightAliases.get(key);
153
+ if (aliases) {
154
+ for (const k of aliases) fn(k);
155
+ } else {
156
+ fn(key);
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Check if a prefetch is already cached, in-flight, or queued for the given key.
162
+ */
163
+ export function hasPrefetch(key: string): boolean {
164
+ if (inflight.has(key)) return true;
165
+ if (cacheTTL <= 0) return false;
166
+ const entry = cache.get(key);
167
+ if (!entry) return false;
168
+ if (Date.now() - entry.timestamp > cacheTTL) {
169
+ cache.delete(key);
170
+ return false;
171
+ }
172
+ return true;
173
+ }
174
+
175
+ /**
176
+ * Consume a cached, eagerly-decoded prefetch. Returns null if not found or
177
+ * expired. One-time consumption: the entry is deleted after retrieval.
178
+ * Returns null when caching is disabled (TTL <= 0).
179
+ *
180
+ * Does NOT check in-flight prefetches — use consumeInflightPrefetch()
181
+ * for that (returns a Promise instead of a resolved entry).
182
+ */
183
+ export function consumePrefetch(key: string): DecodedPrefetch | null {
184
+ if (cacheTTL <= 0) return null;
185
+ const entry = cache.get(key);
186
+ if (!entry) return null;
187
+ if (Date.now() - entry.timestamp > cacheTTL) {
188
+ cache.delete(key);
189
+ return null;
190
+ }
191
+ cache.delete(key);
192
+ return entry.entry;
193
+ }
194
+
195
+ /**
196
+ * Consume an in-flight prefetch promise. Returns null if no prefetch is
197
+ * in-flight for this key. The returned Promise resolves to the decoded
198
+ * prefetch entry (or null if the fetch failed/was aborted, or carried a
199
+ * control header the navigation must re-fetch to honor).
200
+ *
201
+ * One-time consumption: the promise entry is removed (along with any
202
+ * sibling aliases registered via `setInflightPromiseWithAliases`) so a
203
+ * second call on any alias returns null — only one caller can adopt the
204
+ * shared Response stream. The `inflight` set entry is intentionally
205
+ * kept so that `hasPrefetch()` continues to return true while the
206
+ * underlying fetch is still downloading — this prevents
207
+ * `prefetchDirect()` or other callers from starting a duplicate request
208
+ * during the handoff window. The inflight flag is cleaned up naturally
209
+ * by `clearPrefetchInflight()` in the fetch's `.finally()`.
210
+ */
211
+ export function consumeInflightPrefetch(
212
+ key: string,
213
+ ): Promise<DecodedPrefetch | null> | null {
214
+ const promise = inflightPromises.get(key);
215
+ if (!promise) return null;
216
+ // Remove the promise under every alias so a second consumer cannot
217
+ // adopt the same stream and race on the body, and mark every alias as
218
+ // adopted so the pending `storePrefetch` (which resolves later, after this
219
+ // adoption) does not leave the now-owned, single-use entry in the cache map.
220
+ // `inflightAliases` is intentionally preserved — `clearPrefetchInflight()` in
221
+ // the fetch's `.finally()` still needs it to clear every inflight flag and
222
+ // adopted marker; deleting here would strand the sibling's flag forever.
223
+ forEachAlias(key, (k) => {
224
+ inflightPromises.delete(k);
225
+ adoptedKeys.add(k);
226
+ });
227
+ return promise;
228
+ }
229
+
230
+ /**
231
+ * Store an eagerly-decoded prefetch in the in-memory cache.
232
+ *
233
+ * Skips storage if the generation has changed since the fetch started
234
+ * (a server action invalidated the cache mid-flight).
235
+ */
236
+ export function storePrefetch(
237
+ key: string,
238
+ entry: DecodedPrefetch,
239
+ fetchGeneration: number,
240
+ ): void {
241
+ if (cacheTTL <= 0) return;
242
+ if (fetchGeneration !== generation) return;
243
+
244
+ // If a navigation already adopted this prefetch's in-flight promise, it owns
245
+ // the single-use entry (and has drained its handle generator). Do NOT also
246
+ // publish it to the cache map, or a later navigation would be served the
247
+ // exhausted entry and lose that route's handles. Clear the marker (under all
248
+ // aliases) now that the decision is made.
249
+ if (adoptedKeys.has(key)) {
250
+ forEachAlias(key, (k) => adoptedKeys.delete(k));
251
+ return;
252
+ }
253
+
254
+ // Evict expired entries
255
+ const now = Date.now();
256
+ for (const [k, cached] of cache) {
257
+ if (now - cached.timestamp > cacheTTL) {
258
+ cache.delete(k);
259
+ }
260
+ }
261
+
262
+ // FIFO eviction if at capacity
263
+ if (cache.size >= MAX_PREFETCH_CACHE_SIZE) {
264
+ const oldest = cache.keys().next().value;
265
+ if (oldest) cache.delete(oldest);
266
+ }
267
+
268
+ cache.set(key, { entry, timestamp: now });
269
+ }
270
+
271
+ /**
272
+ * Capture the current generation. The returned value is passed to
273
+ * storePrefetch so it can detect stale completions.
274
+ */
275
+ export function currentGeneration(): number {
276
+ return generation;
277
+ }
278
+
279
+ export function markPrefetchInflight(key: string): void {
280
+ inflight.add(key);
281
+ }
282
+
283
+ export function setInflightPromise(
284
+ key: string,
285
+ promise: Promise<DecodedPrefetch | null>,
286
+ ): void {
287
+ inflightPromises.set(key, promise);
288
+ }
289
+
290
+ /**
291
+ * Store the same in-flight Promise under multiple keys, recording them
292
+ * as sibling aliases. Consuming or clearing any one alias atomically
293
+ * removes every entry, guaranteeing the shared Response stream has a
294
+ * single consumer even when navigation looks up either key.
295
+ */
296
+ export function setInflightPromiseWithAliases(
297
+ keys: string[],
298
+ promise: Promise<DecodedPrefetch | null>,
299
+ ): void {
300
+ for (const k of keys) {
301
+ inflightPromises.set(k, promise);
302
+ inflightAliases.set(k, keys);
303
+ }
304
+ }
305
+
306
+ export function clearPrefetchInflight(key: string): void {
307
+ forEachAlias(key, (k) => {
308
+ inflight.delete(k);
309
+ inflightPromises.delete(k);
310
+ inflightAliases.delete(k);
311
+ adoptedKeys.delete(k);
312
+ });
313
+ }
314
+
315
+ export function clearPrefetchCache(): void {
316
+ generation++;
317
+ inflight.clear();
318
+ inflightPromises.clear();
319
+ inflightAliases.clear();
320
+ adoptedKeys.clear();
321
+ cache.clear();
322
+ abortAllPrefetches();
323
+ invalidateRangoState();
324
+ }
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Prefetch Fetch
3
+ *
4
+ * Fetch-based prefetch logic used by Link (hover/viewport/render strategies)
5
+ * and useRouter().prefetch(). Sends the same headers and segment IDs as a
6
+ * real navigation so the server returns a proper diff. The response is fetched
7
+ * AND eagerly decoded (createFromFetch) up front: decoding the Flight stream
8
+ * resolves the route's client references, so the route's JS chunks are imported
9
+ * during prefetch rather than on click. The decoded payload is stored in an
10
+ * in-memory cache and reused verbatim by navigation, so a prefetched click
11
+ * loads no new code.
12
+ *
13
+ * In-flight promises are tracked in the cache so that navigation can reuse
14
+ * a prefetch that is still downloading/decoding instead of starting a
15
+ * duplicate request.
16
+ */
17
+
18
+ import {
19
+ buildPrefetchKey,
20
+ buildSourceKey,
21
+ hasPrefetch,
22
+ markPrefetchInflight,
23
+ setInflightPromiseWithAliases,
24
+ storePrefetch,
25
+ clearPrefetchInflight,
26
+ currentGeneration,
27
+ type DecodedPrefetch,
28
+ } from "./cache.js";
29
+ import { getRangoState } from "../rango-state.js";
30
+ import { isActionFenceActive } from "../action-fence.js";
31
+ import { enqueuePrefetch } from "./queue.js";
32
+ import { shouldPrefetch } from "./policy.js";
33
+ import { debugLog } from "../logging.js";
34
+ import { teeWithCompletion, isForeignRouterId } from "../response-adapter.js";
35
+ import type { RscPayload } from "../types.js";
36
+
37
+ /**
38
+ * Decoder injected at app startup (see setPrefetchDecoder). This is
39
+ * `deps.createFromFetch` — decoupled from the RSC runtime exactly like the
40
+ * navigation client. Prefetch decodes through it so the route's client chunks
41
+ * are pulled during the prefetch, not on click.
42
+ */
43
+ type PrefetchDecoder = (response: Promise<Response>) => Promise<RscPayload>;
44
+
45
+ let decoder: PrefetchDecoder | null = null;
46
+
47
+ /**
48
+ * Wire the RSC decoder used to eagerly decode prefetched responses. Called
49
+ * once from initBrowserApp with the same createFromFetch the navigation client
50
+ * uses. Until set, prefetch warming is inert (prefetches are skipped) — the
51
+ * browser app always sets it before any Link can fire.
52
+ */
53
+ export function setPrefetchDecoder(fn: PrefetchDecoder): void {
54
+ decoder = fn;
55
+ }
56
+
57
+ /**
58
+ * Check if a URL resolves to the current page (same pathname + search).
59
+ * Used to prevent same-page prefetching, which produces a trivial diff
60
+ * that would corrupt the (default wildcard) prefetch cache entry.
61
+ */
62
+ function isSamePage(url: string): boolean {
63
+ try {
64
+ const target = new URL(url, window.location.origin);
65
+ return (
66
+ target.pathname + target.search ===
67
+ window.location.pathname + window.location.search
68
+ );
69
+ } catch {
70
+ return false;
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Build an RSC partial URL for prefetching.
76
+ * Includes _rsc_segments so the server can diff against currently mounted
77
+ * segments, and _rsc_v for version mismatch detection.
78
+ * Returns null for malformed or cross-origin URLs.
79
+ */
80
+ function buildPrefetchUrl(
81
+ url: string,
82
+ segmentIds: string[],
83
+ version?: string,
84
+ routerId?: string,
85
+ ): URL | null {
86
+ let targetUrl: URL;
87
+ try {
88
+ targetUrl = new URL(url, window.location.origin);
89
+ } catch {
90
+ return null;
91
+ }
92
+ if (targetUrl.origin !== window.location.origin) {
93
+ return null;
94
+ }
95
+ targetUrl.searchParams.set("_rsc_partial", "true");
96
+ if (segmentIds.length > 0) {
97
+ targetUrl.searchParams.set("_rsc_segments", segmentIds.join(","));
98
+ }
99
+ if (version) {
100
+ targetUrl.searchParams.set("_rsc_v", version);
101
+ }
102
+ if (routerId) {
103
+ targetUrl.searchParams.set("_rsc_rid", routerId);
104
+ }
105
+ return targetUrl;
106
+ }
107
+
108
+ /**
109
+ * Core prefetch fetch logic. Fetches the response, eagerly decodes it, and
110
+ * stores the decoded payload in the in-memory cache. The returned Promise
111
+ * resolves to the decoded entry (or null on failure / control header) so
112
+ * navigation can safely reuse an in-flight prefetch via
113
+ * consumeInflightPrefetch().
114
+ *
115
+ * Eager decode is the warming step: createFromFetch parses the Flight stream,
116
+ * which resolves the route's client references and imports its JS chunks. The
117
+ * stored payload is reused as-is by navigation, so the click loads no new code.
118
+ *
119
+ * Control headers are NOT acted on here. A speculative prefetch must never
120
+ * reload the page or throw a redirect — if the response carries X-RSC-Reload
121
+ * or X-RSC-Redirect, we drop it (resolve null) and let the real navigation
122
+ * re-fetch and honor it.
123
+ *
124
+ * Inflight + storage key selection:
125
+ *
126
+ * - `forceSourceScope` (Link opted in with `prefetchKey=":source"`): single
127
+ * inflight registration under `sourceKey`; entry stored under `sourceKey`.
128
+ * No wildcard leak is possible.
129
+ *
130
+ * - Otherwise: dual inflight registration under both `wildcardKey` and
131
+ * `sourceKey` so same-source navigations adopt directly via their own
132
+ * source key. Storage key is chosen at response time from the
133
+ * `X-RSC-Prefetch-Scope` header — `"source"` → `sourceKey` (intercept
134
+ * modals etc.), anything else → `wildcardKey`. The entry records its scope
135
+ * so cross-source navigations that adopted via `wildcardKey` can bail out
136
+ * in `navigation-client.ts` when the adopted entry turns out source-scoped.
137
+ */
138
+ function executePrefetchFetch(
139
+ wildcardKey: string,
140
+ sourceKey: string,
141
+ fetchUrl: string,
142
+ forceSourceScope: boolean,
143
+ expectedRouterId?: string,
144
+ signal?: AbortSignal,
145
+ ): Promise<DecodedPrefetch | null> {
146
+ const gen = currentGeneration();
147
+ const inflightKeys = forceSourceScope
148
+ ? [sourceKey]
149
+ : [wildcardKey, sourceKey];
150
+ for (const k of inflightKeys) markPrefetchInflight(k);
151
+
152
+ const promise: Promise<DecodedPrefetch | null> = fetch(fetchUrl, {
153
+ priority: "low" as RequestPriority,
154
+ // During an action's flight the state is not rotated, so the old
155
+ // X-Rango-State still matches the Vary-keyed HTTP-cache entry; bypass it so
156
+ // a prefetch fetches fresh rather than warming the map with stale bytes (the
157
+ // fence's HTTP-cache-bypass requirement applies to prefetch as well as
158
+ // navigation fetches).
159
+ ...(isActionFenceActive() && { cache: "no-store" as RequestCache }),
160
+ signal,
161
+ headers: {
162
+ "X-Rango-State": getRangoState(),
163
+ "X-RSC-Router-Client-Path": window.location.href,
164
+ "X-Rango-Prefetch": "1",
165
+ },
166
+ })
167
+ .then((response) => {
168
+ if (!response.ok || !decoder) return null;
169
+ // Control headers mean this response is stale (reload) or redirecting.
170
+ // Don't warm it — drop so navigation re-fetches and acts on the header.
171
+ if (
172
+ response.headers.has("X-RSC-Reload") ||
173
+ response.headers.has("X-RSC-Redirect")
174
+ ) {
175
+ return null;
176
+ }
177
+ // Integrity check: never warm (or decode/import the chunks of) a foreign
178
+ // app's payload. A speculative prefetch must never reload — just drop it;
179
+ // navigation re-fetches and the server steers it.
180
+ if (isForeignRouterId(response, expectedRouterId)) {
181
+ return null;
182
+ }
183
+
184
+ const scope: "source" | "wildcard" =
185
+ forceSourceScope ||
186
+ response.headers.get("x-rsc-prefetch-scope") === "source"
187
+ ? "source"
188
+ : "wildcard";
189
+ const storageKey = scope === "source" ? sourceKey : wildcardKey;
190
+
191
+ // Track stream completion off a tee so navigation's scroll/revalidation
192
+ // gating matches the fresh-fetch path; decode the other branch.
193
+ let resolveStreamComplete!: () => void;
194
+ const streamComplete = new Promise<void>((resolve) => {
195
+ resolveStreamComplete = resolve;
196
+ });
197
+ const tracked = teeWithCompletion(
198
+ response,
199
+ () => resolveStreamComplete(),
200
+ signal,
201
+ // Speculative prefetch: a never-consumed/aborted stream error is benign.
202
+ true,
203
+ );
204
+
205
+ // Eager decode: parsing the Flight stream imports the route's client
206
+ // chunks now, not on click.
207
+ const payload = decoder(Promise.resolve(tracked));
208
+ // Mark handled so an unconsumed prefetch decode error stays quiet; the
209
+ // error is still surfaced to navigation if it consumes the entry.
210
+ payload.catch(() => {});
211
+
212
+ const entry: DecodedPrefetch = { payload, streamComplete, scope };
213
+ storePrefetch(storageKey, entry, gen);
214
+ return entry;
215
+ })
216
+ .catch(() => null)
217
+ .finally(() => {
218
+ clearPrefetchInflight(inflightKeys[0]!);
219
+ });
220
+
221
+ setInflightPromiseWithAliases(inflightKeys, promise);
222
+ return promise;
223
+ }
224
+
225
+ /**
226
+ * Dedup check for prefetch entry presence.
227
+ *
228
+ * Forced `:source` must NOT dedupe against a pre-existing wildcard entry —
229
+ * otherwise the source slot would stay unpopulated and navigation from
230
+ * this source would fall through to the (potentially wrong) wildcard
231
+ * response, defeating the opt-out.
232
+ */
233
+ function hasPrefetchHit(
234
+ forceSourceScope: boolean,
235
+ wildcardKey: string,
236
+ sourceKey: string,
237
+ ): boolean {
238
+ return forceSourceScope
239
+ ? hasPrefetch(sourceKey)
240
+ : hasPrefetch(wildcardKey) || hasPrefetch(sourceKey);
241
+ }
242
+
243
+ /**
244
+ * Prefetch (direct): fetch with low priority and store in in-memory cache.
245
+ * Used by hover strategy -- fires immediately without queueing.
246
+ *
247
+ * By default the wildcard key (Rango-state-keyed) is used for inflight
248
+ * dedup and for responses that are not source-sensitive; source-scoped
249
+ * storage is automatic when the server emits `X-RSC-Prefetch-Scope: source`.
250
+ *
251
+ * Pass `prefetchKey=":source"` to force source-scoped inflight + storage
252
+ * (e.g. when the target uses a custom `revalidate()` that reads
253
+ * `currentUrl` and the wildcard slot would serve the wrong diff).
254
+ */
255
+ export function prefetchDirect(
256
+ url: string,
257
+ segmentIds: string[],
258
+ version?: string,
259
+ routerId?: string,
260
+ prefetchKey?: ":source",
261
+ ): void {
262
+ if (!shouldPrefetch()) return;
263
+
264
+ const targetUrl = buildPrefetchUrl(url, segmentIds, version, routerId);
265
+ if (!targetUrl) return;
266
+ const forceSourceScope = prefetchKey === ":source";
267
+ // Skip same-page prefetch — a same-page diff is trivial and would corrupt
268
+ // the wildcard cache entry used for cross-page navigation.
269
+ // When `:source` is forced the entry is source-scoped (single-aliased to
270
+ // itself), so it cannot poison any shared slot — allow it.
271
+ if (!forceSourceScope && isSamePage(url)) {
272
+ return;
273
+ }
274
+ const sourceHref = window.location.href;
275
+ const rangoState = getRangoState();
276
+ const wildcardKey = buildPrefetchKey(rangoState, targetUrl);
277
+ const sourceKey = buildSourceKey(rangoState, sourceHref, targetUrl);
278
+ if (hasPrefetchHit(forceSourceScope, wildcardKey, sourceKey)) {
279
+ debugLog("[prefetch] direct dedup (key already exists)", {
280
+ url,
281
+ wildcardKey,
282
+ sourceKey,
283
+ forceSourceScope,
284
+ });
285
+ return;
286
+ }
287
+ debugLog("[prefetch] direct fetch", {
288
+ url,
289
+ wildcardKey,
290
+ sourceKey,
291
+ source: sourceHref,
292
+ forceSourceScope,
293
+ });
294
+ executePrefetchFetch(
295
+ wildcardKey,
296
+ sourceKey,
297
+ targetUrl.toString(),
298
+ forceSourceScope,
299
+ routerId,
300
+ );
301
+ }
302
+
303
+ /**
304
+ * Prefetch (queued): goes through the concurrency-limited queue.
305
+ * Used by viewport/render strategies to avoid flooding the server.
306
+ * Returns the inflight key (wildcard by default, source-scoped when
307
+ * `prefetchKey=":source"` is passed).
308
+ */
309
+ export function prefetchQueued(
310
+ url: string,
311
+ segmentIds: string[],
312
+ version?: string,
313
+ routerId?: string,
314
+ prefetchKey?: ":source",
315
+ ): string {
316
+ if (!shouldPrefetch()) return "";
317
+ const targetUrl = buildPrefetchUrl(url, segmentIds, version, routerId);
318
+ if (!targetUrl) return "";
319
+ const forceSourceScope = prefetchKey === ":source";
320
+ if (!forceSourceScope && isSamePage(url)) {
321
+ return "";
322
+ }
323
+ const sourceHref = window.location.href;
324
+ const rangoState = getRangoState();
325
+ const wildcardKey = buildPrefetchKey(rangoState, targetUrl);
326
+ const sourceKey = buildSourceKey(rangoState, sourceHref, targetUrl);
327
+ const queueKey = forceSourceScope ? sourceKey : wildcardKey;
328
+ if (hasPrefetchHit(forceSourceScope, wildcardKey, sourceKey)) {
329
+ debugLog("[prefetch] queued dedup (key already exists)", {
330
+ url,
331
+ wildcardKey,
332
+ sourceKey,
333
+ forceSourceScope,
334
+ });
335
+ return queueKey;
336
+ }
337
+ const fetchUrlStr = targetUrl.toString();
338
+ enqueuePrefetch(queueKey, (signal) => {
339
+ // Re-check at execution time: a hover-triggered prefetchDirect may
340
+ // have started or completed this key while the item sat in the queue.
341
+ if (hasPrefetchHit(forceSourceScope, wildcardKey, sourceKey)) {
342
+ return Promise.resolve();
343
+ }
344
+ if (!forceSourceScope && isSamePage(url)) {
345
+ return Promise.resolve();
346
+ }
347
+ return executePrefetchFetch(
348
+ wildcardKey,
349
+ sourceKey,
350
+ fetchUrlStr,
351
+ forceSourceScope,
352
+ routerId,
353
+ signal,
354
+ ).then(() => {});
355
+ });
356
+ return queueKey;
357
+ }