@rangojs/router 0.0.0-experimental.78a48627 → 0.0.0-experimental.78adc454

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 (863) hide show
  1. package/dist/bin/rango.js +8 -3
  2. package/dist/vite/index.js +155 -201
  3. package/package.json +1 -1
  4. package/skills/caching/SKILL.md +37 -4
  5. package/skills/parallel/SKILL.md +126 -0
  6. package/src/browser/event-controller.ts +5 -0
  7. package/src/browser/navigation-client.ts +60 -27
  8. package/src/browser/partial-update.ts +23 -16
  9. package/src/browser/prefetch/cache.ts +57 -5
  10. package/src/browser/prefetch/fetch.ts +30 -21
  11. package/src/browser/prefetch/queue.ts +53 -13
  12. package/src/browser/react/Link.tsx +9 -1
  13. package/src/browser/react/NavigationProvider.tsx +3 -3
  14. package/src/browser/rsc-router.tsx +109 -57
  15. package/src/browser/scroll-restoration.ts +11 -10
  16. package/src/browser/segment-reconciler.ts +6 -1
  17. package/src/build/route-types/router-processing.ts +12 -2
  18. package/src/cache/cache-runtime.ts +15 -11
  19. package/src/cache/cache-scope.ts +48 -7
  20. package/src/cache/cf/cf-cache-store.ts +453 -11
  21. package/src/cache/cf/index.ts +5 -1
  22. package/src/cache/document-cache.ts +17 -7
  23. package/src/cache/index.ts +1 -0
  24. package/src/cache/taint.ts +55 -0
  25. package/src/context-var.ts +72 -2
  26. package/src/debug.ts +2 -2
  27. package/src/route-definition/dsl-helpers.ts +32 -7
  28. package/src/route-definition/redirect.ts +2 -2
  29. package/src/router/handler-context.ts +31 -8
  30. package/src/router/lazy-includes.ts +2 -1
  31. package/src/router/logging.ts +1 -1
  32. package/src/router/manifest.ts +6 -2
  33. package/src/router/match-middleware/background-revalidation.ts +30 -2
  34. package/src/router/match-middleware/cache-lookup.ts +66 -9
  35. package/src/router/match-middleware/cache-store.ts +53 -10
  36. package/src/router/match-middleware/intercept-resolution.ts +9 -7
  37. package/src/router/match-middleware/segment-resolution.ts +7 -5
  38. package/src/router/match-result.ts +22 -6
  39. package/src/router/metrics.ts +6 -1
  40. package/src/router/middleware-types.ts +6 -2
  41. package/src/router/middleware.ts +4 -3
  42. package/src/router/router-context.ts +1 -0
  43. package/src/router/segment-resolution/fresh.ts +130 -16
  44. package/src/router/segment-resolution/loader-cache.ts +1 -0
  45. package/src/router/segment-resolution/revalidation.ts +348 -289
  46. package/src/router.ts +1 -1
  47. package/src/segment-system.tsx +140 -4
  48. package/src/server/context.ts +101 -13
  49. package/src/server/request-context.ts +53 -11
  50. package/src/ssr/index.tsx +1 -0
  51. package/src/types/handler-context.ts +113 -19
  52. package/src/types/segments.ts +2 -0
  53. package/src/urls/path-helper.ts +1 -1
  54. package/src/vite/discovery/state.ts +0 -2
  55. package/src/vite/plugin-types.ts +0 -83
  56. package/src/vite/plugins/expose-action-id.ts +1 -3
  57. package/src/vite/plugins/version-plugin.ts +13 -1
  58. package/src/vite/rango.ts +144 -209
  59. package/src/vite/router-discovery.ts +0 -8
  60. package/src/vite/utils/banner.ts +3 -3
  61. package/dist/__internal.d.ts +0 -83
  62. package/dist/__internal.d.ts.map +0 -1
  63. package/dist/__internal.js +0 -19
  64. package/dist/__internal.js.map +0 -1
  65. package/dist/__mocks__/version.d.ts +0 -7
  66. package/dist/__mocks__/version.d.ts.map +0 -1
  67. package/dist/__mocks__/version.js +0 -7
  68. package/dist/__mocks__/version.js.map +0 -1
  69. package/dist/__tests__/client-href.test.d.ts +0 -2
  70. package/dist/__tests__/client-href.test.d.ts.map +0 -1
  71. package/dist/__tests__/client-href.test.js +0 -74
  72. package/dist/__tests__/client-href.test.js.map +0 -1
  73. package/dist/__tests__/component-utils.test.d.ts +0 -2
  74. package/dist/__tests__/component-utils.test.d.ts.map +0 -1
  75. package/dist/__tests__/component-utils.test.js +0 -51
  76. package/dist/__tests__/component-utils.test.js.map +0 -1
  77. package/dist/__tests__/event-controller.test.d.ts +0 -2
  78. package/dist/__tests__/event-controller.test.d.ts.map +0 -1
  79. package/dist/__tests__/event-controller.test.js +0 -538
  80. package/dist/__tests__/event-controller.test.js.map +0 -1
  81. package/dist/__tests__/helpers/route-tree.d.ts +0 -118
  82. package/dist/__tests__/helpers/route-tree.d.ts.map +0 -1
  83. package/dist/__tests__/helpers/route-tree.js +0 -374
  84. package/dist/__tests__/helpers/route-tree.js.map +0 -1
  85. package/dist/__tests__/match-result.test.d.ts +0 -2
  86. package/dist/__tests__/match-result.test.d.ts.map +0 -1
  87. package/dist/__tests__/match-result.test.js +0 -154
  88. package/dist/__tests__/match-result.test.js.map +0 -1
  89. package/dist/__tests__/navigation-store.test.d.ts +0 -2
  90. package/dist/__tests__/navigation-store.test.d.ts.map +0 -1
  91. package/dist/__tests__/navigation-store.test.js +0 -440
  92. package/dist/__tests__/navigation-store.test.js.map +0 -1
  93. package/dist/__tests__/partial-update.test.d.ts +0 -2
  94. package/dist/__tests__/partial-update.test.d.ts.map +0 -1
  95. package/dist/__tests__/partial-update.test.js +0 -1009
  96. package/dist/__tests__/partial-update.test.js.map +0 -1
  97. package/dist/__tests__/reverse-types.test.d.ts +0 -8
  98. package/dist/__tests__/reverse-types.test.d.ts.map +0 -1
  99. package/dist/__tests__/reverse-types.test.js +0 -656
  100. package/dist/__tests__/reverse-types.test.js.map +0 -1
  101. package/dist/__tests__/route-definition.test.d.ts +0 -2
  102. package/dist/__tests__/route-definition.test.d.ts.map +0 -1
  103. package/dist/__tests__/route-definition.test.js +0 -55
  104. package/dist/__tests__/route-definition.test.js.map +0 -1
  105. package/dist/__tests__/router-helpers.test.d.ts +0 -2
  106. package/dist/__tests__/router-helpers.test.d.ts.map +0 -1
  107. package/dist/__tests__/router-helpers.test.js +0 -377
  108. package/dist/__tests__/router-helpers.test.js.map +0 -1
  109. package/dist/__tests__/router-integration-2.test.d.ts +0 -2
  110. package/dist/__tests__/router-integration-2.test.d.ts.map +0 -1
  111. package/dist/__tests__/router-integration-2.test.js +0 -426
  112. package/dist/__tests__/router-integration-2.test.js.map +0 -1
  113. package/dist/__tests__/router-integration.test.d.ts +0 -2
  114. package/dist/__tests__/router-integration.test.d.ts.map +0 -1
  115. package/dist/__tests__/router-integration.test.js +0 -1051
  116. package/dist/__tests__/router-integration.test.js.map +0 -1
  117. package/dist/__tests__/search-params.test.d.ts +0 -5
  118. package/dist/__tests__/search-params.test.d.ts.map +0 -1
  119. package/dist/__tests__/search-params.test.js +0 -306
  120. package/dist/__tests__/search-params.test.js.map +0 -1
  121. package/dist/__tests__/segment-system.test.d.ts +0 -2
  122. package/dist/__tests__/segment-system.test.d.ts.map +0 -1
  123. package/dist/__tests__/segment-system.test.js +0 -627
  124. package/dist/__tests__/segment-system.test.js.map +0 -1
  125. package/dist/__tests__/static-handler-types.test.d.ts +0 -8
  126. package/dist/__tests__/static-handler-types.test.d.ts.map +0 -1
  127. package/dist/__tests__/static-handler-types.test.js +0 -63
  128. package/dist/__tests__/static-handler-types.test.js.map +0 -1
  129. package/dist/__tests__/urls.test.d.ts +0 -2
  130. package/dist/__tests__/urls.test.d.ts.map +0 -1
  131. package/dist/__tests__/urls.test.js +0 -421
  132. package/dist/__tests__/urls.test.js.map +0 -1
  133. package/dist/__tests__/use-mount.test.d.ts +0 -2
  134. package/dist/__tests__/use-mount.test.d.ts.map +0 -1
  135. package/dist/__tests__/use-mount.test.js +0 -35
  136. package/dist/__tests__/use-mount.test.js.map +0 -1
  137. package/dist/bin/rango.d.ts +0 -2
  138. package/dist/bin/rango.d.ts.map +0 -1
  139. package/dist/bin/rango.js.map +0 -1
  140. package/dist/browser/event-controller.d.ts +0 -191
  141. package/dist/browser/event-controller.d.ts.map +0 -1
  142. package/dist/browser/event-controller.js +0 -559
  143. package/dist/browser/event-controller.js.map +0 -1
  144. package/dist/browser/index.d.ts +0 -2
  145. package/dist/browser/index.d.ts.map +0 -1
  146. package/dist/browser/index.js +0 -14
  147. package/dist/browser/index.js.map +0 -1
  148. package/dist/browser/link-interceptor.d.ts +0 -38
  149. package/dist/browser/link-interceptor.d.ts.map +0 -1
  150. package/dist/browser/link-interceptor.js +0 -99
  151. package/dist/browser/link-interceptor.js.map +0 -1
  152. package/dist/browser/logging.d.ts +0 -10
  153. package/dist/browser/logging.d.ts.map +0 -1
  154. package/dist/browser/logging.js +0 -29
  155. package/dist/browser/logging.js.map +0 -1
  156. package/dist/browser/lru-cache.d.ts +0 -17
  157. package/dist/browser/lru-cache.d.ts.map +0 -1
  158. package/dist/browser/lru-cache.js +0 -50
  159. package/dist/browser/lru-cache.js.map +0 -1
  160. package/dist/browser/merge-segment-loaders.d.ts +0 -39
  161. package/dist/browser/merge-segment-loaders.d.ts.map +0 -1
  162. package/dist/browser/merge-segment-loaders.js +0 -102
  163. package/dist/browser/merge-segment-loaders.js.map +0 -1
  164. package/dist/browser/navigation-bridge.d.ts +0 -102
  165. package/dist/browser/navigation-bridge.d.ts.map +0 -1
  166. package/dist/browser/navigation-bridge.js +0 -708
  167. package/dist/browser/navigation-bridge.js.map +0 -1
  168. package/dist/browser/navigation-client.d.ts +0 -25
  169. package/dist/browser/navigation-client.d.ts.map +0 -1
  170. package/dist/browser/navigation-client.js +0 -157
  171. package/dist/browser/navigation-client.js.map +0 -1
  172. package/dist/browser/navigation-store.d.ts +0 -101
  173. package/dist/browser/navigation-store.d.ts.map +0 -1
  174. package/dist/browser/navigation-store.js +0 -625
  175. package/dist/browser/navigation-store.js.map +0 -1
  176. package/dist/browser/partial-update.d.ts +0 -75
  177. package/dist/browser/partial-update.d.ts.map +0 -1
  178. package/dist/browser/partial-update.js +0 -426
  179. package/dist/browser/partial-update.js.map +0 -1
  180. package/dist/browser/react/Link.d.ts +0 -86
  181. package/dist/browser/react/Link.d.ts.map +0 -1
  182. package/dist/browser/react/Link.js +0 -128
  183. package/dist/browser/react/Link.js.map +0 -1
  184. package/dist/browser/react/NavigationProvider.d.ts +0 -63
  185. package/dist/browser/react/NavigationProvider.d.ts.map +0 -1
  186. package/dist/browser/react/NavigationProvider.js +0 -216
  187. package/dist/browser/react/NavigationProvider.js.map +0 -1
  188. package/dist/browser/react/ScrollRestoration.d.ts +0 -75
  189. package/dist/browser/react/ScrollRestoration.d.ts.map +0 -1
  190. package/dist/browser/react/ScrollRestoration.js +0 -57
  191. package/dist/browser/react/ScrollRestoration.js.map +0 -1
  192. package/dist/browser/react/context.d.ts +0 -46
  193. package/dist/browser/react/context.d.ts.map +0 -1
  194. package/dist/browser/react/context.js +0 -10
  195. package/dist/browser/react/context.js.map +0 -1
  196. package/dist/browser/react/index.d.ts +0 -11
  197. package/dist/browser/react/index.d.ts.map +0 -1
  198. package/dist/browser/react/index.js +0 -22
  199. package/dist/browser/react/index.js.map +0 -1
  200. package/dist/browser/react/location-state-shared.d.ts +0 -63
  201. package/dist/browser/react/location-state-shared.d.ts.map +0 -1
  202. package/dist/browser/react/location-state-shared.js +0 -81
  203. package/dist/browser/react/location-state-shared.js.map +0 -1
  204. package/dist/browser/react/location-state.d.ts +0 -23
  205. package/dist/browser/react/location-state.d.ts.map +0 -1
  206. package/dist/browser/react/location-state.js +0 -29
  207. package/dist/browser/react/location-state.js.map +0 -1
  208. package/dist/browser/react/mount-context.d.ts +0 -24
  209. package/dist/browser/react/mount-context.d.ts.map +0 -1
  210. package/dist/browser/react/mount-context.js +0 -24
  211. package/dist/browser/react/mount-context.js.map +0 -1
  212. package/dist/browser/react/use-action.d.ts +0 -64
  213. package/dist/browser/react/use-action.d.ts.map +0 -1
  214. package/dist/browser/react/use-action.js +0 -134
  215. package/dist/browser/react/use-action.js.map +0 -1
  216. package/dist/browser/react/use-client-cache.d.ts +0 -41
  217. package/dist/browser/react/use-client-cache.d.ts.map +0 -1
  218. package/dist/browser/react/use-client-cache.js +0 -39
  219. package/dist/browser/react/use-client-cache.js.map +0 -1
  220. package/dist/browser/react/use-handle.d.ts +0 -31
  221. package/dist/browser/react/use-handle.d.ts.map +0 -1
  222. package/dist/browser/react/use-handle.js +0 -144
  223. package/dist/browser/react/use-handle.js.map +0 -1
  224. package/dist/browser/react/use-href.d.ts +0 -33
  225. package/dist/browser/react/use-href.d.ts.map +0 -1
  226. package/dist/browser/react/use-href.js +0 -39
  227. package/dist/browser/react/use-href.js.map +0 -1
  228. package/dist/browser/react/use-link-status.d.ts +0 -37
  229. package/dist/browser/react/use-link-status.d.ts.map +0 -1
  230. package/dist/browser/react/use-link-status.js +0 -99
  231. package/dist/browser/react/use-link-status.js.map +0 -1
  232. package/dist/browser/react/use-mount.d.ts +0 -25
  233. package/dist/browser/react/use-mount.d.ts.map +0 -1
  234. package/dist/browser/react/use-mount.js +0 -30
  235. package/dist/browser/react/use-mount.js.map +0 -1
  236. package/dist/browser/react/use-navigation.d.ts +0 -27
  237. package/dist/browser/react/use-navigation.d.ts.map +0 -1
  238. package/dist/browser/react/use-navigation.js +0 -87
  239. package/dist/browser/react/use-navigation.js.map +0 -1
  240. package/dist/browser/react/use-segments.d.ts +0 -38
  241. package/dist/browser/react/use-segments.d.ts.map +0 -1
  242. package/dist/browser/react/use-segments.js +0 -130
  243. package/dist/browser/react/use-segments.js.map +0 -1
  244. package/dist/browser/request-controller.d.ts +0 -26
  245. package/dist/browser/request-controller.d.ts.map +0 -1
  246. package/dist/browser/request-controller.js +0 -147
  247. package/dist/browser/request-controller.js.map +0 -1
  248. package/dist/browser/rsc-router.d.ts +0 -129
  249. package/dist/browser/rsc-router.d.ts.map +0 -1
  250. package/dist/browser/rsc-router.js +0 -195
  251. package/dist/browser/rsc-router.js.map +0 -1
  252. package/dist/browser/scroll-restoration.d.ts +0 -93
  253. package/dist/browser/scroll-restoration.d.ts.map +0 -1
  254. package/dist/browser/scroll-restoration.js +0 -321
  255. package/dist/browser/scroll-restoration.js.map +0 -1
  256. package/dist/browser/segment-structure-assert.d.ts +0 -17
  257. package/dist/browser/segment-structure-assert.d.ts.map +0 -1
  258. package/dist/browser/segment-structure-assert.js +0 -59
  259. package/dist/browser/segment-structure-assert.js.map +0 -1
  260. package/dist/browser/server-action-bridge.d.ts +0 -26
  261. package/dist/browser/server-action-bridge.d.ts.map +0 -1
  262. package/dist/browser/server-action-bridge.js +0 -668
  263. package/dist/browser/server-action-bridge.js.map +0 -1
  264. package/dist/browser/shallow.d.ts +0 -12
  265. package/dist/browser/shallow.d.ts.map +0 -1
  266. package/dist/browser/shallow.js +0 -34
  267. package/dist/browser/shallow.js.map +0 -1
  268. package/dist/browser/types.d.ts +0 -369
  269. package/dist/browser/types.d.ts.map +0 -1
  270. package/dist/browser/types.js +0 -2
  271. package/dist/browser/types.js.map +0 -1
  272. package/dist/build/__tests__/generate-cli.test.d.ts +0 -2
  273. package/dist/build/__tests__/generate-cli.test.d.ts.map +0 -1
  274. package/dist/build/__tests__/generate-cli.test.js +0 -237
  275. package/dist/build/__tests__/generate-cli.test.js.map +0 -1
  276. package/dist/build/__tests__/generate-manifest.test.d.ts +0 -2
  277. package/dist/build/__tests__/generate-manifest.test.d.ts.map +0 -1
  278. package/dist/build/__tests__/generate-manifest.test.js +0 -119
  279. package/dist/build/__tests__/generate-manifest.test.js.map +0 -1
  280. package/dist/build/__tests__/generate-route-types.test.d.ts +0 -2
  281. package/dist/build/__tests__/generate-route-types.test.d.ts.map +0 -1
  282. package/dist/build/__tests__/generate-route-types.test.js +0 -620
  283. package/dist/build/__tests__/generate-route-types.test.js.map +0 -1
  284. package/dist/build/__tests__/per-router-manifest.test.d.ts +0 -2
  285. package/dist/build/__tests__/per-router-manifest.test.d.ts.map +0 -1
  286. package/dist/build/__tests__/per-router-manifest.test.js +0 -308
  287. package/dist/build/__tests__/per-router-manifest.test.js.map +0 -1
  288. package/dist/build/generate-manifest.d.ts +0 -81
  289. package/dist/build/generate-manifest.d.ts.map +0 -1
  290. package/dist/build/generate-manifest.js +0 -276
  291. package/dist/build/generate-manifest.js.map +0 -1
  292. package/dist/build/generate-route-types.d.ts +0 -115
  293. package/dist/build/generate-route-types.d.ts.map +0 -1
  294. package/dist/build/generate-route-types.js +0 -740
  295. package/dist/build/generate-route-types.js.map +0 -1
  296. package/dist/build/index.d.ts +0 -21
  297. package/dist/build/index.d.ts.map +0 -1
  298. package/dist/build/index.js +0 -21
  299. package/dist/build/index.js.map +0 -1
  300. package/dist/build/route-trie.d.ts +0 -71
  301. package/dist/build/route-trie.d.ts.map +0 -1
  302. package/dist/build/route-trie.js +0 -175
  303. package/dist/build/route-trie.js.map +0 -1
  304. package/dist/cache/__tests__/cache-scope.test.d.ts +0 -2
  305. package/dist/cache/__tests__/cache-scope.test.d.ts.map +0 -1
  306. package/dist/cache/__tests__/cache-scope.test.js +0 -208
  307. package/dist/cache/__tests__/cache-scope.test.js.map +0 -1
  308. package/dist/cache/__tests__/document-cache.test.d.ts +0 -2
  309. package/dist/cache/__tests__/document-cache.test.d.ts.map +0 -1
  310. package/dist/cache/__tests__/document-cache.test.js +0 -345
  311. package/dist/cache/__tests__/document-cache.test.js.map +0 -1
  312. package/dist/cache/__tests__/memory-segment-store.test.d.ts +0 -2
  313. package/dist/cache/__tests__/memory-segment-store.test.d.ts.map +0 -1
  314. package/dist/cache/__tests__/memory-segment-store.test.js +0 -425
  315. package/dist/cache/__tests__/memory-segment-store.test.js.map +0 -1
  316. package/dist/cache/__tests__/memory-store.test.d.ts +0 -2
  317. package/dist/cache/__tests__/memory-store.test.d.ts.map +0 -1
  318. package/dist/cache/__tests__/memory-store.test.js +0 -367
  319. package/dist/cache/__tests__/memory-store.test.js.map +0 -1
  320. package/dist/cache/cache-scope.d.ts +0 -102
  321. package/dist/cache/cache-scope.d.ts.map +0 -1
  322. package/dist/cache/cache-scope.js +0 -440
  323. package/dist/cache/cache-scope.js.map +0 -1
  324. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts +0 -2
  325. package/dist/cache/cf/__tests__/cf-cache-store.test.d.ts.map +0 -1
  326. package/dist/cache/cf/__tests__/cf-cache-store.test.js +0 -330
  327. package/dist/cache/cf/__tests__/cf-cache-store.test.js.map +0 -1
  328. package/dist/cache/cf/cf-cache-store.d.ts +0 -165
  329. package/dist/cache/cf/cf-cache-store.d.ts.map +0 -1
  330. package/dist/cache/cf/cf-cache-store.js +0 -242
  331. package/dist/cache/cf/cf-cache-store.js.map +0 -1
  332. package/dist/cache/cf/index.d.ts +0 -14
  333. package/dist/cache/cf/index.d.ts.map +0 -1
  334. package/dist/cache/cf/index.js +0 -17
  335. package/dist/cache/cf/index.js.map +0 -1
  336. package/dist/cache/document-cache.d.ts +0 -64
  337. package/dist/cache/document-cache.d.ts.map +0 -1
  338. package/dist/cache/document-cache.js +0 -228
  339. package/dist/cache/document-cache.js.map +0 -1
  340. package/dist/cache/index.d.ts +0 -19
  341. package/dist/cache/index.d.ts.map +0 -1
  342. package/dist/cache/index.js +0 -21
  343. package/dist/cache/index.js.map +0 -1
  344. package/dist/cache/memory-segment-store.d.ts +0 -110
  345. package/dist/cache/memory-segment-store.d.ts.map +0 -1
  346. package/dist/cache/memory-segment-store.js +0 -117
  347. package/dist/cache/memory-segment-store.js.map +0 -1
  348. package/dist/cache/memory-store.d.ts +0 -41
  349. package/dist/cache/memory-store.d.ts.map +0 -1
  350. package/dist/cache/memory-store.js +0 -191
  351. package/dist/cache/memory-store.js.map +0 -1
  352. package/dist/cache/types.d.ts +0 -317
  353. package/dist/cache/types.d.ts.map +0 -1
  354. package/dist/cache/types.js +0 -12
  355. package/dist/cache/types.js.map +0 -1
  356. package/dist/client.d.ts +0 -248
  357. package/dist/client.d.ts.map +0 -1
  358. package/dist/client.js +0 -367
  359. package/dist/client.js.map +0 -1
  360. package/dist/client.rsc.d.ts +0 -26
  361. package/dist/client.rsc.d.ts.map +0 -1
  362. package/dist/client.rsc.js +0 -46
  363. package/dist/client.rsc.js.map +0 -1
  364. package/dist/component-utils.d.ts +0 -36
  365. package/dist/component-utils.d.ts.map +0 -1
  366. package/dist/component-utils.js +0 -61
  367. package/dist/component-utils.js.map +0 -1
  368. package/dist/components/DefaultDocument.d.ts +0 -13
  369. package/dist/components/DefaultDocument.d.ts.map +0 -1
  370. package/dist/components/DefaultDocument.js +0 -15
  371. package/dist/components/DefaultDocument.js.map +0 -1
  372. package/dist/debug.d.ts +0 -58
  373. package/dist/debug.d.ts.map +0 -1
  374. package/dist/debug.js +0 -157
  375. package/dist/debug.js.map +0 -1
  376. package/dist/default-error-boundary.d.ts +0 -11
  377. package/dist/default-error-boundary.d.ts.map +0 -1
  378. package/dist/default-error-boundary.js +0 -45
  379. package/dist/default-error-boundary.js.map +0 -1
  380. package/dist/deps/browser.d.ts +0 -2
  381. package/dist/deps/browser.d.ts.map +0 -1
  382. package/dist/deps/browser.js +0 -3
  383. package/dist/deps/browser.js.map +0 -1
  384. package/dist/deps/html-stream-client.d.ts +0 -2
  385. package/dist/deps/html-stream-client.d.ts.map +0 -1
  386. package/dist/deps/html-stream-client.js +0 -3
  387. package/dist/deps/html-stream-client.js.map +0 -1
  388. package/dist/deps/html-stream-server.d.ts +0 -2
  389. package/dist/deps/html-stream-server.d.ts.map +0 -1
  390. package/dist/deps/html-stream-server.js +0 -3
  391. package/dist/deps/html-stream-server.js.map +0 -1
  392. package/dist/deps/rsc.d.ts +0 -2
  393. package/dist/deps/rsc.d.ts.map +0 -1
  394. package/dist/deps/rsc.js +0 -4
  395. package/dist/deps/rsc.js.map +0 -1
  396. package/dist/deps/ssr.d.ts +0 -2
  397. package/dist/deps/ssr.d.ts.map +0 -1
  398. package/dist/deps/ssr.js +0 -3
  399. package/dist/deps/ssr.js.map +0 -1
  400. package/dist/errors.d.ts +0 -174
  401. package/dist/errors.d.ts.map +0 -1
  402. package/dist/errors.js +0 -241
  403. package/dist/errors.js.map +0 -1
  404. package/dist/handle.d.ts +0 -78
  405. package/dist/handle.d.ts.map +0 -1
  406. package/dist/handle.js +0 -82
  407. package/dist/handle.js.map +0 -1
  408. package/dist/handles/MetaTags.d.ts +0 -14
  409. package/dist/handles/MetaTags.d.ts.map +0 -1
  410. package/dist/handles/MetaTags.js +0 -136
  411. package/dist/handles/MetaTags.js.map +0 -1
  412. package/dist/handles/index.d.ts +0 -6
  413. package/dist/handles/index.d.ts.map +0 -1
  414. package/dist/handles/index.js +0 -6
  415. package/dist/handles/index.js.map +0 -1
  416. package/dist/handles/meta.d.ts +0 -39
  417. package/dist/handles/meta.d.ts.map +0 -1
  418. package/dist/handles/meta.js +0 -202
  419. package/dist/handles/meta.js.map +0 -1
  420. package/dist/host/__tests__/errors.test.d.ts +0 -2
  421. package/dist/host/__tests__/errors.test.d.ts.map +0 -1
  422. package/dist/host/__tests__/errors.test.js +0 -76
  423. package/dist/host/__tests__/errors.test.js.map +0 -1
  424. package/dist/host/__tests__/pattern-comprehensive.test.d.ts +0 -2
  425. package/dist/host/__tests__/pattern-comprehensive.test.d.ts.map +0 -1
  426. package/dist/host/__tests__/pattern-comprehensive.test.js +0 -732
  427. package/dist/host/__tests__/pattern-comprehensive.test.js.map +0 -1
  428. package/dist/host/__tests__/pattern-matcher.test.d.ts +0 -2
  429. package/dist/host/__tests__/pattern-matcher.test.d.ts.map +0 -1
  430. package/dist/host/__tests__/pattern-matcher.test.js +0 -251
  431. package/dist/host/__tests__/pattern-matcher.test.js.map +0 -1
  432. package/dist/host/__tests__/router.test.d.ts +0 -2
  433. package/dist/host/__tests__/router.test.d.ts.map +0 -1
  434. package/dist/host/__tests__/router.test.js +0 -241
  435. package/dist/host/__tests__/router.test.js.map +0 -1
  436. package/dist/host/__tests__/testing.test.d.ts +0 -2
  437. package/dist/host/__tests__/testing.test.d.ts.map +0 -1
  438. package/dist/host/__tests__/testing.test.js +0 -64
  439. package/dist/host/__tests__/testing.test.js.map +0 -1
  440. package/dist/host/__tests__/utils.test.d.ts +0 -2
  441. package/dist/host/__tests__/utils.test.d.ts.map +0 -1
  442. package/dist/host/__tests__/utils.test.js +0 -29
  443. package/dist/host/__tests__/utils.test.js.map +0 -1
  444. package/dist/host/cookie-handler.d.ts +0 -34
  445. package/dist/host/cookie-handler.d.ts.map +0 -1
  446. package/dist/host/cookie-handler.js +0 -124
  447. package/dist/host/cookie-handler.js.map +0 -1
  448. package/dist/host/errors.d.ts +0 -56
  449. package/dist/host/errors.d.ts.map +0 -1
  450. package/dist/host/errors.js +0 -79
  451. package/dist/host/errors.js.map +0 -1
  452. package/dist/host/index.d.ts +0 -29
  453. package/dist/host/index.d.ts.map +0 -1
  454. package/dist/host/index.js +0 -32
  455. package/dist/host/index.js.map +0 -1
  456. package/dist/host/pattern-matcher.d.ts +0 -36
  457. package/dist/host/pattern-matcher.d.ts.map +0 -1
  458. package/dist/host/pattern-matcher.js +0 -172
  459. package/dist/host/pattern-matcher.js.map +0 -1
  460. package/dist/host/router.d.ts +0 -26
  461. package/dist/host/router.d.ts.map +0 -1
  462. package/dist/host/router.js +0 -218
  463. package/dist/host/router.js.map +0 -1
  464. package/dist/host/testing.d.ts +0 -36
  465. package/dist/host/testing.d.ts.map +0 -1
  466. package/dist/host/testing.js +0 -55
  467. package/dist/host/testing.js.map +0 -1
  468. package/dist/host/types.d.ts +0 -115
  469. package/dist/host/types.d.ts.map +0 -1
  470. package/dist/host/types.js +0 -7
  471. package/dist/host/types.js.map +0 -1
  472. package/dist/host/utils.d.ts +0 -21
  473. package/dist/host/utils.d.ts.map +0 -1
  474. package/dist/host/utils.js +0 -23
  475. package/dist/host/utils.js.map +0 -1
  476. package/dist/href-client.d.ts +0 -131
  477. package/dist/href-client.d.ts.map +0 -1
  478. package/dist/href-client.js +0 -64
  479. package/dist/href-client.js.map +0 -1
  480. package/dist/href-context.d.ts +0 -29
  481. package/dist/href-context.d.ts.map +0 -1
  482. package/dist/href-context.js +0 -21
  483. package/dist/href-context.js.map +0 -1
  484. package/dist/index.d.ts +0 -73
  485. package/dist/index.d.ts.map +0 -1
  486. package/dist/index.js +0 -91
  487. package/dist/index.js.map +0 -1
  488. package/dist/index.rsc.d.ts +0 -32
  489. package/dist/index.rsc.d.ts.map +0 -1
  490. package/dist/index.rsc.js +0 -40
  491. package/dist/index.rsc.js.map +0 -1
  492. package/dist/internal-debug.d.ts +0 -2
  493. package/dist/internal-debug.d.ts.map +0 -1
  494. package/dist/internal-debug.js +0 -5
  495. package/dist/internal-debug.js.map +0 -1
  496. package/dist/loader.d.ts +0 -14
  497. package/dist/loader.d.ts.map +0 -1
  498. package/dist/loader.js +0 -20
  499. package/dist/loader.js.map +0 -1
  500. package/dist/loader.rsc.d.ts +0 -19
  501. package/dist/loader.rsc.d.ts.map +0 -1
  502. package/dist/loader.rsc.js +0 -99
  503. package/dist/loader.rsc.js.map +0 -1
  504. package/dist/network-error-thrower.d.ts +0 -17
  505. package/dist/network-error-thrower.d.ts.map +0 -1
  506. package/dist/network-error-thrower.js +0 -14
  507. package/dist/network-error-thrower.js.map +0 -1
  508. package/dist/outlet-context.d.ts +0 -13
  509. package/dist/outlet-context.d.ts.map +0 -1
  510. package/dist/outlet-context.js +0 -3
  511. package/dist/outlet-context.js.map +0 -1
  512. package/dist/prerender/__tests__/param-hash.test.d.ts +0 -2
  513. package/dist/prerender/__tests__/param-hash.test.d.ts.map +0 -1
  514. package/dist/prerender/__tests__/param-hash.test.js +0 -148
  515. package/dist/prerender/__tests__/param-hash.test.js.map +0 -1
  516. package/dist/prerender/param-hash.d.ts +0 -16
  517. package/dist/prerender/param-hash.d.ts.map +0 -1
  518. package/dist/prerender/param-hash.js +0 -36
  519. package/dist/prerender/param-hash.js.map +0 -1
  520. package/dist/prerender/store.d.ts +0 -38
  521. package/dist/prerender/store.d.ts.map +0 -1
  522. package/dist/prerender/store.js +0 -61
  523. package/dist/prerender/store.js.map +0 -1
  524. package/dist/prerender.d.ts +0 -66
  525. package/dist/prerender.d.ts.map +0 -1
  526. package/dist/prerender.js +0 -57
  527. package/dist/prerender.js.map +0 -1
  528. package/dist/reverse.d.ts +0 -196
  529. package/dist/reverse.d.ts.map +0 -1
  530. package/dist/reverse.js +0 -78
  531. package/dist/reverse.js.map +0 -1
  532. package/dist/root-error-boundary.d.ts +0 -33
  533. package/dist/root-error-boundary.d.ts.map +0 -1
  534. package/dist/root-error-boundary.js +0 -165
  535. package/dist/root-error-boundary.js.map +0 -1
  536. package/dist/route-content-wrapper.d.ts +0 -46
  537. package/dist/route-content-wrapper.d.ts.map +0 -1
  538. package/dist/route-content-wrapper.js +0 -77
  539. package/dist/route-content-wrapper.js.map +0 -1
  540. package/dist/route-definition.d.ts +0 -421
  541. package/dist/route-definition.d.ts.map +0 -1
  542. package/dist/route-definition.js +0 -868
  543. package/dist/route-definition.js.map +0 -1
  544. package/dist/route-map-builder.d.ts +0 -155
  545. package/dist/route-map-builder.d.ts.map +0 -1
  546. package/dist/route-map-builder.js +0 -237
  547. package/dist/route-map-builder.js.map +0 -1
  548. package/dist/route-types.d.ts +0 -165
  549. package/dist/route-types.d.ts.map +0 -1
  550. package/dist/route-types.js +0 -7
  551. package/dist/route-types.js.map +0 -1
  552. package/dist/router/__tests__/handler-context.test.d.ts +0 -2
  553. package/dist/router/__tests__/handler-context.test.d.ts.map +0 -1
  554. package/dist/router/__tests__/handler-context.test.js +0 -65
  555. package/dist/router/__tests__/handler-context.test.js.map +0 -1
  556. package/dist/router/__tests__/loader-cycle-detection.test.d.ts +0 -2
  557. package/dist/router/__tests__/loader-cycle-detection.test.d.ts.map +0 -1
  558. package/dist/router/__tests__/loader-cycle-detection.test.js +0 -221
  559. package/dist/router/__tests__/loader-cycle-detection.test.js.map +0 -1
  560. package/dist/router/__tests__/match-context.test.d.ts +0 -2
  561. package/dist/router/__tests__/match-context.test.d.ts.map +0 -1
  562. package/dist/router/__tests__/match-context.test.js +0 -92
  563. package/dist/router/__tests__/match-context.test.js.map +0 -1
  564. package/dist/router/__tests__/match-pipelines.test.d.ts +0 -2
  565. package/dist/router/__tests__/match-pipelines.test.d.ts.map +0 -1
  566. package/dist/router/__tests__/match-pipelines.test.js +0 -417
  567. package/dist/router/__tests__/match-pipelines.test.js.map +0 -1
  568. package/dist/router/__tests__/match-result.test.d.ts +0 -2
  569. package/dist/router/__tests__/match-result.test.d.ts.map +0 -1
  570. package/dist/router/__tests__/match-result.test.js +0 -457
  571. package/dist/router/__tests__/match-result.test.js.map +0 -1
  572. package/dist/router/__tests__/on-error.test.d.ts +0 -2
  573. package/dist/router/__tests__/on-error.test.d.ts.map +0 -1
  574. package/dist/router/__tests__/on-error.test.js +0 -678
  575. package/dist/router/__tests__/on-error.test.js.map +0 -1
  576. package/dist/router/__tests__/pattern-matching.test.d.ts +0 -2
  577. package/dist/router/__tests__/pattern-matching.test.d.ts.map +0 -1
  578. package/dist/router/__tests__/pattern-matching.test.js +0 -629
  579. package/dist/router/__tests__/pattern-matching.test.js.map +0 -1
  580. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts +0 -2
  581. package/dist/router/__tests__/segment-resolution-parallel-loading.test.d.ts.map +0 -1
  582. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js +0 -155
  583. package/dist/router/__tests__/segment-resolution-parallel-loading.test.js.map +0 -1
  584. package/dist/router/error-handling.d.ts +0 -77
  585. package/dist/router/error-handling.d.ts.map +0 -1
  586. package/dist/router/error-handling.js +0 -202
  587. package/dist/router/error-handling.js.map +0 -1
  588. package/dist/router/handler-context.d.ts +0 -20
  589. package/dist/router/handler-context.d.ts.map +0 -1
  590. package/dist/router/handler-context.js +0 -198
  591. package/dist/router/handler-context.js.map +0 -1
  592. package/dist/router/intercept-resolution.d.ts +0 -66
  593. package/dist/router/intercept-resolution.d.ts.map +0 -1
  594. package/dist/router/intercept-resolution.js +0 -246
  595. package/dist/router/intercept-resolution.js.map +0 -1
  596. package/dist/router/loader-resolution.d.ts +0 -64
  597. package/dist/router/loader-resolution.d.ts.map +0 -1
  598. package/dist/router/loader-resolution.js +0 -284
  599. package/dist/router/loader-resolution.js.map +0 -1
  600. package/dist/router/logging.d.ts +0 -15
  601. package/dist/router/logging.d.ts.map +0 -1
  602. package/dist/router/logging.js +0 -99
  603. package/dist/router/logging.js.map +0 -1
  604. package/dist/router/manifest.d.ts +0 -22
  605. package/dist/router/manifest.d.ts.map +0 -1
  606. package/dist/router/manifest.js +0 -181
  607. package/dist/router/manifest.js.map +0 -1
  608. package/dist/router/match-api.d.ts +0 -35
  609. package/dist/router/match-api.d.ts.map +0 -1
  610. package/dist/router/match-api.js +0 -406
  611. package/dist/router/match-api.js.map +0 -1
  612. package/dist/router/match-context.d.ts +0 -206
  613. package/dist/router/match-context.d.ts.map +0 -1
  614. package/dist/router/match-context.js +0 -17
  615. package/dist/router/match-context.js.map +0 -1
  616. package/dist/router/match-middleware/background-revalidation.d.ts +0 -127
  617. package/dist/router/match-middleware/background-revalidation.d.ts.map +0 -1
  618. package/dist/router/match-middleware/background-revalidation.js +0 -75
  619. package/dist/router/match-middleware/background-revalidation.js.map +0 -1
  620. package/dist/router/match-middleware/cache-lookup.d.ts +0 -112
  621. package/dist/router/match-middleware/cache-lookup.d.ts.map +0 -1
  622. package/dist/router/match-middleware/cache-lookup.js +0 -257
  623. package/dist/router/match-middleware/cache-lookup.js.map +0 -1
  624. package/dist/router/match-middleware/cache-store.d.ts +0 -113
  625. package/dist/router/match-middleware/cache-store.d.ts.map +0 -1
  626. package/dist/router/match-middleware/cache-store.js +0 -108
  627. package/dist/router/match-middleware/cache-store.js.map +0 -1
  628. package/dist/router/match-middleware/index.d.ts +0 -81
  629. package/dist/router/match-middleware/index.d.ts.map +0 -1
  630. package/dist/router/match-middleware/index.js +0 -80
  631. package/dist/router/match-middleware/index.js.map +0 -1
  632. package/dist/router/match-middleware/intercept-resolution.d.ts +0 -117
  633. package/dist/router/match-middleware/intercept-resolution.d.ts.map +0 -1
  634. package/dist/router/match-middleware/intercept-resolution.js +0 -134
  635. package/dist/router/match-middleware/intercept-resolution.js.map +0 -1
  636. package/dist/router/match-middleware/segment-resolution.d.ts +0 -99
  637. package/dist/router/match-middleware/segment-resolution.d.ts.map +0 -1
  638. package/dist/router/match-middleware/segment-resolution.js +0 -53
  639. package/dist/router/match-middleware/segment-resolution.js.map +0 -1
  640. package/dist/router/match-pipelines.d.ts +0 -147
  641. package/dist/router/match-pipelines.d.ts.map +0 -1
  642. package/dist/router/match-pipelines.js +0 -82
  643. package/dist/router/match-pipelines.js.map +0 -1
  644. package/dist/router/match-result.d.ts +0 -126
  645. package/dist/router/match-result.d.ts.map +0 -1
  646. package/dist/router/match-result.js +0 -93
  647. package/dist/router/match-result.js.map +0 -1
  648. package/dist/router/metrics.d.ts +0 -20
  649. package/dist/router/metrics.d.ts.map +0 -1
  650. package/dist/router/metrics.js +0 -47
  651. package/dist/router/metrics.js.map +0 -1
  652. package/dist/router/middleware.d.ts +0 -249
  653. package/dist/router/middleware.d.ts.map +0 -1
  654. package/dist/router/middleware.js +0 -434
  655. package/dist/router/middleware.js.map +0 -1
  656. package/dist/router/middleware.test.d.ts +0 -2
  657. package/dist/router/middleware.test.d.ts.map +0 -1
  658. package/dist/router/middleware.test.js +0 -816
  659. package/dist/router/middleware.test.js.map +0 -1
  660. package/dist/router/pattern-matching.d.ts +0 -149
  661. package/dist/router/pattern-matching.d.ts.map +0 -1
  662. package/dist/router/pattern-matching.js +0 -349
  663. package/dist/router/pattern-matching.js.map +0 -1
  664. package/dist/router/revalidation.d.ts +0 -44
  665. package/dist/router/revalidation.d.ts.map +0 -1
  666. package/dist/router/revalidation.js +0 -147
  667. package/dist/router/revalidation.js.map +0 -1
  668. package/dist/router/router-context.d.ts +0 -135
  669. package/dist/router/router-context.d.ts.map +0 -1
  670. package/dist/router/router-context.js +0 -36
  671. package/dist/router/router-context.js.map +0 -1
  672. package/dist/router/segment-resolution.d.ts +0 -127
  673. package/dist/router/segment-resolution.d.ts.map +0 -1
  674. package/dist/router/segment-resolution.js +0 -919
  675. package/dist/router/segment-resolution.js.map +0 -1
  676. package/dist/router/trie-matching.d.ts +0 -40
  677. package/dist/router/trie-matching.d.ts.map +0 -1
  678. package/dist/router/trie-matching.js +0 -127
  679. package/dist/router/trie-matching.js.map +0 -1
  680. package/dist/router/types.d.ts +0 -136
  681. package/dist/router/types.d.ts.map +0 -1
  682. package/dist/router/types.js +0 -7
  683. package/dist/router/types.js.map +0 -1
  684. package/dist/router.d.ts +0 -753
  685. package/dist/router.d.ts.map +0 -1
  686. package/dist/router.gen.d.ts +0 -6
  687. package/dist/router.gen.d.ts.map +0 -1
  688. package/dist/router.gen.js +0 -6
  689. package/dist/router.gen.js.map +0 -1
  690. package/dist/router.js +0 -1304
  691. package/dist/router.js.map +0 -1
  692. package/dist/rsc/__tests__/helpers.test.d.ts +0 -2
  693. package/dist/rsc/__tests__/helpers.test.d.ts.map +0 -1
  694. package/dist/rsc/__tests__/helpers.test.js +0 -140
  695. package/dist/rsc/__tests__/helpers.test.js.map +0 -1
  696. package/dist/rsc/handler.d.ts +0 -45
  697. package/dist/rsc/handler.d.ts.map +0 -1
  698. package/dist/rsc/handler.js +0 -1172
  699. package/dist/rsc/handler.js.map +0 -1
  700. package/dist/rsc/helpers.d.ts +0 -16
  701. package/dist/rsc/helpers.d.ts.map +0 -1
  702. package/dist/rsc/helpers.js +0 -55
  703. package/dist/rsc/helpers.js.map +0 -1
  704. package/dist/rsc/index.d.ts +0 -22
  705. package/dist/rsc/index.d.ts.map +0 -1
  706. package/dist/rsc/index.js +0 -23
  707. package/dist/rsc/index.js.map +0 -1
  708. package/dist/rsc/nonce.d.ts +0 -9
  709. package/dist/rsc/nonce.d.ts.map +0 -1
  710. package/dist/rsc/nonce.js +0 -18
  711. package/dist/rsc/nonce.js.map +0 -1
  712. package/dist/rsc/types.d.ts +0 -206
  713. package/dist/rsc/types.d.ts.map +0 -1
  714. package/dist/rsc/types.js +0 -8
  715. package/dist/rsc/types.js.map +0 -1
  716. package/dist/search-params.d.ts +0 -103
  717. package/dist/search-params.d.ts.map +0 -1
  718. package/dist/search-params.js +0 -74
  719. package/dist/search-params.js.map +0 -1
  720. package/dist/segment-system.d.ts +0 -75
  721. package/dist/segment-system.d.ts.map +0 -1
  722. package/dist/segment-system.js +0 -336
  723. package/dist/segment-system.js.map +0 -1
  724. package/dist/server/context.d.ts +0 -245
  725. package/dist/server/context.d.ts.map +0 -1
  726. package/dist/server/context.js +0 -197
  727. package/dist/server/context.js.map +0 -1
  728. package/dist/server/fetchable-loader-store.d.ts +0 -18
  729. package/dist/server/fetchable-loader-store.d.ts.map +0 -1
  730. package/dist/server/fetchable-loader-store.js +0 -18
  731. package/dist/server/fetchable-loader-store.js.map +0 -1
  732. package/dist/server/handle-store.d.ts +0 -85
  733. package/dist/server/handle-store.d.ts.map +0 -1
  734. package/dist/server/handle-store.js +0 -142
  735. package/dist/server/handle-store.js.map +0 -1
  736. package/dist/server/loader-registry.d.ts +0 -55
  737. package/dist/server/loader-registry.d.ts.map +0 -1
  738. package/dist/server/loader-registry.js +0 -132
  739. package/dist/server/loader-registry.js.map +0 -1
  740. package/dist/server/request-context.d.ts +0 -226
  741. package/dist/server/request-context.d.ts.map +0 -1
  742. package/dist/server/request-context.js +0 -290
  743. package/dist/server/request-context.js.map +0 -1
  744. package/dist/server/root-layout.d.ts +0 -4
  745. package/dist/server/root-layout.d.ts.map +0 -1
  746. package/dist/server/root-layout.js +0 -5
  747. package/dist/server/root-layout.js.map +0 -1
  748. package/dist/server.d.ts +0 -15
  749. package/dist/server.d.ts.map +0 -1
  750. package/dist/server.js +0 -20
  751. package/dist/server.js.map +0 -1
  752. package/dist/ssr/__tests__/ssr-handler.test.d.ts +0 -2
  753. package/dist/ssr/__tests__/ssr-handler.test.d.ts.map +0 -1
  754. package/dist/ssr/__tests__/ssr-handler.test.js +0 -132
  755. package/dist/ssr/__tests__/ssr-handler.test.js.map +0 -1
  756. package/dist/ssr/index.d.ts +0 -98
  757. package/dist/ssr/index.d.ts.map +0 -1
  758. package/dist/ssr/index.js +0 -158
  759. package/dist/ssr/index.js.map +0 -1
  760. package/dist/static-handler.d.ts +0 -50
  761. package/dist/static-handler.d.ts.map +0 -1
  762. package/dist/static-handler.gen.d.ts +0 -5
  763. package/dist/static-handler.gen.d.ts.map +0 -1
  764. package/dist/static-handler.gen.js +0 -5
  765. package/dist/static-handler.gen.js.map +0 -1
  766. package/dist/static-handler.js +0 -29
  767. package/dist/static-handler.js.map +0 -1
  768. package/dist/theme/ThemeProvider.d.ts +0 -20
  769. package/dist/theme/ThemeProvider.d.ts.map +0 -1
  770. package/dist/theme/ThemeProvider.js +0 -240
  771. package/dist/theme/ThemeProvider.js.map +0 -1
  772. package/dist/theme/ThemeScript.d.ts +0 -48
  773. package/dist/theme/ThemeScript.d.ts.map +0 -1
  774. package/dist/theme/ThemeScript.js +0 -13
  775. package/dist/theme/ThemeScript.js.map +0 -1
  776. package/dist/theme/__tests__/theme.test.d.ts +0 -2
  777. package/dist/theme/__tests__/theme.test.d.ts.map +0 -1
  778. package/dist/theme/__tests__/theme.test.js +0 -103
  779. package/dist/theme/__tests__/theme.test.js.map +0 -1
  780. package/dist/theme/constants.d.ts +0 -29
  781. package/dist/theme/constants.d.ts.map +0 -1
  782. package/dist/theme/constants.js +0 -48
  783. package/dist/theme/constants.js.map +0 -1
  784. package/dist/theme/index.d.ts +0 -31
  785. package/dist/theme/index.d.ts.map +0 -1
  786. package/dist/theme/index.js +0 -36
  787. package/dist/theme/index.js.map +0 -1
  788. package/dist/theme/theme-context.d.ts +0 -40
  789. package/dist/theme/theme-context.d.ts.map +0 -1
  790. package/dist/theme/theme-context.js +0 -60
  791. package/dist/theme/theme-context.js.map +0 -1
  792. package/dist/theme/theme-script.d.ts +0 -27
  793. package/dist/theme/theme-script.d.ts.map +0 -1
  794. package/dist/theme/theme-script.js +0 -147
  795. package/dist/theme/theme-script.js.map +0 -1
  796. package/dist/theme/types.d.ts +0 -163
  797. package/dist/theme/types.d.ts.map +0 -1
  798. package/dist/theme/types.js +0 -11
  799. package/dist/theme/types.js.map +0 -1
  800. package/dist/theme/use-theme.d.ts +0 -12
  801. package/dist/theme/use-theme.d.ts.map +0 -1
  802. package/dist/theme/use-theme.js +0 -40
  803. package/dist/theme/use-theme.js.map +0 -1
  804. package/dist/types.d.ts +0 -1479
  805. package/dist/types.d.ts.map +0 -1
  806. package/dist/types.js +0 -10
  807. package/dist/types.js.map +0 -1
  808. package/dist/urls.d.ts +0 -441
  809. package/dist/urls.d.ts.map +0 -1
  810. package/dist/urls.gen.d.ts +0 -8
  811. package/dist/urls.gen.d.ts.map +0 -1
  812. package/dist/urls.gen.js +0 -8
  813. package/dist/urls.gen.js.map +0 -1
  814. package/dist/urls.js +0 -443
  815. package/dist/urls.js.map +0 -1
  816. package/dist/use-loader.d.ts +0 -127
  817. package/dist/use-loader.d.ts.map +0 -1
  818. package/dist/use-loader.js +0 -237
  819. package/dist/use-loader.js.map +0 -1
  820. package/dist/vite/__tests__/ast-handler-extract.test.d.ts +0 -2
  821. package/dist/vite/__tests__/ast-handler-extract.test.d.ts.map +0 -1
  822. package/dist/vite/__tests__/ast-handler-extract.test.js +0 -294
  823. package/dist/vite/__tests__/ast-handler-extract.test.js.map +0 -1
  824. package/dist/vite/__tests__/expose-id-utils.test.d.ts +0 -2
  825. package/dist/vite/__tests__/expose-id-utils.test.d.ts.map +0 -1
  826. package/dist/vite/__tests__/expose-id-utils.test.js +0 -224
  827. package/dist/vite/__tests__/expose-id-utils.test.js.map +0 -1
  828. package/dist/vite/__tests__/expose-internal-ids.test.d.ts +0 -2
  829. package/dist/vite/__tests__/expose-internal-ids.test.d.ts.map +0 -1
  830. package/dist/vite/__tests__/expose-internal-ids.test.js +0 -647
  831. package/dist/vite/__tests__/expose-internal-ids.test.js.map +0 -1
  832. package/dist/vite/__tests__/expose-router-id.test.d.ts +0 -2
  833. package/dist/vite/__tests__/expose-router-id.test.d.ts.map +0 -1
  834. package/dist/vite/__tests__/expose-router-id.test.js +0 -39
  835. package/dist/vite/__tests__/expose-router-id.test.js.map +0 -1
  836. package/dist/vite/ast-handler-extract.d.ts +0 -49
  837. package/dist/vite/ast-handler-extract.d.ts.map +0 -1
  838. package/dist/vite/ast-handler-extract.js +0 -249
  839. package/dist/vite/ast-handler-extract.js.map +0 -1
  840. package/dist/vite/expose-action-id.d.ts +0 -19
  841. package/dist/vite/expose-action-id.d.ts.map +0 -1
  842. package/dist/vite/expose-action-id.js +0 -250
  843. package/dist/vite/expose-action-id.js.map +0 -1
  844. package/dist/vite/expose-id-utils.d.ts +0 -69
  845. package/dist/vite/expose-id-utils.d.ts.map +0 -1
  846. package/dist/vite/expose-id-utils.js +0 -289
  847. package/dist/vite/expose-id-utils.js.map +0 -1
  848. package/dist/vite/expose-internal-ids.d.ts +0 -22
  849. package/dist/vite/expose-internal-ids.d.ts.map +0 -1
  850. package/dist/vite/expose-internal-ids.js +0 -886
  851. package/dist/vite/expose-internal-ids.js.map +0 -1
  852. package/dist/vite/index.d.ts +0 -149
  853. package/dist/vite/index.d.ts.map +0 -1
  854. package/dist/vite/index.js.map +0 -1
  855. package/dist/vite/index.named-routes.gen.ts +0 -103
  856. package/dist/vite/package-resolution.d.ts +0 -43
  857. package/dist/vite/package-resolution.d.ts.map +0 -1
  858. package/dist/vite/package-resolution.js +0 -112
  859. package/dist/vite/package-resolution.js.map +0 -1
  860. package/dist/vite/virtual-entries.d.ts +0 -25
  861. package/dist/vite/virtual-entries.d.ts.map +0 -1
  862. package/dist/vite/virtual-entries.js +0 -110
  863. package/dist/vite/virtual-entries.js.map +0 -1
