@rangojs/router 0.1.1 → 0.4.0

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 (473) hide show
  1. package/README.md +2 -1
  2. package/dist/types/browser/prefetch/default-strategy.d.ts +22 -0
  3. package/dist/types/browser/prefetch/runtime.d.ts +0 -1
  4. package/dist/types/browser/react/Link.d.ts +8 -11
  5. package/dist/types/browser/types.d.ts +5 -0
  6. package/dist/types/cache/document-cache.d.ts +3 -1
  7. package/dist/types/cache/types.d.ts +10 -3
  8. package/dist/types/route-definition/helpers-types.d.ts +6 -6
  9. package/dist/types/router/match-handlers.d.ts +2 -3
  10. package/dist/types/router/prefetch-default.d.ts +28 -0
  11. package/dist/types/router/router-interfaces.d.ts +7 -0
  12. package/dist/types/router/router-options.d.ts +30 -0
  13. package/dist/types/router/segment-resolution/view-transition-default.d.ts +3 -4
  14. package/dist/types/router/transition-when.d.ts +13 -0
  15. package/dist/types/rsc/capture-queue.d.ts +6 -0
  16. package/dist/types/rsc/shell-capture.d.ts +15 -7
  17. package/dist/types/rsc/shell-serve.d.ts +6 -3
  18. package/dist/types/rsc/transition-gate.d.ts +10 -14
  19. package/dist/types/rsc/types.d.ts +2 -0
  20. package/dist/types/server/request-context.d.ts +5 -1
  21. package/dist/types/testing/e2e/index.d.ts +3 -3
  22. package/dist/types/testing/e2e/page-helpers.d.ts +24 -0
  23. package/dist/types/testing/index.d.ts +2 -2
  24. package/dist/types/testing/run-transition-when.d.ts +6 -5
  25. package/dist/types/testing/shell-status.d.ts +23 -3
  26. package/dist/types/types/segments.d.ts +27 -22
  27. package/dist/types/urls/path-helper-types.d.ts +4 -3
  28. package/dist/types.backup/__internal.d.ts +127 -0
  29. package/dist/types.backup/bin/rango.d.ts +1 -0
  30. package/dist/types.backup/browser/action-coordinator.d.ts +57 -0
  31. package/dist/types.backup/browser/action-fence.d.ts +33 -0
  32. package/dist/types.backup/browser/app-shell.d.ts +34 -0
  33. package/dist/types.backup/browser/app-version.d.ts +6 -0
  34. package/dist/types.backup/browser/connection-warmup.d.ts +31 -0
  35. package/dist/types.backup/browser/cookie-name.d.ts +66 -0
  36. package/dist/types.backup/browser/event-controller.d.ts +221 -0
  37. package/dist/types.backup/browser/history-state.d.ts +26 -0
  38. package/dist/types.backup/browser/index.d.ts +1 -0
  39. package/dist/types.backup/browser/intercept-utils.d.ts +30 -0
  40. package/dist/types.backup/browser/invalidate-client-cache.d.ts +17 -0
  41. package/dist/types.backup/browser/link-interceptor.d.ts +43 -0
  42. package/dist/types.backup/browser/logging.d.ts +33 -0
  43. package/dist/types.backup/browser/merge-segment-loaders.d.ts +38 -0
  44. package/dist/types.backup/browser/navigation-bridge.d.ts +27 -0
  45. package/dist/types.backup/browser/navigation-client.d.ts +17 -0
  46. package/dist/types.backup/browser/navigation-store-handle.d.ts +25 -0
  47. package/dist/types.backup/browser/navigation-store.d.ts +95 -0
  48. package/dist/types.backup/browser/navigation-transaction.d.ts +75 -0
  49. package/dist/types.backup/browser/network-error-handler.d.ts +35 -0
  50. package/dist/types.backup/browser/partial-update.d.ts +61 -0
  51. package/dist/types.backup/browser/prefetch/cache.d.ts +183 -0
  52. package/dist/types.backup/browser/prefetch/fetch.d.ts +52 -0
  53. package/dist/types.backup/browser/prefetch/observer.d.ts +27 -0
  54. package/dist/types.backup/browser/prefetch/policy.d.ts +13 -0
  55. package/dist/types.backup/browser/prefetch/queue.d.ts +48 -0
  56. package/dist/types.backup/browser/prefetch/resource-ready.d.ts +28 -0
  57. package/dist/types.backup/browser/rango-state.d.ts +52 -0
  58. package/dist/types.backup/browser/react/Link.d.ts +140 -0
  59. package/dist/types.backup/browser/react/NavigationProvider.d.ts +88 -0
  60. package/dist/types.backup/browser/react/ScrollRestoration.d.ts +78 -0
  61. package/dist/types.backup/browser/react/context.d.ts +54 -0
  62. package/dist/types.backup/browser/react/filter-segment-order.d.ts +35 -0
  63. package/dist/types.backup/browser/react/index.d.ts +1 -0
  64. package/dist/types.backup/browser/react/location-state-shared.d.ts +162 -0
  65. package/dist/types.backup/browser/react/location-state.d.ts +29 -0
  66. package/dist/types.backup/browser/react/mount-context.d.ts +23 -0
  67. package/dist/types.backup/browser/react/nonce-context.d.ts +14 -0
  68. package/dist/types.backup/browser/react/shallow-equal.d.ts +5 -0
  69. package/dist/types.backup/browser/react/use-action.d.ts +61 -0
  70. package/dist/types.backup/browser/react/use-handle.d.ts +21 -0
  71. package/dist/types.backup/browser/react/use-href.d.ts +32 -0
  72. package/dist/types.backup/browser/react/use-link-status.d.ts +36 -0
  73. package/dist/types.backup/browser/react/use-mount.d.ts +24 -0
  74. package/dist/types.backup/browser/react/use-navigation.d.ts +15 -0
  75. package/dist/types.backup/browser/react/use-params.d.ts +21 -0
  76. package/dist/types.backup/browser/react/use-pathname.d.ts +13 -0
  77. package/dist/types.backup/browser/react/use-reverse.d.ts +40 -0
  78. package/dist/types.backup/browser/react/use-router.d.ts +23 -0
  79. package/dist/types.backup/browser/react/use-search-params.d.ts +19 -0
  80. package/dist/types.backup/browser/react/use-segments.d.ts +29 -0
  81. package/dist/types.backup/browser/response-adapter.d.ts +58 -0
  82. package/dist/types.backup/browser/rsc-router.d.ts +141 -0
  83. package/dist/types.backup/browser/scroll-restoration.d.ts +103 -0
  84. package/dist/types.backup/browser/segment-reconciler.d.ts +74 -0
  85. package/dist/types.backup/browser/segment-structure-assert.d.ts +16 -0
  86. package/dist/types.backup/browser/server-action-bridge.d.ts +29 -0
  87. package/dist/types.backup/browser/types.d.ts +530 -0
  88. package/dist/types.backup/browser/validate-redirect-origin.d.ts +28 -0
  89. package/dist/types.backup/build/collect-fallback-refs.d.ts +5 -0
  90. package/dist/types.backup/build/generate-manifest.d.ts +100 -0
  91. package/dist/types.backup/build/generate-route-types.d.ts +8 -0
  92. package/dist/types.backup/build/index.d.ts +21 -0
  93. package/dist/types.backup/build/prefix-tree-utils.d.ts +56 -0
  94. package/dist/types.backup/build/route-trie.d.ts +89 -0
  95. package/dist/types.backup/build/route-types/ast-helpers.d.ts +3 -0
  96. package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +13 -0
  97. package/dist/types.backup/build/route-types/codegen.d.ts +16 -0
  98. package/dist/types.backup/build/route-types/include-resolution.d.ts +74 -0
  99. package/dist/types.backup/build/route-types/param-extraction.d.ts +13 -0
  100. package/dist/types.backup/build/route-types/per-module-writer.d.ts +18 -0
  101. package/dist/types.backup/build/route-types/router-processing.d.ts +82 -0
  102. package/dist/types.backup/build/route-types/scan-filter.d.ts +17 -0
  103. package/dist/types.backup/build/route-types/source-scan.d.ts +13 -0
  104. package/dist/types.backup/build/runtime-discovery.d.ts +24 -0
  105. package/dist/types.backup/cache/background-task.d.ts +21 -0
  106. package/dist/types.backup/cache/cache-error.d.ts +71 -0
  107. package/dist/types.backup/cache/cache-key-utils.d.ts +35 -0
  108. package/dist/types.backup/cache/cache-policy.d.ts +59 -0
  109. package/dist/types.backup/cache/cache-runtime.d.ts +51 -0
  110. package/dist/types.backup/cache/cache-scope.d.ts +134 -0
  111. package/dist/types.backup/cache/cache-tag.d.ts +79 -0
  112. package/dist/types.backup/cache/cf/cf-base64.d.ts +4 -0
  113. package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +105 -0
  114. package/dist/types.backup/cache/cf/cf-cache-store.d.ts +481 -0
  115. package/dist/types.backup/cache/cf/cf-cache-types.d.ts +300 -0
  116. package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +22 -0
  117. package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +15 -0
  118. package/dist/types.backup/cache/cf/index.d.ts +3 -0
  119. package/dist/types.backup/cache/document-cache.d.ts +69 -0
  120. package/dist/types.backup/cache/handle-capture.d.ts +23 -0
  121. package/dist/types.backup/cache/handle-snapshot.d.ts +39 -0
  122. package/dist/types.backup/cache/index.d.ts +7 -0
  123. package/dist/types.backup/cache/memory-segment-store.d.ts +163 -0
  124. package/dist/types.backup/cache/profile-registry.d.ts +40 -0
  125. package/dist/types.backup/cache/read-through-swr.d.ts +60 -0
  126. package/dist/types.backup/cache/segment-codec.d.ts +78 -0
  127. package/dist/types.backup/cache/shell-snapshot.d.ts +162 -0
  128. package/dist/types.backup/cache/tag-invalidation.d.ts +74 -0
  129. package/dist/types.backup/cache/taint.d.ts +71 -0
  130. package/dist/types.backup/cache/types.d.ts +407 -0
  131. package/dist/types.backup/cache/vercel/index.d.ts +1 -0
  132. package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +267 -0
  133. package/dist/types.backup/client.d.ts +184 -0
  134. package/dist/types.backup/client.rsc.d.ts +39 -0
  135. package/dist/types.backup/cloudflare/index.d.ts +7 -0
  136. package/dist/types.backup/cloudflare/tracing.d.ts +53 -0
  137. package/dist/types.backup/component-utils.d.ts +46 -0
  138. package/dist/types.backup/components/DefaultDocument.d.ts +13 -0
  139. package/dist/types.backup/context-var.d.ts +84 -0
  140. package/dist/types.backup/debug.d.ts +57 -0
  141. package/dist/types.backup/decode-loader-results.d.ts +5 -0
  142. package/dist/types.backup/default-error-boundary.d.ts +10 -0
  143. package/dist/types.backup/defer.d.ts +89 -0
  144. package/dist/types.backup/deps/browser.d.ts +1 -0
  145. package/dist/types.backup/deps/html-stream-client.d.ts +1 -0
  146. package/dist/types.backup/deps/html-stream-server.d.ts +1 -0
  147. package/dist/types.backup/deps/rsc.d.ts +1 -0
  148. package/dist/types.backup/deps/ssr.d.ts +1 -0
  149. package/dist/types.backup/encode-kv.d.ts +35 -0
  150. package/dist/types.backup/errors.d.ts +226 -0
  151. package/dist/types.backup/escape-script.d.ts +44 -0
  152. package/dist/types.backup/handle.d.ts +93 -0
  153. package/dist/types.backup/handles/MetaTags.d.ts +17 -0
  154. package/dist/types.backup/handles/Scripts.d.ts +38 -0
  155. package/dist/types.backup/handles/breadcrumbs.d.ts +43 -0
  156. package/dist/types.backup/handles/deferred-resolution.d.ts +53 -0
  157. package/dist/types.backup/handles/is-thenable.d.ts +12 -0
  158. package/dist/types.backup/handles/meta.d.ts +43 -0
  159. package/dist/types.backup/handles/script.d.ts +139 -0
  160. package/dist/types.backup/host/cookie-handler.d.ts +8 -0
  161. package/dist/types.backup/host/errors.d.ts +40 -0
  162. package/dist/types.backup/host/index.d.ts +33 -0
  163. package/dist/types.backup/host/pattern-matcher.d.ts +30 -0
  164. package/dist/types.backup/host/router.d.ts +12 -0
  165. package/dist/types.backup/host/testing.d.ts +41 -0
  166. package/dist/types.backup/host/types.d.ts +148 -0
  167. package/dist/types.backup/host/utils.d.ts +20 -0
  168. package/dist/types.backup/href-client.d.ts +214 -0
  169. package/dist/types.backup/index.d.ts +112 -0
  170. package/dist/types.backup/index.rsc.d.ts +51 -0
  171. package/dist/types.backup/internal-debug.d.ts +1 -0
  172. package/dist/types.backup/loader-store.d.ts +193 -0
  173. package/dist/types.backup/loader.d.ts +18 -0
  174. package/dist/types.backup/loader.rsc.d.ts +18 -0
  175. package/dist/types.backup/missing-id-error.d.ts +1 -0
  176. package/dist/types.backup/outlet-context.d.ts +12 -0
  177. package/dist/types.backup/outlet-provider.d.ts +12 -0
  178. package/dist/types.backup/prerender/build-shell-capture.d.ts +104 -0
  179. package/dist/types.backup/prerender/param-hash.d.ts +6 -0
  180. package/dist/types.backup/prerender/shell-manifest-key.d.ts +18 -0
  181. package/dist/types.backup/prerender/store.d.ts +62 -0
  182. package/dist/types.backup/prerender.d.ts +292 -0
  183. package/dist/types.backup/redirect-origin.d.ts +55 -0
  184. package/dist/types.backup/regex-escape.d.ts +6 -0
  185. package/dist/types.backup/render-error-thrower.d.ts +13 -0
  186. package/dist/types.backup/response-utils.d.ts +35 -0
  187. package/dist/types.backup/reverse.d.ts +206 -0
  188. package/dist/types.backup/root-error-boundary.d.ts +32 -0
  189. package/dist/types.backup/route-content-wrapper.d.ts +40 -0
  190. package/dist/types.backup/route-definition/dsl-helpers.d.ts +130 -0
  191. package/dist/types.backup/route-definition/helper-factories.d.ts +22 -0
  192. package/dist/types.backup/route-definition/helpers-types.d.ts +392 -0
  193. package/dist/types.backup/route-definition/index.d.ts +7 -0
  194. package/dist/types.backup/route-definition/redirect.d.ts +48 -0
  195. package/dist/types.backup/route-definition/resolve-handler-use.d.ts +19 -0
  196. package/dist/types.backup/route-definition/use-item-types.d.ts +1 -0
  197. package/dist/types.backup/route-definition.d.ts +1 -0
  198. package/dist/types.backup/route-map-builder.d.ts +127 -0
  199. package/dist/types.backup/route-name.d.ts +27 -0
  200. package/dist/types.backup/route-types.d.ts +172 -0
  201. package/dist/types.backup/router/basename.d.ts +10 -0
  202. package/dist/types.backup/router/content-negotiation.d.ts +91 -0
  203. package/dist/types.backup/router/debug-manifest.d.ts +7 -0
  204. package/dist/types.backup/router/error-handling.d.ts +76 -0
  205. package/dist/types.backup/router/find-match.d.ts +19 -0
  206. package/dist/types.backup/router/handler-context.d.ts +41 -0
  207. package/dist/types.backup/router/instrument.d.ts +161 -0
  208. package/dist/types.backup/router/intercept-resolution.d.ts +79 -0
  209. package/dist/types.backup/router/lazy-includes.d.ts +26 -0
  210. package/dist/types.backup/router/loader-resolution.d.ts +63 -0
  211. package/dist/types.backup/router/logging.d.ts +41 -0
  212. package/dist/types.backup/router/manifest.d.ts +8 -0
  213. package/dist/types.backup/router/match-api.d.ts +19 -0
  214. package/dist/types.backup/router/match-context.d.ts +184 -0
  215. package/dist/types.backup/router/match-handlers.d.ts +49 -0
  216. package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +113 -0
  217. package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +113 -0
  218. package/dist/types.backup/router/match-middleware/cache-store.d.ts +112 -0
  219. package/dist/types.backup/router/match-middleware/index.d.ts +80 -0
  220. package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +116 -0
  221. package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +94 -0
  222. package/dist/types.backup/router/match-pipelines.d.ts +103 -0
  223. package/dist/types.backup/router/match-result.d.ts +114 -0
  224. package/dist/types.backup/router/metrics.d.ts +6 -0
  225. package/dist/types.backup/router/middleware-types.d.ts +74 -0
  226. package/dist/types.backup/router/middleware.d.ts +116 -0
  227. package/dist/types.backup/router/navigation-snapshot.d.ts +22 -0
  228. package/dist/types.backup/router/params-util.d.ts +8 -0
  229. package/dist/types.backup/router/parse-pattern.d.ts +38 -0
  230. package/dist/types.backup/router/pattern-matching.d.ts +169 -0
  231. package/dist/types.backup/router/prefetch-cache-ttl.d.ts +27 -0
  232. package/dist/types.backup/router/prefetch-limits.d.ts +20 -0
  233. package/dist/types.backup/router/prerender-match.d.ts +50 -0
  234. package/dist/types.backup/router/preview-match.d.ts +22 -0
  235. package/dist/types.backup/router/request-classification.d.ts +104 -0
  236. package/dist/types.backup/router/revalidation.d.ts +57 -0
  237. package/dist/types.backup/router/route-snapshot.d.ts +112 -0
  238. package/dist/types.backup/router/router-context.d.ts +137 -0
  239. package/dist/types.backup/router/router-interfaces.d.ts +432 -0
  240. package/dist/types.backup/router/router-options.d.ts +738 -0
  241. package/dist/types.backup/router/router-registry.d.ts +15 -0
  242. package/dist/types.backup/router/segment-resolution/fresh.d.ts +55 -0
  243. package/dist/types.backup/router/segment-resolution/helpers.d.ts +93 -0
  244. package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +33 -0
  245. package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +44 -0
  246. package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +90 -0
  247. package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +53 -0
  248. package/dist/types.backup/router/segment-resolution/revalidation.d.ts +85 -0
  249. package/dist/types.backup/router/segment-resolution/static-store.d.ts +17 -0
  250. package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
  251. package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +28 -0
  252. package/dist/types.backup/router/segment-resolution.d.ts +3 -0
  253. package/dist/types.backup/router/segment-wrappers.d.ts +53 -0
  254. package/dist/types.backup/router/state-cookie-name.d.ts +1 -0
  255. package/dist/types.backup/router/substitute-pattern-params.d.ts +23 -0
  256. package/dist/types.backup/router/telemetry-otel.d.ts +113 -0
  257. package/dist/types.backup/router/telemetry.d.ts +215 -0
  258. package/dist/types.backup/router/timeout.d.ts +68 -0
  259. package/dist/types.backup/router/tracing.d.ts +125 -0
  260. package/dist/types.backup/router/trie-matching.d.ts +32 -0
  261. package/dist/types.backup/router/types.d.ts +98 -0
  262. package/dist/types.backup/router/url-params.d.ts +26 -0
  263. package/dist/types.backup/router.d.ts +7 -0
  264. package/dist/types.backup/rsc/capture-queue.d.ts +6 -0
  265. package/dist/types.backup/rsc/full-payload.d.ts +22 -0
  266. package/dist/types.backup/rsc/handler-context.d.ts +31 -0
  267. package/dist/types.backup/rsc/handler.d.ts +9 -0
  268. package/dist/types.backup/rsc/helpers.d.ts +213 -0
  269. package/dist/types.backup/rsc/index.d.ts +17 -0
  270. package/dist/types.backup/rsc/json-route-result.d.ts +20 -0
  271. package/dist/types.backup/rsc/loader-fetch.d.ts +14 -0
  272. package/dist/types.backup/rsc/manifest-init.d.ts +18 -0
  273. package/dist/types.backup/rsc/nonce.d.ts +28 -0
  274. package/dist/types.backup/rsc/origin-guard.d.ts +50 -0
  275. package/dist/types.backup/rsc/progressive-enhancement.d.ts +19 -0
  276. package/dist/types.backup/rsc/redirect-guard.d.ts +35 -0
  277. package/dist/types.backup/rsc/response-cache-serve.d.ts +46 -0
  278. package/dist/types.backup/rsc/response-error.d.ts +19 -0
  279. package/dist/types.backup/rsc/response-route-handler.d.ts +29 -0
  280. package/dist/types.backup/rsc/rsc-rendering.d.ts +23 -0
  281. package/dist/types.backup/rsc/runtime-warnings.d.ts +22 -0
  282. package/dist/types.backup/rsc/server-action.d.ts +68 -0
  283. package/dist/types.backup/rsc/shell-build-manifest.d.ts +84 -0
  284. package/dist/types.backup/rsc/shell-capture-constants.d.ts +27 -0
  285. package/dist/types.backup/rsc/shell-capture.d.ts +374 -0
  286. package/dist/types.backup/rsc/shell-serve.d.ts +136 -0
  287. package/dist/types.backup/rsc/ssr-setup.d.ts +48 -0
  288. package/dist/types.backup/rsc/transition-gate.d.ts +27 -0
  289. package/dist/types.backup/rsc/types.d.ts +290 -0
  290. package/dist/types.backup/runtime-env.d.ts +1 -0
  291. package/dist/types.backup/search-params.d.ts +125 -0
  292. package/dist/types.backup/segment-content-promise.d.ts +13 -0
  293. package/dist/types.backup/segment-fragments.d.ts +56 -0
  294. package/dist/types.backup/segment-loader-promise.d.ts +22 -0
  295. package/dist/types.backup/segment-system.d.ts +84 -0
  296. package/dist/types.backup/serialize.d.ts +164 -0
  297. package/dist/types.backup/server/context.d.ts +494 -0
  298. package/dist/types.backup/server/cookie-parse.d.ts +10 -0
  299. package/dist/types.backup/server/cookie-store.d.ts +107 -0
  300. package/dist/types.backup/server/fetchable-loader-store.d.ts +20 -0
  301. package/dist/types.backup/server/handle-store.d.ts +100 -0
  302. package/dist/types.backup/server/loader-registry.d.ts +32 -0
  303. package/dist/types.backup/server/request-context.d.ts +596 -0
  304. package/dist/types.backup/server/root-layout.d.ts +3 -0
  305. package/dist/types.backup/server.d.ts +15 -0
  306. package/dist/types.backup/ssr/index.d.ts +233 -0
  307. package/dist/types.backup/ssr/inject-rsc-eager.d.ts +3 -0
  308. package/dist/types.backup/ssr/preinit-client-references.d.ts +71 -0
  309. package/dist/types.backup/ssr/ssr-root.d.ts +69 -0
  310. package/dist/types.backup/static-handler.d.ts +57 -0
  311. package/dist/types.backup/testing/cache-status.d.ts +63 -0
  312. package/dist/types.backup/testing/collect-handle.d.ts +20 -0
  313. package/dist/types.backup/testing/dispatch.d.ts +123 -0
  314. package/dist/types.backup/testing/dom.entry.d.ts +15 -0
  315. package/dist/types.backup/testing/e2e/fixture.d.ts +37 -0
  316. package/dist/types.backup/testing/e2e/index.d.ts +30 -0
  317. package/dist/types.backup/testing/e2e/matchers.d.ts +17 -0
  318. package/dist/types.backup/testing/e2e/page-helpers.d.ts +62 -0
  319. package/dist/types.backup/testing/e2e/parity.d.ts +111 -0
  320. package/dist/types.backup/testing/e2e/server.d.ts +35 -0
  321. package/dist/types.backup/testing/flight-matchers.d.ts +55 -0
  322. package/dist/types.backup/testing/flight-normalize.d.ts +1 -0
  323. package/dist/types.backup/testing/flight-tree.d.ts +192 -0
  324. package/dist/types.backup/testing/flight.d.ts +115 -0
  325. package/dist/types.backup/testing/flight.entry.d.ts +27 -0
  326. package/dist/types.backup/testing/generated-routes.d.ts +66 -0
  327. package/dist/types.backup/testing/index.d.ts +52 -0
  328. package/dist/types.backup/testing/internal/context.d.ts +225 -0
  329. package/dist/types.backup/testing/internal/flight-client-globals.d.ts +1 -0
  330. package/dist/types.backup/testing/internal/seed-vars.d.ts +30 -0
  331. package/dist/types.backup/testing/render-handler.d.ts +160 -0
  332. package/dist/types.backup/testing/render-route.d.ts +246 -0
  333. package/dist/types.backup/testing/run-loader.d.ts +186 -0
  334. package/dist/types.backup/testing/run-middleware.d.ts +132 -0
  335. package/dist/types.backup/testing/run-transition-when.d.ts +77 -0
  336. package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
  337. package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
  338. package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
  339. package/dist/types.backup/testing/vitest-stubs/version.d.ts +1 -0
  340. package/dist/types.backup/testing/vitest.d.ts +205 -0
  341. package/dist/types.backup/theme/ThemeProvider.d.ts +13 -0
  342. package/dist/types.backup/theme/ThemeScript.d.ts +45 -0
  343. package/dist/types.backup/theme/constants.d.ts +39 -0
  344. package/dist/types.backup/theme/index.d.ts +29 -0
  345. package/dist/types.backup/theme/theme-context.d.ts +21 -0
  346. package/dist/types.backup/theme/theme-script.d.ts +26 -0
  347. package/dist/types.backup/theme/types.d.ts +162 -0
  348. package/dist/types.backup/theme/use-theme.d.ts +8 -0
  349. package/dist/types.backup/types/boundaries.d.ts +93 -0
  350. package/dist/types.backup/types/cache-types.d.ts +191 -0
  351. package/dist/types.backup/types/error-types.d.ts +114 -0
  352. package/dist/types.backup/types/global-namespace.d.ts +90 -0
  353. package/dist/types.backup/types/handler-context.d.ts +658 -0
  354. package/dist/types.backup/types/index.d.ts +11 -0
  355. package/dist/types.backup/types/loader-types.d.ts +182 -0
  356. package/dist/types.backup/types/request-scope.d.ts +93 -0
  357. package/dist/types.backup/types/route-config.d.ts +105 -0
  358. package/dist/types.backup/types/route-entry.d.ts +95 -0
  359. package/dist/types.backup/types/segments.d.ts +234 -0
  360. package/dist/types.backup/types.d.ts +1 -0
  361. package/dist/types.backup/urls/include-helper.d.ts +17 -0
  362. package/dist/types.backup/urls/include-provider.d.ts +27 -0
  363. package/dist/types.backup/urls/index.d.ts +6 -0
  364. package/dist/types.backup/urls/path-helper-types.d.ts +197 -0
  365. package/dist/types.backup/urls/path-helper.d.ts +12 -0
  366. package/dist/types.backup/urls/pattern-types.d.ts +166 -0
  367. package/dist/types.backup/urls/response-types.d.ts +67 -0
  368. package/dist/types.backup/urls/type-extraction.d.ts +157 -0
  369. package/dist/types.backup/urls/urls-function.d.ts +24 -0
  370. package/dist/types.backup/urls.d.ts +1 -0
  371. package/dist/types.backup/use-loader.d.ts +150 -0
  372. package/dist/types.backup/vercel/index.d.ts +10 -0
  373. package/dist/types.backup/vercel/tracing.d.ts +70 -0
  374. package/dist/types.backup/vite/debug.d.ts +80 -0
  375. package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +12 -0
  376. package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +65 -0
  377. package/dist/types.backup/vite/discovery/discover-routers.d.ts +17 -0
  378. package/dist/types.backup/vite/discovery/discovery-errors.d.ts +113 -0
  379. package/dist/types.backup/vite/discovery/gate-state.d.ts +79 -0
  380. package/dist/types.backup/vite/discovery/prerender-collection.d.ts +24 -0
  381. package/dist/types.backup/vite/discovery/route-types-writer.d.ts +32 -0
  382. package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +22 -0
  383. package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +40 -0
  384. package/dist/types.backup/vite/discovery/state.d.ts +162 -0
  385. package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +15 -0
  386. package/dist/types.backup/vite/index.d.ts +11 -0
  387. package/dist/types.backup/vite/inject-client-debug.d.ts +56 -0
  388. package/dist/types.backup/vite/plugin-types.d.ts +298 -0
  389. package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +6 -0
  390. package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +40 -0
  391. package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +35 -0
  392. package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
  393. package/dist/types.backup/vite/plugins/expose-action-id.d.ts +18 -0
  394. package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +37 -0
  395. package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
  396. package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
  397. package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
  398. package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +13 -0
  399. package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +29 -0
  400. package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +6 -0
  401. package/dist/types.backup/vite/plugins/performance-tracks.d.ts +25 -0
  402. package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +20 -0
  403. package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +20 -0
  404. package/dist/types.backup/vite/plugins/vercel-output.d.ts +85 -0
  405. package/dist/types.backup/vite/plugins/version-injector.d.ts +21 -0
  406. package/dist/types.backup/vite/plugins/version-plugin.d.ts +19 -0
  407. package/dist/types.backup/vite/plugins/virtual-entries.d.ts +36 -0
  408. package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +7 -0
  409. package/dist/types.backup/vite/rango.d.ts +29 -0
  410. package/dist/types.backup/vite/router-discovery.d.ts +23 -0
  411. package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +64 -0
  412. package/dist/types.backup/vite/utils/banner.d.ts +2 -0
  413. package/dist/types.backup/vite/utils/bundle-analysis.d.ts +28 -0
  414. package/dist/types.backup/vite/utils/client-chunks.d.ts +55 -0
  415. package/dist/types.backup/vite/utils/directive-prologue.d.ts +16 -0
  416. package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +37 -0
  417. package/dist/types.backup/vite/utils/manifest-utils.d.ts +7 -0
  418. package/dist/types.backup/vite/utils/package-resolution.d.ts +6 -0
  419. package/dist/types.backup/vite/utils/prerender-utils.d.ts +32 -0
  420. package/dist/types.backup/vite/utils/shared-utils.d.ts +55 -0
  421. package/dist/vite/index.js +5 -2
  422. package/package.json +20 -21
  423. package/skills/cache-guide/SKILL.md +6 -3
  424. package/skills/catalog.json +7 -1
  425. package/skills/comparison/references/framework-comparison.md +2 -1
  426. package/skills/deployment-caching/SKILL.md +176 -0
  427. package/skills/document-cache/SKILL.md +30 -3
  428. package/skills/ppr/SKILL.md +81 -34
  429. package/skills/prerender/SKILL.md +15 -8
  430. package/skills/rango/SKILL.md +20 -17
  431. package/skills/router-setup/SKILL.md +4 -0
  432. package/skills/testing/SKILL.md +1 -1
  433. package/skills/testing/cache-prerender.md +5 -1
  434. package/skills/vercel/SKILL.md +22 -1
  435. package/skills/view-transitions/SKILL.md +12 -8
  436. package/src/browser/prefetch/default-strategy.ts +34 -0
  437. package/src/browser/prefetch/loader.ts +6 -12
  438. package/src/browser/prefetch/runtime.ts +0 -1
  439. package/src/browser/react/Link.tsx +22 -21
  440. package/src/browser/rsc-router.tsx +8 -0
  441. package/src/browser/types.ts +5 -0
  442. package/src/cache/cache-scope.ts +6 -1
  443. package/src/cache/cf/cf-cache-store.ts +4 -0
  444. package/src/cache/document-cache.ts +4 -2
  445. package/src/cache/types.ts +10 -3
  446. package/src/cache/vercel/vercel-cache-store.ts +6 -1
  447. package/src/route-definition/helpers-types.ts +6 -6
  448. package/src/router/match-handlers.ts +44 -6
  449. package/src/router/match-middleware/cache-lookup.ts +10 -3
  450. package/src/router/prefetch-default.ts +59 -0
  451. package/src/router/router-interfaces.ts +8 -0
  452. package/src/router/router-options.ts +31 -0
  453. package/src/router/segment-resolution/view-transition-default.ts +9 -5
  454. package/src/router/transition-when.ts +76 -0
  455. package/src/router.ts +7 -0
  456. package/src/rsc/capture-queue.ts +24 -1
  457. package/src/rsc/full-payload.ts +1 -0
  458. package/src/rsc/handler.ts +1 -0
  459. package/src/rsc/progressive-enhancement.ts +9 -14
  460. package/src/rsc/rsc-rendering.ts +261 -48
  461. package/src/rsc/shell-capture.ts +94 -50
  462. package/src/rsc/shell-serve.ts +9 -4
  463. package/src/rsc/transition-gate.ts +37 -40
  464. package/src/rsc/types.ts +2 -0
  465. package/src/server/request-context.ts +6 -0
  466. package/src/testing/e2e/index.ts +11 -0
  467. package/src/testing/e2e/page-helpers.ts +47 -0
  468. package/src/testing/e2e/parity.ts +13 -0
  469. package/src/testing/index.ts +9 -1
  470. package/src/testing/run-transition-when.ts +42 -9
  471. package/src/testing/shell-status.ts +92 -3
  472. package/src/types/segments.ts +27 -22
  473. package/src/urls/path-helper-types.ts +4 -3
