@rangojs/router 0.0.0-experimental.ce770c9a → 0.0.0-experimental.dc0369d7

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 (915) hide show
  1. package/README.md +76 -18
  2. package/dist/bin/rango.js +130 -47
  3. package/dist/vite/index.js +421 -121
  4. package/package.json +2 -2
  5. package/skills/cache-guide/SKILL.md +32 -0
  6. package/skills/caching/SKILL.md +8 -0
  7. package/skills/links/SKILL.md +3 -1
  8. package/skills/loader/SKILL.md +53 -43
  9. package/skills/middleware/SKILL.md +2 -0
  10. package/skills/parallel/SKILL.md +67 -0
  11. package/skills/prerender/SKILL.md +110 -68
  12. package/skills/route/SKILL.md +31 -0
  13. package/skills/router-setup/SKILL.md +87 -2
  14. package/skills/typesafety/SKILL.md +10 -0
  15. package/src/__internal.ts +1 -1
  16. package/src/browser/app-version.ts +14 -0
  17. package/src/browser/navigation-bridge.ts +16 -3
  18. package/src/browser/navigation-client.ts +64 -40
  19. package/src/browser/navigation-store.ts +43 -8
  20. package/src/browser/partial-update.ts +37 -4
  21. package/src/browser/prefetch/fetch.ts +8 -2
  22. package/src/browser/prefetch/queue.ts +61 -29
  23. package/src/browser/prefetch/resource-ready.ts +77 -0
  24. package/src/browser/react/Link.tsx +44 -8
  25. package/src/browser/react/NavigationProvider.tsx +13 -4
  26. package/src/browser/react/context.ts +7 -2
  27. package/src/browser/react/use-handle.ts +9 -58
  28. package/src/browser/react/use-router.ts +21 -8
  29. package/src/browser/rsc-router.tsx +26 -3
  30. package/src/browser/scroll-restoration.ts +10 -8
  31. package/src/browser/server-action-bridge.ts +8 -6
  32. package/src/browser/types.ts +27 -5
  33. package/src/build/generate-manifest.ts +6 -6
  34. package/src/build/generate-route-types.ts +3 -0
  35. package/src/build/route-types/include-resolution.ts +8 -1
  36. package/src/build/route-types/router-processing.ts +211 -72
  37. package/src/build/route-types/scan-filter.ts +8 -1
  38. package/src/cache/cache-runtime.ts +15 -11
  39. package/src/cache/cache-scope.ts +46 -5
  40. package/src/cache/taint.ts +55 -0
  41. package/src/client.tsx +2 -56
  42. package/src/context-var.ts +72 -2
  43. package/src/handle.ts +40 -0
  44. package/src/index.rsc.ts +3 -1
  45. package/src/index.ts +8 -0
  46. package/src/prerender/store.ts +5 -4
  47. package/src/prerender.ts +138 -77
  48. package/src/reverse.ts +22 -1
  49. package/src/route-definition/dsl-helpers.ts +42 -19
  50. package/src/route-definition/helpers-types.ts +10 -6
  51. package/src/route-definition/index.ts +3 -0
  52. package/src/route-definition/redirect.ts +9 -1
  53. package/src/route-definition/resolve-handler-use.ts +149 -0
  54. package/src/route-types.ts +11 -0
  55. package/src/router/content-negotiation.ts +100 -1
  56. package/src/router/handler-context.ts +79 -23
  57. package/src/router/intercept-resolution.ts +9 -4
  58. package/src/router/loader-resolution.ts +122 -10
  59. package/src/router/match-api.ts +124 -189
  60. package/src/router/match-middleware/background-revalidation.ts +12 -1
  61. package/src/router/match-middleware/cache-lookup.ts +64 -9
  62. package/src/router/match-middleware/cache-store.ts +21 -4
  63. package/src/router/match-middleware/segment-resolution.ts +53 -0
  64. package/src/router/match-result.ts +11 -5
  65. package/src/router/middleware-types.ts +6 -8
  66. package/src/router/middleware.ts +2 -5
  67. package/src/router/navigation-snapshot.ts +182 -0
  68. package/src/router/prerender-match.ts +110 -10
  69. package/src/router/preview-match.ts +30 -102
  70. package/src/router/request-classification.ts +310 -0
  71. package/src/router/route-snapshot.ts +245 -0
  72. package/src/router/router-context.ts +1 -0
  73. package/src/router/router-interfaces.ts +36 -4
  74. package/src/router/router-options.ts +37 -11
  75. package/src/router/segment-resolution/fresh.ts +88 -21
  76. package/src/router/segment-resolution/helpers.ts +29 -24
  77. package/src/router/segment-resolution/revalidation.ts +100 -29
  78. package/src/router/types.ts +1 -0
  79. package/src/router.ts +54 -5
  80. package/src/rsc/handler.ts +460 -368
  81. package/src/rsc/manifest-init.ts +5 -1
  82. package/src/rsc/progressive-enhancement.ts +4 -0
  83. package/src/rsc/rsc-rendering.ts +5 -0
  84. package/src/rsc/server-action.ts +2 -0
  85. package/src/rsc/ssr-setup.ts +2 -2
  86. package/src/rsc/types.ts +8 -1
  87. package/src/server/context.ts +50 -1
  88. package/src/server/loader-registry.ts +9 -8
  89. package/src/server/request-context.ts +145 -14
  90. package/src/ssr/index.tsx +3 -0
  91. package/src/static-handler.ts +18 -6
  92. package/src/types/cache-types.ts +4 -4
  93. package/src/types/handler-context.ts +137 -33
  94. package/src/types/loader-types.ts +36 -9
  95. package/src/types/route-entry.ts +1 -1
  96. package/src/urls/path-helper-types.ts +9 -2
  97. package/src/urls/path-helper.ts +47 -12
  98. package/src/urls/pattern-types.ts +12 -0
  99. package/src/urls/response-types.ts +16 -6
  100. package/src/use-loader.tsx +73 -4
  101. package/src/vite/discovery/bundle-postprocess.ts +30 -33
  102. package/src/vite/discovery/discover-routers.ts +5 -1
  103. package/src/vite/discovery/prerender-collection.ts +14 -1
  104. package/src/vite/discovery/state.ts +13 -4
  105. package/src/vite/index.ts +4 -0
  106. package/src/vite/plugin-types.ts +60 -5
  107. package/src/vite/plugins/performance-tracks.ts +88 -0
  108. package/src/vite/plugins/refresh-cmd.ts +88 -26
  109. package/src/vite/rango.ts +19 -2
  110. package/src/vite/router-discovery.ts +153 -34
  111. package/src/vite/utils/prerender-utils.ts +18 -0
  112. package/src/vite/utils/shared-utils.ts +3 -2
  113. package/dist/__internal.d.ts +0 -83
  114. package/dist/__internal.d.ts.map +0 -1
  115. package/dist/__internal.js +0 -19
  116. package/dist/__internal.js.map +0 -1
  117. package/dist/__mocks__/version.d.ts +0 -7
  118. package/dist/__mocks__/version.d.ts.map +0 -1
  119. package/dist/__mocks__/version.js +0 -7
  120. package/dist/__mocks__/version.js.map +0 -1
  121. package/dist/__tests__/client-href.test.d.ts +0 -2
  122. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  123. package/dist/__tests__/client-href.test.js +0 -74
  124. package/dist/__tests__/client-href.test.js.map +0 -1
  125. package/dist/__tests__/component-utils.test.d.ts +0 -2
  126. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  127. package/dist/__tests__/component-utils.test.js +0 -51
  128. package/dist/__tests__/component-utils.test.js.map +0 -1
  129. package/dist/__tests__/event-controller.test.d.ts +0 -2
  130. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  131. package/dist/__tests__/event-controller.test.js +0 -538
  132. package/dist/__tests__/event-controller.test.js.map +0 -1
  133. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  134. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  135. package/dist/__tests__/helpers/route-tree.js +0 -374
  136. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  137. package/dist/__tests__/match-result.test.d.ts +0 -2
  138. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  139. package/dist/__tests__/match-result.test.js +0 -154
  140. package/dist/__tests__/match-result.test.js.map +0 -1
  141. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  142. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  143. package/dist/__tests__/navigation-store.test.js +0 -440
  144. package/dist/__tests__/navigation-store.test.js.map +0 -1
  145. package/dist/__tests__/partial-update.test.d.ts +0 -2
  146. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  147. package/dist/__tests__/partial-update.test.js +0 -1009
  148. package/dist/__tests__/partial-update.test.js.map +0 -1
  149. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  150. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  151. package/dist/__tests__/reverse-types.test.js +0 -656
  152. package/dist/__tests__/reverse-types.test.js.map +0 -1
  153. package/dist/__tests__/route-definition.test.d.ts +0 -2
  154. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  155. package/dist/__tests__/route-definition.test.js +0 -55
  156. package/dist/__tests__/route-definition.test.js.map +0 -1
  157. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  158. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  159. package/dist/__tests__/router-helpers.test.js +0 -377
  160. package/dist/__tests__/router-helpers.test.js.map +0 -1
  161. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  162. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  163. package/dist/__tests__/router-integration-2.test.js +0 -426
  164. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  165. package/dist/__tests__/router-integration.test.d.ts +0 -2
  166. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  167. package/dist/__tests__/router-integration.test.js +0 -1051
  168. package/dist/__tests__/router-integration.test.js.map +0 -1
  169. package/dist/__tests__/search-params.test.d.ts +0 -5
  170. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  171. package/dist/__tests__/search-params.test.js +0 -306
  172. package/dist/__tests__/search-params.test.js.map +0 -1
  173. package/dist/__tests__/segment-system.test.d.ts +0 -2
  174. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  175. package/dist/__tests__/segment-system.test.js +0 -627
  176. package/dist/__tests__/segment-system.test.js.map +0 -1
  177. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  178. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  179. package/dist/__tests__/static-handler-types.test.js +0 -63
  180. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  181. package/dist/__tests__/urls.test.d.ts +0 -2
  182. package/dist/__tests__/urls.test.d.ts.map +0 -1
  183. package/dist/__tests__/urls.test.js +0 -421
  184. package/dist/__tests__/urls.test.js.map +0 -1
  185. package/dist/__tests__/use-mount.test.d.ts +0 -2
  186. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  187. package/dist/__tests__/use-mount.test.js +0 -35
  188. package/dist/__tests__/use-mount.test.js.map +0 -1
  189. package/dist/bin/rango.d.ts +0 -2
  190. package/dist/bin/rango.d.ts.map +0 -1
  191. package/dist/bin/rango.js.map +0 -1
  192. package/dist/browser/event-controller.d.ts +0 -191
  193. package/dist/browser/event-controller.d.ts.map +0 -1
  194. package/dist/browser/event-controller.js +0 -559
  195. package/dist/browser/event-controller.js.map +0 -1
  196. package/dist/browser/index.d.ts +0 -2
  197. package/dist/browser/index.d.ts.map +0 -1
  198. package/dist/browser/index.js +0 -14
  199. package/dist/browser/index.js.map +0 -1
  200. package/dist/browser/link-interceptor.d.ts +0 -38
  201. package/dist/browser/link-interceptor.d.ts.map +0 -1
  202. package/dist/browser/link-interceptor.js +0 -99
  203. package/dist/browser/link-interceptor.js.map +0 -1
  204. package/dist/browser/logging.d.ts +0 -10
  205. package/dist/browser/logging.d.ts.map +0 -1
  206. package/dist/browser/logging.js +0 -29
  207. package/dist/browser/logging.js.map +0 -1
  208. package/dist/browser/lru-cache.d.ts +0 -17
  209. package/dist/browser/lru-cache.d.ts.map +0 -1
  210. package/dist/browser/lru-cache.js +0 -50
  211. package/dist/browser/lru-cache.js.map +0 -1
  212. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  213. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  214. package/dist/browser/merge-segment-loaders.js +0 -102
  215. package/dist/browser/merge-segment-loaders.js.map +0 -1
  216. package/dist/browser/navigation-bridge.d.ts +0 -102
  217. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  218. package/dist/browser/navigation-bridge.js +0 -708
  219. package/dist/browser/navigation-bridge.js.map +0 -1
  220. package/dist/browser/navigation-client.d.ts +0 -25
  221. package/dist/browser/navigation-client.d.ts.map +0 -1
  222. package/dist/browser/navigation-client.js +0 -157
  223. package/dist/browser/navigation-client.js.map +0 -1
  224. package/dist/browser/navigation-store.d.ts +0 -101
  225. package/dist/browser/navigation-store.d.ts.map +0 -1
  226. package/dist/browser/navigation-store.js +0 -625
  227. package/dist/browser/navigation-store.js.map +0 -1
  228. package/dist/browser/partial-update.d.ts +0 -75
  229. package/dist/browser/partial-update.d.ts.map +0 -1
  230. package/dist/browser/partial-update.js +0 -426
  231. package/dist/browser/partial-update.js.map +0 -1
  232. package/dist/browser/react/Link.d.ts +0 -86
  233. package/dist/browser/react/Link.d.ts.map +0 -1
  234. package/dist/browser/react/Link.js +0 -128
  235. package/dist/browser/react/Link.js.map +0 -1
  236. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  237. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  238. package/dist/browser/react/NavigationProvider.js +0 -216
  239. package/dist/browser/react/NavigationProvider.js.map +0 -1
  240. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  241. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  242. package/dist/browser/react/ScrollRestoration.js +0 -57
  243. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  244. package/dist/browser/react/context.d.ts +0 -46
  245. package/dist/browser/react/context.d.ts.map +0 -1
  246. package/dist/browser/react/context.js +0 -10
  247. package/dist/browser/react/context.js.map +0 -1
  248. package/dist/browser/react/index.d.ts +0 -11
  249. package/dist/browser/react/index.d.ts.map +0 -1
  250. package/dist/browser/react/index.js +0 -22
  251. package/dist/browser/react/index.js.map +0 -1
  252. package/dist/browser/react/location-state-shared.d.ts +0 -63
  253. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  254. package/dist/browser/react/location-state-shared.js +0 -81
  255. package/dist/browser/react/location-state-shared.js.map +0 -1
  256. package/dist/browser/react/location-state.d.ts +0 -23
  257. package/dist/browser/react/location-state.d.ts.map +0 -1
  258. package/dist/browser/react/location-state.js +0 -29
  259. package/dist/browser/react/location-state.js.map +0 -1
  260. package/dist/browser/react/mount-context.d.ts +0 -24
  261. package/dist/browser/react/mount-context.d.ts.map +0 -1
  262. package/dist/browser/react/mount-context.js +0 -24
  263. package/dist/browser/react/mount-context.js.map +0 -1
  264. package/dist/browser/react/use-action.d.ts +0 -64
  265. package/dist/browser/react/use-action.d.ts.map +0 -1
  266. package/dist/browser/react/use-action.js +0 -134
  267. package/dist/browser/react/use-action.js.map +0 -1
  268. package/dist/browser/react/use-client-cache.d.ts +0 -41
  269. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  270. package/dist/browser/react/use-client-cache.js +0 -39
  271. package/dist/browser/react/use-client-cache.js.map +0 -1
  272. package/dist/browser/react/use-handle.d.ts +0 -31
  273. package/dist/browser/react/use-handle.d.ts.map +0 -1
  274. package/dist/browser/react/use-handle.js +0 -144
  275. package/dist/browser/react/use-handle.js.map +0 -1
  276. package/dist/browser/react/use-href.d.ts +0 -33
  277. package/dist/browser/react/use-href.d.ts.map +0 -1
  278. package/dist/browser/react/use-href.js +0 -39
  279. package/dist/browser/react/use-href.js.map +0 -1
  280. package/dist/browser/react/use-link-status.d.ts +0 -37
  281. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  282. package/dist/browser/react/use-link-status.js +0 -99
  283. package/dist/browser/react/use-link-status.js.map +0 -1
  284. package/dist/browser/react/use-mount.d.ts +0 -25
  285. package/dist/browser/react/use-mount.d.ts.map +0 -1
  286. package/dist/browser/react/use-mount.js +0 -30
  287. package/dist/browser/react/use-mount.js.map +0 -1
  288. package/dist/browser/react/use-navigation.d.ts +0 -27
  289. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  290. package/dist/browser/react/use-navigation.js +0 -87
  291. package/dist/browser/react/use-navigation.js.map +0 -1
  292. package/dist/browser/react/use-segments.d.ts +0 -38
  293. package/dist/browser/react/use-segments.d.ts.map +0 -1
  294. package/dist/browser/react/use-segments.js +0 -130
  295. package/dist/browser/react/use-segments.js.map +0 -1
  296. package/dist/browser/request-controller.d.ts +0 -26
  297. package/dist/browser/request-controller.d.ts.map +0 -1
  298. package/dist/browser/request-controller.js +0 -147
  299. package/dist/browser/request-controller.js.map +0 -1
  300. package/dist/browser/rsc-router.d.ts +0 -129
  301. package/dist/browser/rsc-router.d.ts.map +0 -1
  302. package/dist/browser/rsc-router.js +0 -195
  303. package/dist/browser/rsc-router.js.map +0 -1
  304. package/dist/browser/scroll-restoration.d.ts +0 -93
  305. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  306. package/dist/browser/scroll-restoration.js +0 -321
  307. package/dist/browser/scroll-restoration.js.map +0 -1
  308. package/dist/browser/segment-structure-assert.d.ts +0 -17
  309. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  310. package/dist/browser/segment-structure-assert.js +0 -59
  311. package/dist/browser/segment-structure-assert.js.map +0 -1
  312. package/dist/browser/server-action-bridge.d.ts +0 -26
  313. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  314. package/dist/browser/server-action-bridge.js +0 -668
  315. package/dist/browser/server-action-bridge.js.map +0 -1
  316. package/dist/browser/shallow.d.ts +0 -12
  317. package/dist/browser/shallow.d.ts.map +0 -1
  318. package/dist/browser/shallow.js +0 -34
  319. package/dist/browser/shallow.js.map +0 -1
  320. package/dist/browser/types.d.ts +0 -369
  321. package/dist/browser/types.d.ts.map +0 -1
  322. package/dist/browser/types.js +0 -2
  323. package/dist/browser/types.js.map +0 -1
  324. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  325. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  326. package/dist/build/__tests__/generate-cli.test.js +0 -237
  327. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  328. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  329. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  330. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  331. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  332. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  333. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  334. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  335. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  336. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  337. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  338. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  339. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  340. package/dist/build/generate-manifest.d.ts +0 -81
  341. package/dist/build/generate-manifest.d.ts.map +0 -1
  342. package/dist/build/generate-manifest.js +0 -276
  343. package/dist/build/generate-manifest.js.map +0 -1
  344. package/dist/build/generate-route-types.d.ts +0 -115
  345. package/dist/build/generate-route-types.d.ts.map +0 -1
  346. package/dist/build/generate-route-types.js +0 -740
  347. package/dist/build/generate-route-types.js.map +0 -1
  348. package/dist/build/index.d.ts +0 -21
  349. package/dist/build/index.d.ts.map +0 -1
  350. package/dist/build/index.js +0 -21
  351. package/dist/build/index.js.map +0 -1
  352. package/dist/build/route-trie.d.ts +0 -71
  353. package/dist/build/route-trie.d.ts.map +0 -1
  354. package/dist/build/route-trie.js +0 -175
  355. package/dist/build/route-trie.js.map +0 -1
  356. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  357. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  358. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  359. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  360. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  361. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  362. package/dist/cache/__tests__/document-cache.test.js +0 -345
  363. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  364. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  365. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  366. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  367. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  368. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  369. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  370. package/dist/cache/__tests__/memory-store.test.js +0 -367
  371. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  372. package/dist/cache/cache-scope.d.ts +0 -102
  373. package/dist/cache/cache-scope.d.ts.map +0 -1
  374. package/dist/cache/cache-scope.js +0 -440
  375. package/dist/cache/cache-scope.js.map +0 -1
  376. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  377. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  378. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  379. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  380. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  381. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  382. package/dist/cache/cf/cf-cache-store.js +0 -242
  383. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  384. package/dist/cache/cf/index.d.ts +0 -14
  385. package/dist/cache/cf/index.d.ts.map +0 -1
  386. package/dist/cache/cf/index.js +0 -17
  387. package/dist/cache/cf/index.js.map +0 -1
  388. package/dist/cache/document-cache.d.ts +0 -64
  389. package/dist/cache/document-cache.d.ts.map +0 -1
  390. package/dist/cache/document-cache.js +0 -228
  391. package/dist/cache/document-cache.js.map +0 -1
  392. package/dist/cache/index.d.ts +0 -19
  393. package/dist/cache/index.d.ts.map +0 -1
  394. package/dist/cache/index.js +0 -21
  395. package/dist/cache/index.js.map +0 -1
  396. package/dist/cache/memory-segment-store.d.ts +0 -110
  397. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  398. package/dist/cache/memory-segment-store.js +0 -117
  399. package/dist/cache/memory-segment-store.js.map +0 -1
  400. package/dist/cache/memory-store.d.ts +0 -41
  401. package/dist/cache/memory-store.d.ts.map +0 -1
  402. package/dist/cache/memory-store.js +0 -191
  403. package/dist/cache/memory-store.js.map +0 -1
  404. package/dist/cache/types.d.ts +0 -317
  405. package/dist/cache/types.d.ts.map +0 -1
  406. package/dist/cache/types.js +0 -12
  407. package/dist/cache/types.js.map +0 -1
  408. package/dist/client.d.ts +0 -248
  409. package/dist/client.d.ts.map +0 -1
  410. package/dist/client.js +0 -367
  411. package/dist/client.js.map +0 -1
  412. package/dist/client.rsc.d.ts +0 -26
  413. package/dist/client.rsc.d.ts.map +0 -1
  414. package/dist/client.rsc.js +0 -46
  415. package/dist/client.rsc.js.map +0 -1
  416. package/dist/component-utils.d.ts +0 -36
  417. package/dist/component-utils.d.ts.map +0 -1
  418. package/dist/component-utils.js +0 -61
  419. package/dist/component-utils.js.map +0 -1
  420. package/dist/components/DefaultDocument.d.ts +0 -13
  421. package/dist/components/DefaultDocument.d.ts.map +0 -1
  422. package/dist/components/DefaultDocument.js +0 -15
  423. package/dist/components/DefaultDocument.js.map +0 -1
  424. package/dist/debug.d.ts +0 -58
  425. package/dist/debug.d.ts.map +0 -1
  426. package/dist/debug.js +0 -157
  427. package/dist/debug.js.map +0 -1
  428. package/dist/default-error-boundary.d.ts +0 -11
  429. package/dist/default-error-boundary.d.ts.map +0 -1
  430. package/dist/default-error-boundary.js +0 -45
  431. package/dist/default-error-boundary.js.map +0 -1
  432. package/dist/deps/browser.d.ts +0 -2
  433. package/dist/deps/browser.d.ts.map +0 -1
  434. package/dist/deps/browser.js +0 -3
  435. package/dist/deps/browser.js.map +0 -1
  436. package/dist/deps/html-stream-client.d.ts +0 -2
  437. package/dist/deps/html-stream-client.d.ts.map +0 -1
  438. package/dist/deps/html-stream-client.js +0 -3
  439. package/dist/deps/html-stream-client.js.map +0 -1
  440. package/dist/deps/html-stream-server.d.ts +0 -2
  441. package/dist/deps/html-stream-server.d.ts.map +0 -1
  442. package/dist/deps/html-stream-server.js +0 -3
  443. package/dist/deps/html-stream-server.js.map +0 -1
  444. package/dist/deps/rsc.d.ts +0 -2
  445. package/dist/deps/rsc.d.ts.map +0 -1
  446. package/dist/deps/rsc.js +0 -4
  447. package/dist/deps/rsc.js.map +0 -1
  448. package/dist/deps/ssr.d.ts +0 -2
  449. package/dist/deps/ssr.d.ts.map +0 -1
  450. package/dist/deps/ssr.js +0 -3
  451. package/dist/deps/ssr.js.map +0 -1
  452. package/dist/errors.d.ts +0 -174
  453. package/dist/errors.d.ts.map +0 -1
  454. package/dist/errors.js +0 -241
  455. package/dist/errors.js.map +0 -1
  456. package/dist/handle.d.ts +0 -78
  457. package/dist/handle.d.ts.map +0 -1
  458. package/dist/handle.js +0 -82
  459. package/dist/handle.js.map +0 -1
  460. package/dist/handles/MetaTags.d.ts +0 -14
  461. package/dist/handles/MetaTags.d.ts.map +0 -1
  462. package/dist/handles/MetaTags.js +0 -136
  463. package/dist/handles/MetaTags.js.map +0 -1
  464. package/dist/handles/index.d.ts +0 -6
  465. package/dist/handles/index.d.ts.map +0 -1
  466. package/dist/handles/index.js +0 -6
  467. package/dist/handles/index.js.map +0 -1
  468. package/dist/handles/meta.d.ts +0 -39
  469. package/dist/handles/meta.d.ts.map +0 -1
  470. package/dist/handles/meta.js +0 -202
  471. package/dist/handles/meta.js.map +0 -1
  472. package/dist/host/__tests__/errors.test.d.ts +0 -2
  473. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  474. package/dist/host/__tests__/errors.test.js +0 -76
  475. package/dist/host/__tests__/errors.test.js.map +0 -1
  476. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  477. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  478. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  479. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  480. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  481. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  482. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  483. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  484. package/dist/host/__tests__/router.test.d.ts +0 -2
  485. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  486. package/dist/host/__tests__/router.test.js +0 -241
  487. package/dist/host/__tests__/router.test.js.map +0 -1
  488. package/dist/host/__tests__/testing.test.d.ts +0 -2
  489. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  490. package/dist/host/__tests__/testing.test.js +0 -64
  491. package/dist/host/__tests__/testing.test.js.map +0 -1
  492. package/dist/host/__tests__/utils.test.d.ts +0 -2
  493. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  494. package/dist/host/__tests__/utils.test.js +0 -29
  495. package/dist/host/__tests__/utils.test.js.map +0 -1
  496. package/dist/host/cookie-handler.d.ts +0 -34
  497. package/dist/host/cookie-handler.d.ts.map +0 -1
  498. package/dist/host/cookie-handler.js +0 -124
  499. package/dist/host/cookie-handler.js.map +0 -1
  500. package/dist/host/errors.d.ts +0 -56
  501. package/dist/host/errors.d.ts.map +0 -1
  502. package/dist/host/errors.js +0 -79
  503. package/dist/host/errors.js.map +0 -1
  504. package/dist/host/index.d.ts +0 -29
  505. package/dist/host/index.d.ts.map +0 -1
  506. package/dist/host/index.js +0 -32
  507. package/dist/host/index.js.map +0 -1
  508. package/dist/host/pattern-matcher.d.ts +0 -36
  509. package/dist/host/pattern-matcher.d.ts.map +0 -1
  510. package/dist/host/pattern-matcher.js +0 -172
  511. package/dist/host/pattern-matcher.js.map +0 -1
  512. package/dist/host/router.d.ts +0 -26
  513. package/dist/host/router.d.ts.map +0 -1
  514. package/dist/host/router.js +0 -218
  515. package/dist/host/router.js.map +0 -1
  516. package/dist/host/testing.d.ts +0 -36
  517. package/dist/host/testing.d.ts.map +0 -1
  518. package/dist/host/testing.js +0 -55
  519. package/dist/host/testing.js.map +0 -1
  520. package/dist/host/types.d.ts +0 -115
  521. package/dist/host/types.d.ts.map +0 -1
  522. package/dist/host/types.js +0 -7
  523. package/dist/host/types.js.map +0 -1
  524. package/dist/host/utils.d.ts +0 -21
  525. package/dist/host/utils.d.ts.map +0 -1
  526. package/dist/host/utils.js +0 -23
  527. package/dist/host/utils.js.map +0 -1
  528. package/dist/href-client.d.ts +0 -131
  529. package/dist/href-client.d.ts.map +0 -1
  530. package/dist/href-client.js +0 -64
  531. package/dist/href-client.js.map +0 -1
  532. package/dist/href-context.d.ts +0 -29
  533. package/dist/href-context.d.ts.map +0 -1
  534. package/dist/href-context.js +0 -21
  535. package/dist/href-context.js.map +0 -1
  536. package/dist/index.d.ts +0 -73
  537. package/dist/index.d.ts.map +0 -1
  538. package/dist/index.js +0 -91
  539. package/dist/index.js.map +0 -1
  540. package/dist/index.rsc.d.ts +0 -32
  541. package/dist/index.rsc.d.ts.map +0 -1
  542. package/dist/index.rsc.js +0 -40
  543. package/dist/index.rsc.js.map +0 -1
  544. package/dist/internal-debug.d.ts +0 -2
  545. package/dist/internal-debug.d.ts.map +0 -1
  546. package/dist/internal-debug.js +0 -5
  547. package/dist/internal-debug.js.map +0 -1
  548. package/dist/loader.d.ts +0 -14
  549. package/dist/loader.d.ts.map +0 -1
  550. package/dist/loader.js +0 -20
  551. package/dist/loader.js.map +0 -1
  552. package/dist/loader.rsc.d.ts +0 -19
  553. package/dist/loader.rsc.d.ts.map +0 -1
  554. package/dist/loader.rsc.js +0 -99
  555. package/dist/loader.rsc.js.map +0 -1
  556. package/dist/network-error-thrower.d.ts +0 -17
  557. package/dist/network-error-thrower.d.ts.map +0 -1
  558. package/dist/network-error-thrower.js +0 -14
  559. package/dist/network-error-thrower.js.map +0 -1
  560. package/dist/outlet-context.d.ts +0 -13
  561. package/dist/outlet-context.d.ts.map +0 -1
  562. package/dist/outlet-context.js +0 -3
  563. package/dist/outlet-context.js.map +0 -1
  564. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  565. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  566. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  567. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  568. package/dist/prerender/param-hash.d.ts +0 -16
  569. package/dist/prerender/param-hash.d.ts.map +0 -1
  570. package/dist/prerender/param-hash.js +0 -36
  571. package/dist/prerender/param-hash.js.map +0 -1
  572. package/dist/prerender/store.d.ts +0 -38
  573. package/dist/prerender/store.d.ts.map +0 -1
  574. package/dist/prerender/store.js +0 -61
  575. package/dist/prerender/store.js.map +0 -1
  576. package/dist/prerender.d.ts +0 -66
  577. package/dist/prerender.d.ts.map +0 -1
  578. package/dist/prerender.js +0 -57
  579. package/dist/prerender.js.map +0 -1
  580. package/dist/reverse.d.ts +0 -196
  581. package/dist/reverse.d.ts.map +0 -1
  582. package/dist/reverse.js +0 -78
  583. package/dist/reverse.js.map +0 -1
  584. package/dist/root-error-boundary.d.ts +0 -33
  585. package/dist/root-error-boundary.d.ts.map +0 -1
  586. package/dist/root-error-boundary.js +0 -165
  587. package/dist/root-error-boundary.js.map +0 -1
  588. package/dist/route-content-wrapper.d.ts +0 -46
  589. package/dist/route-content-wrapper.d.ts.map +0 -1
  590. package/dist/route-content-wrapper.js +0 -77
  591. package/dist/route-content-wrapper.js.map +0 -1
  592. package/dist/route-definition.d.ts +0 -421
  593. package/dist/route-definition.d.ts.map +0 -1
  594. package/dist/route-definition.js +0 -868
  595. package/dist/route-definition.js.map +0 -1
  596. package/dist/route-map-builder.d.ts +0 -155
  597. package/dist/route-map-builder.d.ts.map +0 -1
  598. package/dist/route-map-builder.js +0 -237
  599. package/dist/route-map-builder.js.map +0 -1
  600. package/dist/route-types.d.ts +0 -165
  601. package/dist/route-types.d.ts.map +0 -1
  602. package/dist/route-types.js +0 -7
  603. package/dist/route-types.js.map +0 -1
  604. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  605. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  606. package/dist/router/__tests__/handler-context.test.js +0 -65
  607. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  608. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  609. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  610. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  611. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  612. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  613. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  614. package/dist/router/__tests__/match-context.test.js +0 -92
  615. package/dist/router/__tests__/match-context.test.js.map +0 -1
  616. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  617. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  618. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  619. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  620. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  621. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  622. package/dist/router/__tests__/match-result.test.js +0 -457
  623. package/dist/router/__tests__/match-result.test.js.map +0 -1
  624. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  625. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  626. package/dist/router/__tests__/on-error.test.js +0 -678
  627. package/dist/router/__tests__/on-error.test.js.map +0 -1
  628. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  629. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  630. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  631. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  632. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  633. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  634. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  635. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  636. package/dist/router/error-handling.d.ts +0 -77
  637. package/dist/router/error-handling.d.ts.map +0 -1
  638. package/dist/router/error-handling.js +0 -202
  639. package/dist/router/error-handling.js.map +0 -1
  640. package/dist/router/handler-context.d.ts +0 -20
  641. package/dist/router/handler-context.d.ts.map +0 -1
  642. package/dist/router/handler-context.js +0 -198
  643. package/dist/router/handler-context.js.map +0 -1
  644. package/dist/router/intercept-resolution.d.ts +0 -66
  645. package/dist/router/intercept-resolution.d.ts.map +0 -1
  646. package/dist/router/intercept-resolution.js +0 -246
  647. package/dist/router/intercept-resolution.js.map +0 -1
  648. package/dist/router/loader-resolution.d.ts +0 -64
  649. package/dist/router/loader-resolution.d.ts.map +0 -1
  650. package/dist/router/loader-resolution.js +0 -284
  651. package/dist/router/loader-resolution.js.map +0 -1
  652. package/dist/router/logging.d.ts +0 -15
  653. package/dist/router/logging.d.ts.map +0 -1
  654. package/dist/router/logging.js +0 -99
  655. package/dist/router/logging.js.map +0 -1
  656. package/dist/router/manifest.d.ts +0 -22
  657. package/dist/router/manifest.d.ts.map +0 -1
  658. package/dist/router/manifest.js +0 -181
  659. package/dist/router/manifest.js.map +0 -1
  660. package/dist/router/match-api.d.ts +0 -35
  661. package/dist/router/match-api.d.ts.map +0 -1
  662. package/dist/router/match-api.js +0 -406
  663. package/dist/router/match-api.js.map +0 -1
  664. package/dist/router/match-context.d.ts +0 -206
  665. package/dist/router/match-context.d.ts.map +0 -1
  666. package/dist/router/match-context.js +0 -17
  667. package/dist/router/match-context.js.map +0 -1
  668. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  669. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  670. package/dist/router/match-middleware/background-revalidation.js +0 -75
  671. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  672. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  673. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  674. package/dist/router/match-middleware/cache-lookup.js +0 -257
  675. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  676. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  677. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  678. package/dist/router/match-middleware/cache-store.js +0 -108
  679. package/dist/router/match-middleware/cache-store.js.map +0 -1
  680. package/dist/router/match-middleware/index.d.ts +0 -81
  681. package/dist/router/match-middleware/index.d.ts.map +0 -1
  682. package/dist/router/match-middleware/index.js +0 -80
  683. package/dist/router/match-middleware/index.js.map +0 -1
  684. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  685. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  686. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  687. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  688. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  689. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  690. package/dist/router/match-middleware/segment-resolution.js +0 -53
  691. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  692. package/dist/router/match-pipelines.d.ts +0 -147
  693. package/dist/router/match-pipelines.d.ts.map +0 -1
  694. package/dist/router/match-pipelines.js +0 -82
  695. package/dist/router/match-pipelines.js.map +0 -1
  696. package/dist/router/match-result.d.ts +0 -126
  697. package/dist/router/match-result.d.ts.map +0 -1
  698. package/dist/router/match-result.js +0 -93
  699. package/dist/router/match-result.js.map +0 -1
  700. package/dist/router/metrics.d.ts +0 -20
  701. package/dist/router/metrics.d.ts.map +0 -1
  702. package/dist/router/metrics.js +0 -47
  703. package/dist/router/metrics.js.map +0 -1
  704. package/dist/router/middleware.d.ts +0 -249
  705. package/dist/router/middleware.d.ts.map +0 -1
  706. package/dist/router/middleware.js +0 -434
  707. package/dist/router/middleware.js.map +0 -1
  708. package/dist/router/middleware.test.d.ts +0 -2
  709. package/dist/router/middleware.test.d.ts.map +0 -1
  710. package/dist/router/middleware.test.js +0 -816
  711. package/dist/router/middleware.test.js.map +0 -1
  712. package/dist/router/pattern-matching.d.ts +0 -149
  713. package/dist/router/pattern-matching.d.ts.map +0 -1
  714. package/dist/router/pattern-matching.js +0 -349
  715. package/dist/router/pattern-matching.js.map +0 -1
  716. package/dist/router/revalidation.d.ts +0 -44
  717. package/dist/router/revalidation.d.ts.map +0 -1
  718. package/dist/router/revalidation.js +0 -147
  719. package/dist/router/revalidation.js.map +0 -1
  720. package/dist/router/router-context.d.ts +0 -135
  721. package/dist/router/router-context.d.ts.map +0 -1
  722. package/dist/router/router-context.js +0 -36
  723. package/dist/router/router-context.js.map +0 -1
  724. package/dist/router/segment-resolution.d.ts +0 -127
  725. package/dist/router/segment-resolution.d.ts.map +0 -1
  726. package/dist/router/segment-resolution.js +0 -919
  727. package/dist/router/segment-resolution.js.map +0 -1
  728. package/dist/router/trie-matching.d.ts +0 -40
  729. package/dist/router/trie-matching.d.ts.map +0 -1
  730. package/dist/router/trie-matching.js +0 -127
  731. package/dist/router/trie-matching.js.map +0 -1
  732. package/dist/router/types.d.ts +0 -136
  733. package/dist/router/types.d.ts.map +0 -1
  734. package/dist/router/types.js +0 -7
  735. package/dist/router/types.js.map +0 -1
  736. package/dist/router.d.ts +0 -753
  737. package/dist/router.d.ts.map +0 -1
  738. package/dist/router.gen.d.ts +0 -6
  739. package/dist/router.gen.d.ts.map +0 -1
  740. package/dist/router.gen.js +0 -6
  741. package/dist/router.gen.js.map +0 -1
  742. package/dist/router.js +0 -1304
  743. package/dist/router.js.map +0 -1
  744. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  745. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  746. package/dist/rsc/__tests__/helpers.test.js +0 -140
  747. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  748. package/dist/rsc/handler.d.ts +0 -45
  749. package/dist/rsc/handler.d.ts.map +0 -1
  750. package/dist/rsc/handler.js +0 -1172
  751. package/dist/rsc/handler.js.map +0 -1
  752. package/dist/rsc/helpers.d.ts +0 -16
  753. package/dist/rsc/helpers.d.ts.map +0 -1
  754. package/dist/rsc/helpers.js +0 -55
  755. package/dist/rsc/helpers.js.map +0 -1
  756. package/dist/rsc/index.d.ts +0 -22
  757. package/dist/rsc/index.d.ts.map +0 -1
  758. package/dist/rsc/index.js +0 -23
  759. package/dist/rsc/index.js.map +0 -1
  760. package/dist/rsc/nonce.d.ts +0 -9
  761. package/dist/rsc/nonce.d.ts.map +0 -1
  762. package/dist/rsc/nonce.js +0 -18
  763. package/dist/rsc/nonce.js.map +0 -1
  764. package/dist/rsc/types.d.ts +0 -206
  765. package/dist/rsc/types.d.ts.map +0 -1
  766. package/dist/rsc/types.js +0 -8
  767. package/dist/rsc/types.js.map +0 -1
  768. package/dist/search-params.d.ts +0 -103
  769. package/dist/search-params.d.ts.map +0 -1
  770. package/dist/search-params.js +0 -74
  771. package/dist/search-params.js.map +0 -1
  772. package/dist/segment-system.d.ts +0 -75
  773. package/dist/segment-system.d.ts.map +0 -1
  774. package/dist/segment-system.js +0 -336
  775. package/dist/segment-system.js.map +0 -1
  776. package/dist/server/context.d.ts +0 -245
  777. package/dist/server/context.d.ts.map +0 -1
  778. package/dist/server/context.js +0 -197
  779. package/dist/server/context.js.map +0 -1
  780. package/dist/server/fetchable-loader-store.d.ts +0 -18
  781. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  782. package/dist/server/fetchable-loader-store.js +0 -18
  783. package/dist/server/fetchable-loader-store.js.map +0 -1
  784. package/dist/server/handle-store.d.ts +0 -85
  785. package/dist/server/handle-store.d.ts.map +0 -1
  786. package/dist/server/handle-store.js +0 -142
  787. package/dist/server/handle-store.js.map +0 -1
  788. package/dist/server/loader-registry.d.ts +0 -55
  789. package/dist/server/loader-registry.d.ts.map +0 -1
  790. package/dist/server/loader-registry.js +0 -132
  791. package/dist/server/loader-registry.js.map +0 -1
  792. package/dist/server/request-context.d.ts +0 -226
  793. package/dist/server/request-context.d.ts.map +0 -1
  794. package/dist/server/request-context.js +0 -290
  795. package/dist/server/request-context.js.map +0 -1
  796. package/dist/server/root-layout.d.ts +0 -4
  797. package/dist/server/root-layout.d.ts.map +0 -1
  798. package/dist/server/root-layout.js +0 -5
  799. package/dist/server/root-layout.js.map +0 -1
  800. package/dist/server.d.ts +0 -15
  801. package/dist/server.d.ts.map +0 -1
  802. package/dist/server.js +0 -20
  803. package/dist/server.js.map +0 -1
  804. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  805. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  806. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  807. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  808. package/dist/ssr/index.d.ts +0 -98
  809. package/dist/ssr/index.d.ts.map +0 -1
  810. package/dist/ssr/index.js +0 -158
  811. package/dist/ssr/index.js.map +0 -1
  812. package/dist/static-handler.d.ts +0 -50
  813. package/dist/static-handler.d.ts.map +0 -1
  814. package/dist/static-handler.gen.d.ts +0 -5
  815. package/dist/static-handler.gen.d.ts.map +0 -1
  816. package/dist/static-handler.gen.js +0 -5
  817. package/dist/static-handler.gen.js.map +0 -1
  818. package/dist/static-handler.js +0 -29
  819. package/dist/static-handler.js.map +0 -1
  820. package/dist/theme/ThemeProvider.d.ts +0 -20
  821. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  822. package/dist/theme/ThemeProvider.js +0 -240
  823. package/dist/theme/ThemeProvider.js.map +0 -1
  824. package/dist/theme/ThemeScript.d.ts +0 -48
  825. package/dist/theme/ThemeScript.d.ts.map +0 -1
  826. package/dist/theme/ThemeScript.js +0 -13
  827. package/dist/theme/ThemeScript.js.map +0 -1
  828. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  829. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  830. package/dist/theme/__tests__/theme.test.js +0 -103
  831. package/dist/theme/__tests__/theme.test.js.map +0 -1
  832. package/dist/theme/constants.d.ts +0 -29
  833. package/dist/theme/constants.d.ts.map +0 -1
  834. package/dist/theme/constants.js +0 -48
  835. package/dist/theme/constants.js.map +0 -1
  836. package/dist/theme/index.d.ts +0 -31
  837. package/dist/theme/index.d.ts.map +0 -1
  838. package/dist/theme/index.js +0 -36
  839. package/dist/theme/index.js.map +0 -1
  840. package/dist/theme/theme-context.d.ts +0 -40
  841. package/dist/theme/theme-context.d.ts.map +0 -1
  842. package/dist/theme/theme-context.js +0 -60
  843. package/dist/theme/theme-context.js.map +0 -1
  844. package/dist/theme/theme-script.d.ts +0 -27
  845. package/dist/theme/theme-script.d.ts.map +0 -1
  846. package/dist/theme/theme-script.js +0 -147
  847. package/dist/theme/theme-script.js.map +0 -1
  848. package/dist/theme/types.d.ts +0 -163
  849. package/dist/theme/types.d.ts.map +0 -1
  850. package/dist/theme/types.js +0 -11
  851. package/dist/theme/types.js.map +0 -1
  852. package/dist/theme/use-theme.d.ts +0 -12
  853. package/dist/theme/use-theme.d.ts.map +0 -1
  854. package/dist/theme/use-theme.js +0 -40
  855. package/dist/theme/use-theme.js.map +0 -1
  856. package/dist/types.d.ts +0 -1479
  857. package/dist/types.d.ts.map +0 -1
  858. package/dist/types.js +0 -10
  859. package/dist/types.js.map +0 -1
  860. package/dist/urls.d.ts +0 -441
  861. package/dist/urls.d.ts.map +0 -1
  862. package/dist/urls.gen.d.ts +0 -8
  863. package/dist/urls.gen.d.ts.map +0 -1
  864. package/dist/urls.gen.js +0 -8
  865. package/dist/urls.gen.js.map +0 -1
  866. package/dist/urls.js +0 -443
  867. package/dist/urls.js.map +0 -1
  868. package/dist/use-loader.d.ts +0 -127
  869. package/dist/use-loader.d.ts.map +0 -1
  870. package/dist/use-loader.js +0 -237
  871. package/dist/use-loader.js.map +0 -1
  872. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  873. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  874. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  875. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  876. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  877. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  878. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  879. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  880. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  881. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  882. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  883. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  884. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  885. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  886. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  887. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  888. package/dist/vite/ast-handler-extract.d.ts +0 -49
  889. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  890. package/dist/vite/ast-handler-extract.js +0 -249
  891. package/dist/vite/ast-handler-extract.js.map +0 -1
  892. package/dist/vite/expose-action-id.d.ts +0 -19
  893. package/dist/vite/expose-action-id.d.ts.map +0 -1
  894. package/dist/vite/expose-action-id.js +0 -250
  895. package/dist/vite/expose-action-id.js.map +0 -1
  896. package/dist/vite/expose-id-utils.d.ts +0 -69
  897. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  898. package/dist/vite/expose-id-utils.js +0 -289
  899. package/dist/vite/expose-id-utils.js.map +0 -1
  900. package/dist/vite/expose-internal-ids.d.ts +0 -22
  901. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  902. package/dist/vite/expose-internal-ids.js +0 -886
  903. package/dist/vite/expose-internal-ids.js.map +0 -1
  904. package/dist/vite/index.d.ts +0 -149
  905. package/dist/vite/index.d.ts.map +0 -1
  906. package/dist/vite/index.js.map +0 -1
  907. package/dist/vite/index.named-routes.gen.ts +0 -103
  908. package/dist/vite/package-resolution.d.ts +0 -43
  909. package/dist/vite/package-resolution.d.ts.map +0 -1
  910. package/dist/vite/package-resolution.js +0 -112
  911. package/dist/vite/package-resolution.js.map +0 -1
  912. package/dist/vite/virtual-entries.d.ts +0 -25
  913. package/dist/vite/virtual-entries.d.ts.map +0 -1
  914. package/dist/vite/virtual-entries.js +0 -110
  915. package/dist/vite/virtual-entries.js.map +0 -1