@@ -120,9 +120,9 @@ const store = new MemorySegmentCacheStore({
120
120
  });
121
121
  ```
122
122
 
123
- ### Cloudflare KV Store
123
+ ### Cloudflare Edge Cache Store
124
124
 
125
- For distributed caching on Cloudflare Workers:
125
+ For distributed caching on Cloudflare Workers using the Cache API:
126
126
 
127
127
  ```typescript
128
128
  import { CFCacheStore } from "@rangojs/router/cache";
@@ -132,14 +132,47 @@ const router = createRouter<AppBindings>({
132
132
  urls: urlpatterns,
133
133
  cache: (env, ctx) => ({
134
134
  store: new CFCacheStore({
135
- kv: env.CACHE_KV,
136
- waitUntil: (fn) => ctx!.waitUntil(fn),
135
+ ctx,
136
+ defaults: { ttl: 60, swr: 300 },
137
137
  }),
138
138
  enabled: true,
139
139
  }),
140
140
  });
141
141
  ```
142
142
 
143
+ ### With KV L2 Persistence
144
+
145
+ Add a KV namespace for global cross-colo persistence. On Cache API miss, KV is
146
+ checked and hits are promoted back to L1. Writes go to both layers.
147
+
148
+ ```typescript
149
+ import { CFCacheStore } from "@rangojs/router/cache";
150
+
151
+ const router = createRouter<AppBindings>({
152
+ document: Document,
153
+ urls: urlpatterns,
154
+ cache: (env, ctx) => ({
155
+ store: new CFCacheStore({
156
+ ctx,
157
+ kv: env.CACHE_KV, // optional KV namespace binding
158
+ defaults: { ttl: 60, swr: 300 },
159
+ }),
160
+ enabled: true,
161
+ }),
162
+ });
163
+ ```
164
+
165
+ **How the two layers work:**
166
+
167
+ | Scenario | L1 (Cache API) | L2 (KV) | Result |
168
+ | ------------ | -------------- | ------- | ----------------------------- |
169
+ | Hot request | HIT | — | Serve from L1 (fast) |
170
+ | Cold colo | MISS | HIT | Serve from KV, promote to L1 |
171
+ | First render | MISS | MISS | Render, write to both L1 + KV |
172
+
173
+ KV entries require `expirationTtl >= 60s`. Short-lived entries (< 60s total TTL)
174
+ are only cached in L1.
175
+
143
176
  ## Nested Cache Boundaries
144
177
 
145
178
  Override cache settings for specific sections:
@@ -92,6 +92,73 @@ path("/dashboard/:id", (ctx) => {
92
92
  ])
93
93
  ```