@@ -110,6 +110,7 @@ stated, greppable contract.
110
110
  | pre-render a route at build time | `Prerender(...)` wrapper | /prerender |
111
111
  | feed live loaders from a cached shell | replayed handle + `ctx.rendered()` | /shell-manifest |
112
112
  | cache the HTML shell, keep loaders live | `ppr` path option | /ppr |
113
+ | choose in-function vs CDN caching | deployment cache boundary | /deployment-caching |
113
114
  | stream SSE / upgrade a WebSocket | `path.stream()` / `path.any()` | /streams-and-websockets |
114
115
 
115
116
  ## Invariants
@@ -161,8 +162,8 @@ Same words, different jobs — this is the most common source of the
161
162
  | Next.js `export const revalidate = N` | **Axis 1** (cache) | Same word, opposite meaning. Next's `revalidate` is time-based cache expiry; Rango's `revalidate()` is **axis 2**. Use `cache({ ttl })` for the Next behavior. |
162
163
  | Next.js `revalidateTag` / `updateTag` | **Axis 1** (cache) | Cache busting by tag. Tag via `cache({ tags })` / `cacheTag(...tags)`; invalidate with `updateTag(...tags)` (awaitable, read-your-own-writes) or `revalidateTag(...tags)` (background, non-blocking). Built-in stores index by tag. No `revalidatePath` (path-based busting); use tags. |