@@ -61,6 +61,7 @@ export function createNavigationClient(
61
61
  staleRevalidation,
62
62
  interceptSourceUrl,
63
63
  version,
64
+ routerId,
64
65
  hmr,
65
66
  } = options;
66
67
 
@@ -88,6 +89,9 @@ export function createNavigationClient(
88
89
  if (version) {
89
90
  fetchUrl.searchParams.set("_rsc_v", version);
90
91
  }
92
+ if (routerId) {
93
+ fetchUrl.searchParams.set("_rsc_rid", routerId);
94
+ }
91
95
 
92
96
  // Check completed in-memory prefetch cache before making a network request.
93
97
  // The cache key includes the source URL (previousUrl) because the
@@ -107,6 +111,54 @@ export function createNavigationClient(
107
111
  resolveStreamComplete = resolve;
108
112
  });
109
113
 
114
+ /**
115
+ * Validate RSC control headers on any response (fresh, cached, or
116
+ * in-flight). Handles version-mismatch reloads and server redirects.
117
+ * Returns the response unchanged when no control header is present.
118
+ */
119
+ const validateRscHeaders = (
120
+ response: Response,
121
+ source: string,
122
+ ): Response | Promise<Response> => {
123
+ // Version mismatch — server wants a full page reload
124
+ const reload = extractRscHeaderUrl(response, "X-RSC-Reload");
125
+ if (reload === "blocked") {
126
+ resolveStreamComplete();
127
+ return emptyResponse();
128
+ }
129
+ if (reload) {
130
+ if (tx) {
131
+ browserDebugLog(tx, `version mismatch, reloading (${source})`, {
132
+ reloadUrl: reload.url,
133
+ });
134
+ }
135
+ window.location.href = reload.url;
136
+ // Block further processing — page is reloading
137
+ return new Promise<Response>(() => {});
138
+ }
139
+
140
+ // Server-side redirect without state: the server returned 204 with
141
+ // X-RSC-Redirect instead of a 3xx (which fetch would auto-follow
142
+ // to a URL rendering full HTML). Throw ServerRedirect so the
143
+ // navigation bridge catches it and re-navigates with _skipCache.
144
+ const redirect = extractRscHeaderUrl(response, "X-RSC-Redirect");
145
+ if (redirect === "blocked") {
146
+ resolveStreamComplete();
147
+ return emptyResponse();
148
+ }
149
+ if (redirect) {
150
+ if (tx) {
151
+ browserDebugLog(tx, `server redirect (${source})`, {
152
+ redirectUrl: redirect.url,
153
+ });
154
+ }
155
+ resolveStreamComplete();
156
+ throw new ServerRedirect(redirect.url, undefined);
157
+ }
158
+
159
+ return response;
160
+ };
161
+
110
162
  /** Start a fresh navigation fetch (no cache / inflight hit). */