94
94
 
95
+ ## Setting Handles (Meta, Breadcrumbs)
96
+
97
+ Parallel slot handlers can call `ctx.use(Meta)` or `ctx.use(Breadcrumbs)` to
98
+ push handle data. The data is associated with the **parent** layout or route
99
+ segment, not the parallel segment itself. This is because parallels execute
100
+ after their parent handler and inherit its segment scope.
101
+
102
+ This works well for document-level metadata — the handle data follows the
103
+ parent's lifecycle (appears when the parent is mounted, removed when it
104
+ unmounts).
105
+
106
+ ```typescript
107
+ parallel({
108
+ "@meta": (ctx) => {
109
+ const meta = ctx.use(Meta);
110
+ meta({ title: "Product Detail" });
111
+ meta({ name: "description", content: "..." });
112
+ return null; // UI-less slot, only sets metadata
113
+ },
114
+ "@sidebar": (ctx) => <Sidebar />,
115
+ })
116
+ ```
117
+
118
+ Multiple parallels on the same parent can each push handle data — they all
119
+ accumulate under the parent segment ID.
120
+
121
+ ### Pattern: `@meta` slot for per-route metadata overrides
122
+
123
+ A dedicated `@meta` parallel slot lets routes define metadata separately from
124
+ their handler logic. The layout sets defaults via a title template, and each
125
+ route overrides via its own `@meta` slot. Since child segments push after
126
+ parents and `collectMeta` uses last-wins deduplication, overrides work
127
+ naturally.
128
+
129
+ ```typescript
130
+ // Layout sets defaults
131
+ layout((ctx) => {
132
+ ctx.use(Meta)({ title: { template: "%s | Store", default: "Store" } });
133
+ return <StoreLayout />;
134
+ }, () => [
135
+ // Route with @meta override — decoupled from handler rendering
136
+ path("/:slug", ProductPage, { name: "product" }, () => [
137
+ parallel({
138
+ "@meta": async (ctx) => {
139
+ const product = await ctx.use(ProductLoader);
140
+ const meta = ctx.use(Meta);
141
+ meta({ title: product.name });
142
+ meta({ name: "description", content: product.description });
143
+ meta({
144
+ "script:ld+json": {
145
+ "@context": "https://schema.org",
146
+ "@type": "Product",
147
+ name: product.name,
148
+ description: product.description,
149
+ },
150
+ });
151
+ return null; // UI-less slot
152
+ },
153
+ }),
154
+ ]),
155
+ ])
156
+ ```
157
+
158
+ This keeps the route handler focused on rendering UI while metadata
159
+ (title, description, Open Graph, JSON-LD) lives in a composable slot that
160
+ can be added, removed, or swapped per route without touching the handler.
161
+
95
162
  ## Parallel Routes with Loaders