163
164
  | React Router / Remix `shouldRevalidate` | **Axis 2** | This is the correct mental model for Rango's `revalidate()`. |
164
- | HTTP `Cache-Control` / ISR | **Axis 1** | Edge/document layer see `/document-cache`. Separate from both `cache()` and `revalidate()`. |
165
- | Next.js PPR (partial prerendering) | HTML shell layer | Same idea, different wiring: the opt-in `ppr` path option captures at runtime (no build-time default); holes are render-defined — `loading()` subtrees plus pending promises under a consumer's own `<Suspense>`. See `/ppr`. |
165
+ | HTTP `Cache-Control` / ISR | Deployment layer | Complete-response deployment layer. A CDN hit bypasses Rango entirely; the store-backed middleware does not. See `/deployment-caching` and `/document-cache`. |
166
+ | Next.js PPR (partial prerendering) | HTML shell layer | Same React primitive, different transport: Rango serves shells in-function after middleware. Ordinary `ppr` captures at runtime; `Prerender + ppr` captures at build. See `/ppr`, `/prerender`, and `/deployment-caching`. |
166
167
  | Remix/RR `loader` | live data | Like Rango loaders, fresh per request — but Rango loaders run in parallel and stream (latency overlaps first paint), and can opt into caching on demand. |
167
168
 
