@rangojs/router 0.2.0 → 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 (435) hide show
  1. package/dist/types/browser/prefetch/default-strategy.d.ts +22 -0
  2. package/dist/types/browser/prefetch/runtime.d.ts +0 -1
  3. package/dist/types/browser/react/Link.d.ts +8 -11
  4. package/dist/types/browser/types.d.ts +5 -0
  5. package/dist/types/cache/types.d.ts +6 -0
  6. package/dist/types/router/prefetch-default.d.ts +28 -0
  7. package/dist/types/router/router-interfaces.d.ts +7 -0
  8. package/dist/types/router/router-options.d.ts +30 -0
  9. package/dist/types/rsc/capture-queue.d.ts +6 -0
  10. package/dist/types/rsc/shell-capture.d.ts +15 -7
  11. package/dist/types/rsc/shell-serve.d.ts +4 -3
  12. package/dist/types/rsc/types.d.ts +2 -0
  13. package/dist/types/testing/e2e/index.d.ts +2 -2
  14. package/dist/types/testing/e2e/page-helpers.d.ts +24 -0
  15. package/dist/types.backup/__internal.d.ts +127 -0
  16. package/dist/types.backup/bin/rango.d.ts +1 -0
  17. package/dist/types.backup/browser/action-coordinator.d.ts +57 -0
  18. package/dist/types.backup/browser/action-fence.d.ts +33 -0
  19. package/dist/types.backup/browser/app-shell.d.ts +34 -0
  20. package/dist/types.backup/browser/app-version.d.ts +6 -0
  21. package/dist/types.backup/browser/connection-warmup.d.ts +31 -0
  22. package/dist/types.backup/browser/cookie-name.d.ts +66 -0
  23. package/dist/types.backup/browser/event-controller.d.ts +221 -0
  24. package/dist/types.backup/browser/history-state.d.ts +26 -0
  25. package/dist/types.backup/browser/index.d.ts +1 -0
  26. package/dist/types.backup/browser/intercept-utils.d.ts +30 -0
  27. package/dist/types.backup/browser/invalidate-client-cache.d.ts +17 -0
  28. package/dist/types.backup/browser/link-interceptor.d.ts +43 -0
  29. package/dist/types.backup/browser/logging.d.ts +33 -0
  30. package/dist/types.backup/browser/merge-segment-loaders.d.ts +38 -0
  31. package/dist/types.backup/browser/navigation-bridge.d.ts +27 -0
  32. package/dist/types.backup/browser/navigation-client.d.ts +17 -0
  33. package/dist/types.backup/browser/navigation-store-handle.d.ts +25 -0
  34. package/dist/types.backup/browser/navigation-store.d.ts +95 -0
  35. package/dist/types.backup/browser/navigation-transaction.d.ts +75 -0
  36. package/dist/types.backup/browser/network-error-handler.d.ts +35 -0
  37. package/dist/types.backup/browser/partial-update.d.ts +61 -0
  38. package/dist/types.backup/browser/prefetch/cache.d.ts +183 -0
  39. package/dist/types.backup/browser/prefetch/fetch.d.ts +52 -0
  40. package/dist/types.backup/browser/prefetch/observer.d.ts +27 -0
  41. package/dist/types.backup/browser/prefetch/policy.d.ts +13 -0
  42. package/dist/types.backup/browser/prefetch/queue.d.ts +48 -0
  43. package/dist/types.backup/browser/prefetch/resource-ready.d.ts +28 -0
  44. package/dist/types.backup/browser/rango-state.d.ts +52 -0
  45. package/dist/types.backup/browser/react/Link.d.ts +140 -0
  46. package/dist/types.backup/browser/react/NavigationProvider.d.ts +88 -0
  47. package/dist/types.backup/browser/react/ScrollRestoration.d.ts +78 -0
  48. package/dist/types.backup/browser/react/context.d.ts +54 -0
  49. package/dist/types.backup/browser/react/filter-segment-order.d.ts +35 -0
  50. package/dist/types.backup/browser/react/index.d.ts +1 -0
  51. package/dist/types.backup/browser/react/location-state-shared.d.ts +162 -0
  52. package/dist/types.backup/browser/react/location-state.d.ts +29 -0
  53. package/dist/types.backup/browser/react/mount-context.d.ts +23 -0
  54. package/dist/types.backup/browser/react/nonce-context.d.ts +14 -0
  55. package/dist/types.backup/browser/react/shallow-equal.d.ts +5 -0
  56. package/dist/types.backup/browser/react/use-action.d.ts +61 -0
  57. package/dist/types.backup/browser/react/use-handle.d.ts +21 -0
  58. package/dist/types.backup/browser/react/use-href.d.ts +32 -0
  59. package/dist/types.backup/browser/react/use-link-status.d.ts +36 -0
  60. package/dist/types.backup/browser/react/use-mount.d.ts +24 -0
  61. package/dist/types.backup/browser/react/use-navigation.d.ts +15 -0
  62. package/dist/types.backup/browser/react/use-params.d.ts +21 -0
  63. package/dist/types.backup/browser/react/use-pathname.d.ts +13 -0
  64. package/dist/types.backup/browser/react/use-reverse.d.ts +40 -0
  65. package/dist/types.backup/browser/react/use-router.d.ts +23 -0
  66. package/dist/types.backup/browser/react/use-search-params.d.ts +19 -0
  67. package/dist/types.backup/browser/react/use-segments.d.ts +29 -0
  68. package/dist/types.backup/browser/response-adapter.d.ts +58 -0
  69. package/dist/types.backup/browser/rsc-router.d.ts +141 -0
  70. package/dist/types.backup/browser/scroll-restoration.d.ts +103 -0
  71. package/dist/types.backup/browser/segment-reconciler.d.ts +74 -0
  72. package/dist/types.backup/browser/segment-structure-assert.d.ts +16 -0
  73. package/dist/types.backup/browser/server-action-bridge.d.ts +29 -0
  74. package/dist/types.backup/browser/types.d.ts +530 -0
  75. package/dist/types.backup/browser/validate-redirect-origin.d.ts +28 -0
  76. package/dist/types.backup/build/collect-fallback-refs.d.ts +5 -0
  77. package/dist/types.backup/build/generate-manifest.d.ts +100 -0
  78. package/dist/types.backup/build/generate-route-types.d.ts +8 -0
  79. package/dist/types.backup/build/index.d.ts +21 -0
  80. package/dist/types.backup/build/prefix-tree-utils.d.ts +56 -0
  81. package/dist/types.backup/build/route-trie.d.ts +89 -0
  82. package/dist/types.backup/build/route-types/ast-helpers.d.ts +3 -0
  83. package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +13 -0
  84. package/dist/types.backup/build/route-types/codegen.d.ts +16 -0
  85. package/dist/types.backup/build/route-types/include-resolution.d.ts +74 -0
  86. package/dist/types.backup/build/route-types/param-extraction.d.ts +13 -0
  87. package/dist/types.backup/build/route-types/per-module-writer.d.ts +18 -0
  88. package/dist/types.backup/build/route-types/router-processing.d.ts +82 -0
  89. package/dist/types.backup/build/route-types/scan-filter.d.ts +17 -0
  90. package/dist/types.backup/build/route-types/source-scan.d.ts +13 -0
  91. package/dist/types.backup/build/runtime-discovery.d.ts +24 -0
  92. package/dist/types.backup/cache/background-task.d.ts +21 -0
  93. package/dist/types.backup/cache/cache-error.d.ts +71 -0
  94. package/dist/types.backup/cache/cache-key-utils.d.ts +35 -0
  95. package/dist/types.backup/cache/cache-policy.d.ts +59 -0
  96. package/dist/types.backup/cache/cache-runtime.d.ts +51 -0
  97. package/dist/types.backup/cache/cache-scope.d.ts +134 -0
  98. package/dist/types.backup/cache/cache-tag.d.ts +79 -0
  99. package/dist/types.backup/cache/cf/cf-base64.d.ts +4 -0
  100. package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +105 -0
  101. package/dist/types.backup/cache/cf/cf-cache-store.d.ts +481 -0
  102. package/dist/types.backup/cache/cf/cf-cache-types.d.ts +300 -0
  103. package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +22 -0
  104. package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +15 -0
  105. package/dist/types.backup/cache/cf/index.d.ts +3 -0
  106. package/dist/types.backup/cache/document-cache.d.ts +69 -0
  107. package/dist/types.backup/cache/handle-capture.d.ts +23 -0
  108. package/dist/types.backup/cache/handle-snapshot.d.ts +39 -0
  109. package/dist/types.backup/cache/index.d.ts +7 -0
  110. package/dist/types.backup/cache/memory-segment-store.d.ts +163 -0
  111. package/dist/types.backup/cache/profile-registry.d.ts +40 -0
  112. package/dist/types.backup/cache/read-through-swr.d.ts +60 -0
  113. package/dist/types.backup/cache/segment-codec.d.ts +78 -0
  114. package/dist/types.backup/cache/shell-snapshot.d.ts +162 -0
  115. package/dist/types.backup/cache/tag-invalidation.d.ts +74 -0
  116. package/dist/types.backup/cache/taint.d.ts +71 -0
  117. package/dist/types.backup/cache/types.d.ts +407 -0
  118. package/dist/types.backup/cache/vercel/index.d.ts +1 -0
  119. package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +267 -0
  120. package/dist/types.backup/client.d.ts +184 -0
  121. package/dist/types.backup/client.rsc.d.ts +39 -0
  122. package/dist/types.backup/cloudflare/index.d.ts +7 -0
  123. package/dist/types.backup/cloudflare/tracing.d.ts +53 -0
  124. package/dist/types.backup/component-utils.d.ts +46 -0
  125. package/dist/types.backup/components/DefaultDocument.d.ts +13 -0
  126. package/dist/types.backup/context-var.d.ts +84 -0
  127. package/dist/types.backup/debug.d.ts +57 -0
  128. package/dist/types.backup/decode-loader-results.d.ts +5 -0
  129. package/dist/types.backup/default-error-boundary.d.ts +10 -0
  130. package/dist/types.backup/defer.d.ts +89 -0
  131. package/dist/types.backup/deps/browser.d.ts +1 -0
  132. package/dist/types.backup/deps/html-stream-client.d.ts +1 -0
  133. package/dist/types.backup/deps/html-stream-server.d.ts +1 -0
  134. package/dist/types.backup/deps/rsc.d.ts +1 -0
  135. package/dist/types.backup/deps/ssr.d.ts +1 -0
  136. package/dist/types.backup/encode-kv.d.ts +35 -0
  137. package/dist/types.backup/errors.d.ts +226 -0
  138. package/dist/types.backup/escape-script.d.ts +44 -0
  139. package/dist/types.backup/handle.d.ts +93 -0
  140. package/dist/types.backup/handles/MetaTags.d.ts +17 -0
  141. package/dist/types.backup/handles/Scripts.d.ts +38 -0
  142. package/dist/types.backup/handles/breadcrumbs.d.ts +43 -0
  143. package/dist/types.backup/handles/deferred-resolution.d.ts +53 -0
  144. package/dist/types.backup/handles/is-thenable.d.ts +12 -0
  145. package/dist/types.backup/handles/meta.d.ts +43 -0
  146. package/dist/types.backup/handles/script.d.ts +139 -0
  147. package/dist/types.backup/host/cookie-handler.d.ts +8 -0
  148. package/dist/types.backup/host/errors.d.ts +40 -0
  149. package/dist/types.backup/host/index.d.ts +33 -0
  150. package/dist/types.backup/host/pattern-matcher.d.ts +30 -0
  151. package/dist/types.backup/host/router.d.ts +12 -0
  152. package/dist/types.backup/host/testing.d.ts +41 -0
  153. package/dist/types.backup/host/types.d.ts +148 -0
  154. package/dist/types.backup/host/utils.d.ts +20 -0
  155. package/dist/types.backup/href-client.d.ts +214 -0
  156. package/dist/types.backup/index.d.ts +112 -0
  157. package/dist/types.backup/index.rsc.d.ts +51 -0
  158. package/dist/types.backup/internal-debug.d.ts +1 -0
  159. package/dist/types.backup/loader-store.d.ts +193 -0
  160. package/dist/types.backup/loader.d.ts +18 -0
  161. package/dist/types.backup/loader.rsc.d.ts +18 -0
  162. package/dist/types.backup/missing-id-error.d.ts +1 -0
  163. package/dist/types.backup/outlet-context.d.ts +12 -0
  164. package/dist/types.backup/outlet-provider.d.ts +12 -0
  165. package/dist/types.backup/prerender/build-shell-capture.d.ts +104 -0
  166. package/dist/types.backup/prerender/param-hash.d.ts +6 -0
  167. package/dist/types.backup/prerender/shell-manifest-key.d.ts +18 -0
  168. package/dist/types.backup/prerender/store.d.ts +62 -0
  169. package/dist/types.backup/prerender.d.ts +292 -0
  170. package/dist/types.backup/redirect-origin.d.ts +55 -0
  171. package/dist/types.backup/regex-escape.d.ts +6 -0
  172. package/dist/types.backup/render-error-thrower.d.ts +13 -0
  173. package/dist/types.backup/response-utils.d.ts +35 -0
  174. package/dist/types.backup/reverse.d.ts +206 -0
  175. package/dist/types.backup/root-error-boundary.d.ts +32 -0
  176. package/dist/types.backup/route-content-wrapper.d.ts +40 -0
  177. package/dist/types.backup/route-definition/dsl-helpers.d.ts +130 -0
  178. package/dist/types.backup/route-definition/helper-factories.d.ts +22 -0
  179. package/dist/types.backup/route-definition/helpers-types.d.ts +392 -0
  180. package/dist/types.backup/route-definition/index.d.ts +7 -0
  181. package/dist/types.backup/route-definition/redirect.d.ts +48 -0
  182. package/dist/types.backup/route-definition/resolve-handler-use.d.ts +19 -0
  183. package/dist/types.backup/route-definition/use-item-types.d.ts +1 -0
  184. package/dist/types.backup/route-definition.d.ts +1 -0
  185. package/dist/types.backup/route-map-builder.d.ts +127 -0
  186. package/dist/types.backup/route-name.d.ts +27 -0
  187. package/dist/types.backup/route-types.d.ts +172 -0
  188. package/dist/types.backup/router/basename.d.ts +10 -0
  189. package/dist/types.backup/router/content-negotiation.d.ts +91 -0
  190. package/dist/types.backup/router/debug-manifest.d.ts +7 -0
  191. package/dist/types.backup/router/error-handling.d.ts +76 -0
  192. package/dist/types.backup/router/find-match.d.ts +19 -0
  193. package/dist/types.backup/router/handler-context.d.ts +41 -0
  194. package/dist/types.backup/router/instrument.d.ts +161 -0
  195. package/dist/types.backup/router/intercept-resolution.d.ts +79 -0
  196. package/dist/types.backup/router/lazy-includes.d.ts +26 -0
  197. package/dist/types.backup/router/loader-resolution.d.ts +63 -0
  198. package/dist/types.backup/router/logging.d.ts +41 -0
  199. package/dist/types.backup/router/manifest.d.ts +8 -0
  200. package/dist/types.backup/router/match-api.d.ts +19 -0
  201. package/dist/types.backup/router/match-context.d.ts +184 -0
  202. package/dist/types.backup/router/match-handlers.d.ts +49 -0
  203. package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +113 -0
  204. package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +113 -0
  205. package/dist/types.backup/router/match-middleware/cache-store.d.ts +112 -0
  206. package/dist/types.backup/router/match-middleware/index.d.ts +80 -0
  207. package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +116 -0
  208. package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +94 -0
  209. package/dist/types.backup/router/match-pipelines.d.ts +103 -0
  210. package/dist/types.backup/router/match-result.d.ts +114 -0
  211. package/dist/types.backup/router/metrics.d.ts +6 -0
  212. package/dist/types.backup/router/middleware-types.d.ts +74 -0
  213. package/dist/types.backup/router/middleware.d.ts +116 -0
  214. package/dist/types.backup/router/navigation-snapshot.d.ts +22 -0
  215. package/dist/types.backup/router/params-util.d.ts +8 -0
  216. package/dist/types.backup/router/parse-pattern.d.ts +38 -0
  217. package/dist/types.backup/router/pattern-matching.d.ts +169 -0
  218. package/dist/types.backup/router/prefetch-cache-ttl.d.ts +27 -0
  219. package/dist/types.backup/router/prefetch-limits.d.ts +20 -0
  220. package/dist/types.backup/router/prerender-match.d.ts +50 -0
  221. package/dist/types.backup/router/preview-match.d.ts +22 -0
  222. package/dist/types.backup/router/request-classification.d.ts +104 -0
  223. package/dist/types.backup/router/revalidation.d.ts +57 -0
  224. package/dist/types.backup/router/route-snapshot.d.ts +112 -0
  225. package/dist/types.backup/router/router-context.d.ts +137 -0
  226. package/dist/types.backup/router/router-interfaces.d.ts +432 -0
  227. package/dist/types.backup/router/router-options.d.ts +738 -0
  228. package/dist/types.backup/router/router-registry.d.ts +15 -0
  229. package/dist/types.backup/router/segment-resolution/fresh.d.ts +55 -0
  230. package/dist/types.backup/router/segment-resolution/helpers.d.ts +93 -0
  231. package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +33 -0
  232. package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +44 -0
  233. package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +90 -0
  234. package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +53 -0
  235. package/dist/types.backup/router/segment-resolution/revalidation.d.ts +85 -0
  236. package/dist/types.backup/router/segment-resolution/static-store.d.ts +17 -0
  237. package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
  238. package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +28 -0
  239. package/dist/types.backup/router/segment-resolution.d.ts +3 -0
  240. package/dist/types.backup/router/segment-wrappers.d.ts +53 -0
  241. package/dist/types.backup/router/state-cookie-name.d.ts +1 -0
  242. package/dist/types.backup/router/substitute-pattern-params.d.ts +23 -0
  243. package/dist/types.backup/router/telemetry-otel.d.ts +113 -0
  244. package/dist/types.backup/router/telemetry.d.ts +215 -0
  245. package/dist/types.backup/router/timeout.d.ts +68 -0
  246. package/dist/types.backup/router/tracing.d.ts +125 -0
  247. package/dist/types.backup/router/trie-matching.d.ts +32 -0
  248. package/dist/types.backup/router/types.d.ts +98 -0
  249. package/dist/types.backup/router/url-params.d.ts +26 -0
  250. package/dist/types.backup/router.d.ts +7 -0
  251. package/dist/types.backup/rsc/capture-queue.d.ts +6 -0
  252. package/dist/types.backup/rsc/full-payload.d.ts +22 -0
  253. package/dist/types.backup/rsc/handler-context.d.ts +31 -0
  254. package/dist/types.backup/rsc/handler.d.ts +9 -0
  255. package/dist/types.backup/rsc/helpers.d.ts +213 -0
  256. package/dist/types.backup/rsc/index.d.ts +17 -0
  257. package/dist/types.backup/rsc/json-route-result.d.ts +20 -0
  258. package/dist/types.backup/rsc/loader-fetch.d.ts +14 -0
  259. package/dist/types.backup/rsc/manifest-init.d.ts +18 -0
  260. package/dist/types.backup/rsc/nonce.d.ts +28 -0
  261. package/dist/types.backup/rsc/origin-guard.d.ts +50 -0
  262. package/dist/types.backup/rsc/progressive-enhancement.d.ts +19 -0
  263. package/dist/types.backup/rsc/redirect-guard.d.ts +35 -0
  264. package/dist/types.backup/rsc/response-cache-serve.d.ts +46 -0
  265. package/dist/types.backup/rsc/response-error.d.ts +19 -0
  266. package/dist/types.backup/rsc/response-route-handler.d.ts +29 -0
  267. package/dist/types.backup/rsc/rsc-rendering.d.ts +23 -0
  268. package/dist/types.backup/rsc/runtime-warnings.d.ts +22 -0
  269. package/dist/types.backup/rsc/server-action.d.ts +68 -0
  270. package/dist/types.backup/rsc/shell-build-manifest.d.ts +84 -0
  271. package/dist/types.backup/rsc/shell-capture-constants.d.ts +27 -0
  272. package/dist/types.backup/rsc/shell-capture.d.ts +374 -0
  273. package/dist/types.backup/rsc/shell-serve.d.ts +136 -0
  274. package/dist/types.backup/rsc/ssr-setup.d.ts +48 -0
  275. package/dist/types.backup/rsc/transition-gate.d.ts +27 -0
  276. package/dist/types.backup/rsc/types.d.ts +290 -0
  277. package/dist/types.backup/runtime-env.d.ts +1 -0
  278. package/dist/types.backup/search-params.d.ts +125 -0
  279. package/dist/types.backup/segment-content-promise.d.ts +13 -0
  280. package/dist/types.backup/segment-fragments.d.ts +56 -0
  281. package/dist/types.backup/segment-loader-promise.d.ts +22 -0
  282. package/dist/types.backup/segment-system.d.ts +84 -0
  283. package/dist/types.backup/serialize.d.ts +164 -0
  284. package/dist/types.backup/server/context.d.ts +494 -0
  285. package/dist/types.backup/server/cookie-parse.d.ts +10 -0
  286. package/dist/types.backup/server/cookie-store.d.ts +107 -0
  287. package/dist/types.backup/server/fetchable-loader-store.d.ts +20 -0
  288. package/dist/types.backup/server/handle-store.d.ts +100 -0
  289. package/dist/types.backup/server/loader-registry.d.ts +32 -0
  290. package/dist/types.backup/server/request-context.d.ts +596 -0
  291. package/dist/types.backup/server/root-layout.d.ts +3 -0
  292. package/dist/types.backup/server.d.ts +15 -0
  293. package/dist/types.backup/ssr/index.d.ts +233 -0
  294. package/dist/types.backup/ssr/inject-rsc-eager.d.ts +3 -0
  295. package/dist/types.backup/ssr/preinit-client-references.d.ts +71 -0
  296. package/dist/types.backup/ssr/ssr-root.d.ts +69 -0
  297. package/dist/types.backup/static-handler.d.ts +57 -0
  298. package/dist/types.backup/testing/cache-status.d.ts +63 -0
  299. package/dist/types.backup/testing/collect-handle.d.ts +20 -0
  300. package/dist/types.backup/testing/dispatch.d.ts +123 -0
  301. package/dist/types.backup/testing/dom.entry.d.ts +15 -0
  302. package/dist/types.backup/testing/e2e/fixture.d.ts +37 -0
  303. package/dist/types.backup/testing/e2e/index.d.ts +30 -0
  304. package/dist/types.backup/testing/e2e/matchers.d.ts +17 -0
  305. package/dist/types.backup/testing/e2e/page-helpers.d.ts +62 -0
  306. package/dist/types.backup/testing/e2e/parity.d.ts +111 -0
  307. package/dist/types.backup/testing/e2e/server.d.ts +35 -0
  308. package/dist/types.backup/testing/flight-matchers.d.ts +55 -0
  309. package/dist/types.backup/testing/flight-normalize.d.ts +1 -0
  310. package/dist/types.backup/testing/flight-tree.d.ts +192 -0
  311. package/dist/types.backup/testing/flight.d.ts +115 -0
  312. package/dist/types.backup/testing/flight.entry.d.ts +27 -0
  313. package/dist/types.backup/testing/generated-routes.d.ts +66 -0
  314. package/dist/types.backup/testing/index.d.ts +52 -0
  315. package/dist/types.backup/testing/internal/context.d.ts +225 -0
  316. package/dist/types.backup/testing/internal/flight-client-globals.d.ts +1 -0
  317. package/dist/types.backup/testing/internal/seed-vars.d.ts +30 -0
  318. package/dist/types.backup/testing/render-handler.d.ts +160 -0
  319. package/dist/types.backup/testing/render-route.d.ts +246 -0
  320. package/dist/types.backup/testing/run-loader.d.ts +186 -0
  321. package/dist/types.backup/testing/run-middleware.d.ts +132 -0
  322. package/dist/types.backup/testing/run-transition-when.d.ts +77 -0
  323. package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
  324. package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
  325. package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
  326. package/dist/types.backup/testing/vitest-stubs/version.d.ts +1 -0
  327. package/dist/types.backup/testing/vitest.d.ts +205 -0
  328. package/dist/types.backup/theme/ThemeProvider.d.ts +13 -0
  329. package/dist/types.backup/theme/ThemeScript.d.ts +45 -0
  330. package/dist/types.backup/theme/constants.d.ts +39 -0
  331. package/dist/types.backup/theme/index.d.ts +29 -0
  332. package/dist/types.backup/theme/theme-context.d.ts +21 -0
  333. package/dist/types.backup/theme/theme-script.d.ts +26 -0
  334. package/dist/types.backup/theme/types.d.ts +162 -0
  335. package/dist/types.backup/theme/use-theme.d.ts +8 -0
  336. package/dist/types.backup/types/boundaries.d.ts +93 -0
  337. package/dist/types.backup/types/cache-types.d.ts +191 -0
  338. package/dist/types.backup/types/error-types.d.ts +114 -0
  339. package/dist/types.backup/types/global-namespace.d.ts +90 -0
  340. package/dist/types.backup/types/handler-context.d.ts +658 -0
  341. package/dist/types.backup/types/index.d.ts +11 -0
  342. package/dist/types.backup/types/loader-types.d.ts +182 -0
  343. package/dist/types.backup/types/request-scope.d.ts +93 -0
  344. package/dist/types.backup/types/route-config.d.ts +105 -0
  345. package/dist/types.backup/types/route-entry.d.ts +95 -0
  346. package/dist/types.backup/types/segments.d.ts +234 -0
  347. package/dist/types.backup/types.d.ts +1 -0
  348. package/dist/types.backup/urls/include-helper.d.ts +17 -0
  349. package/dist/types.backup/urls/include-provider.d.ts +27 -0
  350. package/dist/types.backup/urls/index.d.ts +6 -0
  351. package/dist/types.backup/urls/path-helper-types.d.ts +197 -0
  352. package/dist/types.backup/urls/path-helper.d.ts +12 -0
  353. package/dist/types.backup/urls/pattern-types.d.ts +166 -0
  354. package/dist/types.backup/urls/response-types.d.ts +67 -0
  355. package/dist/types.backup/urls/type-extraction.d.ts +157 -0
  356. package/dist/types.backup/urls/urls-function.d.ts +24 -0
  357. package/dist/types.backup/urls.d.ts +1 -0
  358. package/dist/types.backup/use-loader.d.ts +150 -0
  359. package/dist/types.backup/vercel/index.d.ts +10 -0
  360. package/dist/types.backup/vercel/tracing.d.ts +70 -0
  361. package/dist/types.backup/vite/debug.d.ts +80 -0
  362. package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +12 -0
  363. package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +65 -0
  364. package/dist/types.backup/vite/discovery/discover-routers.d.ts +17 -0
  365. package/dist/types.backup/vite/discovery/discovery-errors.d.ts +113 -0
  366. package/dist/types.backup/vite/discovery/gate-state.d.ts +79 -0
  367. package/dist/types.backup/vite/discovery/prerender-collection.d.ts +24 -0
  368. package/dist/types.backup/vite/discovery/route-types-writer.d.ts +32 -0
  369. package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +22 -0
  370. package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +40 -0
  371. package/dist/types.backup/vite/discovery/state.d.ts +162 -0
  372. package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +15 -0
  373. package/dist/types.backup/vite/index.d.ts +11 -0
  374. package/dist/types.backup/vite/inject-client-debug.d.ts +56 -0
  375. package/dist/types.backup/vite/plugin-types.d.ts +298 -0
  376. package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +6 -0
  377. package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +40 -0
  378. package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +35 -0
  379. package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
  380. package/dist/types.backup/vite/plugins/expose-action-id.d.ts +18 -0
  381. package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +37 -0
  382. package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
  383. package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
  384. package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
  385. package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +13 -0
  386. package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +29 -0
  387. package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +6 -0
  388. package/dist/types.backup/vite/plugins/performance-tracks.d.ts +25 -0
  389. package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +20 -0
  390. package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +20 -0
  391. package/dist/types.backup/vite/plugins/vercel-output.d.ts +85 -0
  392. package/dist/types.backup/vite/plugins/version-injector.d.ts +21 -0
  393. package/dist/types.backup/vite/plugins/version-plugin.d.ts +19 -0
  394. package/dist/types.backup/vite/plugins/virtual-entries.d.ts +36 -0
  395. package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +7 -0
  396. package/dist/types.backup/vite/rango.d.ts +29 -0
  397. package/dist/types.backup/vite/router-discovery.d.ts +23 -0
  398. package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +64 -0
  399. package/dist/types.backup/vite/utils/banner.d.ts +2 -0
  400. package/dist/types.backup/vite/utils/bundle-analysis.d.ts +28 -0
  401. package/dist/types.backup/vite/utils/client-chunks.d.ts +55 -0
  402. package/dist/types.backup/vite/utils/directive-prologue.d.ts +16 -0
  403. package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +37 -0
  404. package/dist/types.backup/vite/utils/manifest-utils.d.ts +7 -0
  405. package/dist/types.backup/vite/utils/package-resolution.d.ts +6 -0
  406. package/dist/types.backup/vite/utils/prerender-utils.d.ts +32 -0
  407. package/dist/types.backup/vite/utils/shared-utils.d.ts +55 -0
  408. package/dist/vite/index.js +5 -2
  409. package/package.json +1 -1
  410. package/skills/comparison/references/framework-comparison.md +2 -1
  411. package/skills/ppr/SKILL.md +28 -13
  412. package/skills/router-setup/SKILL.md +4 -0
  413. package/src/browser/prefetch/default-strategy.ts +34 -0
  414. package/src/browser/prefetch/loader.ts +6 -12
  415. package/src/browser/prefetch/runtime.ts +0 -1
  416. package/src/browser/react/Link.tsx +22 -21
  417. package/src/browser/rsc-router.tsx +8 -0
  418. package/src/browser/types.ts +5 -0
  419. package/src/cache/cf/cf-cache-store.ts +4 -0
  420. package/src/cache/types.ts +6 -0
  421. package/src/cache/vercel/vercel-cache-store.ts +6 -1
  422. package/src/router/prefetch-default.ts +59 -0
  423. package/src/router/router-interfaces.ts +8 -0
  424. package/src/router/router-options.ts +31 -0
  425. package/src/router.ts +7 -0
  426. package/src/rsc/capture-queue.ts +24 -1
  427. package/src/rsc/full-payload.ts +1 -0
  428. package/src/rsc/handler.ts +1 -0
  429. package/src/rsc/rsc-rendering.ts +120 -18
  430. package/src/rsc/shell-capture.ts +94 -50
  431. package/src/rsc/shell-serve.ts +6 -4
  432. package/src/rsc/types.ts +2 -0
  433. package/src/testing/e2e/index.ts +6 -0
  434. package/src/testing/e2e/page-helpers.ts +47 -0
  435. package/src/testing/e2e/parity.ts +13 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rangojs/router",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Django-inspired RSC router with composable URL patterns",
