@rangojs/router 0.0.0-experimental.42 → 0.0.0-experimental.44

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 (835) hide show
  1. package/dist/bin/rango.js +8 -3
  2. package/dist/vite/index.js +136 -197
  3. package/package.json +1 -1
  4. package/skills/caching/SKILL.md +37 -4
  5. package/src/browser/event-controller.ts +5 -0
  6. package/src/browser/navigation-bridge.ts +1 -11
  7. package/src/browser/navigation-client.ts +70 -24
  8. package/src/browser/navigation-transaction.ts +11 -9
  9. package/src/browser/partial-update.ts +39 -9
  10. package/src/browser/prefetch/cache.ts +54 -2
  11. package/src/browser/prefetch/fetch.ts +22 -12
  12. package/src/browser/prefetch/queue.ts +53 -13
  13. package/src/browser/react/Link.tsx +9 -1
  14. package/src/browser/react/NavigationProvider.tsx +27 -0
  15. package/src/browser/rsc-router.tsx +109 -57
  16. package/src/browser/scroll-restoration.ts +20 -11
  17. package/src/browser/types.ts +9 -0
  18. package/src/build/route-types/router-processing.ts +12 -2
  19. package/src/cache/cache-scope.ts +2 -2
  20. package/src/cache/cf/cf-cache-store.ts +453 -11
  21. package/src/cache/cf/index.ts +5 -1
  22. package/src/cache/index.ts +1 -0
  23. package/src/route-definition/redirect.ts +2 -2
  24. package/src/router/middleware.ts +2 -1
  25. package/src/server/request-context.ts +10 -4
  26. package/src/ssr/index.tsx +1 -0
  27. package/src/vite/discovery/state.ts +0 -2
  28. package/src/vite/plugin-types.ts +0 -83
  29. package/src/vite/plugins/expose-action-id.ts +1 -3
  30. package/src/vite/plugins/version-plugin.ts +13 -1
  31. package/src/vite/rango.ts +144 -209
  32. package/src/vite/router-discovery.ts +0 -8
  33. package/dist/__internal.d.ts +0 -83
  34. package/dist/__internal.d.ts.map +0 -1
  35. package/dist/__internal.js +0 -19
  36. package/dist/__internal.js.map +0 -1
  37. package/dist/__mocks__/version.d.ts +0 -7
  38. package/dist/__mocks__/version.d.ts.map +0 -1
  39. package/dist/__mocks__/version.js +0 -7
  40. package/dist/__mocks__/version.js.map +0 -1
  41. package/dist/__tests__/client-href.test.d.ts +0 -2
  42. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  43. package/dist/__tests__/client-href.test.js +0 -74
  44. package/dist/__tests__/client-href.test.js.map +0 -1
  45. package/dist/__tests__/component-utils.test.d.ts +0 -2
  46. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  47. package/dist/__tests__/component-utils.test.js +0 -51
  48. package/dist/__tests__/component-utils.test.js.map +0 -1
  49. package/dist/__tests__/event-controller.test.d.ts +0 -2
  50. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  51. package/dist/__tests__/event-controller.test.js +0 -538
  52. package/dist/__tests__/event-controller.test.js.map +0 -1
  53. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  54. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  55. package/dist/__tests__/helpers/route-tree.js +0 -374
  56. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  57. package/dist/__tests__/match-result.test.d.ts +0 -2
  58. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  59. package/dist/__tests__/match-result.test.js +0 -154
  60. package/dist/__tests__/match-result.test.js.map +0 -1
  61. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  62. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  63. package/dist/__tests__/navigation-store.test.js +0 -440
  64. package/dist/__tests__/navigation-store.test.js.map +0 -1
  65. package/dist/__tests__/partial-update.test.d.ts +0 -2
  66. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  67. package/dist/__tests__/partial-update.test.js +0 -1009
  68. package/dist/__tests__/partial-update.test.js.map +0 -1
  69. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  70. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  71. package/dist/__tests__/reverse-types.test.js +0 -656
  72. package/dist/__tests__/reverse-types.test.js.map +0 -1
  73. package/dist/__tests__/route-definition.test.d.ts +0 -2
  74. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  75. package/dist/__tests__/route-definition.test.js +0 -55
  76. package/dist/__tests__/route-definition.test.js.map +0 -1
  77. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  78. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  79. package/dist/__tests__/router-helpers.test.js +0 -377
  80. package/dist/__tests__/router-helpers.test.js.map +0 -1
  81. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  82. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  83. package/dist/__tests__/router-integration-2.test.js +0 -426
  84. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  85. package/dist/__tests__/router-integration.test.d.ts +0 -2
  86. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  87. package/dist/__tests__/router-integration.test.js +0 -1051
  88. package/dist/__tests__/router-integration.test.js.map +0 -1
  89. package/dist/__tests__/search-params.test.d.ts +0 -5
  90. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  91. package/dist/__tests__/search-params.test.js +0 -306
  92. package/dist/__tests__/search-params.test.js.map +0 -1
  93. package/dist/__tests__/segment-system.test.d.ts +0 -2
  94. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  95. package/dist/__tests__/segment-system.test.js +0 -627
  96. package/dist/__tests__/segment-system.test.js.map +0 -1
  97. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  98. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  99. package/dist/__tests__/static-handler-types.test.js +0 -63
  100. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  101. package/dist/__tests__/urls.test.d.ts +0 -2
  102. package/dist/__tests__/urls.test.d.ts.map +0 -1
  103. package/dist/__tests__/urls.test.js +0 -421
  104. package/dist/__tests__/urls.test.js.map +0 -1
  105. package/dist/__tests__/use-mount.test.d.ts +0 -2
  106. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  107. package/dist/__tests__/use-mount.test.js +0 -35
  108. package/dist/__tests__/use-mount.test.js.map +0 -1
  109. package/dist/bin/rango.d.ts +0 -2
  110. package/dist/bin/rango.d.ts.map +0 -1
  111. package/dist/bin/rango.js.map +0 -1
  112. package/dist/browser/event-controller.d.ts +0 -191
  113. package/dist/browser/event-controller.d.ts.map +0 -1
  114. package/dist/browser/event-controller.js +0 -559
  115. package/dist/browser/event-controller.js.map +0 -1
  116. package/dist/browser/index.d.ts +0 -2
  117. package/dist/browser/index.d.ts.map +0 -1
  118. package/dist/browser/index.js +0 -14
  119. package/dist/browser/index.js.map +0 -1
  120. package/dist/browser/link-interceptor.d.ts +0 -38
  121. package/dist/browser/link-interceptor.d.ts.map +0 -1
  122. package/dist/browser/link-interceptor.js +0 -99
  123. package/dist/browser/link-interceptor.js.map +0 -1
  124. package/dist/browser/logging.d.ts +0 -10
  125. package/dist/browser/logging.d.ts.map +0 -1
  126. package/dist/browser/logging.js +0 -29
  127. package/dist/browser/logging.js.map +0 -1
  128. package/dist/browser/lru-cache.d.ts +0 -17
  129. package/dist/browser/lru-cache.d.ts.map +0 -1
  130. package/dist/browser/lru-cache.js +0 -50
  131. package/dist/browser/lru-cache.js.map +0 -1
  132. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  133. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  134. package/dist/browser/merge-segment-loaders.js +0 -102
  135. package/dist/browser/merge-segment-loaders.js.map +0 -1
  136. package/dist/browser/navigation-bridge.d.ts +0 -102
  137. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  138. package/dist/browser/navigation-bridge.js +0 -708
  139. package/dist/browser/navigation-bridge.js.map +0 -1
  140. package/dist/browser/navigation-client.d.ts +0 -25
  141. package/dist/browser/navigation-client.d.ts.map +0 -1
  142. package/dist/browser/navigation-client.js +0 -157
  143. package/dist/browser/navigation-client.js.map +0 -1
  144. package/dist/browser/navigation-store.d.ts +0 -101
  145. package/dist/browser/navigation-store.d.ts.map +0 -1
  146. package/dist/browser/navigation-store.js +0 -625
  147. package/dist/browser/navigation-store.js.map +0 -1
  148. package/dist/browser/partial-update.d.ts +0 -75
  149. package/dist/browser/partial-update.d.ts.map +0 -1
  150. package/dist/browser/partial-update.js +0 -426
  151. package/dist/browser/partial-update.js.map +0 -1
  152. package/dist/browser/react/Link.d.ts +0 -86
  153. package/dist/browser/react/Link.d.ts.map +0 -1
  154. package/dist/browser/react/Link.js +0 -128
  155. package/dist/browser/react/Link.js.map +0 -1
  156. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  157. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  158. package/dist/browser/react/NavigationProvider.js +0 -216
  159. package/dist/browser/react/NavigationProvider.js.map +0 -1
  160. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  161. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  162. package/dist/browser/react/ScrollRestoration.js +0 -57
  163. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  164. package/dist/browser/react/context.d.ts +0 -46
  165. package/dist/browser/react/context.d.ts.map +0 -1
  166. package/dist/browser/react/context.js +0 -10
  167. package/dist/browser/react/context.js.map +0 -1
  168. package/dist/browser/react/index.d.ts +0 -11
  169. package/dist/browser/react/index.d.ts.map +0 -1
  170. package/dist/browser/react/index.js +0 -22
  171. package/dist/browser/react/index.js.map +0 -1
  172. package/dist/browser/react/location-state-shared.d.ts +0 -63
  173. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  174. package/dist/browser/react/location-state-shared.js +0 -81
  175. package/dist/browser/react/location-state-shared.js.map +0 -1
  176. package/dist/browser/react/location-state.d.ts +0 -23
  177. package/dist/browser/react/location-state.d.ts.map +0 -1
  178. package/dist/browser/react/location-state.js +0 -29
  179. package/dist/browser/react/location-state.js.map +0 -1
  180. package/dist/browser/react/mount-context.d.ts +0 -24
  181. package/dist/browser/react/mount-context.d.ts.map +0 -1
  182. package/dist/browser/react/mount-context.js +0 -24
  183. package/dist/browser/react/mount-context.js.map +0 -1
  184. package/dist/browser/react/use-action.d.ts +0 -64
  185. package/dist/browser/react/use-action.d.ts.map +0 -1
  186. package/dist/browser/react/use-action.js +0 -134
  187. package/dist/browser/react/use-action.js.map +0 -1
  188. package/dist/browser/react/use-client-cache.d.ts +0 -41
  189. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  190. package/dist/browser/react/use-client-cache.js +0 -39
  191. package/dist/browser/react/use-client-cache.js.map +0 -1
  192. package/dist/browser/react/use-handle.d.ts +0 -31
  193. package/dist/browser/react/use-handle.d.ts.map +0 -1
  194. package/dist/browser/react/use-handle.js +0 -144
  195. package/dist/browser/react/use-handle.js.map +0 -1
  196. package/dist/browser/react/use-href.d.ts +0 -33
  197. package/dist/browser/react/use-href.d.ts.map +0 -1
  198. package/dist/browser/react/use-href.js +0 -39
  199. package/dist/browser/react/use-href.js.map +0 -1
  200. package/dist/browser/react/use-link-status.d.ts +0 -37
  201. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  202. package/dist/browser/react/use-link-status.js +0 -99
  203. package/dist/browser/react/use-link-status.js.map +0 -1
  204. package/dist/browser/react/use-mount.d.ts +0 -25
  205. package/dist/browser/react/use-mount.d.ts.map +0 -1
  206. package/dist/browser/react/use-mount.js +0 -30
  207. package/dist/browser/react/use-mount.js.map +0 -1
  208. package/dist/browser/react/use-navigation.d.ts +0 -27
  209. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  210. package/dist/browser/react/use-navigation.js +0 -87
  211. package/dist/browser/react/use-navigation.js.map +0 -1
  212. package/dist/browser/react/use-segments.d.ts +0 -38
  213. package/dist/browser/react/use-segments.d.ts.map +0 -1
  214. package/dist/browser/react/use-segments.js +0 -130
  215. package/dist/browser/react/use-segments.js.map +0 -1
  216. package/dist/browser/request-controller.d.ts +0 -26
  217. package/dist/browser/request-controller.d.ts.map +0 -1
  218. package/dist/browser/request-controller.js +0 -147
  219. package/dist/browser/request-controller.js.map +0 -1
  220. package/dist/browser/rsc-router.d.ts +0 -129
  221. package/dist/browser/rsc-router.d.ts.map +0 -1
  222. package/dist/browser/rsc-router.js +0 -195
  223. package/dist/browser/rsc-router.js.map +0 -1
  224. package/dist/browser/scroll-restoration.d.ts +0 -93
  225. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  226. package/dist/browser/scroll-restoration.js +0 -321
  227. package/dist/browser/scroll-restoration.js.map +0 -1
  228. package/dist/browser/segment-structure-assert.d.ts +0 -17
  229. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  230. package/dist/browser/segment-structure-assert.js +0 -59
  231. package/dist/browser/segment-structure-assert.js.map +0 -1
  232. package/dist/browser/server-action-bridge.d.ts +0 -26
  233. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  234. package/dist/browser/server-action-bridge.js +0 -668
  235. package/dist/browser/server-action-bridge.js.map +0 -1
  236. package/dist/browser/shallow.d.ts +0 -12
  237. package/dist/browser/shallow.d.ts.map +0 -1
  238. package/dist/browser/shallow.js +0 -34
  239. package/dist/browser/shallow.js.map +0 -1
  240. package/dist/browser/types.d.ts +0 -369
  241. package/dist/browser/types.d.ts.map +0 -1
  242. package/dist/browser/types.js +0 -2
  243. package/dist/browser/types.js.map +0 -1
  244. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  245. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  246. package/dist/build/__tests__/generate-cli.test.js +0 -237
  247. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  248. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  249. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  250. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  251. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  252. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  253. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  254. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  255. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  256. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  257. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  258. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  259. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  260. package/dist/build/generate-manifest.d.ts +0 -81
  261. package/dist/build/generate-manifest.d.ts.map +0 -1
  262. package/dist/build/generate-manifest.js +0 -276
  263. package/dist/build/generate-manifest.js.map +0 -1
  264. package/dist/build/generate-route-types.d.ts +0 -115
  265. package/dist/build/generate-route-types.d.ts.map +0 -1
  266. package/dist/build/generate-route-types.js +0 -740
  267. package/dist/build/generate-route-types.js.map +0 -1
  268. package/dist/build/index.d.ts +0 -21
  269. package/dist/build/index.d.ts.map +0 -1
  270. package/dist/build/index.js +0 -21
  271. package/dist/build/index.js.map +0 -1
  272. package/dist/build/route-trie.d.ts +0 -71
  273. package/dist/build/route-trie.d.ts.map +0 -1
  274. package/dist/build/route-trie.js +0 -175
  275. package/dist/build/route-trie.js.map +0 -1
  276. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  277. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  278. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  279. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  280. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  281. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  282. package/dist/cache/__tests__/document-cache.test.js +0 -345
  283. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  284. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  285. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  286. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  287. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  288. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  289. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  290. package/dist/cache/__tests__/memory-store.test.js +0 -367
  291. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  292. package/dist/cache/cache-scope.d.ts +0 -102
  293. package/dist/cache/cache-scope.d.ts.map +0 -1
  294. package/dist/cache/cache-scope.js +0 -440
  295. package/dist/cache/cache-scope.js.map +0 -1
  296. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  297. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  298. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  299. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  300. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  301. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  302. package/dist/cache/cf/cf-cache-store.js +0 -242
  303. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  304. package/dist/cache/cf/index.d.ts +0 -14
  305. package/dist/cache/cf/index.d.ts.map +0 -1
  306. package/dist/cache/cf/index.js +0 -17
  307. package/dist/cache/cf/index.js.map +0 -1
  308. package/dist/cache/document-cache.d.ts +0 -64
  309. package/dist/cache/document-cache.d.ts.map +0 -1
  310. package/dist/cache/document-cache.js +0 -228
  311. package/dist/cache/document-cache.js.map +0 -1
  312. package/dist/cache/index.d.ts +0 -19
  313. package/dist/cache/index.d.ts.map +0 -1
  314. package/dist/cache/index.js +0 -21
  315. package/dist/cache/index.js.map +0 -1
  316. package/dist/cache/memory-segment-store.d.ts +0 -110
  317. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  318. package/dist/cache/memory-segment-store.js +0 -117
  319. package/dist/cache/memory-segment-store.js.map +0 -1
  320. package/dist/cache/memory-store.d.ts +0 -41
  321. package/dist/cache/memory-store.d.ts.map +0 -1
  322. package/dist/cache/memory-store.js +0 -191
  323. package/dist/cache/memory-store.js.map +0 -1
  324. package/dist/cache/types.d.ts +0 -317
  325. package/dist/cache/types.d.ts.map +0 -1
  326. package/dist/cache/types.js +0 -12
  327. package/dist/cache/types.js.map +0 -1
  328. package/dist/client.d.ts +0 -248
  329. package/dist/client.d.ts.map +0 -1
  330. package/dist/client.js +0 -367
  331. package/dist/client.js.map +0 -1
  332. package/dist/client.rsc.d.ts +0 -26
  333. package/dist/client.rsc.d.ts.map +0 -1
  334. package/dist/client.rsc.js +0 -46
  335. package/dist/client.rsc.js.map +0 -1
  336. package/dist/component-utils.d.ts +0 -36
  337. package/dist/component-utils.d.ts.map +0 -1
  338. package/dist/component-utils.js +0 -61
  339. package/dist/component-utils.js.map +0 -1
  340. package/dist/components/DefaultDocument.d.ts +0 -13
  341. package/dist/components/DefaultDocument.d.ts.map +0 -1
  342. package/dist/components/DefaultDocument.js +0 -15
  343. package/dist/components/DefaultDocument.js.map +0 -1
  344. package/dist/debug.d.ts +0 -58
  345. package/dist/debug.d.ts.map +0 -1
  346. package/dist/debug.js +0 -157
  347. package/dist/debug.js.map +0 -1
  348. package/dist/default-error-boundary.d.ts +0 -11
  349. package/dist/default-error-boundary.d.ts.map +0 -1
  350. package/dist/default-error-boundary.js +0 -45
  351. package/dist/default-error-boundary.js.map +0 -1
  352. package/dist/deps/browser.d.ts +0 -2
  353. package/dist/deps/browser.d.ts.map +0 -1
  354. package/dist/deps/browser.js +0 -3
  355. package/dist/deps/browser.js.map +0 -1
  356. package/dist/deps/html-stream-client.d.ts +0 -2
  357. package/dist/deps/html-stream-client.d.ts.map +0 -1
  358. package/dist/deps/html-stream-client.js +0 -3
  359. package/dist/deps/html-stream-client.js.map +0 -1
  360. package/dist/deps/html-stream-server.d.ts +0 -2
  361. package/dist/deps/html-stream-server.d.ts.map +0 -1
  362. package/dist/deps/html-stream-server.js +0 -3
  363. package/dist/deps/html-stream-server.js.map +0 -1
  364. package/dist/deps/rsc.d.ts +0 -2
  365. package/dist/deps/rsc.d.ts.map +0 -1
  366. package/dist/deps/rsc.js +0 -4
  367. package/dist/deps/rsc.js.map +0 -1
  368. package/dist/deps/ssr.d.ts +0 -2
  369. package/dist/deps/ssr.d.ts.map +0 -1
  370. package/dist/deps/ssr.js +0 -3
  371. package/dist/deps/ssr.js.map +0 -1
  372. package/dist/errors.d.ts +0 -174
  373. package/dist/errors.d.ts.map +0 -1
  374. package/dist/errors.js +0 -241
  375. package/dist/errors.js.map +0 -1
  376. package/dist/handle.d.ts +0 -78
  377. package/dist/handle.d.ts.map +0 -1
  378. package/dist/handle.js +0 -82
  379. package/dist/handle.js.map +0 -1
  380. package/dist/handles/MetaTags.d.ts +0 -14
  381. package/dist/handles/MetaTags.d.ts.map +0 -1
  382. package/dist/handles/MetaTags.js +0 -136
  383. package/dist/handles/MetaTags.js.map +0 -1
  384. package/dist/handles/index.d.ts +0 -6
  385. package/dist/handles/index.d.ts.map +0 -1
  386. package/dist/handles/index.js +0 -6
  387. package/dist/handles/index.js.map +0 -1
  388. package/dist/handles/meta.d.ts +0 -39
  389. package/dist/handles/meta.d.ts.map +0 -1
  390. package/dist/handles/meta.js +0 -202
  391. package/dist/handles/meta.js.map +0 -1
  392. package/dist/host/__tests__/errors.test.d.ts +0 -2
  393. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  394. package/dist/host/__tests__/errors.test.js +0 -76
  395. package/dist/host/__tests__/errors.test.js.map +0 -1
  396. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  397. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  398. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  399. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  400. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  401. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  402. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  403. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  404. package/dist/host/__tests__/router.test.d.ts +0 -2
  405. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  406. package/dist/host/__tests__/router.test.js +0 -241
  407. package/dist/host/__tests__/router.test.js.map +0 -1
  408. package/dist/host/__tests__/testing.test.d.ts +0 -2
  409. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  410. package/dist/host/__tests__/testing.test.js +0 -64
  411. package/dist/host/__tests__/testing.test.js.map +0 -1
  412. package/dist/host/__tests__/utils.test.d.ts +0 -2
  413. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  414. package/dist/host/__tests__/utils.test.js +0 -29
  415. package/dist/host/__tests__/utils.test.js.map +0 -1
  416. package/dist/host/cookie-handler.d.ts +0 -34
  417. package/dist/host/cookie-handler.d.ts.map +0 -1
  418. package/dist/host/cookie-handler.js +0 -124
  419. package/dist/host/cookie-handler.js.map +0 -1
  420. package/dist/host/errors.d.ts +0 -56
  421. package/dist/host/errors.d.ts.map +0 -1
  422. package/dist/host/errors.js +0 -79
  423. package/dist/host/errors.js.map +0 -1
  424. package/dist/host/index.d.ts +0 -29
  425. package/dist/host/index.d.ts.map +0 -1
  426. package/dist/host/index.js +0 -32
  427. package/dist/host/index.js.map +0 -1
  428. package/dist/host/pattern-matcher.d.ts +0 -36
  429. package/dist/host/pattern-matcher.d.ts.map +0 -1
  430. package/dist/host/pattern-matcher.js +0 -172
  431. package/dist/host/pattern-matcher.js.map +0 -1
  432. package/dist/host/router.d.ts +0 -26
  433. package/dist/host/router.d.ts.map +0 -1
  434. package/dist/host/router.js +0 -218
  435. package/dist/host/router.js.map +0 -1
  436. package/dist/host/testing.d.ts +0 -36
  437. package/dist/host/testing.d.ts.map +0 -1
  438. package/dist/host/testing.js +0 -55
  439. package/dist/host/testing.js.map +0 -1
  440. package/dist/host/types.d.ts +0 -115
  441. package/dist/host/types.d.ts.map +0 -1
  442. package/dist/host/types.js +0 -7
  443. package/dist/host/types.js.map +0 -1
  444. package/dist/host/utils.d.ts +0 -21
  445. package/dist/host/utils.d.ts.map +0 -1
  446. package/dist/host/utils.js +0 -23
  447. package/dist/host/utils.js.map +0 -1
  448. package/dist/href-client.d.ts +0 -131
  449. package/dist/href-client.d.ts.map +0 -1
  450. package/dist/href-client.js +0 -64
  451. package/dist/href-client.js.map +0 -1
  452. package/dist/href-context.d.ts +0 -29
  453. package/dist/href-context.d.ts.map +0 -1
  454. package/dist/href-context.js +0 -21
  455. package/dist/href-context.js.map +0 -1
  456. package/dist/index.d.ts +0 -73
  457. package/dist/index.d.ts.map +0 -1
  458. package/dist/index.js +0 -91
  459. package/dist/index.js.map +0 -1
  460. package/dist/index.rsc.d.ts +0 -32
  461. package/dist/index.rsc.d.ts.map +0 -1
  462. package/dist/index.rsc.js +0 -40
  463. package/dist/index.rsc.js.map +0 -1
  464. package/dist/internal-debug.d.ts +0 -2
  465. package/dist/internal-debug.d.ts.map +0 -1
  466. package/dist/internal-debug.js +0 -5
  467. package/dist/internal-debug.js.map +0 -1
  468. package/dist/loader.d.ts +0 -14
  469. package/dist/loader.d.ts.map +0 -1
  470. package/dist/loader.js +0 -20
  471. package/dist/loader.js.map +0 -1
  472. package/dist/loader.rsc.d.ts +0 -19
  473. package/dist/loader.rsc.d.ts.map +0 -1
  474. package/dist/loader.rsc.js +0 -99
  475. package/dist/loader.rsc.js.map +0 -1
  476. package/dist/network-error-thrower.d.ts +0 -17
  477. package/dist/network-error-thrower.d.ts.map +0 -1
  478. package/dist/network-error-thrower.js +0 -14
  479. package/dist/network-error-thrower.js.map +0 -1
  480. package/dist/outlet-context.d.ts +0 -13
  481. package/dist/outlet-context.d.ts.map +0 -1
  482. package/dist/outlet-context.js +0 -3
  483. package/dist/outlet-context.js.map +0 -1
  484. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  485. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  486. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  487. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  488. package/dist/prerender/param-hash.d.ts +0 -16
  489. package/dist/prerender/param-hash.d.ts.map +0 -1
  490. package/dist/prerender/param-hash.js +0 -36
  491. package/dist/prerender/param-hash.js.map +0 -1
  492. package/dist/prerender/store.d.ts +0 -38
  493. package/dist/prerender/store.d.ts.map +0 -1
  494. package/dist/prerender/store.js +0 -61
  495. package/dist/prerender/store.js.map +0 -1
  496. package/dist/prerender.d.ts +0 -66
  497. package/dist/prerender.d.ts.map +0 -1
  498. package/dist/prerender.js +0 -57
  499. package/dist/prerender.js.map +0 -1
  500. package/dist/reverse.d.ts +0 -196
  501. package/dist/reverse.d.ts.map +0 -1
  502. package/dist/reverse.js +0 -78
  503. package/dist/reverse.js.map +0 -1
  504. package/dist/root-error-boundary.d.ts +0 -33
  505. package/dist/root-error-boundary.d.ts.map +0 -1
  506. package/dist/root-error-boundary.js +0 -165
  507. package/dist/root-error-boundary.js.map +0 -1
  508. package/dist/route-content-wrapper.d.ts +0 -46
  509. package/dist/route-content-wrapper.d.ts.map +0 -1
  510. package/dist/route-content-wrapper.js +0 -77
  511. package/dist/route-content-wrapper.js.map +0 -1
  512. package/dist/route-definition.d.ts +0 -421
  513. package/dist/route-definition.d.ts.map +0 -1
  514. package/dist/route-definition.js +0 -868
  515. package/dist/route-definition.js.map +0 -1
  516. package/dist/route-map-builder.d.ts +0 -155
  517. package/dist/route-map-builder.d.ts.map +0 -1
  518. package/dist/route-map-builder.js +0 -237
  519. package/dist/route-map-builder.js.map +0 -1
  520. package/dist/route-types.d.ts +0 -165
  521. package/dist/route-types.d.ts.map +0 -1
  522. package/dist/route-types.js +0 -7
  523. package/dist/route-types.js.map +0 -1
  524. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  525. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  526. package/dist/router/__tests__/handler-context.test.js +0 -65
  527. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  528. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  529. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  530. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  531. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  532. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  533. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  534. package/dist/router/__tests__/match-context.test.js +0 -92
  535. package/dist/router/__tests__/match-context.test.js.map +0 -1
  536. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  537. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  538. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  539. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  540. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  541. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  542. package/dist/router/__tests__/match-result.test.js +0 -457
  543. package/dist/router/__tests__/match-result.test.js.map +0 -1
  544. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  545. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  546. package/dist/router/__tests__/on-error.test.js +0 -678
  547. package/dist/router/__tests__/on-error.test.js.map +0 -1
  548. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  549. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  550. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  551. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  552. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  553. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  554. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  555. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  556. package/dist/router/error-handling.d.ts +0 -77
  557. package/dist/router/error-handling.d.ts.map +0 -1
  558. package/dist/router/error-handling.js +0 -202
  559. package/dist/router/error-handling.js.map +0 -1
  560. package/dist/router/handler-context.d.ts +0 -20
  561. package/dist/router/handler-context.d.ts.map +0 -1
  562. package/dist/router/handler-context.js +0 -198
  563. package/dist/router/handler-context.js.map +0 -1
  564. package/dist/router/intercept-resolution.d.ts +0 -66
  565. package/dist/router/intercept-resolution.d.ts.map +0 -1
  566. package/dist/router/intercept-resolution.js +0 -246
  567. package/dist/router/intercept-resolution.js.map +0 -1
  568. package/dist/router/loader-resolution.d.ts +0 -64
  569. package/dist/router/loader-resolution.d.ts.map +0 -1
  570. package/dist/router/loader-resolution.js +0 -284
  571. package/dist/router/loader-resolution.js.map +0 -1
  572. package/dist/router/logging.d.ts +0 -15
  573. package/dist/router/logging.d.ts.map +0 -1
  574. package/dist/router/logging.js +0 -99
  575. package/dist/router/logging.js.map +0 -1
  576. package/dist/router/manifest.d.ts +0 -22
  577. package/dist/router/manifest.d.ts.map +0 -1
  578. package/dist/router/manifest.js +0 -181
  579. package/dist/router/manifest.js.map +0 -1
  580. package/dist/router/match-api.d.ts +0 -35
  581. package/dist/router/match-api.d.ts.map +0 -1
  582. package/dist/router/match-api.js +0 -406
  583. package/dist/router/match-api.js.map +0 -1
  584. package/dist/router/match-context.d.ts +0 -206
  585. package/dist/router/match-context.d.ts.map +0 -1
  586. package/dist/router/match-context.js +0 -17
  587. package/dist/router/match-context.js.map +0 -1
  588. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  589. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  590. package/dist/router/match-middleware/background-revalidation.js +0 -75
  591. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  592. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  593. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  594. package/dist/router/match-middleware/cache-lookup.js +0 -257
  595. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  596. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  597. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  598. package/dist/router/match-middleware/cache-store.js +0 -108
  599. package/dist/router/match-middleware/cache-store.js.map +0 -1
  600. package/dist/router/match-middleware/index.d.ts +0 -81
  601. package/dist/router/match-middleware/index.d.ts.map +0 -1
  602. package/dist/router/match-middleware/index.js +0 -80
  603. package/dist/router/match-middleware/index.js.map +0 -1
  604. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  605. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  606. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  607. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  608. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  609. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  610. package/dist/router/match-middleware/segment-resolution.js +0 -53
  611. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  612. package/dist/router/match-pipelines.d.ts +0 -147
  613. package/dist/router/match-pipelines.d.ts.map +0 -1
  614. package/dist/router/match-pipelines.js +0 -82
  615. package/dist/router/match-pipelines.js.map +0 -1
  616. package/dist/router/match-result.d.ts +0 -126
  617. package/dist/router/match-result.d.ts.map +0 -1
  618. package/dist/router/match-result.js +0 -93
  619. package/dist/router/match-result.js.map +0 -1
  620. package/dist/router/metrics.d.ts +0 -20
  621. package/dist/router/metrics.d.ts.map +0 -1
  622. package/dist/router/metrics.js +0 -47
  623. package/dist/router/metrics.js.map +0 -1
  624. package/dist/router/middleware.d.ts +0 -249
  625. package/dist/router/middleware.d.ts.map +0 -1
  626. package/dist/router/middleware.js +0 -434
  627. package/dist/router/middleware.js.map +0 -1
  628. package/dist/router/middleware.test.d.ts +0 -2
  629. package/dist/router/middleware.test.d.ts.map +0 -1
  630. package/dist/router/middleware.test.js +0 -816
  631. package/dist/router/middleware.test.js.map +0 -1
  632. package/dist/router/pattern-matching.d.ts +0 -149
  633. package/dist/router/pattern-matching.d.ts.map +0 -1
  634. package/dist/router/pattern-matching.js +0 -349
  635. package/dist/router/pattern-matching.js.map +0 -1
  636. package/dist/router/revalidation.d.ts +0 -44
  637. package/dist/router/revalidation.d.ts.map +0 -1
  638. package/dist/router/revalidation.js +0 -147
  639. package/dist/router/revalidation.js.map +0 -1
  640. package/dist/router/router-context.d.ts +0 -135
  641. package/dist/router/router-context.d.ts.map +0 -1
  642. package/dist/router/router-context.js +0 -36
  643. package/dist/router/router-context.js.map +0 -1
  644. package/dist/router/segment-resolution.d.ts +0 -127
  645. package/dist/router/segment-resolution.d.ts.map +0 -1
  646. package/dist/router/segment-resolution.js +0 -919
  647. package/dist/router/segment-resolution.js.map +0 -1
  648. package/dist/router/trie-matching.d.ts +0 -40
  649. package/dist/router/trie-matching.d.ts.map +0 -1
  650. package/dist/router/trie-matching.js +0 -127
  651. package/dist/router/trie-matching.js.map +0 -1
  652. package/dist/router/types.d.ts +0 -136
  653. package/dist/router/types.d.ts.map +0 -1
  654. package/dist/router/types.js +0 -7
  655. package/dist/router/types.js.map +0 -1
  656. package/dist/router.d.ts +0 -753
  657. package/dist/router.d.ts.map +0 -1
  658. package/dist/router.gen.d.ts +0 -6
  659. package/dist/router.gen.d.ts.map +0 -1
  660. package/dist/router.gen.js +0 -6
  661. package/dist/router.gen.js.map +0 -1
  662. package/dist/router.js +0 -1304
  663. package/dist/router.js.map +0 -1
  664. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  665. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  666. package/dist/rsc/__tests__/helpers.test.js +0 -140
  667. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  668. package/dist/rsc/handler.d.ts +0 -45
  669. package/dist/rsc/handler.d.ts.map +0 -1
  670. package/dist/rsc/handler.js +0 -1172
  671. package/dist/rsc/handler.js.map +0 -1
  672. package/dist/rsc/helpers.d.ts +0 -16
  673. package/dist/rsc/helpers.d.ts.map +0 -1
  674. package/dist/rsc/helpers.js +0 -55
  675. package/dist/rsc/helpers.js.map +0 -1
  676. package/dist/rsc/index.d.ts +0 -22
  677. package/dist/rsc/index.d.ts.map +0 -1
  678. package/dist/rsc/index.js +0 -23
  679. package/dist/rsc/index.js.map +0 -1
  680. package/dist/rsc/nonce.d.ts +0 -9
  681. package/dist/rsc/nonce.d.ts.map +0 -1
  682. package/dist/rsc/nonce.js +0 -18
  683. package/dist/rsc/nonce.js.map +0 -1
  684. package/dist/rsc/types.d.ts +0 -206
  685. package/dist/rsc/types.d.ts.map +0 -1
  686. package/dist/rsc/types.js +0 -8
  687. package/dist/rsc/types.js.map +0 -1
  688. package/dist/search-params.d.ts +0 -103
  689. package/dist/search-params.d.ts.map +0 -1
  690. package/dist/search-params.js +0 -74
  691. package/dist/search-params.js.map +0 -1
  692. package/dist/segment-system.d.ts +0 -75
  693. package/dist/segment-system.d.ts.map +0 -1
  694. package/dist/segment-system.js +0 -336
  695. package/dist/segment-system.js.map +0 -1
  696. package/dist/server/context.d.ts +0 -245
  697. package/dist/server/context.d.ts.map +0 -1
  698. package/dist/server/context.js +0 -197
  699. package/dist/server/context.js.map +0 -1
  700. package/dist/server/fetchable-loader-store.d.ts +0 -18
  701. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  702. package/dist/server/fetchable-loader-store.js +0 -18
  703. package/dist/server/fetchable-loader-store.js.map +0 -1
  704. package/dist/server/handle-store.d.ts +0 -85
  705. package/dist/server/handle-store.d.ts.map +0 -1
  706. package/dist/server/handle-store.js +0 -142
  707. package/dist/server/handle-store.js.map +0 -1
  708. package/dist/server/loader-registry.d.ts +0 -55
  709. package/dist/server/loader-registry.d.ts.map +0 -1
  710. package/dist/server/loader-registry.js +0 -132
  711. package/dist/server/loader-registry.js.map +0 -1
  712. package/dist/server/request-context.d.ts +0 -226
  713. package/dist/server/request-context.d.ts.map +0 -1
  714. package/dist/server/request-context.js +0 -290
  715. package/dist/server/request-context.js.map +0 -1
  716. package/dist/server/root-layout.d.ts +0 -4
  717. package/dist/server/root-layout.d.ts.map +0 -1
  718. package/dist/server/root-layout.js +0 -5
  719. package/dist/server/root-layout.js.map +0 -1
  720. package/dist/server.d.ts +0 -15
  721. package/dist/server.d.ts.map +0 -1
  722. package/dist/server.js +0 -20
  723. package/dist/server.js.map +0 -1
  724. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  725. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  726. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  727. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  728. package/dist/ssr/index.d.ts +0 -98
  729. package/dist/ssr/index.d.ts.map +0 -1
  730. package/dist/ssr/index.js +0 -158
  731. package/dist/ssr/index.js.map +0 -1
  732. package/dist/static-handler.d.ts +0 -50
  733. package/dist/static-handler.d.ts.map +0 -1
  734. package/dist/static-handler.gen.d.ts +0 -5
  735. package/dist/static-handler.gen.d.ts.map +0 -1
  736. package/dist/static-handler.gen.js +0 -5
  737. package/dist/static-handler.gen.js.map +0 -1
  738. package/dist/static-handler.js +0 -29
  739. package/dist/static-handler.js.map +0 -1
  740. package/dist/theme/ThemeProvider.d.ts +0 -20
  741. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  742. package/dist/theme/ThemeProvider.js +0 -240
  743. package/dist/theme/ThemeProvider.js.map +0 -1
  744. package/dist/theme/ThemeScript.d.ts +0 -48
  745. package/dist/theme/ThemeScript.d.ts.map +0 -1
  746. package/dist/theme/ThemeScript.js +0 -13
  747. package/dist/theme/ThemeScript.js.map +0 -1
  748. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  749. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  750. package/dist/theme/__tests__/theme.test.js +0 -103
  751. package/dist/theme/__tests__/theme.test.js.map +0 -1
  752. package/dist/theme/constants.d.ts +0 -29
  753. package/dist/theme/constants.d.ts.map +0 -1
  754. package/dist/theme/constants.js +0 -48
  755. package/dist/theme/constants.js.map +0 -1
  756. package/dist/theme/index.d.ts +0 -31
  757. package/dist/theme/index.d.ts.map +0 -1
  758. package/dist/theme/index.js +0 -36
  759. package/dist/theme/index.js.map +0 -1
  760. package/dist/theme/theme-context.d.ts +0 -40
  761. package/dist/theme/theme-context.d.ts.map +0 -1
  762. package/dist/theme/theme-context.js +0 -60
  763. package/dist/theme/theme-context.js.map +0 -1
  764. package/dist/theme/theme-script.d.ts +0 -27
  765. package/dist/theme/theme-script.d.ts.map +0 -1
  766. package/dist/theme/theme-script.js +0 -147
  767. package/dist/theme/theme-script.js.map +0 -1
  768. package/dist/theme/types.d.ts +0 -163
  769. package/dist/theme/types.d.ts.map +0 -1
  770. package/dist/theme/types.js +0 -11
  771. package/dist/theme/types.js.map +0 -1
  772. package/dist/theme/use-theme.d.ts +0 -12
  773. package/dist/theme/use-theme.d.ts.map +0 -1
  774. package/dist/theme/use-theme.js +0 -40
  775. package/dist/theme/use-theme.js.map +0 -1
  776. package/dist/types.d.ts +0 -1479
  777. package/dist/types.d.ts.map +0 -1
  778. package/dist/types.js +0 -10
  779. package/dist/types.js.map +0 -1
  780. package/dist/urls.d.ts +0 -441
  781. package/dist/urls.d.ts.map +0 -1
  782. package/dist/urls.gen.d.ts +0 -8
  783. package/dist/urls.gen.d.ts.map +0 -1
  784. package/dist/urls.gen.js +0 -8
  785. package/dist/urls.gen.js.map +0 -1
  786. package/dist/urls.js +0 -443
  787. package/dist/urls.js.map +0 -1
  788. package/dist/use-loader.d.ts +0 -127
  789. package/dist/use-loader.d.ts.map +0 -1
  790. package/dist/use-loader.js +0 -237
  791. package/dist/use-loader.js.map +0 -1
  792. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  793. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  794. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  795. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  796. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  797. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  798. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  799. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  800. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  801. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  802. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  803. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  804. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  805. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  806. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  807. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  808. package/dist/vite/ast-handler-extract.d.ts +0 -49
  809. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  810. package/dist/vite/ast-handler-extract.js +0 -249
  811. package/dist/vite/ast-handler-extract.js.map +0 -1
  812. package/dist/vite/expose-action-id.d.ts +0 -19
  813. package/dist/vite/expose-action-id.d.ts.map +0 -1
  814. package/dist/vite/expose-action-id.js +0 -250
  815. package/dist/vite/expose-action-id.js.map +0 -1
  816. package/dist/vite/expose-id-utils.d.ts +0 -69
  817. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  818. package/dist/vite/expose-id-utils.js +0 -289
  819. package/dist/vite/expose-id-utils.js.map +0 -1
  820. package/dist/vite/expose-internal-ids.d.ts +0 -22
  821. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  822. package/dist/vite/expose-internal-ids.js +0 -886
  823. package/dist/vite/expose-internal-ids.js.map +0 -1
  824. package/dist/vite/index.d.ts +0 -149
  825. package/dist/vite/index.d.ts.map +0 -1
  826. package/dist/vite/index.js.map +0 -1
  827. package/dist/vite/index.named-routes.gen.ts +0 -103
  828. package/dist/vite/package-resolution.d.ts +0 -43
  829. package/dist/vite/package-resolution.d.ts.map +0 -1
  830. package/dist/vite/package-resolution.js +0 -112
  831. package/dist/vite/package-resolution.js.map +0 -1
  832. package/dist/vite/virtual-entries.d.ts +0 -25
  833. package/dist/vite/virtual-entries.d.ts.map +0 -1
  834. package/dist/vite/virtual-entries.js +0 -110
  835. package/dist/vite/virtual-entries.js.map +0 -1