168
169
  See `/cache-guide` for the axis-1 decision guide, `/loader` and `/route` for
@@ -257,17 +258,18 @@ Grouped by concern — read when you need to…
257
258
 
258
259
  **Data & caching** — fetch, mutate, and cache:
259
260
 
260
- | Skill | Description |
261
- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
262
- | `/loader` | Data loaders with `createLoader()` and `revalidate()` |
263
- | `/server-actions` | Mutations with `"use server"`, useActionState, validation, revalidation |
264
- | `/caching` | Segment caching with memory or KV stores |
265
- | `/use-cache` | Function-level caching with `"use cache"` directive |
266
- | `/cache-guide` | When to use `cache()` vs `"use cache"` — differences and decision guide |
267
- | `/document-cache` | Edge caching with Cache-Control headers |
268
- | `/ppr` | PPR shell caching: cached shell served instantly, live holes resumed a hole is a `loading()` subtree OR a pending promise under `<Suspense>` (no loader needed) |
269
- | `/prerender` | Pre-render route segments at build time (Passthrough live fallback) |
270
- | `/shell-manifest` | Replayed handles as cache metadata read by live loaders (frozen shell, batched live holes) |
261
+ | Skill | Description |
262
+ | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
263
+ | `/loader` | Data loaders with `createLoader()` and `revalidate()` |
264
+ | `/server-actions` | Mutations with `"use server"`, useActionState, validation, revalidation |
265
+ | `/caching` | Segment caching with memory or KV stores |
266
+ | `/use-cache` | Function-level caching with `"use cache"` directive |
267
+ | `/cache-guide` | When to use `cache()` vs `"use cache"` — differences and decision guide |
268
+ | `/document-cache` | Store-backed complete-response middleware using Cache-Control policy |
269
+ | `/deployment-caching` | Choose between in-function caches, store-backed responses, and an external CDN cache |
270
+ | `/ppr` | PPR shell caching: cached shell served instantly, live holes resumed — a hole is a `loading()` subtree OR a pending promise under `<Suspense>` (no loader needed) |
271
+ | `/prerender` | Pre-render route segments at build time (Passthrough live fallback) |
272
+ | `/shell-manifest` | Replayed handles as cache metadata read by live loaders (frozen shell, batched live holes) |
271
273
 