5
5
  "keywords": [
6
6
  "react",
@@ -539,7 +539,8 @@ analog but operates on loader/query reload, not RSC-segment render.
539
539
 
540
540
  ### Prefetching: stability and control
541
541
 
542
- `<Link prefetch="hover|viewport|render|adaptive|none">` (default `"none"`), plus
542
+ `<Link prefetch="hover|viewport|render|adaptive|none">` (default: the router's
543
+ `defaultPrefetch`, `"none"` in development and `"viewport"` in production), plus
543
544
  `prefetchKey` (`":source"` scopes a prefetch to the originating page for routes
544
545
  whose response branches on `currentUrl`). The distinguishing part is the stability
545
546
  gating: a queued prefetch (`viewport`/`render`) will not fire until **both** the
@@ -175,12 +175,14 @@ On a document GET to a ppr route the router runs:
175
175
  point is after the chain, an unauthorized request NEVER sees shell bytes — put
176
176
  auth middleware anywhere (global or route DSL) and it guards PPR for free.
177
177
 
178
- ### Soft navigation reuses the captured segment shell
178
+ ### Soft navigation caches and reuses the handler layer
179
179
 
180
- A usable shell snapshot also accelerates ordinary partial RSC navigations to
181
- the same URL. The capture records the canonical document segment tree alongside
182
- the HTML prelude. On a partial request the server replays only that segment
183
- record through the normal `matchPartial()` pipeline, which then:
180
+ Ordinary partial RSC navigations to a `ppr` URL use the same handler-layer cache
181
+ contract even when no document request has captured an HTML shell yet. When a
182
+ shell snapshot exists, the server replays its canonical document segment record.
183
+ On a cold partial request, normal matching renders the response and schedules a
184
+ background navigation-only shell capture; later navigations and prefetches
185
+ replay its eligible snapshot. In both cases `matchPartial()`:
184
186
 
185
187
  - preserves client-owned shared layouts by segment id;
186
188
  - returns only new or revalidating destination segments;
@@ -191,9 +193,8 @@ This is deliberately invisible to the browser: the response is the same
191
193
  `RscPayload` shape as any other partial navigation. Captured item/response values
192
194
  and loader-container pins are NOT replayed on this path, so loader reads stay
193
195
  live. A route's own `cache()` scope still resolves its normal store, key, TTL,
194
- SWR, tags, and condition; only the implicit document scope sees the replay
195
- overlay, and fresh segment writes there stay request-local rather than polluting
196
- the canonical `doc:` namespace. `transition({ when })` is evaluated from the
196
+ SWR, tags, and condition; only the implicit PPR scope sees this behavior.
197
+ `transition({ when })` is evaluated from the
197
198
  matched manifest before route handlers on every PPR match, so it can vary by
198
199
  URL/params/action or middleware context without disabling replay; handler-set
199
200
  context is unavailable by design. Intercepts, handler-live holes, an active
@@ -204,12 +205,21 @@ an explicit cache tier remains frozen by that tier's normal semantics.
204
205
  Fresh and stale-within-SWR runtime shells replay. The stale read is passive: it
205
206
  uses `getShell(key, { claimRevalidation: false })`, does not claim SWR ownership,
206
207
  and cannot recapture HTML. A later document request owns the background
207
- recapture; hard-expired entries fall open. Production may also use a fresh local
208
- build manifest; development stays runtime-only because probing `/__rsc_shell`
209
- would block navigation on an on-demand capture. Custom `SegmentCacheStore`
208
+ recapture; hard-expired entries schedule a navigation-only capture. Production
209
+ may also use a fresh local build manifest. Development does not probe
210
+ `/__rsc_shell`; it schedules the same local background capture instead. Custom `SegmentCacheStore`
210
211
  implementations must set `supportsPassiveShellReads: true` and honor the
211
212
  non-claiming read option.
212
213
 
214
+ The first cold partial request reports `BYPASS; reason=no-entry` because no
215
+ artifact could supply that response; its successful render schedules
216
+ `scheduleShellCapture` with a navigation-only marker. The next request reports
217
+ `HIT` when the capture produced an eligible snapshot. Navigation snapshots use
218
+ a separate shell key, so they cannot overwrite or be served as a document shell.
219
+ The capture runs with the stripped target document URL and loads SSR support in
220
+ the bounded background queue, outside the triggering partial response's latency.
221
+ An `allReady` decision still declines capture.
222
+
213
223
  Partial responses expose the actual decision as `x-rango-ppr-replay`:
214
224
  `HIT; freshness=fresh|stale` or `BYPASS; reason=<bounded-token>`. With
215
225
  performance metrics enabled, the same decision appears as
@@ -292,7 +302,9 @@ curl -s -D - -o /dev/null https://app.example.com/products/1 | grep -i x-rango-s
292
302
  - Structured capture diagnostics: `createRouter({ debugShellCapture: true })`
293
303
  logs one line per capture attempt/skip (outcome, durations, prelude and
294
304
  snapshot bytes, backoff state); pass a function to receive each
295
- `ShellCaptureDebugEvent` instead. In dev, with `debugPerformance` on, the
305
+ `ShellCaptureDebugEvent` instead. `skip-capacity` means the isolate already
306
+ has 32 queued/running captures; the dropped best-effort capture can retry on a
307
+ later request. In dev, with `debugPerformance` on, the
296
308
  last capture outcome for a key also rides the next document GET's
297
309
  `Server-Timing` as `ppr-capture;desc="…"`.
298
310
 
@@ -750,7 +762,10 @@ cache"` value baked into the shell is PINNED at capture (the capture data
750
762
  it: call `cacheTag(...)` from the shell-material render code (the render-time
751
763
  lever), or add the tag to `ppr.tags` (operational tags the render cannot know —
752
764
  a tenant id, a deploy marker). Ring-1/ring-3 tag invalidation does NOT drop the
753
- shell.
765
+ shell. Tags are optional: if TTL/SWR is the complete freshness policy, leave
766
+ the shell untagged. Rango does not warn for that choice; with
767
+ `debugShellCapture` enabled, a stored event reports `untaggedBake: true` when
768
+ bake-lane loader material uses TTL/SWR-only invalidation.
754
769
  - **Uncached nondeterminism in the shell is a hydration hazard**: a raw
755
770
  `Date.now()` / `Math.random()` / uncached `fetch` rendered directly in shell
756
771
  material (outside any cache ring) drifts between capture and hit and the
@@ -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,
@@ -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
@@ -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,
@@ -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
@@ -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
 
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Resolve the router-wide default Link prefetch strategy once, at router init.
3
+ * The resolved value ships to the client in payload metadata; the browser
4
+ * entry applies it via `setDefaultPrefetchStrategy` (browser/prefetch/
5
+ * default-strategy.ts) and every `<Link>` without an explicit `prefetch` prop
6
+ * falls back to it.
7
+ *
8
+ * The type lives HERE (not in browser/react/Link.tsx) because both seats need
9
+ * it: this server-side resolver and the client Link/default-strategy modules.
10
+ * Link.tsx re-exports it so the public `PrefetchStrategy` export path is
11
+ * unchanged.
12
+ *
13
+ * Policy note: automatic prefetch stays quiet in development, matching the
14
+ * production-only default used by Next.js. Explicit router and per-Link
15
+ * strategies still work in every mode. Invalid untyped inputs fall back to the
16
+ * current environment's default.
17
+ */
18
+
19
+ /**
20
+ * Prefetch strategy for the Link component
21
+ * - "hover": Prefetch on mouse enter (direct, no queue)
22
+ * - "viewport": Prefetch when link enters viewport (queued, waits for idle)
23
+ * - "render": Prefetch on component mount regardless of visibility (queued, waits for idle)
24
+ * - "adaptive": Hover on pointer devices, viewport on touch devices
25
+ * - "none": No prefetching
26
+ */
27
+ export type PrefetchStrategy =
28
+ | "hover"
29
+ | "viewport"
30
+ | "render"
31
+ | "adaptive"
32
+ | "none";
33
+
34
+ function defaultPrefetchForEnvironment(
35
+ nodeEnv: string | undefined,
36
+ ): PrefetchStrategy {
37
+ return nodeEnv === "production" ? "viewport" : "none";
38
+ }
39
+
40
+ export const DEFAULT_PREFETCH_STRATEGY: PrefetchStrategy =
41
+ defaultPrefetchForEnvironment(process.env.NODE_ENV);
42
+
43
+ const VALID_STRATEGIES: ReadonlySet<string> = new Set([
44
+ "hover",
45
+ "viewport",
46
+ "render",
47
+ "adaptive",
48
+ "none",
49
+ ] satisfies PrefetchStrategy[]);
50
+
51
+ export function resolveDefaultPrefetch(
52
+ raw: PrefetchStrategy | undefined,
53
+ nodeEnv: string | undefined = process.env.NODE_ENV,
54
+ ): PrefetchStrategy {
55
+ if (typeof raw === "string" && VALID_STRATEGIES.has(raw)) {
56
+ return raw;
57
+ }
58
+ return defaultPrefetchForEnvironment(nodeEnv);
59
+ }
@@ -318,6 +318,14 @@ export interface RangoInternal<
318
318
  */
319
319
  readonly prefetchConcurrency: number;
320
320
 
321
+ /**
322
+ * Router-wide default Link prefetch strategy for Links without an explicit
323
+ * `prefetch` prop. Shipped to the client in payload metadata. Derived from
324
+ * the `defaultPrefetch` option (default "none" in development and
325
+ * "viewport" in production).
326
+ */
327
+ readonly defaultPrefetch: import("./prefetch-default.js").PrefetchStrategy;
328
+
321
329
  /**
322
330
  * Resolved rango state cookie name (`{prefix}_{routerId}`), composed once at
323
331
  * router init and shipped to the client in payload metadata. The server-side
@@ -11,6 +11,7 @@ import type { ExecutionContext } from "../server/request-context.js";
11
11
  import type { UrlPatterns } from "../urls.js";
12
12
  import type { UrlBuilder } from "../urls/pattern-types.js";
13
13
  import type { NamedRouteEntry } from "./content-negotiation.js";
14
+ import type { PrefetchStrategy } from "./prefetch-default.js";
14
15
  import type { TelemetrySink } from "./telemetry.js";
15
16
  import type { RouterTracingConfig } from "./tracing.js";
16
17
  import type { RouterTimeouts, OnTimeoutCallback } from "./timeout.js";
@@ -532,6 +533,36 @@ export interface RangoOptions<TEnv = any> {
532
533
  */
533
534
  prefetchConcurrency?: number;
534
535
 
536
+ /**
537
+ * Default prefetch strategy for every `<Link>` that does not set its own
538
+ * `prefetch` prop. A per-Link `prefetch` prop always wins, in both
539
+ * directions (a Link can opt out of an aggressive default with
540
+ * `prefetch="none"`, or opt in under `defaultPrefetch: "none"`).
541
+ *
542
+ * - `"viewport"` (production default): prefetch when the link enters the viewport —
543
+ * idle-gated and queued (see `prefetchConcurrency`), so prefetches never
544
+ * compete with hydration or an active navigation.
545
+ * - `"hover"`: prefetch on mouse enter only. Much lighter on the server —
546
+ * only links the pointer approaches are fetched — at the cost of the
547
+ * ~100-300ms head start viewport prefetch gives.
548
+ * - `"adaptive"`: `"hover"` on pointer devices, `"viewport"` on touch
549
+ * devices (no hover to wait for).
550
+ * - `"render"`: prefetch on mount regardless of visibility.
551
+ * - `"none"`: manual mode — nothing prefetches unless a Link opts in.
552
+ *
553
+ * Automatic prefetch defaults to `"none"` in development and `"viewport"`
554
+ * in production. With the production default, every visible Link triggers an
555
+ * RSC render (loaders included) on the server. Routes served from cache/PPR
556
+ * absorb this cheaply; per-user dynamic routes pay full price per viewport
557
+ * entry. Set `"hover"`, `"adaptive"`, or `"none"` when that cost matters.
558
+ *
559
+ * To disable the prefetch subsystem entirely (including per-Link opt-ins
560
+ * and `useRouter().prefetch()`), set `prefetchCacheTTL: false` instead.
561
+ *
562
+ * @default "none" in development; "viewport" in production
563
+ */
564
+ defaultPrefetch?: PrefetchStrategy;
565
+
535
566
  /**
536
567
  * Prefix for the rango state cookie name. The resolved name is
537
568
  * `{prefix}_{routerId}`; the prefix is sanitized to cookie-name-safe
package/src/router.ts CHANGED
@@ -115,6 +115,7 @@ import {
115
115
  } from "./router/prerender-match.js";
116
116
  import { resolveStateCookieName } from "./router/state-cookie-name.js";
117
117
  import { resolvePrefetchCacheTTL } from "./router/prefetch-cache-ttl.js";
118
+ import { resolveDefaultPrefetch } from "./router/prefetch-default.js";
118
119
  import {
119
120
  resolvePrefetchCacheSize,
120
121
  resolvePrefetchConcurrency,
@@ -160,6 +161,7 @@ export function createRouter<TEnv = any>(
160
161
  prefetchCacheTTL: prefetchCacheTTLOption,
161
162
  prefetchCacheSize: prefetchCacheSizeOption,
162
163
  prefetchConcurrency: prefetchConcurrencyOption,
164
+ defaultPrefetch: defaultPrefetchOption,
163
165
  stateCookiePrefix: stateCookiePrefixOption,
164
166
  warmup: warmupOption,
165
167
  telemetry: telemetrySink,
@@ -268,6 +270,10 @@ export function createRouter<TEnv = any>(
268
270
  prefetchConcurrencyOption,
269
271
  );
270
272
 
273
+ // Resolve the router-wide default Link prefetch strategy ("none" in dev,
274
+ // "viewport" in production). Links without an explicit prop fall back to it.
275
+ const defaultPrefetch = resolveDefaultPrefetch(defaultPrefetchOption);
276
+
271
277
  // Resolve warmup enabled flag (default: true)
272
278
  const warmupEnabled = warmupOption !== false;
273
279
 
@@ -1009,6 +1015,7 @@ export function createRouter<TEnv = any>(
1009
1015
  prefetchCacheTTL,
1010
1016
  prefetchCacheSize,
1011
1017
  prefetchConcurrency,
1018
+ defaultPrefetch,
1012
1019
 
1013
1020
  // Expose the resolved rango state cookie name for the server-side writer
1014
1021
  // (invalidateClientCache) and for shipping to the client in metadata.
@@ -23,6 +23,18 @@
23
23
  * swallow, so one rejected capture can never wedge every later one.
24
24
  */
25
25
  let captureQueue: Promise<void> = Promise.resolve();
26
+ let admittedCaptures = 0;
27
+
28
+ /** Bound queued/running capture closures retained by one isolate. */
29
+ export const MAX_ADMITTED_CAPTURES: number = 32;
30
+
31
+ /** The caller may drop this best-effort capture and retry on a later request. */
32
+ export class CaptureQueueFullError extends Error {
33
+ constructor() {
34
+ super(`shell capture queue is full (${MAX_ADMITTED_CAPTURES})`);
35
+ this.name = "CaptureQueueFullError";
36
+ }
37
+ }
26
38
 
27
39
  /**
28
40
  * Upper bound on how long one queue link may hold the queue. A capture task
@@ -43,6 +55,10 @@ const QUEUE_LINK_CAP_MS = 60_000;
43
55
  export function enqueueSerializedCapture(
44
56
  task: () => Promise<void>,
45
57
  ): Promise<void> {
58
+ if (admittedCaptures >= MAX_ADMITTED_CAPTURES) {
59
+ return Promise.reject(new CaptureQueueFullError());
60
+ }
61
+ admittedCaptures++;
46
62
  const prior = captureQueue;
47
63
  let releaseQueue!: () => void;
48
64
  captureQueue = new Promise<void>((resolve) => {
@@ -51,9 +67,16 @@ export function enqueueSerializedCapture(
51
67
  return (async () => {
52
68
  await prior.catch(() => {});
53
69
  let capTimer: ReturnType<typeof setTimeout> | undefined;
70
+ const taskPromise = Promise.resolve()
71
+ .then(task)
72
+ .finally(() => {
73
+ // A timed-out link releases serialization, but its detached task still
74
+ // counts against admission until it actually settles.
75
+ admittedCaptures--;
76
+ });
54
77
  try {
55
78
  await Promise.race([
56
- task(),
79
+ taskPromise,
57
80
  new Promise<void>((resolve) => {
58
81
  capTimer = setTimeout(resolve, QUEUE_LINK_CAP_MS);
59
82
  (capTimer as { unref?: () => void }).unref?.();
@@ -53,6 +53,7 @@ export function buildFullPayload(
53
53
  prefetchCacheTTL: ctx.router.prefetchCacheTTL,
54
54
  prefetchCacheSize: ctx.router.prefetchCacheSize,
55
55
  prefetchConcurrency: ctx.router.prefetchConcurrency,
56
+ defaultPrefetch: ctx.router.defaultPrefetch,
56
57
  stateCookieName: ctx.router.resolvedStateCookieName,
57
58
  themeConfig: ctx.router.themeConfig,
58
59
  // Carry warmupEnabled on the initial full-render payload so the client
@@ -1219,6 +1219,7 @@ export function createRSCHandler<
1219
1219
  prefetchCacheTTL: router.prefetchCacheTTL,
1220
1220
  prefetchCacheSize: router.prefetchCacheSize,
1221
1221
  prefetchConcurrency: router.prefetchConcurrency,
1222
+ defaultPrefetch: router.defaultPrefetch,
1222
1223
  stateCookieName: router.resolvedStateCookieName,
1223
1224
  themeConfig: router.themeConfig,
1224
1225
  warmupEnabled: router.warmupEnabled,