96
163
 
97
164
  Add loaders and loading states to parallel routes:
@@ -109,6 +176,65 @@ parallel(
109
176
  )
110
177
  ```
111
178
 
179
+ ### Streaming Behavior
180
+
181
+ Parallels with `loading()` are **independent streaming units**. They don't
182
+ block the parent layout or sibling routes during SSR:
183
+
184
+ - **With `loading()`**: The skeleton renders immediately. The loader runs
185
+ in the background and streams data to the client when ready. The rest
186
+ of the page (layout, route content, other parallels) renders without
187
+ waiting.
188
+ - **Without `loading()`**: The parallel's loaders block the parent layout's
189
+ rendering. Use this when the data must be available before the page
190
+ paints (e.g., critical above-the-fold content).
191
+ - **SPA navigation**: Parallel loaders resolve in the background. The
192
+ existing parallel UI stays visible — no skeleton flash on route changes
193
+ within the same layout.
194
+
195
+ ```typescript
196
+ // Sidebar streams independently — page renders immediately
197
+ parallel(
198
+ { "@sidebar": () => <Sidebar /> },
199
+ () => [loader(SlowSidebarLoader), loading(<SidebarSkeleton />)]
200
+ )
201
+
202
+ // Cart data blocks layout — must be ready before paint
203
+ parallel(
204
+ { "@cartBadge": () => <CartBadge /> },
205
+ () => [loader(CartCountLoader)] // No loading() = awaited
206
+ )
207
+ ```
208
+
209
+ ## Slot Override Semantics
210
+
211
+ When multiple `parallel()` calls define the same slot name, **the last
212
+ definition wins**. Earlier definitions of that slot are removed. Other
213
+ slots from the earlier call are preserved.
214
+
215
+ This enables composition patterns where included routes override
216
+ parent-defined slots:
217
+
218
+ ```typescript
219
+ layout(DashboardLayout, () => [
220
+ // Base slots
221
+ parallel({
222
+ "@sidebar": () => <DefaultSidebar />,
223
+ "@footer": () => <Footer />,
224
+ }),
225
+
226
+ // Override just @sidebar — @footer is preserved
227
+ parallel({ "@sidebar": () => <CustomSidebar /> }),
228
+
229
+ path("/", DashboardIndex, { name: "index" }),
230
+ ])
231
+ ```
232
+
233
+ After resolution, the layout has two parallel entries:
234
+
235
+ - `{ "@footer": () => <Footer /> }` (first call, `@sidebar` removed)
236
+ - `{ "@sidebar": () => <CustomSidebar /> }` (second call, wins)
237
+
112
238
  ## Multiple Parallel Slots
113
239
 
114
240
  ```typescript