@@ -472,6 +472,7 @@ export function createNavigationBridge(
472
472
  cachedHandleData,
473
473
  params: cachedParams,
474
474
  },
475
+ scroll: { restore: true, isStreaming },
475
476
  };
476
477
  const hasTransition = cachedSegments.some((s) => s.transition);
477
478
  if (hasTransition) {
@@ -485,17 +486,6 @@ export function createNavigationBridge(
485
486
  onUpdate(popstateUpdate);
486
487
  }
487
488
 
488
- // Restore scroll position for back/forward navigation.
489
- // Defer to next frame so React has committed the cached content to
490
- // the DOM before we measure scrollHeight and restore scroll position.
491
- const defer =
492
- typeof requestAnimationFrame === "function"
493
- ? requestAnimationFrame
494
- : (fn: () => void) => setTimeout(fn, 0);
495
- defer(() => {
496
- handleNavigationEnd({ restore: true, isStreaming });
497
- });
498
-
499
489
  // SWR: If stale, trigger background revalidation
500
490
  if (isStale) {
501
491
  debugLog("[Browser] Cache is stale, background revalidating...");
@@ -17,7 +17,11 @@ import {
17
17
  emptyResponse,
18
18
  teeWithCompletion,
19
19
  } from "./response-adapter.js";
20
- import { buildPrefetchKey, consumePrefetch } from "./prefetch/cache.js";
20
+ import {
21
+ buildPrefetchKey,
22
+ consumePrefetch,
23
+ consumeInflightPrefetch,
24
+ } from "./prefetch/cache.js";
21
25
 
22
26
  /**
23
27
  * Create a navigation client for fetching RSC payloads
@@ -90,10 +94,15 @@ export function createNavigationClient(
90
94
  // server's diff response depends on the source page context.
91
95
  // Skip cache for stale revalidation (needs fresh data), HMR (needs
92
96
  // fresh modules), and intercept contexts (source-dependent responses).
97
+ const canUsePrefetch = !staleRevalidation && !hmr && !interceptSourceUrl;
93
98
  const cacheKey = buildPrefetchKey(previousUrl, fetchUrl);
94
- const cachedResponse =
95
- !staleRevalidation && !hmr && !interceptSourceUrl
96
- ? consumePrefetch(cacheKey)
99
+ const cachedResponse = canUsePrefetch ? consumePrefetch(cacheKey) : null;
100
+ // If no completed cache entry, check for in-flight prefetch.
101
+ // This reuses a prefetch that is still downloading rather than
102
+ // starting a duplicate request from scratch.
103
+ const inflightPrefetch =
104
+ !cachedResponse && canUsePrefetch
105
+ ? consumeInflightPrefetch(cacheKey)
97
106
  : null;
98
107
 
99
108
  // Track when the stream completes
@@ -102,32 +111,15 @@ export function createNavigationClient(
102
111
  resolveStreamComplete = resolve;
103
112
  });
104
113
 
105
- let responsePromise: Promise<Response>;
106
-
107
- if (cachedResponse) {
108
- if (tx) {
109
- browserDebugLog(tx, "prefetch cache hit", { key: cacheKey });
110
- }
111
- // Cached response body is already fully buffered (arrayBuffer),
112
- // so stream completion is immediate.
113
- responsePromise = Promise.resolve(cachedResponse).then((response) => {
114
- return teeWithCompletion(
115
- response,
116
- () => {
117
- if (tx) browserDebugLog(tx, "stream complete (from cache)");
118
- resolveStreamComplete();
119
- },
120
- signal,
121
- );
122
- });
123
- } else {
114
+ /** Start a fresh navigation fetch (no cache / inflight hit). */
115
+ const doFreshFetch = (): Promise<Response> => {
124
116
  if (tx) {
125
117
  browserDebugLog(tx, "fetching", {
126
118
  path: `${fetchUrl.pathname}${fetchUrl.search}`,
127
119
  });
128
120
  }
129
121
 
130
- responsePromise = fetch(fetchUrl, {
122
+ return fetch(fetchUrl, {
131
123
  headers: {
132
124
  "X-RSC-Router-Client-Path": previousUrl,
133
125
  "X-Rango-State": getRangoState(),
@@ -183,6 +175,60 @@ export function createNavigationClient(
183
175
  signal,
184
176
  );
185
177
  });
178
+ };
179
+
180
+ let responsePromise: Promise<Response>;
181
+
182
+ if (cachedResponse) {
183
+ if (tx) {
184
+ browserDebugLog(tx, "prefetch cache hit", { key: cacheKey });
185
+ }
186
+ // Cached response body is already fully buffered (arrayBuffer),
187
+ // so stream completion is immediate.
188
+ responsePromise = Promise.resolve(cachedResponse).then((response) => {
189
+ return teeWithCompletion(
190
+ response,
191
+ () => {
192
+ if (tx) browserDebugLog(tx, "stream complete (from cache)");
193
+ resolveStreamComplete();
194
+ },
195
+ signal,
196
+ );
197
+ });
198
+ } else if (inflightPrefetch) {
199
+ if (tx) {
200
+ browserDebugLog(tx, "reusing inflight prefetch", { key: cacheKey });
201
+ }
202
+ // Await the in-flight prefetch. If it resolves with a Response,
203
+ // use it like a cache hit. If it fails (null), fall back to
204
+ // a fresh navigation fetch.
205
+ responsePromise = inflightPrefetch.then((prefetchResponse) => {
206
+ if (!prefetchResponse) {
207
+ if (tx) {
208
+ browserDebugLog(
209
+ tx,
210
+ "inflight prefetch failed, falling back to fetch",
211
+ );
212
+ }
213
+ return doFreshFetch();
214
+ }
215
+ if (tx) {
216
+ browserDebugLog(tx, "inflight prefetch resolved", {
217
+ key: cacheKey,
218
+ });
219
+ }
220
+ return teeWithCompletion(
221
+ prefetchResponse,
222
+ () => {
223
+ if (tx)
224
+ browserDebugLog(tx, "stream complete (from inflight prefetch)");
225
+ resolveStreamComplete();
226
+ },
227
+ signal,
228
+ );
229
+ });
230
+ } else {
231
+ responsePromise = doFreshFetch();
186
232
  }
187
233
 
188
234
  try {
@@ -7,7 +7,6 @@ import type {
7
7
  import { generateHistoryKey } from "./navigation-store.js";
8
8
  import {
9
9
  handleNavigationStart,
10
- handleNavigationEnd,
11
10
  ensureHistoryKey,
12
11
  } from "./scroll-restoration.js";
13
12
  import type { EventController, NavigationHandle } from "./event-controller.js";
@@ -81,11 +80,12 @@ export interface BoundTransaction {
81
80
  readonly currentUrl: string;
82
81
  /** Start streaming and get a token to end it when the stream completes */
83
82
  startStreaming(): StreamingToken;
83
+ /** Commit the navigation. Returns the effective scroll option for the caller to handle. */
84
84
  commit(
85
85
  segmentIds: string[],
86
86
  segments: ResolvedSegment[],
87
87
  overrides?: BoundCommitOverrides,
88
- ): void;
88
+ ): { scroll?: boolean };
89
89
  }
90
90
 
91
91
  /**
@@ -93,7 +93,7 @@ export interface BoundTransaction {
93
93
  * Uses the event controller handle for lifecycle management
94
94
  */
95
95
  interface NavigationTransaction extends Disposable {
96
- commit(options: CommitOptions): void;
96
+ commit(options: CommitOptions): { scroll?: boolean };
97
97
  with(
98
98
  options: Omit<CommitOptions, "segmentIds" | "segments">,
99
99
  ): BoundTransaction;
@@ -120,7 +120,7 @@ export function createNavigationTransaction(
120
120
  /**
121
121
  * Commit the navigation - updates store and URL atomically
122
122
  */
123
- function commit(opts: CommitOptions): void {
123
+ function commit(opts: CommitOptions): { scroll?: boolean } {
124
124
  committed = true;
125
125
 
126
126
  const {
@@ -150,7 +150,7 @@ export function createNavigationTransaction(
150
150
  // Without this, the entry lingers and weakens state-machine invariants.
151
151
  handle.complete(parsedUrl);
152
152
  debugLog("[Browser] Cache-only commit, historyKey:", historyKey);
153
- return;
153
+ return { scroll: false };
154
154
  }
155
155
 
156
156
  // Save current scroll position before navigating
@@ -172,7 +172,7 @@ export function createNavigationTransaction(
172
172
  debugLog("[Browser] Store updated (action)");
173
173
  // Complete navigation to clear loading state
174
174
  handle.complete(parsedUrl);
175
- return;
175
+ return { scroll: false };
176
176
  }
177
177
 
178
178
  // Build history state - include user state, intercept info, and server-set state
@@ -205,14 +205,16 @@ export function createNavigationTransaction(
205
205
  // Complete the navigation in event controller (sets idle state, updates location)
206
206
  handle.complete(parsedUrl);
207
207
 
208
- // Handle scroll after navigation
209
- handleNavigationEnd({ scroll });
208
+ // NOTE: Scroll is NOT handled here. The caller (partial-update.ts) handles
209
+ // scroll AFTER onUpdate() so React has the new content before we scroll.
210
210
 
211
211
  debugLog(
212
212
  "[Browser] Navigation committed, historyKey:",
213
213
  historyKey,
214
214
  intercept ? "(intercept)" : "",
215
215
  );
216
+
217
+ return { scroll };
216
218
  }
217
219
 
218
220
  return {
@@ -263,7 +265,7 @@ export function createNavigationTransaction(
263
265
  overrides?.state !== undefined ? overrides.state : opts.state;
264
266
  // Server-set location state: only from overrides (set by partial-update)
265
267
  const serverState = overrides?.serverState;
266
- commit({
268
+ return commit({
267
269
  ...opts,
268
270
  segmentIds,
269
271
  segments,
@@ -19,6 +19,14 @@ import type { BoundTransaction } from "./navigation-transaction.js";
19
19
  import { ServerRedirect } from "../errors.js";
20
20
  import { debugLog } from "./logging.js";
21
21
  import { validateRedirectOrigin } from "./validate-redirect-origin.js";
22
+ import type { NavigationUpdate } from "./types.js";
23
+
24
+ /** Build a scroll payload from the commit's scroll option */
25
+ function toScrollPayload(
26
+ scroll: boolean | undefined,
27
+ ): NonNullable<NavigationUpdate["scroll"]> {
28
+ return { enabled: scroll !== false ? scroll : false };
29
+ }
22
30
 
23
31
  /**
24
32
  * Configuration for creating a partial updater
@@ -246,7 +254,10 @@ export function createPartialUpdater(
246
254
  forceAwait: true,
247
255
  });
248
256
 
249
- tx.commit(matchedIds, existingSegments);
257
+ const { scroll: commitScroll } = tx.commit(
258
+ matchedIds,
259
+ existingSegments,
260
+ );
250
261
 
251
262
  // Include cachedHandleData in metadata so NavigationProvider can restore
252
263
  // breadcrumbs and other handle data from cache.
@@ -260,6 +271,7 @@ export function createPartialUpdater(
260
271
  ...metadataWithoutHandles,
261
272
  cachedHandleData: mode.targetCacheHandleData,
262
273
  },
274
+ scroll: toScrollPayload(commitScroll),
263
275
  };
264
276
 
265
277
  const cachedHasTransition = existingSegments.some(
@@ -290,11 +302,15 @@ export function createPartialUpdater(
290
302
  forceAwait: true,
291
303
  });
292
304
 
293
- tx.commit(matchedIds, existingSegments);
305
+ const { scroll: leaveScroll } = tx.commit(
306
+ matchedIds,
307
+ existingSegments,
308
+ );
294
309
 
295
310
  onUpdate({
296
311
  root: newTree,
297
312
  metadata: payload.metadata,
313
+ scroll: toScrollPayload(leaveScroll),
298
314
  });
299
315
 
300
316
  debugLog("[Browser] Navigation complete (left intercept)");
@@ -426,7 +442,11 @@ export function createPartialUpdater(
426
442
  : serverLocationState
427
443
  ? { serverState: serverLocationState }
428
444
  : undefined;
429
- tx.commit(allSegmentIds, reconciled.segments, overrides);
445
+ const { scroll: navScroll } = tx.commit(
446
+ allSegmentIds,
447
+ reconciled.segments,
448
+ overrides,
449
+ );
430
450
 
431
451
  // For stale revalidation: verify history key hasn't changed before updating UI
432
452
  if (mode.type === "stale-revalidation") {
@@ -441,8 +461,10 @@ export function createPartialUpdater(
441
461
 
442
462
  debugLog("[partial-update] updating document");
443
463
 
444
- // Emit update to trigger React render
464
+ // Emit update to trigger React render.
465
+ // Scroll info is included so NavigationProvider applies it after React commits.
445
466
  const hasTransition = reconciled.mainSegments.some((s) => s.transition);
467
+ const scrollPayload = toScrollPayload(navScroll);
446
468
 
447
469
  if (mode.type === "action" || mode.type === "stale-revalidation") {
448
470
  startTransition(() => {
@@ -452,6 +474,7 @@ export function createPartialUpdater(
452
474
  onUpdate({
453
475
  root: newTree,
454
476
  metadata: payload.metadata!,
477
+ scroll: scrollPayload,
455
478
  });
456
479
  });
457
480
  } else if (hasTransition) {
@@ -462,12 +485,14 @@ export function createPartialUpdater(
462
485
  onUpdate({
463
486
  root: newTree,
464
487
  metadata: payload.metadata!,
488
+ scroll: scrollPayload,
465
489
  });
466
490
  });
467
491
  } else {
468
492
  onUpdate({
469
493
  root: newTree,
470
494
  metadata: payload.metadata!,
495
+ scroll: scrollPayload,
471
496
  });
472
497
  }
473
498
 
@@ -494,15 +519,16 @@ export function createPartialUpdater(
494
519
  }
495
520
 
496
521
  const fullUpdateServerState = payload.metadata?.locationState;
497
- if (fullUpdateServerState) {
498
- tx.commit(segmentIds, segments, { serverState: fullUpdateServerState });
499
- } else {
500
- tx.commit(segmentIds, segments);
501
- }
522
+ const { scroll: fullScroll } = fullUpdateServerState
523
+ ? tx.commit(segmentIds, segments, {
524
+ serverState: fullUpdateServerState,
525
+ })
526
+ : tx.commit(segmentIds, segments);
502
527
 
503
528
  const fullHasTransition = segments.some(
504
529
  (s: ResolvedSegment) => s.transition,
505
530
  );
531
+ const fullScrollPayload = toScrollPayload(fullScroll);
506
532
 
507
533
  if (mode.type === "stale-revalidation") {
508
534
  await rawStreamComplete;
@@ -513,6 +539,7 @@ export function createPartialUpdater(
513
539
  onUpdate({
514
540
  root: newTree,
515
541
  metadata: payload.metadata!,
542
+ scroll: fullScrollPayload,
516
543
  });
517
544
  });
518
545
  } else if (mode.type === "action") {
@@ -523,6 +550,7 @@ export function createPartialUpdater(
523
550
  onUpdate({
524
551
  root: newTree,
525
552
  metadata: payload.metadata!,
553
+ scroll: fullScrollPayload,
526
554
  });
527
555
  });
528
556
  } else if (fullHasTransition) {
@@ -533,12 +561,14 @@ export function createPartialUpdater(
533
561
  onUpdate({
534
562
  root: newTree,
535
563
  metadata: payload.metadata!,
564
+ scroll: fullScrollPayload,
536
565
  });
537
566
  });
538
567
  } else {
539
568
  onUpdate({
540
569
  root: newTree,
541
570
  metadata: payload.metadata!,
571
+ scroll: fullScrollPayload,
542
572
  });
543
573
  }
544
574
 
@@ -6,11 +6,15 @@
6
6
  * current page URL) because the server's diff-based response depends on
7
7
  * where the user navigates from.
8
8
  *
9
+ * Also tracks in-flight prefetch promises so navigation can reuse a
10
+ * prefetch that is still downloading rather than starting a duplicate
11
+ * request. See consumeInflightPrefetch().
12
+ *
9
13
  * Replaces the previous browser HTTP cache approach which was unreliable
10
14
  * due to response draining race conditions and browser inconsistencies.
11
15
  */
12
16
 
13
- import { cancelAllPrefetches } from "./queue.js";
17
+ import { abortAllPrefetches } from "./queue.js";
14
18
  import { invalidateRangoState } from "../rango-state.js";
15
19
 
16
20
  // Default TTL: 5 minutes. Overridden by initPrefetchCache() with
@@ -44,6 +48,13 @@ interface PrefetchCacheEntry {
44
48
  const cache = new Map<string, PrefetchCacheEntry>();
45
49
  const inflight = new Set<string>();
46
50
 
51
+ /**
52
+ * In-flight promise map. When a prefetch fetch is in progress, its
53
+ * Promise<Response | null> is stored here so navigation can await
54
+ * it instead of starting a duplicate request.
55
+ */
56
+ const inflightPromises = new Map<string, Promise<Response | null>>();
57
+
47
58
  // Generation counter incremented on each clearPrefetchCache(). Fetches that
48
59
  // started before a clear carry a stale generation and must not store their
49
60
  // response (the data may be stale due to a server action invalidation).
@@ -78,6 +89,9 @@ export function hasPrefetch(key: string): boolean {
78
89
  * Consume a cached prefetch response. Returns null if not found or expired.
79
90
  * One-time consumption: the entry is deleted after retrieval.
80
91
  * Returns null when caching is disabled (TTL <= 0).
92
+ *
93
+ * Does NOT check in-flight prefetches — use consumeInflightPrefetch()
94
+ * for that (returns a Promise instead of a Response).
81
95
  */
82
96
  export function consumePrefetch(key: string): Response | null {
83
97
  if (cacheTTL <= 0) return null;
@@ -91,6 +105,29 @@ export function consumePrefetch(key: string): Response | null {
91
105
  return entry.response;
92
106
  }
93
107
 
108
+ /**
109
+ * Consume an in-flight prefetch promise. Returns null if no prefetch is
110
+ * in-flight for this key. The returned Promise resolves to the buffered
111
+ * Response (or null if the fetch failed/was aborted).
112
+ *
113
+ * One-time consumption: the promise entry is removed so a second call
114
+ * returns null. The `inflight` set entry is intentionally kept so that
115
+ * hasPrefetch() continues to return true while the underlying fetch is
116
+ * still downloading — this prevents prefetchDirect() or other callers
117
+ * from starting a duplicate request during the handoff window. The
118
+ * inflight flag is cleaned up naturally by clearPrefetchInflight() in
119
+ * the fetch's .finally().
120
+ */
121
+ export function consumeInflightPrefetch(
122
+ key: string,
123
+ ): Promise<Response | null> | null {
124
+ const promise = inflightPromises.get(key);
125
+ if (!promise) return null;
126
+ // Remove the promise (one-time consumption) but keep the inflight flag.
127
+ inflightPromises.delete(key);
128
+ return promise;
129
+ }
130
+
94
131
  /**
95
132
  * Store a prefetch response in the in-memory cache.
96
133
  * The response body must be fully buffered (e.g. via arrayBuffer()) before
@@ -136,19 +173,34 @@ export function markPrefetchInflight(key: string): void {
136
173
  inflight.add(key);
137
174
  }
138
175
 
176
+ /**
177
+ * Store the in-flight Promise for a prefetch so navigation can reuse it.
178
+ */
179
+ export function setInflightPromise(
180
+ key: string,
181
+ promise: Promise<Response | null>,
182
+ ): void {
183
+ inflightPromises.set(key, promise);
184
+ }
185
+
139
186
  export function clearPrefetchInflight(key: string): void {
140
187
  inflight.delete(key);
188
+ inflightPromises.delete(key);
141
189
  }
142
190
 
143
191
  /**
144
192
  * Invalidate all prefetch state. Called when server actions mutate data.
145
193
  * Clears the in-memory cache, cancels in-flight prefetches, and rotates
146
194
  * the Rango state key so CDN-cached responses are also invalidated.
195
+ *
196
+ * Uses abortAllPrefetches (hard cancel) because in-flight responses
197
+ * may contain stale data after a mutation.
147
198
  */
148
199
  export function clearPrefetchCache(): void {
149
200
  generation++;
150
201
  inflight.clear();
202
+ inflightPromises.clear();
151
203
  cache.clear();
152
- cancelAllPrefetches();
204
+ abortAllPrefetches();
153
205
  invalidateRangoState();
154
206
  }
@@ -6,12 +6,16 @@
6
6
  * real navigation so the server returns a proper diff. The Response is fully
7
7
  * buffered and stored in an in-memory cache for instant consumption on
8
8
  * subsequent navigation.
9
+ *
10
+ * In-flight promises are tracked in the cache so that navigation can reuse
11
+ * a prefetch that is still downloading instead of starting a duplicate request.
9
12
  */
10
13
 
11
14
  import {
12
15
  buildPrefetchKey,
13
16
  hasPrefetch,
14
17
  markPrefetchInflight,
18
+ setInflightPromise,
15
19
  storePrefetch,
16
20
  clearPrefetchInflight,
17
21
  currentGeneration,
@@ -52,18 +56,19 @@ function buildPrefetchUrl(
52
56
 
53
57
  /**
54
58
  * Core prefetch fetch logic. Fetches the response, fully buffers the body,
55
- * and stores it in the in-memory cache. Returns a Promise and accepts an
56
- * optional AbortSignal for cancellation by the prefetch queue.
59
+ * and stores it in the in-memory cache. The returned Promise resolves to
60
+ * the buffered Response (or null on failure) so navigation can reuse
61
+ * in-flight prefetches via consumeInflightPrefetch().
57
62
  */
58
63
  function executePrefetchFetch(
59
64
  key: string,
60
65
  fetchUrl: string,
61
66
  signal?: AbortSignal,
62
- ): Promise<void> {
67
+ ): Promise<Response | null> {
63
68
  const gen = currentGeneration();
64
69
  markPrefetchInflight(key);
65
70
 
66
- return fetch(fetchUrl, {
71
+ const promise: Promise<Response | null> = fetch(fetchUrl, {
67
72
  priority: "low" as RequestPriority,
68
73
  signal,
69
74
  headers: {
@@ -73,7 +78,7 @@ function executePrefetchFetch(
73
78
  },
74
79
  })
75
80
  .then(async (response) => {
76
- if (!response.ok) return;
81
+ if (!response.ok) return null;
77
82
  // Fully buffer the response body so the cached Response is
78
83
  // self-contained and doesn't depend on the network connection.
79
84
  // This eliminates the race condition where the user clicks before
@@ -84,14 +89,16 @@ function executePrefetchFetch(
84
89
  status: response.status,
85
90
  statusText: response.statusText,
86
91
  });
87
- storePrefetch(key, cachedResponse, gen);
88
- })
89
- .catch(() => {
90
- // Silently ignore prefetch failures (including abort)
92
+ storePrefetch(key, cachedResponse.clone(), gen);
93
+ return cachedResponse;
91
94
  })
95
+ .catch(() => null)
92
96
  .finally(() => {
93
97
  clearPrefetchInflight(key);
94
98
  });
99
+
100
+ setInflightPromise(key, promise);
101
+ return promise;
95
102
  }
96
103
 
97
104
  /**
@@ -128,8 +135,11 @@ export function prefetchQueued(
128
135
  const key = buildPrefetchKey(window.location.href, targetUrl);
129
136
  if (hasPrefetch(key)) return key;
130
137
  const fetchUrlStr = targetUrl.toString();
131
- enqueuePrefetch(key, (signal) =>
132
- executePrefetchFetch(key, fetchUrlStr, signal),
133
- );
138
+ enqueuePrefetch(key, (signal) => {
139
+ // Re-check at execution time: a hover-triggered prefetchDirect may
140
+ // have started or completed this key while the item sat in the queue.
141
+ if (hasPrefetch(key)) return Promise.resolve();
142
+ return executePrefetchFetch(key, fetchUrlStr, signal).then(() => {});
143
+ });
134
144
  return key;
135
145
  }
@@ -5,12 +5,22 @@
5
5
  * Hover prefetches bypass this queue — they fire directly for immediate response
6
6
  * to user intent.
7
7
  *
8
- * All queued/executing prefetches share a single AbortController so they can
9
- * be cancelled in bulk when a navigation starts.
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.
11
+ *
12
+ * When a navigation starts, queued prefetches are cancelled but executing ones
13
+ * are left running. Navigation can reuse their in-flight responses via the
14
+ * prefetch cache's inflight promise map, avoiding duplicate requests.
10
15
  */
11
16
 
12
17
  const MAX_CONCURRENT = 2;
13
18
 
19
+ const deferToNextPaint: (fn: () => void) => void =
20
+ typeof requestAnimationFrame === "function"
21
+ ? requestAnimationFrame
22
+ : (fn) => setTimeout(fn, 0);
23
+
14
24
  let active = 0;
15
25
  const queue: Array<{
16
26
  key: string;
@@ -19,6 +29,7 @@ const queue: Array<{
19
29
  const queued = new Set<string>();
20
30
  const executing = new Set<string>();
21
31
  let abortController: AbortController | null = null;
32
+ let drainScheduled = false;
22
33
 
23
34
  function startExecution(
24
35
  key: string,
@@ -34,6 +45,21 @@ function startExecution(
34
45
  if (executing.delete(key)) {
35
46
  active--;
36
47
  }
48
+ scheduleDrain();
49
+ });
50
+ }
51
+
52
+ /**
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.
56
+ */
57
+ function scheduleDrain(): void {
58
+ if (drainScheduled) return;
59
+ if (active >= MAX_CONCURRENT || queue.length === 0) return;
60
+ drainScheduled = true;
61
+ deferToNextPaint(() => {
62
+ drainScheduled = false;
37
63
  drain();
38
64
  });
39
65
  }
@@ -48,8 +74,8 @@ function drain(): void {
48
74
 
49
75
  /**
50
76
  * Enqueue a prefetch for concurrency-limited execution.
51
- * If below the concurrency limit, executes immediately.
52
- * Otherwise queues for later execution.
77
+ * Execution is always deferred to the next animation frame to avoid
78
+ * blocking paint, even when below the concurrency limit.
53
79
  * Deduplicates by key — items already queued or executing are skipped.
54
80
  *
55
81
  * The executor receives an AbortSignal that is aborted when
@@ -61,20 +87,33 @@ export function enqueuePrefetch(
61
87
  ): void {
62
88
  if (queued.has(key) || executing.has(key)) return;
63
89
 
64
- if (active < MAX_CONCURRENT) {
65
- startExecution(key, execute);
66
- } else {
67
- queued.add(key);
68
- queue.push({ key, execute });
69
- }
90
+ queued.add(key);
91
+ queue.push({ key, execute });
92
+ scheduleDrain();
70
93
  }
71
94
 
72
95
  /**
73
- * Cancel all in-flight and queued prefetches.
74
- * Called when a navigation starts speculative prefetches should not
75
- * compete with navigation fetches for connection slots.
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.
101
+ *
102
+ * Called when a navigation starts via the NavigationProvider's
103
+ * event controller subscription.
76
104
  */
77
105
  export function cancelAllPrefetches(): void {
106
+ queue.length = 0;
107
+ queued.clear();
108
+ drainScheduled = false;
109
+ }
110
+
111
+ /**
112
+ * Hard-cancel everything including in-flight prefetches.
113
+ * Used by clearPrefetchCache (server action invalidation) where
114
+ * in-flight responses would be stale.
115
+ */
116
+ export function abortAllPrefetches(): void {
78
117
  abortController?.abort();
79
118
  abortController = null;
80
119
 
@@ -85,4 +124,5 @@ export function cancelAllPrefetches(): void {
85
124
  // so active settles at 0 without underflow.
86
125
  executing.clear();
87
126
  active = 0;
127
+ drainScheduled = false;
88
128
  }