272
274
  **Client & presentation** — build the client-side UX:
273
275
 
@@ -295,10 +297,11 @@ Grouped by concern — read when you need to…
295
297
 
296
298
  **Deployment**:
297
299
 
298
- | Skill | Description |
299
- | ------------- | ---------------------------------------------------------------------------------------------------------------- |
300
- | `/cloudflare` | Deploy to Cloudflare Workers with the Vite plugin, typed D1/KV bindings, migrations, secrets, and preview parity |
301
- | `/vercel` | Deploy to Vercel Functions (`preset: "vercel"`), Runtime Cache, and `createVercelTracing` |
300
+ | Skill | Description |
301
+ | --------------------- | ---------------------------------------------------------------------------------------------------------------- |
302
+ | `/cloudflare` | Deploy to Cloudflare Workers with the Vite plugin, typed D1/KV bindings, migrations, secrets, and preview parity |
303
+ | `/vercel` | Deploy to Vercel Functions (`preset: "vercel"`), Runtime Cache, and `createVercelTracing` |
304
+ | `/deployment-caching` | Compare deployment cache boundaries, middleware execution, PPR transport, and HTTP CDN caching |
302
305
 
303
306
  **Testing**:
304
307
 
@@ -120,6 +120,10 @@ interface RangoOptions<TEnv> {
120
120
  // Set to false to disable prefetch caching.
121
121
  prefetchCacheTTL?: number | false;
122
122
 
123
+ // Default prefetch strategy for Links without a `prefetch` prop
124
+ // (dev: "none", production: "viewport"). Per-Link props win in both directions.
125
+ defaultPrefetch?: "hover" | "viewport" | "render" | "adaptive" | "none";
126
+
123
127
  // CSP nonce provider (for router.fetch)
124
128
  nonce?: (
125
129
  request: Request,
@@ -88,7 +88,7 @@ Each primitive links to its sub-file (API + recipe + caveats).
88
88
  | a loader's cookie / header / redirect output (auth-loader pattern) | unit (node) | [`runLoaderResult`](./loader.md) | `@rangojs/router/testing` |
89
89
  | one middleware's ordering / short-circuit / cookie+header merge | unit (node) | [`runMiddleware`](./middleware.md) | `@rangojs/router/testing` |
90
90
  | a `"use server"` action's cookie / header / flash output (even on `throw redirect()`) | unit (node) | [`runInRequestContext`](./server-actions.md) | `@rangojs/router/testing` |
91
- | a `transition({ when })` gate (keep/drop) against nav source / target / action metadata | unit (node) | `runTransitionWhen` (`{ kept, whenContext }`) | `@rangojs/router/testing` |
91
+ | a `transition({ when })` gate (keep/drop) against nav source / target / action metadata | unit (node) | `runTransitionWhen` (`{ kept, whenContext }`; pass `{ ppr: true }` for pre-handler timing) | `@rangojs/router/testing` |
92
92
  | a handle's `collect`/accumulator, or a seeded handle read | unit | [`collectHandle` / seeded `handles`](./handles.md) | `@rangojs/router/testing` |
93
93
  | a CLIENT component reading router context (`useParams`/`useReverse`/`Outlet`/`useNavigation`/`useLoader`) | unit (DOM) | [`renderRoute`](./client-components.md) | `@rangojs/router/testing/dom` |
94
94
  | a redirect / status / headers / cookies / **response route** (json/text/html/xml/md), no Flight | integration | [`dispatch`](./response-routes.md) | `@rangojs/router/testing` |
@@ -113,7 +113,7 @@ expect(decision.segments?.[0].shouldRevalidate).toBe(true);
113
113
 
114
114
  `events` accumulates across requests, so the FIRST matching segment for a `routeKey` wins — slice or recreate the sink between requests for the same route.
115
115
 
116
- ## PPR shell (`x-rango-shell`)
116
+ ## PPR shell and navigation replay
117
117
 
118
118
  **DSL:** `ppr: true | PartialPrerenderProps` on a page route (see `/ppr`). **Not** the same header as `X-Rango-Cache` — shell is a second render axis.
119
119
 
@@ -123,6 +123,9 @@ expect(decision.segments?.[0].shouldRevalidate).toBe(true);
123
123
  | `parseShellStatus(res)` | same | `"HIT" \| "MISS" \| null` (null = header absent / unrecognized) |
124
124
  | `shellCacheKey(url)` | same | Production shell store key (`host+pathname+sorted search+:shell`) for `store.getShell` / custom stores |
125
125
  | `SHELL_STATUS_HEADER` | same | `"x-rango-shell"` constant |
126
+ | `assertPprReplayStatus(res, expected)` | same | Assert fresh/stale replay or a bounded bypass decision |
127
+ | `parsePprReplayStatus(res)` | same | Structured replay/bypass status, or null for an absent/unrecognized header |
128
+ | `PPR_REPLAY_STATUS_HEADER` | same | `"x-rango-ppr-replay"` constant |
126
129
 
127
130
  ### What unit can prove vs e2e
128
131
 
@@ -131,6 +134,7 @@ expect(decision.segments?.[0].shouldRevalidate).toBe(true);
131
134
  | **Unit** | store family + key identity | `MemorySegmentCacheStore` + `shellCacheKey(url)` + `putShell`/`getShell` / tag eviction — dogfood in `e2e/mini/test/shell-store-family.test.ts` and `src/testing/__tests__/shell-status.test.ts` |
132
135
  | **Unit** | header helper contract | `assertShellStatus` on a Response that already carries the header (characterizes the helper; **never** invent a HIT to claim capture worked) |
133
136
  | **E2E** | live MISS → capture → HIT | document GET, poll until `x-rango-shell: HIT` (background capture) — `e2e/shell-cache.test.ts` |
137
+ | **E2E** | partial replay decision | soft navigation to a warmed shell and `assertPprReplayStatus(response, { outcome: "HIT", freshness: "fresh" })` |
134
138
 
135
139
  `dispatch` is RSC-free: it never runs shell serve/capture. `renderHandler` only surfaces `ctx.dynamic()` opt-out, not bake/serve.
136
140
 
@@ -8,6 +8,25 @@ argument-hint:
8
8
 
9
9
  The `vercel` preset builds like the `node` preset (Vercel runs Node Functions, not Workers): rango owns the RSC entry, folds `process.env.NODE_ENV` for the SSR/RSC build, and after `vite build` assembles a `.vercel/output` directory (Build Output API v3) from `dist/` — a single streaming Node Function plus the static client assets.
10
10
 
11
+ ## Deployment boundary
12
+
13
+ Only client JS, CSS, and public assets are emitted under
14
+ `.vercel/output/static`. HTML, Flight, prerender payloads, and PPR shells are
15
+ served from the streaming Node Function. `VercelCacheStore` is an in-function
16
+ Runtime Cache backend; it is separate from Vercel's CDN/ISR cache.
17
+
18
+ The preset does not emit `.prerender-config.json`, a response `chain`, or a
19
+ CDN-stitched PPR resume function. Rango PPR intentionally runs the whole global
20
+ and route middleware chain before committing shell bytes. A CDN-first shell
21
+ cannot preserve that contract because the resume function is invoked after the
22
+ shell starts streaming.
23
+
24
+ For fully public responses, HTTP `s-maxage`/`stale-while-revalidate` can cache
25
+ the completed response at Vercel's CDN and avoid the function on a hit. That is
26
+ whole-response caching: it freezes loader output and bypasses all Rango
27
+ middleware. Use `/deployment-caching` for the execution matrix and safety
28
+ checklist before adding shared-cache headers.
29
+
11
30
  ## Setup
12
31
 
13
32
  ```bash
@@ -48,7 +67,9 @@ rango({
48
67
 
49
68
  ## Runtime Cache
50
69
 
51
- `VercelCacheStore` wraps the Vercel Runtime Cache. Locally (no `process.env.VERCEL`) fall back to an in-memory store so dev/preview work without the platform:
70
+ `VercelCacheStore` wraps the Vercel Runtime Cache for segment, item, response,
71
+ and PPR shell families. Locally (no `process.env.VERCEL`) fall back to an
72
+ in-memory store so dev/preview work without the platform:
52
73
 
53
74
  ```typescript
54
75
  import {
@@ -209,9 +209,8 @@ interface TransitionConfig {
209
209
  default?: string | Record<string, string>; // fallback for any phase
210
210
  name?: string; // explicit view-transition-name
211
211
  viewTransition?: "auto" | false; // boundary opt-out (see below)
212
- // Conditional gate, evaluated server-side AFTER the route handler. Return
213
- // false to drop this transition for the request, so the navigation streams its
214
- // loading() fallback instead of holding. See the gate section below.
212
+ // Conditional server-side gate. PPR routes run it before route handlers and
213
+ // on every replay; other routes run it after handlers on fresh resolution.
215
214
  when?: (ctx: TransitionWhenContext) => boolean;
216
215
  }
217
216
  ```
@@ -223,14 +222,19 @@ interface TransitionConfig {
223
222
 
224
223
  ## Conditional transitions (`when`)
225
224
 
226
- `transition({ when })` gates the hold per request. The predicate runs **server-side, AFTER the route handler** and outside any cache scope; return `false` to drop this segment's transition for the request (the navigation streams its `loading()` fallback instead of holding).
225
+ `transition({ when })` gates the hold per request. The predicate runs server-side and outside any cache scope; return `false` to drop this segment's transition for the request (the navigation streams its `loading()` fallback instead of holding).
227
226
 
228
- Its context mirrors the `revalidate()` predicate args — the same navigation/action metadata — plus `get`/`env` for post-handler reads:
227
+ Timing follows the route's rendering contract:
228
+
229
+ - On an ordinary route it runs after the route handler during fresh resolution, so `get()` can read handler- and middleware-set context. Cache/prerender hits replay the stored decision.
230
+ - On a `ppr` route it is automatically hoisted before route handlers and runs on every match, including runtime-cache, prerender, document-shell, and partial-navigation replay. It can read URL/params/action metadata, `env`, and middleware-set context, but not values set by route handlers. This is what keeps the handler-free PPR fast path available without a second API.
231
+
232
+ Its context mirrors the `revalidate()` predicate args — the same navigation/action metadata — plus `get`/`env` for request-context reads:
229
233
 
230
234
  ```ts
231
235
  import type { TransitionWhenContext } from "@rangojs/router";
232
236
 
233
- // Hold only when the handler marked this request (handler sets, gate reads):
237
+ // Ordinary route: hold only when the handler marked this request:
234
238
  transition({ when: (ctx) => ctx.get(KeepScroll) === true });
235
239
 
236
240
  // Hold only when arriving from a specific page (the navigation SOURCE):
@@ -252,13 +256,13 @@ transition({
252
256
  | `toRouteName` (and `fromRouteName`) | route **name** | when the route is named (undefined for unnamed/auto-generated) |
253
257
  | `actionId` / `actionUrl` / `actionResult` / `formData` | the server action that triggered this render | action-triggered renders only |
254
258
  | `method` | `"GET"` (nav) / `"POST"` (action) | always |
255
- | `get` / `env` | read handler/middleware vars + app env | always |
259
+ | `get` / `env` | read request vars + app env | always; PPR timing exposes middleware vars, not handler writes |
256
260
 
257
261
  A predicate that throws is reported to `router.onError` (phase `"rendering"`) and treated as no-hold (conservative).
258
262
 
259
263
  **Same-route content-holds need the transition present on the FIRST render.** The same-route hold works by giving the route a param-agnostic key so a param change reconciles instead of remounting — but that key is established when the route first mounts. A source gate that returns `false` on the initial full load (where `currentUrl`/`currentParams`/`fromRouteName` are undefined) drops the transition before the route mounts, so the route mounts _outside_ a transition scope and **every** later same-route param nav remounts (flashing the skeleton) regardless of what the gate decides on those navs. Write source gates so they hold when there is no source — e.g. `({ currentParams }) => currentParams?.tab !== "raw"` (true on the initial load) rather than `=== "details"` (false on the initial load) — when the same-route content-hold must engage. This only affects same-route param navigations; action-only or cross-route gating is unaffected (no shared param key is in play).
260
264
 
261
- **Prefetch / cache caveat.** The gate runs during resolution, so a **prefetched** navigation decides at prefetch time — `currentUrl`/`currentParams`/`fromRouteName` reflect the page the prefetch fired from, not necessarily the click-time source and a `cache()`/prerender hit replays the stored transition without re-running the predicate. A source-sensitive gate can therefore be frozen to prefetch/store-time state. This covers ~99% of navigations; if yours must reflect the exact click-time source, source-scope the prefetch (`<Link prefetchKey=":source">`) and don't `cache()` that segment.
265
+ **Prefetch / cache caveat.** A **prefetched** navigation still decides at prefetch time — `currentUrl`/`currentParams`/`fromRouteName` reflect the page the prefetch fired from, not necessarily the click-time source. Non-PPR `cache()`/prerender hits also replay the stored transition without rerunning the predicate. PPR routes rerun it on the server for each cache/prerender/PPR match, but a completed browser prefetch still carries its earlier Flight decision. If the exact click-time source matters, source-scope the prefetch (`<Link prefetchKey=":source">`).
262
266
 
263
267
  ## Opting out of the router boundary (place your own `<ViewTransition>`)
264
268
 
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Router-wide default Link prefetch strategy (client seat).
3
+ *
4
+ * The server resolves `createRouter({ defaultPrefetch })` once at router init
5
+ * (router/prefetch-default.ts) and ships it in initial payload metadata; the
6
+ * browser entry applies it here before hydration — same lifecycle as
7
+ * `initPrefetchCache` / `setPrefetchConcurrency`. Every `<Link>` without an
8
+ * explicit `prefetch` prop reads the value at render time.
9
+ *
10
+ * The module initial value must equal the server resolver's environment default:
11
+ * `"none"` in development and `"viewport"` in production. During SSR this
12
+ * module is never initialized from metadata, so keeping both seats aligned also
13
+ * gives metadata-less payloads the documented behavior.
14
+ */
15
+
16
+ import type { PrefetchStrategy } from "../../router/prefetch-default.js";
17
+
18
+ // Mirrors DEFAULT_PREFETCH_STRATEGY without pulling router-layer code into the
19
+ // client bundle. NODE_ENV is folded by the app build.
20
+ let defaultStrategy: PrefetchStrategy =
21
+ process.env.NODE_ENV === "production" ? "viewport" : "none";
22
+
23
+ /**
24
+ * Apply the server-resolved default strategy. Called once at browser app init
25
+ * from payload metadata; also used by tests to reset state.
26
+ */
27
+ export function setDefaultPrefetchStrategy(strategy: PrefetchStrategy): void {
28
+ defaultStrategy = strategy;
29
+ }
30
+
31
+ /** Current default strategy for Links without an explicit `prefetch` prop. */
32
+ export function getDefaultPrefetchStrategy(): PrefetchStrategy {
33
+ return defaultStrategy;
34
+ }
@@ -1,4 +1,8 @@
1
1
  import type { RscPayload } from "../types.js";
2
+ import {
3
+ observeForPrefetch as observeElementForPrefetch,
4
+ unobserveForPrefetch,
5
+ } from "./observer.js";
2
6
 
3
7
  type PrefetchDecoder = (response: Promise<Response>) => Promise<RscPayload>;
4
8
 
@@ -83,19 +87,9 @@ export function observeForPrefetch(
83
87
  callback: () => void,
84
88
  ): () => void {
85
89
  if (typeof IntersectionObserver === "undefined") return () => {};
86
- let active = true;
87
- if (runtime) {
88
- runtime.observeForPrefetch(element, callback);
89
- } else {
90
- void loadRuntime()
91
- .then((loaded) => {
92
- if (active) loaded.observeForPrefetch(element, callback);
93
- })
94
- .catch(() => {});
95
- }
90
+ observeElementForPrefetch(element, callback);
96
91
  return () => {
97
- active = false;
98
- runtime?.unobserveForPrefetch(element);
92
+ unobserveForPrefetch(element);
99
93
  };
100
94
  }
101
95
 
@@ -4,4 +4,3 @@ export {
4
4
  cancelAllPrefetches,
5
5
  setPrefetchConcurrency,
6
6
  } from "./queue.js";
7
- export { observeForPrefetch, unobserveForPrefetch } from "./observer.js";
@@ -37,7 +37,9 @@ import {
37
37
  prefetchDirect,
38
38
  prefetchQueued,
39
39
  } from "../prefetch/loader.js";
40
+ import { getDefaultPrefetchStrategy } from "../prefetch/default-strategy.js";
40
41
  import { getAppVersion } from "../app-version.js";
42
+ import type { PrefetchStrategy } from "../../router/prefetch-default.js";
41
43
 
42
44
  // The (hover: none) MediaQueryList, created lazily on first client read and
43
45
  // reused across every Link render. matchMedia allocates and registers a live
@@ -62,20 +64,10 @@ function isTouchDevice(): boolean {
62
64
  return hoverNoneQuery.matches;
63
65
  }
64
66
 
65
- /**
66
- * Prefetch strategy for the Link component
67
- * - "hover": Prefetch on mouse enter (direct, no queue)
68
- * - "viewport": Prefetch when link enters viewport (queued, waits for idle)
69
- * - "render": Prefetch on component mount regardless of visibility (queued, waits for idle)
70
- * - "adaptive": Hover on pointer devices, viewport on touch devices
71
- * - "none": No prefetching (default)
72
- */
73
- export type PrefetchStrategy =
74
- | "hover"
75
- | "viewport"
76
- | "render"
77
- | "adaptive"
78
- | "none";
67
+ // The PrefetchStrategy union is defined in router/prefetch-default.ts (both
68
+ // the server-side option resolver and this client seat consume it); re-export
69
+ // so the public `PrefetchStrategy` import path via client.tsx is unchanged.
70
+ export type { PrefetchStrategy } from "../../router/prefetch-default.js";
79
71
 
80
72
  /**
81
73
  * Resolve a prefetch strategy, expanding "adaptive" to the concrete strategy
@@ -125,8 +117,12 @@ export interface LinkProps extends Omit<
125
117
  */
126
118
  revalidate?: boolean;
127
119
  /**
128
- * Prefetch strategy for the link destination
129
- * @default "none"
120
+ * Prefetch strategy for the link destination. When omitted, falls back to
121
+ * the router-wide default (`createRouter({ defaultPrefetch })`: `"none"` in
122
+ * development, `"viewport"` in production). An explicit value always wins
123
+ * over the router default, including `"none"` to opt a single Link out.
124
+ *
125
+ * @default the router's environment-aware `defaultPrefetch`
130
126
  */
131
127
  prefetch?: PrefetchStrategy;
132
128
  /**
@@ -240,7 +236,7 @@ export const Link: ForwardRefExoticComponent<
240
236
  scroll = true,
241
237
  reloadDocument = false,
242
238
  revalidate,
243
- prefetch = "none",
239
+ prefetch,
244
240
  prefetchKey,
245
241
  state,
246
242
  children,
@@ -262,10 +258,15 @@ export const Link: ForwardRefExoticComponent<
262
258
  return to === "/" ? bn : bn + to;
263
259
  }, [to, isExternal, ctx?.basename]);
264
260
 
265
- // Resolve adaptive: viewport on touch devices, hover on pointer devices.
266
- // isTouchDevice() is read here (per render), not from a module-load snapshot,
267
- // so a device whose input capability changes resolves to the current value.
268
- const resolvedStrategy = resolveAdaptiveStrategy(prefetch);
261
+ // No explicit `prefetch` prop: fall back to the router-wide default
262
+ // (server-resolved, applied at browser init before hydration, so this
263
+ // render-time read never races the metadata). Then resolve adaptive:
264
+ // viewport on touch devices, hover on pointer devices. isTouchDevice() is
265
+ // read here (per render), not from a module-load snapshot, so a device
266
+ // whose input capability changes resolves to the current value.
267
+ const resolvedStrategy = resolveAdaptiveStrategy(
268
+ prefetch ?? getDefaultPrefetchStrategy(),
269
+ );
269
270
 
270
271
  // Internal ref for viewport observation; merge with forwarded ref
271
272
  const internalRef = useRef<HTMLAnchorElement | null>(null);
@@ -30,6 +30,7 @@ import {
30
30
  setPrefetchConcurrency,
31
31
  setPrefetchDecoder,
32
32
  } from "./prefetch/loader.js";
33
+ import { setDefaultPrefetchStrategy } from "./prefetch/default-strategy.js";
33
34
  import { setAppVersion } from "./app-version.js";
34
35
  import {
35
36
  isInterceptSegment,
@@ -297,6 +298,13 @@ export async function initBrowserApp(
297
298
  if (prefetchConcurrency !== undefined) {
298
299
  setPrefetchConcurrency(prefetchConcurrency);
299
300
  }
301
+ // Apply the router-wide default Link prefetch strategy. Undefined (older
302
+ // server payload) keeps the module's environment-aware default, which equals
303
+ // the server resolver's default by contract — see default-strategy.ts.
304
+ const defaultPrefetch = initialPayload.metadata?.defaultPrefetch;
305
+ if (defaultPrefetch !== undefined) {
306
+ setDefaultPrefetchStrategy(defaultPrefetch);
307
+ }
300
308
 
301
309
  // Wire the RSC decoder so prefetches decode eagerly and warm the route's
302
310
  // client chunks (same createFromFetch the navigation client uses).
@@ -82,6 +82,11 @@ export interface RscMetadata {
82
82
  * Sent on initial render so the browser can configure its prefetch queue.
83
83
  */
84
84
  prefetchConcurrency?: number;
85
+ /**
86
+ * Router-wide default prefetch strategy for Links without a `prefetch` prop.
87
+ * Sent on initial render; applied once at init (default-strategy.ts).
88
+ */
89
+ defaultPrefetch?: import("../router/prefetch-default.js").PrefetchStrategy;
85
90
  /**
86
91
  * Server-resolved rango state cookie name (`{prefix}_{routerId}`). The client
87
92
  * reads it verbatim and binds the rango state cookie to it; composition
@@ -108,6 +108,8 @@ function getDefaultRouteCacheKey(
108
108
  // CacheScope
109
109
  // ============================================================================
110
110
 
111
+ const CACHE_HIT_OBSERVERS = new WeakMap<CacheScope, () => void>();
112
+
111
113
  /**
112
114
  * CacheScope represents a cache boundary in the route tree.
113
115
  *
@@ -348,6 +350,7 @@ export class CacheScope {
348
350
  );
349
351
  }
350
352
 
353
+ CACHE_HIT_OBSERVERS.get(this)?.();
351
354
  return { segments, shouldRevalidate };
352
355
  } catch (error) {
353
356
  // Covers a store.get() failure AND a throwing consumer key()/keyGenerator
@@ -555,9 +558,11 @@ export function resolveShellImplicitCacheScope(
555
558
  if (scope) return scope;
556
559
  const marker = getRequestContext()?._shellImplicitCache;
557
560
  if (!marker) return null;
558
- return new CacheScope(
561
+ const implicitScope = new CacheScope(
559
562
  { ttl: marker.ttl, swr: marker.swr, store: marker.store },
560
563
  null,
561
564
  marker.keyPrefix,
562
565
  );
566
+ if (marker.onHit) CACHE_HIT_OBSERVERS.set(implicitScope, marker.onHit);
567
+ return implicitScope;
563
568
  }
@@ -295,6 +295,8 @@ interface KVShellEnvelope {
295
295
  lh?: boolean;
296
296
  /** ShellCacheEntry.transitionWhen; conditional transitions must re-run. */
297
297
  tw?: true;
298
+ /** ShellCacheEntry.navigationOnly; its partial-context prelude is not document-safe. */
299
+ no?: true;
298
300
  }
299
301
 
300
302
  /**
@@ -1819,6 +1821,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
1819
1821
  snapshot: envelope.sn,
1820
1822
  handlerLiveHoles: envelope.lh,
1821
1823
  transitionWhen: envelope.tw,
1824
+ navigationOnly: envelope.no,
1822
1825
  createdAt: envelope.c,
1823
1826
  },
1824
1827
  shouldRevalidate,
@@ -1907,6 +1910,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
1907
1910
  sn: entry.snapshot,
1908
1911
  lh: entry.handlerLiveHoles,
1909
1912
  tw: entry.transitionWhen,
1913
+ no: entry.navigationOnly,
1910
1914
  };
1911
1915
  await this.kv!.put(kvKey, JSON.stringify(envelope), {
1912
1916
  expirationTtl: retentionTtl,
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Document-Level Cache Middleware
3
3
  *
4
- * Caches full HTTP responses at the edge based on Cache-Control headers.
4
+ * Caches full HTTP responses in the configured app store based on Cache-Control
5
+ * headers. A deployment CDN may independently consume the same shared-cache
6
+ * directives; this middleware itself runs inside the worker/function.
5
7
  * Routes opt-in to caching by setting s-maxage or stale-while-revalidate headers.
6
8
  *
7
9
  * Flow:
@@ -58,7 +60,7 @@ function parseCacheControl(header: string | null): CacheDirectives | null {
58
60
 
59
61
  // RFC 7234: in a SHARED cache, `private` and `no-store` forbid storage and
60
62
  // MUST win over `s-maxage` even though `private, s-maxage` is contradictory.
61
- // The document cache is a shared edge store, so refuse both regardless of any
63
+ // The document cache is a shared app store, so refuse both regardless of any
62
64
  // s-maxage / stale-while-revalidate also present. Match standalone directive
63
65
  // tokens (start/end, whitespace, comma, semicolon, or `=` bounded), not a
64
66
  // substring, so a value containing "private" cannot false-veto.
@@ -305,6 +305,12 @@ export interface ShellCacheEntry {
305
305
  * heals it. See docs/design/ppr-shell-resume.md ("the capture data snapshot").
306
306
  */
307
307
  snapshot?: ShellSnapshotRecord[];
308
+ /**
309
+ * The entry was captured from a partial request only to produce an eligible
310
+ * segment snapshot. Document serving must treat its HTML prelude as a miss;
311
+ * the partial request's headers and middleware state are not document state.
312
+ */
313
+ navigationOnly?: true;
308
314
  /**
309
315
  * True when the capture's HANDLER layer declared per-request liveness: a
310
316
  * handle pushed OUTSIDE a DSL loader scope carried a nested thenable (the
@@ -319,9 +325,10 @@ export interface ShellCacheEntry {
319
325
  */
320
326
  handlerLiveHoles?: boolean;
321
327
  /**
322
- * The capture encountered transition({ when }). Its effective hold policy is
323
- * request-dependent, so handler-free document and navigation replay must
324
- * re-run resolution to collect and evaluate the predicate.
328
+ * Legacy/fallback marker for a transition({ when }) predicate that was not
329
+ * evaluated by the PPR pre-handler gate. Such an entry stays conservatively
330
+ * ineligible for handler-free replay. New PPR matches evaluate known segment
331
+ * predicates before the pipeline and do not set this marker.
325
332
  */
326
333
  transitionWhen?: true;
327
334
  /** Capture-generation start time; tag invalidations at or after it win. */
@@ -211,6 +211,8 @@ interface VercelShellEnvelope {
211
211
  lh?: boolean;
212
212
  /** ShellCacheEntry.transitionWhen; conditional transitions must re-run. */
213
213
  tw?: true;
214
+ /** ShellCacheEntry.navigationOnly; its partial-context prelude is not document-safe. */
215
+ no?: true;
214
216
  }
215
217
 
216
218
  /** Read-path outcome for the debug sink. */
@@ -816,6 +818,7 @@ export class VercelCacheStore<
816
818
  snapshot: env.sn,
817
819
  handlerLiveHoles: env.lh,
818
820
  transitionWhen: env.tw,
821
+ navigationOnly: env.no,
819
822
  createdAt: env.c,
820
823
  },
821
824
  shouldRevalidate,
@@ -865,6 +868,7 @@ export class VercelCacheStore<
865
868
  sn: entry.snapshot,
866
869
  lh: entry.handlerLiveHoles,
867
870
  tw: entry.transitionWhen,
871
+ no: entry.navigationOnly,
868
872
  };
869
873
  // write() enforces the 2 MB per-item ceiling (withinSizeLimit): an
870
874
  // oversized shell prelude is reported and skipped (fail-open to a full
@@ -1192,7 +1196,7 @@ export class VercelCacheStore<
1192
1196
 
1193
1197
  private asShellEnvelope(raw: unknown): VercelShellEnvelope | null {
1194
1198
  if (!isRecord(raw)) return null;
1195
- const { p, po, rv, bv, c, s, e, t, i, sn, lh, tw } = raw;
1199
+ const { p, po, rv, bv, c, s, e, t, i, sn, lh, tw, no } = raw;
1196
1200
  if (typeof p !== "string" || typeof rv !== "string") return null;
1197
1201
  if (po !== null && typeof po !== "string") return null;
1198
1202
  if (typeof c !== "number") return null;
@@ -1210,6 +1214,7 @@ export class VercelCacheStore<
1210
1214
  sn: Array.isArray(sn) ? (sn as ShellSnapshotRecord[]) : undefined,
1211
1215
  lh: lh === true ? true : undefined,
1212
1216
  tw: tw === true ? true : undefined,
1217
+ no: no === true ? true : undefined,
1213
1218
  };
1214
1219
  }
1215
1220
 
@@ -460,11 +460,11 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
460
460
  * startTransition only when the router sets viewTransition: false.
461
461
  *
462
462
  * Conditional hold: pass `when: (ctx) => boolean` to gate the transition per
463
- * request. It runs server-side AFTER the route handler (so it can read state
464
- * the handler set via `ctx.get(...)`); returning false drops this transition
465
- * for the request, so the navigation streams its loading() skeleton instead of
466
- * holding. This is a post-handler predicate distinct from intercept()'s
467
- * match-time `when` config selector (`intercept(slot, route, Comp, { when })`).
463
+ * request. It normally runs server-side after the route handler. On a `ppr`
464
+ * route it is automatically hoisted before route handlers and reevaluated on
465
+ * every replay, so it may read URL/params/action/env and middleware-set context
466
+ * but not handler-set context. Returning false drops this transition for the
467
+ * request. This is distinct from intercept()'s match-time `when` selector.
468
468
  *
469
469
  * ```typescript
470
470
  * // Attach to a single route
@@ -491,7 +491,7 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
491
491
  * @param config - ViewTransition configuration (enter, exit, update, share,
492
492
  * default, name), `viewTransition: "auto" | false` to toggle the router
493
493
  * boundary (createRouter({ viewTransition }) sets the app-wide default), and
494
- * `when: (ctx) => boolean` to gate the transition per request post-handler
494
+ * `when: (ctx) => boolean` to gate the transition per request
495
495
  * @param children - Optional callback returning child routes to wrap
496
496
  */
497
497
  transition: {