@@ -79,6 +79,8 @@ export interface DerivedNavigationState {
79
79
  state: "idle" | "loading";
80
80
  /** Whether any operation is streaming */
81
81
  isStreaming: boolean;
82
+ /** Whether a navigation is active (fetching or streaming, before commit) */
83
+ isNavigating: boolean;
82
84
  /** Current committed location */
83
85
  location: NavigationLocation;
84
86
  /** URL being navigated to (null if idle) */
@@ -389,6 +391,9 @@ export function createEventController(
389
391
  return {
390
392
  state,
391
393
  isStreaming,
394
+ // True when a navigation is active (fetching or streaming, before
395
+ // commit). Broader than pendingUrl which clears during streaming.
396
+ isNavigating: currentNavigation !== null,
392
397
  location,
393
398
  // pendingUrl only during fetching phase - once streaming starts (URL changed), not pending.
394
399
  // Background revalidations (skipLoadingState) don't expose a pending URL.
@@ -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
+ consumeInflightPrefetch,
23
+ consumePrefetch,
24
+ } from "./prefetch/cache.js";
21
25
 
22
26
  /**
23
27
  * Create a navigation client for fetching RSC payloads
@@ -85,49 +89,33 @@ export function createNavigationClient(
85
89
  fetchUrl.searchParams.set("_rsc_v", version);
86
90
  }
87
91
 
88
- // Check in-memory prefetch cache before making a network request.
92
+ // Check completed in-memory prefetch cache before making a network request.
89
93
  // The cache key includes the source URL (previousUrl) because the
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
+ //
98
+ const canUsePrefetch = !staleRevalidation && !hmr && !interceptSourceUrl;
93
99
  const cacheKey = buildPrefetchKey(previousUrl, fetchUrl);
94
- const cachedResponse =
95
- !staleRevalidation && !hmr && !interceptSourceUrl
96
- ? consumePrefetch(cacheKey)
97
- : null;
98
-
100
+ const cachedResponse = canUsePrefetch ? consumePrefetch(cacheKey) : null;
101
+ const inflightResponsePromise = canUsePrefetch
102
+ ? consumeInflightPrefetch(cacheKey)
103
+ : null;
99
104
  // Track when the stream completes
100
105
  let resolveStreamComplete: () => void;
101
106
  const streamComplete = new Promise<void>((resolve) => {
102
107
  resolveStreamComplete = resolve;
103
108
  });
104
109
 
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 {
110
+ /** Start a fresh navigation fetch (no cache / inflight hit). */
111
+ const doFreshFetch = (): Promise<Response> => {
124
112
  if (tx) {
125
113
  browserDebugLog(tx, "fetching", {
126
114
  path: `${fetchUrl.pathname}${fetchUrl.search}`,
127
115
  });
128
116
  }
129
117
 
130
- responsePromise = fetch(fetchUrl, {
118
+ return fetch(fetchUrl, {
131
119
  headers: {
132
120
  "X-RSC-Router-Client-Path": previousUrl,
133
121
  "X-Rango-State": getRangoState(),
@@ -183,6 +171,51 @@ export function createNavigationClient(
183
171
  signal,
184
172
  );
185
173
  });
174
+ };
175
+
176
+ let responsePromise: Promise<Response>;
177
+
178
+ if (cachedResponse) {
179
+ if (tx) {
180
+ browserDebugLog(tx, "prefetch cache hit", { key: cacheKey });
181
+ }
182
+ // Cached response body is already fully buffered (arrayBuffer),
183
+ // so stream completion is immediate.
184
+ responsePromise = Promise.resolve(cachedResponse).then((response) => {
185
+ return teeWithCompletion(
186
+ response,
187
+ () => {
188
+ if (tx) browserDebugLog(tx, "stream complete (from cache)");
189
+ resolveStreamComplete();
190
+ },
191
+ signal,
192
+ );
193
+ });
194
+ } else if (inflightResponsePromise) {
195
+ if (tx) {
196
+ browserDebugLog(tx, "reusing inflight prefetch", { key: cacheKey });
197
+ }
198
+ responsePromise = inflightResponsePromise.then(async (response) => {
199
+ if (!response) {
200
+ if (tx) {
201
+ browserDebugLog(tx, "inflight prefetch unavailable, refetching");
202
+ }
203
+ return doFreshFetch();
204
+ }
205
+
206
+ return teeWithCompletion(
207
+ response,
208
+ () => {
209
+ if (tx) {
210
+ browserDebugLog(tx, "stream complete (from inflight prefetch)");
211
+ }
212
+ resolveStreamComplete();
213
+ },
214
+ signal,
215
+ );
216
+ });
217
+ } else {
218
+ responsePromise = doFreshFetch();
186
219
  }
187
220
 
188
221
  try {
@@ -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
@@ -251,6 +259,17 @@ export function createPartialUpdater(
251
259
  existingSegments,
252
260
  );
253
261
 
262
+ // Fix: tx.commit() cached the source page's handleData because
263
+ // eventController hasn't been updated yet. Overwrite with the
264
+ // correct cached handleData to prevent cache corruption on
265
+ // subsequent navigations to this same URL.
266
+ if (mode.targetCacheHandleData) {
267
+ store.updateCacheHandleData(
268
+ store.getHistoryKey(),
269
+ mode.targetCacheHandleData,
270
+ );
271
+ }
272
+
254
273
  // Include cachedHandleData in metadata so NavigationProvider can restore
255
274
  // breadcrumbs and other handle data from cache.
256
275
  // Remove `handles` from metadata to prevent NavigationProvider from
@@ -263,10 +282,7 @@ export function createPartialUpdater(
263
282
  ...metadataWithoutHandles,
264
283
  cachedHandleData: mode.targetCacheHandleData,
265
284
  },
266
- scroll:
267
- commitScroll !== false
268
- ? { enabled: commitScroll }
269
- : { enabled: false },
285
+ scroll: toScrollPayload(commitScroll),
270
286
  };
271
287
 
272
288
  const cachedHasTransition = existingSegments.some(
@@ -305,10 +321,7 @@ export function createPartialUpdater(
305
321
  onUpdate({
306
322
  root: newTree,
307
323
  metadata: payload.metadata,
308
- scroll:
309
- leaveScroll !== false
310
- ? { enabled: leaveScroll }
311
- : { enabled: false },
324
+ scroll: toScrollPayload(leaveScroll),
312
325
  });
313
326
 
314
327
  debugLog("[Browser] Navigation complete (left intercept)");
@@ -462,10 +475,7 @@ export function createPartialUpdater(
462
475
  // Emit update to trigger React render.
463
476
  // Scroll info is included so NavigationProvider applies it after React commits.
464
477
  const hasTransition = reconciled.mainSegments.some((s) => s.transition);
465
- const scrollPayload =
466
- navScroll !== false
467
- ? { enabled: navScroll }
468
- : { enabled: false as const };
478
+ const scrollPayload = toScrollPayload(navScroll);
469
479
 
470
480
  if (mode.type === "action" || mode.type === "stale-revalidation") {
471
481
  startTransition(() => {
@@ -529,10 +539,7 @@ export function createPartialUpdater(
529
539
  const fullHasTransition = segments.some(
530
540
  (s: ResolvedSegment) => s.transition,
531
541
  );
532
- const fullScrollPayload =
533
- fullScroll !== false
534
- ? { enabled: fullScroll }
535
- : { enabled: false as const };
542
+ const fullScrollPayload = toScrollPayload(fullScroll);
536
543
 
537
544
  if (mode.type === "stale-revalidation") {
538
545
  await rawStreamComplete;
@@ -1,16 +1,20 @@
1
1
  /**
2
2
  * Prefetch Cache
3
3
  *
4
- * In-memory cache storing prefetch Response objects for instant cache hits
4
+ * In-memory cache storing prefetched Response objects for instant cache hits
5
5
  * on subsequent navigation. Cache key is source-dependent (includes the
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. Each promise resolves to the
10
+ * navigation branch of a tee'd Response, allowing navigation to adopt a
11
+ * still-downloading prefetch without reparsing or buffering the body.
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,10 +105,33 @@ 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
- * The response body must be fully buffered (e.g. via arrayBuffer()) before
97
- * storing, so the cached Response is self-contained and network-independent.
133
+ * The response should be a clone() of the original so the caller can
134
+ * still consume the body. The clone's body streams independently.
98
135
  *
99
136
  * Skips storage if the generation has changed since the fetch started
100
137
  * (a server action invalidated the cache mid-flight).
@@ -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,
@@ -51,19 +55,20 @@ function buildPrefetchUrl(
51
55
  }
52
56
 
53
57
  /**
54
- * 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.
58
+ * Core prefetch fetch logic. Fetches the response, tees the body, and stores
59
+ * one branch in the in-memory cache. The returned Promise resolves to the
60
+ * sibling navigation branch (or null on failure) so navigation can safely
61
+ * reuse an in-flight prefetch 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: {
@@ -72,26 +77,27 @@ function executePrefetchFetch(
72
77
  "X-Rango-Prefetch": "1",
73
78
  },
74
79
  })
75
- .then(async (response) => {
76
- if (!response.ok) return;
77
- // Fully buffer the response body so the cached Response is
78
- // self-contained and doesn't depend on the network connection.
79
- // This eliminates the race condition where the user clicks before
80
- // the response body has been fully downloaded.
81
- const buffer = await response.arrayBuffer();
82
- const cachedResponse = new Response(buffer, {
80
+ .then((response) => {
81
+ if (!response.ok) return null;
82
+ // Don't buffer with arrayBuffer() that blocks until the entire
83
+ // body downloads, defeating streaming for slow loaders.
84
+ // Tee the body: one branch for navigation, one for cache storage.
85
+ const [navStream, cacheStream] = response.body!.tee();
86
+ const responseInit = {
83
87
  headers: response.headers,
84
88
  status: response.status,
85
89
  statusText: response.statusText,
86
- });
87
- storePrefetch(key, cachedResponse, gen);
88
- })
89
- .catch(() => {
90
- // Silently ignore prefetch failures (including abort)
90
+ };
91
+ storePrefetch(key, new Response(cacheStream, responseInit), gen);
92
+ return new Response(navStream, responseInit);
91
93
  })
94
+ .catch(() => null)
92
95
  .finally(() => {
93
96
  clearPrefetchInflight(key);
94
97
  });
98
+
99
+ setInflightPromise(key, promise);
100
+ return promise;
95
101
  }
96
102
 
97
103
  /**
@@ -128,8 +134,11 @@ export function prefetchQueued(
128
134
  const key = buildPrefetchKey(window.location.href, targetUrl);
129
135
  if (hasPrefetch(key)) return key;
130
136
  const fetchUrlStr = targetUrl.toString();
131
- enqueuePrefetch(key, (signal) =>
132
- executePrefetchFetch(key, fetchUrlStr, signal),
133
- );
137
+ enqueuePrefetch(key, (signal) => {
138
+ // Re-check at execution time: a hover-triggered prefetchDirect may
139
+ // have started or completed this key while the item sat in the queue.
140
+ if (hasPrefetch(key)) return Promise.resolve();
141
+ return executePrefetchFetch(key, fetchUrlStr, signal).then(() => {});
142
+ });
134
143
  return key;
135
144
  }