111
163
  const doFreshFetch = (): Promise<Response> => {
112
164
  if (tx) {
@@ -127,43 +179,11 @@ export function createNavigationClient(
127
179
  },
128
180
  signal,
129
181
  }).then((response) => {
130
- // Check for version mismatch - server wants us to reload
131
- const reload = extractRscHeaderUrl(response, "X-RSC-Reload");
132
- if (reload === "blocked") {
133
- resolveStreamComplete();
134
- return emptyResponse();
135
- }
136
- if (reload) {
137
- if (tx) {
138
- browserDebugLog(tx, "version mismatch, reloading", {
139
- reloadUrl: reload.url,
140
- });
141
- }
142
- window.location.href = reload.url;
143
- return new Promise<Response>(() => {});
144
- }
145
-
146
- // Server-side redirect without state: the server returned 204 with
147
- // X-RSC-Redirect instead of a 3xx (which fetch would auto-follow
148
- // to a URL rendering full HTML). Throw ServerRedirect so the
149
- // navigation bridge catches it and re-navigates with _skipCache.
150
- const redirect = extractRscHeaderUrl(response, "X-RSC-Redirect");
151
- if (redirect === "blocked") {
152
- resolveStreamComplete();
153
- return emptyResponse();
154
- }
155
- if (redirect) {
156
- if (tx) {
157
- browserDebugLog(tx, "server redirect", {
158
- redirectUrl: redirect.url,
159
- });
160
- }
161
- resolveStreamComplete();
162
- throw new ServerRedirect(redirect.url, undefined);
163
- }
182
+ const validated = validateRscHeaders(response, "fetch");
183
+ if (validated instanceof Promise) return validated;
164
184
 
165
185
  return teeWithCompletion(
166
- response,
186
+ validated,
167
187
  () => {
168
188
  if (tx) browserDebugLog(tx, "stream complete");
169
189
  resolveStreamComplete();
@@ -179,11 +199,12 @@ export function createNavigationClient(
179
199
  if (tx) {
180
200
  browserDebugLog(tx, "prefetch cache hit", { key: cacheKey });
181
201
  }
182
- // Cached response body is already fully buffered (arrayBuffer),
183
- // so stream completion is immediate.
184
202
  responsePromise = Promise.resolve(cachedResponse).then((response) => {
203
+ const validated = validateRscHeaders(response, "prefetch cache");
204
+ if (validated instanceof Promise) return validated;
205
+
185
206
  return teeWithCompletion(
186
- response,
207
+ validated,
187
208
  () => {
188
209
  if (tx) browserDebugLog(tx, "stream complete (from cache)");
189
210
  resolveStreamComplete();
@@ -203,8 +224,11 @@ export function createNavigationClient(
203
224
  return doFreshFetch();
204
225
  }
205
226
 
227
+ const validated = validateRscHeaders(response, "inflight prefetch");
228
+ if (validated instanceof Promise) return validated;
229
+
206
230
  return teeWithCompletion(
207
- response,
231
+ validated,
208
232
  () => {
209
233
  if (tx) {
210
234
  browserDebugLog(tx, "stream complete (from inflight prefetch)");
@@ -219,8 +243,8 @@ export function createNavigationClient(
219
243
  }
220
244
 
221
245
  try {
222
- // Deserialize RSC payload
223
246
  const payload = await deps.createFromFetch<RscPayload>(responsePromise);
247
+
224
248
  if (tx) {
225
249
  browserDebugLog(tx, "response received", {
226
250
  isPartial: payload.metadata?.isPartial,
@@ -28,9 +28,15 @@ const DEFAULT_ACTION_STATE: TrackedActionState = {
28
28
  // Maximum number of history entries to cache (URLs visited)
29
29
  const HISTORY_CACHE_SIZE = 20;
30
30
 
31
- // Cache entry: [url-key, segments, stale, handleData?]
31
+ // Cache entry: [url-key, segments, stale, handleData?, routerId?]
32
32
  // stale=true means the data may be outdated and should be revalidated on access
33
- type HistoryCacheEntry = [string, ResolvedSegment[], boolean, HandleData?];
33
+ type HistoryCacheEntry = [
34
+ string,
35
+ ResolvedSegment[],
36
+ boolean,
37
+ HandleData?,
38
+ string?,
39
+ ];
34
40
 
35
41
  /**
36
42
  * Shallow clone handleData to avoid reference sharing between cache entries.
@@ -258,6 +264,11 @@ export function createNavigationStore(
258
264
  // Used to maintain intercept context during action revalidation
259
265
  let interceptSourceUrl: string | null = null;
260
266
 
267
+ // Router identity - tracks which router is currently active.
268
+ // When this changes on a partial response, the client forces a full
269
+ // tree replacement instead of reconciling with stale segments.
270
+ let currentRouterId: string | undefined;
271
+
261
272
  // Action state tracking (for useAction hook)
262
273
  // Maps action function ID to its tracked state
263
274
  const actionStates = new Map<string, TrackedActionState>();
@@ -571,10 +582,17 @@ export function createNavigationStore(
571
582
  segments,
572
583
  false,
573
584
  clonedHandleData,
585
+ currentRouterId,
574
586
  ];
575
587
  } else {
576
588
  // Add new entry at the end (not stale)
577
- historyCache.push([historyKey, segments, false, clonedHandleData]);
589
+ historyCache.push([
590
+ historyKey,
591
+ segments,
592
+ false,
593
+ clonedHandleData,
594
+ currentRouterId,
595
+ ]);
578
596
  // Remove oldest entries if over limit
579
597
  while (historyCache.length > cacheSize) {
580
598
  historyCache.shift();
@@ -586,14 +604,22 @@ export function createNavigationStore(
586
604
  * Get cached segments for a history entry
587
605
  * Returns { segments, stale, handleData } or undefined if not cached
588
606
  */
589
- getCachedSegments(
590
- historyKey: string,
591
- ):
592
- | { segments: ResolvedSegment[]; stale: boolean; handleData?: HandleData }
607
+ getCachedSegments(historyKey: string):
608
+ | {
609
+ segments: ResolvedSegment[];
610
+ stale: boolean;
611
+ handleData?: HandleData;
612
+ routerId?: string;
613
+ }
593
614
  | undefined {
594
615
  const entry = historyCache.find(([key]) => key === historyKey);
595
616
  if (!entry) return undefined;
596
- return { segments: entry[1], stale: entry[2], handleData: entry[3] };
617
+ return {
618
+ segments: entry[1],
619
+ stale: entry[2],
620
+ handleData: entry[3],
621
+ routerId: entry[4],
622
+ };
597
623
  },
598
624
 
599
625
  /**
@@ -621,6 +647,7 @@ export function createNavigationStore(
621
647
  entry[1],
622
648
  entry[2],
623
649
  clonedHandleData,
650
+ entry[4], // preserve routerId
624
651
  ];
625
652
  }
626
653
  },
@@ -687,6 +714,14 @@ export function createNavigationStore(
687
714
  interceptSourceUrl = url;
688
715
  },
689
716
 
717
+ getRouterId(): string | undefined {
718
+ return currentRouterId;
719
+ },
720
+
721
+ setRouterId(id: string): void {
722
+ currentRouterId = id;
723
+ },
724
+
690
725
  // ========================================================================
691
726
  // UI Update Notifications
692
727
  // ========================================================================
@@ -39,8 +39,8 @@ export interface PartialUpdateConfig {
39
39
  segments: ResolvedSegment[],
40
40
  options?: RenderSegmentsOptions,
41
41
  ) => Promise<ReactNode> | ReactNode;
42
- /** RSC version received from server (from initial payload metadata) */
43
- version?: string;
42
+ /** RSC version getter returns the current version (may change after HMR) */
43
+ getVersion?: () => string | undefined;
44
44
  }
45
45
 
46
46
  /**
@@ -104,7 +104,13 @@ export type PartialUpdater = (
104
104
  export function createPartialUpdater(
105
105
  config: PartialUpdateConfig,
106
106
  ): PartialUpdater {
107
- const { store, client, onUpdate, renderSegments, version } = config;
107
+ const {
108
+ store,
109
+ client,
110
+ onUpdate,
111
+ renderSegments,
112
+ getVersion = () => undefined,
113
+ } = config;
108
114
 
109
115
  /**
110
116
  * Get current page's cached segments as an array
@@ -193,7 +199,8 @@ export function createPartialUpdater(
193
199
  // (action redirect sends empty segments for a fresh render).
194
200
  staleRevalidation:
195
201
  mode.type === "stale-revalidation" || segments.length === 0,
196
- version,
202
+ version: getVersion(),
203
+ routerId: store.getRouterId?.(),
197
204
  });
198
205
  // Mark navigation as streaming (response received, now parsing RSC).
199
206
  // Called after fetchPartial so pendingUrl stays set during the network wait,
@@ -206,6 +213,21 @@ export function createPartialUpdater(
206
213
  streamingToken.end();
207
214
  });
208
215
 
216
+ // Detect app switch: if routerId changed, the navigation crossed into
217
+ // a different router (e.g., via host router path mount). Downgrade
218
+ // partial to full so the entire tree is replaced without reconciliation
219
+ // against stale segments from the previous app.
220
+ if (payload.metadata?.routerId) {
221
+ const prevRouterId = store.getRouterId?.();
222
+ if (prevRouterId && prevRouterId !== payload.metadata.routerId) {
223
+ debugLog(
224
+ `[Browser] App switch detected (${prevRouterId} → ${payload.metadata.routerId}), forcing full update`,
225
+ );
226
+ payload.metadata.isPartial = false;
227
+ }
228
+ store.setRouterId?.(payload.metadata.routerId);
229
+ }
230
+
209
231
  // Handle server-side redirect with state
210
232
  if (payload.metadata?.redirect) {
211
233
  if (signal?.aborted) {
@@ -259,6 +281,17 @@ export function createPartialUpdater(
259
281
  existingSegments,
260
282
  );
261
283
 
284
+ // tx.commit() cached the source page's handleData because
285
+ // eventController hasn't been updated yet. Overwrite with the
286
+ // correct cached handleData to prevent cache corruption on
287
+ // subsequent navigations to this same URL.
288
+ if (mode.targetCacheHandleData) {
289
+ store.updateCacheHandleData(
290
+ store.getHistoryKey(),
291
+ mode.targetCacheHandleData,
292
+ );
293
+ }
294
+
262
295
  // Include cachedHandleData in metadata so NavigationProvider can restore
263
296
  // breadcrumbs and other handle data from cache.
264
297
  // Remove `handles` from metadata to prevent NavigationProvider from
@@ -34,6 +34,7 @@ function buildPrefetchUrl(
34
34
  url: string,
35
35
  segmentIds: string[],
36
36
  version?: string,
37
+ routerId?: string,
37
38
  ): URL | null {
38
39
  let targetUrl: URL;
39
40
  try {
@@ -51,6 +52,9 @@ function buildPrefetchUrl(
51
52
  if (version) {
52
53
  targetUrl.searchParams.set("_rsc_v", version);
53
54
  }
55
+ if (routerId) {
56
+ targetUrl.searchParams.set("_rsc_rid", routerId);
57
+ }
54
58
  return targetUrl;
55
59
  }
56
60
 
@@ -108,10 +112,11 @@ export function prefetchDirect(
108
112
  url: string,
109
113
  segmentIds: string[],
110
114
  version?: string,
115
+ routerId?: string,
111
116
  ): void {
112
117
  if (!shouldPrefetch()) return;
113
118
 
114
- const targetUrl = buildPrefetchUrl(url, segmentIds, version);
119
+ const targetUrl = buildPrefetchUrl(url, segmentIds, version, routerId);
115
120
  if (!targetUrl) return;
116
121
  const key = buildPrefetchKey(window.location.href, targetUrl);
117
122
  if (hasPrefetch(key)) return;
@@ -127,9 +132,10 @@ export function prefetchQueued(
127
132
  url: string,
128
133
  segmentIds: string[],
129
134
  version?: string,
135
+ routerId?: string,
130
136
  ): string {
131
137
  if (!shouldPrefetch()) return "";
132
- const targetUrl = buildPrefetchUrl(url, segmentIds, version);
138
+ const targetUrl = buildPrefetchUrl(url, segmentIds, version, routerId);
133
139
  if (!targetUrl) return "";
134
140
  const key = buildPrefetchKey(window.location.href, targetUrl);
135
141
  if (hasPrefetch(key)) return key;
@@ -5,21 +5,19 @@
5
5
  * Hover prefetches bypass this queue — they fire directly for immediate response
6
6
  * to user intent.
7
7
  *
8
- * Draining is deferred to the next animation frame so prefetch network activity
9
- * never blocks paint. This applies to both the initial batch and subsequent
10
- * batches every drain cycle yields to the browser first.
8
+ * Draining waits for an idle main-thread moment and for viewport images to
9
+ * finish loading, so prefetch fetch() calls never compete with critical
10
+ * resources for the browser's connection pool.
11
11
  *
12
12
  * When a navigation starts, queued prefetches are cancelled but executing ones
13
13
  * are left running. Navigation can reuse their in-flight responses via the
14
14
  * prefetch cache's inflight promise map, avoiding duplicate requests.
15
15
  */
16
16
 
17
- const MAX_CONCURRENT = 2;
17
+ import { wait, waitForIdle, waitForViewportImages } from "./resource-ready.js";
18
18
 
19
- const deferToNextPaint: (fn: () => void) => void =
20
- typeof requestAnimationFrame === "function"
21
- ? requestAnimationFrame
22
- : (fn) => setTimeout(fn, 0);
19
+ const MAX_CONCURRENT = 2;
20
+ const IMAGE_WAIT_TIMEOUT = 2000;
23
21
 
24
22
  let active = 0;
25
23
  const queue: Array<{
@@ -28,8 +26,9 @@ const queue: Array<{
28
26
  }> = [];
29
27
  const queued = new Set<string>();
30
28
  const executing = new Set<string>();
31
- let abortController: AbortController | null = null;
29
+ const abortControllers = new Map<string, AbortController>();
32
30
  let drainScheduled = false;
31
+ let drainGeneration = 0;
33
32
 
34
33
  function startExecution(
35
34
  key: string,
@@ -37,8 +36,10 @@ function startExecution(
37
36
  ): void {
38
37
  active++;
39
38
  executing.add(key);
40
- abortController ??= new AbortController();
41
- execute(abortController.signal).finally(() => {
39
+ const ac = new AbortController();
40
+ abortControllers.set(key, ac);
41
+ execute(ac.signal).finally(() => {
42
+ abortControllers.delete(key);
42
43
  // Only decrement if this key wasn't already cleared by cancelAllPrefetches.
43
44
  // Without this guard, cancelled tasks' .finally() would underflow active
44
45
  // below zero, breaking the MAX_CONCURRENT guarantee.
@@ -50,18 +51,32 @@ function startExecution(
50
51
  }
51
52
 
52
53
  /**
53
- * Schedule a drain on the next animation frame.
54
- * Coalesces multiple drain requests into a single rAF callback so
55
- * batch completion doesn't schedule redundant frames.
54
+ * Schedule a drain after the browser is idle and viewport images are loaded.
55
+ * Coalesces multiple drain requests into a single deferred callback so
56
+ * batch completion doesn't schedule redundant waits.
57
+ *
58
+ * The two-step wait ensures prefetch fetch() calls don't compete with
59
+ * images for the browser's connection pool:
60
+ * 1. waitForIdle — yield until the main thread has a quiet moment
61
+ * 2. waitForViewportImages OR 2s timeout — yield until visible images
62
+ * finish loading, but don't let slow/broken images block indefinitely
56
63
  */
57
64
  function scheduleDrain(): void {
58
65
  if (drainScheduled) return;
59
66
  if (active >= MAX_CONCURRENT || queue.length === 0) return;
60
67
  drainScheduled = true;
61
- deferToNextPaint(() => {
62
- drainScheduled = false;
63
- drain();
64
- });
68
+ const gen = drainGeneration;
69
+ waitForIdle()
70
+ .then(() =>
71
+ Promise.race([waitForViewportImages(), wait(IMAGE_WAIT_TIMEOUT)]),
72
+ )
73
+ .then(() => {
74
+ drainScheduled = false;
75
+ // Stale drain: a cancel/abort happened while we were waiting.
76
+ // A fresh scheduleDrain will be called by whatever enqueues next.
77
+ if (gen !== drainGeneration) return;
78
+ if (queue.length > 0) drain();
79
+ });
65
80
  }
66
81
 
67
82
  function drain(): void {
@@ -74,9 +89,10 @@ function drain(): void {
74
89
 
75
90
  /**
76
91
  * Enqueue a prefetch for concurrency-limited execution.
77
- * Execution is always deferred to the next animation frame to avoid
78
- * blocking paint, even when below the concurrency limit.
79
- * Deduplicates by key — items already queued or executing are skipped.
92
+ * Execution is deferred until the browser is idle and viewport images
93
+ * have finished loading, so prefetches never compete with critical
94
+ * resources. Deduplicates by key — items already queued or executing
95
+ * are skipped.
80
96
  *
81
97
  * The executor receives an AbortSignal that is aborted when
82
98
  * cancelAllPrefetches() is called (e.g. on navigation start).
@@ -93,19 +109,32 @@ export function enqueuePrefetch(
93
109
  }
94
110
 
95
111
  /**
96
- * Cancel queued prefetches. Executing prefetches are left running so
97
- * navigation can reuse their in-flight responses (checked via
98
- * consumeInflightPrefetch in the prefetch cache). With MAX_CONCURRENT=2
99
- * and priority: "low", in-flight prefetches don't meaningfully compete
100
- * with navigation fetches under HTTP/2 multiplexing.
112
+ * Cancel queued prefetches and abort in-flight ones that don't match
113
+ * the current navigation target. If `keepUrl` is provided, the
114
+ * executing prefetch whose key contains that URL is kept alive so
115
+ * navigation can reuse its response via consumeInflightPrefetch.
101
116
  *
102
117
  * Called when a navigation starts via the NavigationProvider's
103
118
  * event controller subscription.
104
119
  */
105
- export function cancelAllPrefetches(): void {
120
+ export function cancelAllPrefetches(keepUrl?: string | null): void {
106
121
  queue.length = 0;
107
122
  queued.clear();
108
123
  drainScheduled = false;
124
+ drainGeneration++;
125
+
126
+ // Abort in-flight prefetches that aren't for the navigation target.
127
+ // Keys use format "sourceHref\0targetPathname+search" — match the
128
+ // target portion (after \0) against keepUrl.
129
+ for (const [key, ac] of abortControllers) {
130
+ const target = key.split("\0")[1];
131
+ if (keepUrl && target && keepUrl.startsWith(target)) continue;
132
+ ac.abort();
133
+ abortControllers.delete(key);
134
+ if (executing.delete(key)) {
135
+ active--;
136
+ }
137
+ }
109
138
  }
110
139
 
111
140
  /**
@@ -114,8 +143,10 @@ export function cancelAllPrefetches(): void {
114
143
  * in-flight responses would be stale.
115
144
  */
116
145
  export function abortAllPrefetches(): void {
117
- abortController?.abort();
118
- abortController = null;
146
+ for (const ac of abortControllers.values()) {
147
+ ac.abort();
148
+ }
149
+ abortControllers.clear();
119
150
 
120
151
  queue.length = 0;
121
152
  queued.clear();
@@ -125,4 +156,5 @@ export function abortAllPrefetches(): void {
125
156
  executing.clear();
126
157
  active = 0;
127
158
  drainScheduled = false;
159
+ drainGeneration++;
128
160
  }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Resource Readiness
3
+ *
4
+ * Utilities to defer speculative prefetches until critical resources
5
+ * (viewport images) have finished loading. Prevents prefetch fetch()
6
+ * calls from competing with images for the browser's connection pool.
7
+ */
8
+
9
+ /**
10
+ * Resolve when all in-viewport images have finished loading.
11
+ * Returns immediately if no images are pending.
12
+ *
13
+ * Only checks images that exist at call time — does not observe
14
+ * dynamically added images. For SPA navigations where new images
15
+ * appear after render, call this after the navigation settles.
16
+ */
17
+ export function waitForViewportImages(): Promise<void> {
18
+ if (typeof document === "undefined") return Promise.resolve();
19
+
20
+ const pending = Array.from(document.querySelectorAll("img")).filter((img) => {
21
+ if (img.complete) return false;
22
+ const rect = img.getBoundingClientRect();
23
+ return (
24
+ rect.bottom > 0 &&
25
+ rect.right > 0 &&
26
+ rect.top < window.innerHeight &&
27
+ rect.left < window.innerWidth
28
+ );
29
+ });
30
+
31
+ if (pending.length === 0) return Promise.resolve();
32
+
33
+ return new Promise((resolve) => {
34
+ const settled = new Set<HTMLImageElement>();
35
+
36
+ const settle = (img: HTMLImageElement) => {
37
+ if (settled.has(img)) return;
38
+ settled.add(img);
39
+ if (settled.size >= pending.length) resolve();
40
+ };
41
+
42
+ for (const img of pending) {
43
+ img.addEventListener("load", () => settle(img), { once: true });
44
+ img.addEventListener("error", () => settle(img), { once: true });
45
+ // Re-check: image may have completed between the initial filter
46
+ // and listener attachment. settle() is idempotent per image, so
47
+ // a queued load event firing afterward is harmless.
48
+ if (img.complete) settle(img);
49
+ }
50
+ });
51
+ }
52
+
53
+ /**
54
+ * Resolve after the given number of milliseconds.
55
+ */
56
+ export function wait(ms: number): Promise<void> {
57
+ return new Promise((resolve) => setTimeout(resolve, ms));
58
+ }
59
+
60
+ /**
61
+ * Resolve when the browser has an idle main-thread moment.
62
+ * Uses requestIdleCallback where available, falls back to setTimeout.
63
+ *
64
+ * This is a scheduling hint, not an asset-loaded detector — combine
65
+ * with waitForViewportImages() for full resource readiness.
66
+ */
67
+ export function waitForIdle(timeout = 200): Promise<void> {
68
+ if (typeof window !== "undefined" && "requestIdleCallback" in window) {
69
+ return new Promise((resolve) => {
70
+ window.requestIdleCallback(() => resolve(), { timeout });
71
+ });
72
+ }
73
+
74
+ return new Promise((resolve) => {
75
+ setTimeout(resolve, 0);
76
+ });
77
+ }