@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.
- package/dist/types/browser/prefetch/default-strategy.d.ts +22 -0
- package/dist/types/browser/prefetch/runtime.d.ts +0 -1
- package/dist/types/browser/react/Link.d.ts +8 -11
- package/dist/types/browser/types.d.ts +5 -0
- package/dist/types/cache/types.d.ts +6 -0
- package/dist/types/router/prefetch-default.d.ts +28 -0
- package/dist/types/router/router-interfaces.d.ts +7 -0
- package/dist/types/router/router-options.d.ts +30 -0
- package/dist/types/rsc/capture-queue.d.ts +6 -0
- package/dist/types/rsc/shell-capture.d.ts +15 -7
- package/dist/types/rsc/shell-serve.d.ts +4 -3
- package/dist/types/rsc/types.d.ts +2 -0
- package/dist/types/testing/e2e/index.d.ts +2 -2
- package/dist/types/testing/e2e/page-helpers.d.ts +24 -0
- package/dist/types.backup/__internal.d.ts +127 -0
- package/dist/types.backup/bin/rango.d.ts +1 -0
- package/dist/types.backup/browser/action-coordinator.d.ts +57 -0
- package/dist/types.backup/browser/action-fence.d.ts +33 -0
- package/dist/types.backup/browser/app-shell.d.ts +34 -0
- package/dist/types.backup/browser/app-version.d.ts +6 -0
- package/dist/types.backup/browser/connection-warmup.d.ts +31 -0
- package/dist/types.backup/browser/cookie-name.d.ts +66 -0
- package/dist/types.backup/browser/event-controller.d.ts +221 -0
- package/dist/types.backup/browser/history-state.d.ts +26 -0
- package/dist/types.backup/browser/index.d.ts +1 -0
- package/dist/types.backup/browser/intercept-utils.d.ts +30 -0
- package/dist/types.backup/browser/invalidate-client-cache.d.ts +17 -0
- package/dist/types.backup/browser/link-interceptor.d.ts +43 -0
- package/dist/types.backup/browser/logging.d.ts +33 -0
- package/dist/types.backup/browser/merge-segment-loaders.d.ts +38 -0
- package/dist/types.backup/browser/navigation-bridge.d.ts +27 -0
- package/dist/types.backup/browser/navigation-client.d.ts +17 -0
- package/dist/types.backup/browser/navigation-store-handle.d.ts +25 -0
- package/dist/types.backup/browser/navigation-store.d.ts +95 -0
- package/dist/types.backup/browser/navigation-transaction.d.ts +75 -0
- package/dist/types.backup/browser/network-error-handler.d.ts +35 -0
- package/dist/types.backup/browser/partial-update.d.ts +61 -0
- package/dist/types.backup/browser/prefetch/cache.d.ts +183 -0
- package/dist/types.backup/browser/prefetch/fetch.d.ts +52 -0
- package/dist/types.backup/browser/prefetch/observer.d.ts +27 -0
- package/dist/types.backup/browser/prefetch/policy.d.ts +13 -0
- package/dist/types.backup/browser/prefetch/queue.d.ts +48 -0
- package/dist/types.backup/browser/prefetch/resource-ready.d.ts +28 -0
- package/dist/types.backup/browser/rango-state.d.ts +52 -0
- package/dist/types.backup/browser/react/Link.d.ts +140 -0
- package/dist/types.backup/browser/react/NavigationProvider.d.ts +88 -0
- package/dist/types.backup/browser/react/ScrollRestoration.d.ts +78 -0
- package/dist/types.backup/browser/react/context.d.ts +54 -0
- package/dist/types.backup/browser/react/filter-segment-order.d.ts +35 -0
- package/dist/types.backup/browser/react/index.d.ts +1 -0
- package/dist/types.backup/browser/react/location-state-shared.d.ts +162 -0
- package/dist/types.backup/browser/react/location-state.d.ts +29 -0
- package/dist/types.backup/browser/react/mount-context.d.ts +23 -0
- package/dist/types.backup/browser/react/nonce-context.d.ts +14 -0
- package/dist/types.backup/browser/react/shallow-equal.d.ts +5 -0
- package/dist/types.backup/browser/react/use-action.d.ts +61 -0
- package/dist/types.backup/browser/react/use-handle.d.ts +21 -0
- package/dist/types.backup/browser/react/use-href.d.ts +32 -0
- package/dist/types.backup/browser/react/use-link-status.d.ts +36 -0
- package/dist/types.backup/browser/react/use-mount.d.ts +24 -0
- package/dist/types.backup/browser/react/use-navigation.d.ts +15 -0
- package/dist/types.backup/browser/react/use-params.d.ts +21 -0
- package/dist/types.backup/browser/react/use-pathname.d.ts +13 -0
- package/dist/types.backup/browser/react/use-reverse.d.ts +40 -0
- package/dist/types.backup/browser/react/use-router.d.ts +23 -0
- package/dist/types.backup/browser/react/use-search-params.d.ts +19 -0
- package/dist/types.backup/browser/react/use-segments.d.ts +29 -0
- package/dist/types.backup/browser/response-adapter.d.ts +58 -0
- package/dist/types.backup/browser/rsc-router.d.ts +141 -0
- package/dist/types.backup/browser/scroll-restoration.d.ts +103 -0
- package/dist/types.backup/browser/segment-reconciler.d.ts +74 -0
- package/dist/types.backup/browser/segment-structure-assert.d.ts +16 -0
- package/dist/types.backup/browser/server-action-bridge.d.ts +29 -0
- package/dist/types.backup/browser/types.d.ts +530 -0
- package/dist/types.backup/browser/validate-redirect-origin.d.ts +28 -0
- package/dist/types.backup/build/collect-fallback-refs.d.ts +5 -0
- package/dist/types.backup/build/generate-manifest.d.ts +100 -0
- package/dist/types.backup/build/generate-route-types.d.ts +8 -0
- package/dist/types.backup/build/index.d.ts +21 -0
- package/dist/types.backup/build/prefix-tree-utils.d.ts +56 -0
- package/dist/types.backup/build/route-trie.d.ts +89 -0
- package/dist/types.backup/build/route-types/ast-helpers.d.ts +3 -0
- package/dist/types.backup/build/route-types/ast-route-extraction.d.ts +13 -0
- package/dist/types.backup/build/route-types/codegen.d.ts +16 -0
- package/dist/types.backup/build/route-types/include-resolution.d.ts +74 -0
- package/dist/types.backup/build/route-types/param-extraction.d.ts +13 -0
- package/dist/types.backup/build/route-types/per-module-writer.d.ts +18 -0
- package/dist/types.backup/build/route-types/router-processing.d.ts +82 -0
- package/dist/types.backup/build/route-types/scan-filter.d.ts +17 -0
- package/dist/types.backup/build/route-types/source-scan.d.ts +13 -0
- package/dist/types.backup/build/runtime-discovery.d.ts +24 -0
- package/dist/types.backup/cache/background-task.d.ts +21 -0
- package/dist/types.backup/cache/cache-error.d.ts +71 -0
- package/dist/types.backup/cache/cache-key-utils.d.ts +35 -0
- package/dist/types.backup/cache/cache-policy.d.ts +59 -0
- package/dist/types.backup/cache/cache-runtime.d.ts +51 -0
- package/dist/types.backup/cache/cache-scope.d.ts +134 -0
- package/dist/types.backup/cache/cache-tag.d.ts +79 -0
- package/dist/types.backup/cache/cf/cf-base64.d.ts +4 -0
- package/dist/types.backup/cache/cf/cf-cache-constants.d.ts +105 -0
- package/dist/types.backup/cache/cf/cf-cache-store.d.ts +481 -0
- package/dist/types.backup/cache/cf/cf-cache-types.d.ts +300 -0
- package/dist/types.backup/cache/cf/cf-kv-utils.d.ts +22 -0
- package/dist/types.backup/cache/cf/cf-tag-marker-memo.d.ts +15 -0
- package/dist/types.backup/cache/cf/index.d.ts +3 -0
- package/dist/types.backup/cache/document-cache.d.ts +69 -0
- package/dist/types.backup/cache/handle-capture.d.ts +23 -0
- package/dist/types.backup/cache/handle-snapshot.d.ts +39 -0
- package/dist/types.backup/cache/index.d.ts +7 -0
- package/dist/types.backup/cache/memory-segment-store.d.ts +163 -0
- package/dist/types.backup/cache/profile-registry.d.ts +40 -0
- package/dist/types.backup/cache/read-through-swr.d.ts +60 -0
- package/dist/types.backup/cache/segment-codec.d.ts +78 -0
- package/dist/types.backup/cache/shell-snapshot.d.ts +162 -0
- package/dist/types.backup/cache/tag-invalidation.d.ts +74 -0
- package/dist/types.backup/cache/taint.d.ts +71 -0
- package/dist/types.backup/cache/types.d.ts +407 -0
- package/dist/types.backup/cache/vercel/index.d.ts +1 -0
- package/dist/types.backup/cache/vercel/vercel-cache-store.d.ts +267 -0
- package/dist/types.backup/client.d.ts +184 -0
- package/dist/types.backup/client.rsc.d.ts +39 -0
- package/dist/types.backup/cloudflare/index.d.ts +7 -0
- package/dist/types.backup/cloudflare/tracing.d.ts +53 -0
- package/dist/types.backup/component-utils.d.ts +46 -0
- package/dist/types.backup/components/DefaultDocument.d.ts +13 -0
- package/dist/types.backup/context-var.d.ts +84 -0
- package/dist/types.backup/debug.d.ts +57 -0
- package/dist/types.backup/decode-loader-results.d.ts +5 -0
- package/dist/types.backup/default-error-boundary.d.ts +10 -0
- package/dist/types.backup/defer.d.ts +89 -0
- package/dist/types.backup/deps/browser.d.ts +1 -0
- package/dist/types.backup/deps/html-stream-client.d.ts +1 -0
- package/dist/types.backup/deps/html-stream-server.d.ts +1 -0
- package/dist/types.backup/deps/rsc.d.ts +1 -0
- package/dist/types.backup/deps/ssr.d.ts +1 -0
- package/dist/types.backup/encode-kv.d.ts +35 -0
- package/dist/types.backup/errors.d.ts +226 -0
- package/dist/types.backup/escape-script.d.ts +44 -0
- package/dist/types.backup/handle.d.ts +93 -0
- package/dist/types.backup/handles/MetaTags.d.ts +17 -0
- package/dist/types.backup/handles/Scripts.d.ts +38 -0
- package/dist/types.backup/handles/breadcrumbs.d.ts +43 -0
- package/dist/types.backup/handles/deferred-resolution.d.ts +53 -0
- package/dist/types.backup/handles/is-thenable.d.ts +12 -0
- package/dist/types.backup/handles/meta.d.ts +43 -0
- package/dist/types.backup/handles/script.d.ts +139 -0
- package/dist/types.backup/host/cookie-handler.d.ts +8 -0
- package/dist/types.backup/host/errors.d.ts +40 -0
- package/dist/types.backup/host/index.d.ts +33 -0
- package/dist/types.backup/host/pattern-matcher.d.ts +30 -0
- package/dist/types.backup/host/router.d.ts +12 -0
- package/dist/types.backup/host/testing.d.ts +41 -0
- package/dist/types.backup/host/types.d.ts +148 -0
- package/dist/types.backup/host/utils.d.ts +20 -0
- package/dist/types.backup/href-client.d.ts +214 -0
- package/dist/types.backup/index.d.ts +112 -0
- package/dist/types.backup/index.rsc.d.ts +51 -0
- package/dist/types.backup/internal-debug.d.ts +1 -0
- package/dist/types.backup/loader-store.d.ts +193 -0
- package/dist/types.backup/loader.d.ts +18 -0
- package/dist/types.backup/loader.rsc.d.ts +18 -0
- package/dist/types.backup/missing-id-error.d.ts +1 -0
- package/dist/types.backup/outlet-context.d.ts +12 -0
- package/dist/types.backup/outlet-provider.d.ts +12 -0
- package/dist/types.backup/prerender/build-shell-capture.d.ts +104 -0
- package/dist/types.backup/prerender/param-hash.d.ts +6 -0
- package/dist/types.backup/prerender/shell-manifest-key.d.ts +18 -0
- package/dist/types.backup/prerender/store.d.ts +62 -0
- package/dist/types.backup/prerender.d.ts +292 -0
- package/dist/types.backup/redirect-origin.d.ts +55 -0
- package/dist/types.backup/regex-escape.d.ts +6 -0
- package/dist/types.backup/render-error-thrower.d.ts +13 -0
- package/dist/types.backup/response-utils.d.ts +35 -0
- package/dist/types.backup/reverse.d.ts +206 -0
- package/dist/types.backup/root-error-boundary.d.ts +32 -0
- package/dist/types.backup/route-content-wrapper.d.ts +40 -0
- package/dist/types.backup/route-definition/dsl-helpers.d.ts +130 -0
- package/dist/types.backup/route-definition/helper-factories.d.ts +22 -0
- package/dist/types.backup/route-definition/helpers-types.d.ts +392 -0
- package/dist/types.backup/route-definition/index.d.ts +7 -0
- package/dist/types.backup/route-definition/redirect.d.ts +48 -0
- package/dist/types.backup/route-definition/resolve-handler-use.d.ts +19 -0
- package/dist/types.backup/route-definition/use-item-types.d.ts +1 -0
- package/dist/types.backup/route-definition.d.ts +1 -0
- package/dist/types.backup/route-map-builder.d.ts +127 -0
- package/dist/types.backup/route-name.d.ts +27 -0
- package/dist/types.backup/route-types.d.ts +172 -0
- package/dist/types.backup/router/basename.d.ts +10 -0
- package/dist/types.backup/router/content-negotiation.d.ts +91 -0
- package/dist/types.backup/router/debug-manifest.d.ts +7 -0
- package/dist/types.backup/router/error-handling.d.ts +76 -0
- package/dist/types.backup/router/find-match.d.ts +19 -0
- package/dist/types.backup/router/handler-context.d.ts +41 -0
- package/dist/types.backup/router/instrument.d.ts +161 -0
- package/dist/types.backup/router/intercept-resolution.d.ts +79 -0
- package/dist/types.backup/router/lazy-includes.d.ts +26 -0
- package/dist/types.backup/router/loader-resolution.d.ts +63 -0
- package/dist/types.backup/router/logging.d.ts +41 -0
- package/dist/types.backup/router/manifest.d.ts +8 -0
- package/dist/types.backup/router/match-api.d.ts +19 -0
- package/dist/types.backup/router/match-context.d.ts +184 -0
- package/dist/types.backup/router/match-handlers.d.ts +49 -0
- package/dist/types.backup/router/match-middleware/background-revalidation.d.ts +113 -0
- package/dist/types.backup/router/match-middleware/cache-lookup.d.ts +113 -0
- package/dist/types.backup/router/match-middleware/cache-store.d.ts +112 -0
- package/dist/types.backup/router/match-middleware/index.d.ts +80 -0
- package/dist/types.backup/router/match-middleware/intercept-resolution.d.ts +116 -0
- package/dist/types.backup/router/match-middleware/segment-resolution.d.ts +94 -0
- package/dist/types.backup/router/match-pipelines.d.ts +103 -0
- package/dist/types.backup/router/match-result.d.ts +114 -0
- package/dist/types.backup/router/metrics.d.ts +6 -0
- package/dist/types.backup/router/middleware-types.d.ts +74 -0
- package/dist/types.backup/router/middleware.d.ts +116 -0
- package/dist/types.backup/router/navigation-snapshot.d.ts +22 -0
- package/dist/types.backup/router/params-util.d.ts +8 -0
- package/dist/types.backup/router/parse-pattern.d.ts +38 -0
- package/dist/types.backup/router/pattern-matching.d.ts +169 -0
- package/dist/types.backup/router/prefetch-cache-ttl.d.ts +27 -0
- package/dist/types.backup/router/prefetch-limits.d.ts +20 -0
- package/dist/types.backup/router/prerender-match.d.ts +50 -0
- package/dist/types.backup/router/preview-match.d.ts +22 -0
- package/dist/types.backup/router/request-classification.d.ts +104 -0
- package/dist/types.backup/router/revalidation.d.ts +57 -0
- package/dist/types.backup/router/route-snapshot.d.ts +112 -0
- package/dist/types.backup/router/router-context.d.ts +137 -0
- package/dist/types.backup/router/router-interfaces.d.ts +432 -0
- package/dist/types.backup/router/router-options.d.ts +738 -0
- package/dist/types.backup/router/router-registry.d.ts +15 -0
- package/dist/types.backup/router/segment-resolution/fresh.d.ts +55 -0
- package/dist/types.backup/router/segment-resolution/helpers.d.ts +93 -0
- package/dist/types.backup/router/segment-resolution/loader-cache.d.ts +33 -0
- package/dist/types.backup/router/segment-resolution/loader-mask.d.ts +44 -0
- package/dist/types.backup/router/segment-resolution/loader-snapshot.d.ts +90 -0
- package/dist/types.backup/router/segment-resolution/mask-nested.d.ts +53 -0
- package/dist/types.backup/router/segment-resolution/revalidation.d.ts +85 -0
- package/dist/types.backup/router/segment-resolution/static-store.d.ts +17 -0
- package/dist/types.backup/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
- package/dist/types.backup/router/segment-resolution/view-transition-default.d.ts +28 -0
- package/dist/types.backup/router/segment-resolution.d.ts +3 -0
- package/dist/types.backup/router/segment-wrappers.d.ts +53 -0
- package/dist/types.backup/router/state-cookie-name.d.ts +1 -0
- package/dist/types.backup/router/substitute-pattern-params.d.ts +23 -0
- package/dist/types.backup/router/telemetry-otel.d.ts +113 -0
- package/dist/types.backup/router/telemetry.d.ts +215 -0
- package/dist/types.backup/router/timeout.d.ts +68 -0
- package/dist/types.backup/router/tracing.d.ts +125 -0
- package/dist/types.backup/router/trie-matching.d.ts +32 -0
- package/dist/types.backup/router/types.d.ts +98 -0
- package/dist/types.backup/router/url-params.d.ts +26 -0
- package/dist/types.backup/router.d.ts +7 -0
- package/dist/types.backup/rsc/capture-queue.d.ts +6 -0
- package/dist/types.backup/rsc/full-payload.d.ts +22 -0
- package/dist/types.backup/rsc/handler-context.d.ts +31 -0
- package/dist/types.backup/rsc/handler.d.ts +9 -0
- package/dist/types.backup/rsc/helpers.d.ts +213 -0
- package/dist/types.backup/rsc/index.d.ts +17 -0
- package/dist/types.backup/rsc/json-route-result.d.ts +20 -0
- package/dist/types.backup/rsc/loader-fetch.d.ts +14 -0
- package/dist/types.backup/rsc/manifest-init.d.ts +18 -0
- package/dist/types.backup/rsc/nonce.d.ts +28 -0
- package/dist/types.backup/rsc/origin-guard.d.ts +50 -0
- package/dist/types.backup/rsc/progressive-enhancement.d.ts +19 -0
- package/dist/types.backup/rsc/redirect-guard.d.ts +35 -0
- package/dist/types.backup/rsc/response-cache-serve.d.ts +46 -0
- package/dist/types.backup/rsc/response-error.d.ts +19 -0
- package/dist/types.backup/rsc/response-route-handler.d.ts +29 -0
- package/dist/types.backup/rsc/rsc-rendering.d.ts +23 -0
- package/dist/types.backup/rsc/runtime-warnings.d.ts +22 -0
- package/dist/types.backup/rsc/server-action.d.ts +68 -0
- package/dist/types.backup/rsc/shell-build-manifest.d.ts +84 -0
- package/dist/types.backup/rsc/shell-capture-constants.d.ts +27 -0
- package/dist/types.backup/rsc/shell-capture.d.ts +374 -0
- package/dist/types.backup/rsc/shell-serve.d.ts +136 -0
- package/dist/types.backup/rsc/ssr-setup.d.ts +48 -0
- package/dist/types.backup/rsc/transition-gate.d.ts +27 -0
- package/dist/types.backup/rsc/types.d.ts +290 -0
- package/dist/types.backup/runtime-env.d.ts +1 -0
- package/dist/types.backup/search-params.d.ts +125 -0
- package/dist/types.backup/segment-content-promise.d.ts +13 -0
- package/dist/types.backup/segment-fragments.d.ts +56 -0
- package/dist/types.backup/segment-loader-promise.d.ts +22 -0
- package/dist/types.backup/segment-system.d.ts +84 -0
- package/dist/types.backup/serialize.d.ts +164 -0
- package/dist/types.backup/server/context.d.ts +494 -0
- package/dist/types.backup/server/cookie-parse.d.ts +10 -0
- package/dist/types.backup/server/cookie-store.d.ts +107 -0
- package/dist/types.backup/server/fetchable-loader-store.d.ts +20 -0
- package/dist/types.backup/server/handle-store.d.ts +100 -0
- package/dist/types.backup/server/loader-registry.d.ts +32 -0
- package/dist/types.backup/server/request-context.d.ts +596 -0
- package/dist/types.backup/server/root-layout.d.ts +3 -0
- package/dist/types.backup/server.d.ts +15 -0
- package/dist/types.backup/ssr/index.d.ts +233 -0
- package/dist/types.backup/ssr/inject-rsc-eager.d.ts +3 -0
- package/dist/types.backup/ssr/preinit-client-references.d.ts +71 -0
- package/dist/types.backup/ssr/ssr-root.d.ts +69 -0
- package/dist/types.backup/static-handler.d.ts +57 -0
- package/dist/types.backup/testing/cache-status.d.ts +63 -0
- package/dist/types.backup/testing/collect-handle.d.ts +20 -0
- package/dist/types.backup/testing/dispatch.d.ts +123 -0
- package/dist/types.backup/testing/dom.entry.d.ts +15 -0
- package/dist/types.backup/testing/e2e/fixture.d.ts +37 -0
- package/dist/types.backup/testing/e2e/index.d.ts +30 -0
- package/dist/types.backup/testing/e2e/matchers.d.ts +17 -0
- package/dist/types.backup/testing/e2e/page-helpers.d.ts +62 -0
- package/dist/types.backup/testing/e2e/parity.d.ts +111 -0
- package/dist/types.backup/testing/e2e/server.d.ts +35 -0
- package/dist/types.backup/testing/flight-matchers.d.ts +55 -0
- package/dist/types.backup/testing/flight-normalize.d.ts +1 -0
- package/dist/types.backup/testing/flight-tree.d.ts +192 -0
- package/dist/types.backup/testing/flight.d.ts +115 -0
- package/dist/types.backup/testing/flight.entry.d.ts +27 -0
- package/dist/types.backup/testing/generated-routes.d.ts +66 -0
- package/dist/types.backup/testing/index.d.ts +52 -0
- package/dist/types.backup/testing/internal/context.d.ts +225 -0
- package/dist/types.backup/testing/internal/flight-client-globals.d.ts +1 -0
- package/dist/types.backup/testing/internal/seed-vars.d.ts +30 -0
- package/dist/types.backup/testing/render-handler.d.ts +160 -0
- package/dist/types.backup/testing/render-route.d.ts +246 -0
- package/dist/types.backup/testing/run-loader.d.ts +186 -0
- package/dist/types.backup/testing/run-middleware.d.ts +132 -0
- package/dist/types.backup/testing/run-transition-when.d.ts +77 -0
- package/dist/types.backup/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
- package/dist/types.backup/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
- package/dist/types.backup/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
- package/dist/types.backup/testing/vitest-stubs/version.d.ts +1 -0
- package/dist/types.backup/testing/vitest.d.ts +205 -0
- package/dist/types.backup/theme/ThemeProvider.d.ts +13 -0
- package/dist/types.backup/theme/ThemeScript.d.ts +45 -0
- package/dist/types.backup/theme/constants.d.ts +39 -0
- package/dist/types.backup/theme/index.d.ts +29 -0
- package/dist/types.backup/theme/theme-context.d.ts +21 -0
- package/dist/types.backup/theme/theme-script.d.ts +26 -0
- package/dist/types.backup/theme/types.d.ts +162 -0
- package/dist/types.backup/theme/use-theme.d.ts +8 -0
- package/dist/types.backup/types/boundaries.d.ts +93 -0
- package/dist/types.backup/types/cache-types.d.ts +191 -0
- package/dist/types.backup/types/error-types.d.ts +114 -0
- package/dist/types.backup/types/global-namespace.d.ts +90 -0
- package/dist/types.backup/types/handler-context.d.ts +658 -0
- package/dist/types.backup/types/index.d.ts +11 -0
- package/dist/types.backup/types/loader-types.d.ts +182 -0
- package/dist/types.backup/types/request-scope.d.ts +93 -0
- package/dist/types.backup/types/route-config.d.ts +105 -0
- package/dist/types.backup/types/route-entry.d.ts +95 -0
- package/dist/types.backup/types/segments.d.ts +234 -0
- package/dist/types.backup/types.d.ts +1 -0
- package/dist/types.backup/urls/include-helper.d.ts +17 -0
- package/dist/types.backup/urls/include-provider.d.ts +27 -0
- package/dist/types.backup/urls/index.d.ts +6 -0
- package/dist/types.backup/urls/path-helper-types.d.ts +197 -0
- package/dist/types.backup/urls/path-helper.d.ts +12 -0
- package/dist/types.backup/urls/pattern-types.d.ts +166 -0
- package/dist/types.backup/urls/response-types.d.ts +67 -0
- package/dist/types.backup/urls/type-extraction.d.ts +157 -0
- package/dist/types.backup/urls/urls-function.d.ts +24 -0
- package/dist/types.backup/urls.d.ts +1 -0
- package/dist/types.backup/use-loader.d.ts +150 -0
- package/dist/types.backup/vercel/index.d.ts +10 -0
- package/dist/types.backup/vercel/tracing.d.ts +70 -0
- package/dist/types.backup/vite/debug.d.ts +80 -0
- package/dist/types.backup/vite/discovery/bundle-postprocess.d.ts +12 -0
- package/dist/types.backup/vite/discovery/dev-prerender-cache.d.ts +65 -0
- package/dist/types.backup/vite/discovery/discover-routers.d.ts +17 -0
- package/dist/types.backup/vite/discovery/discovery-errors.d.ts +113 -0
- package/dist/types.backup/vite/discovery/gate-state.d.ts +79 -0
- package/dist/types.backup/vite/discovery/prerender-collection.d.ts +24 -0
- package/dist/types.backup/vite/discovery/route-types-writer.d.ts +32 -0
- package/dist/types.backup/vite/discovery/self-gen-tracking.d.ts +22 -0
- package/dist/types.backup/vite/discovery/shell-prerender-phase.d.ts +40 -0
- package/dist/types.backup/vite/discovery/state.d.ts +162 -0
- package/dist/types.backup/vite/discovery/virtual-module-codegen.d.ts +15 -0
- package/dist/types.backup/vite/index.d.ts +11 -0
- package/dist/types.backup/vite/inject-client-debug.d.ts +56 -0
- package/dist/types.backup/vite/plugin-types.d.ts +298 -0
- package/dist/types.backup/vite/plugins/cjs-to-esm.d.ts +6 -0
- package/dist/types.backup/vite/plugins/client-ref-dedup.d.ts +40 -0
- package/dist/types.backup/vite/plugins/client-ref-hashing.d.ts +35 -0
- package/dist/types.backup/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
- package/dist/types.backup/vite/plugins/expose-action-id.d.ts +18 -0
- package/dist/types.backup/vite/plugins/expose-id-utils.d.ts +37 -0
- package/dist/types.backup/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
- package/dist/types.backup/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
- package/dist/types.backup/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
- package/dist/types.backup/vite/plugins/expose-ids/router-transform.d.ts +13 -0
- package/dist/types.backup/vite/plugins/expose-ids/types.d.ts +29 -0
- package/dist/types.backup/vite/plugins/expose-internal-ids.d.ts +6 -0
- package/dist/types.backup/vite/plugins/performance-tracks.d.ts +25 -0
- package/dist/types.backup/vite/plugins/refresh-cmd.d.ts +20 -0
- package/dist/types.backup/vite/plugins/use-cache-transform.d.ts +20 -0
- package/dist/types.backup/vite/plugins/vercel-output.d.ts +85 -0
- package/dist/types.backup/vite/plugins/version-injector.d.ts +21 -0
- package/dist/types.backup/vite/plugins/version-plugin.d.ts +19 -0
- package/dist/types.backup/vite/plugins/virtual-entries.d.ts +36 -0
- package/dist/types.backup/vite/plugins/virtual-stub-plugin.d.ts +7 -0
- package/dist/types.backup/vite/rango.d.ts +29 -0
- package/dist/types.backup/vite/router-discovery.d.ts +23 -0
- package/dist/types.backup/vite/utils/ast-handler-extract.d.ts +64 -0
- package/dist/types.backup/vite/utils/banner.d.ts +2 -0
- package/dist/types.backup/vite/utils/bundle-analysis.d.ts +28 -0
- package/dist/types.backup/vite/utils/client-chunks.d.ts +55 -0
- package/dist/types.backup/vite/utils/directive-prologue.d.ts +16 -0
- package/dist/types.backup/vite/utils/forward-user-plugins.d.ts +37 -0
- package/dist/types.backup/vite/utils/manifest-utils.d.ts +7 -0
- package/dist/types.backup/vite/utils/package-resolution.d.ts +6 -0
- package/dist/types.backup/vite/utils/prerender-utils.d.ts +32 -0
- package/dist/types.backup/vite/utils/shared-utils.d.ts +55 -0
- package/dist/vite/index.js +5 -2
- package/package.json +1 -1
- package/skills/comparison/references/framework-comparison.md +2 -1
- package/skills/ppr/SKILL.md +28 -13
- package/skills/router-setup/SKILL.md +4 -0
- package/src/browser/prefetch/default-strategy.ts +34 -0
- package/src/browser/prefetch/loader.ts +6 -12
- package/src/browser/prefetch/runtime.ts +0 -1
- package/src/browser/react/Link.tsx +22 -21
- package/src/browser/rsc-router.tsx +8 -0
- package/src/browser/types.ts +5 -0
- package/src/cache/cf/cf-cache-store.ts +4 -0
- package/src/cache/types.ts +6 -0
- package/src/cache/vercel/vercel-cache-store.ts +6 -1
- package/src/router/prefetch-default.ts +59 -0
- package/src/router/router-interfaces.ts +8 -0
- package/src/router/router-options.ts +31 -0
- package/src/router.ts +7 -0
- package/src/rsc/capture-queue.ts +24 -1
- package/src/rsc/full-payload.ts +1 -0
- package/src/rsc/handler.ts +1 -0
- package/src/rsc/rsc-rendering.ts +120 -18
- package/src/rsc/shell-capture.ts +94 -50
- package/src/rsc/shell-serve.ts +6 -4
- package/src/rsc/types.ts +2 -0
- package/src/testing/e2e/index.ts +6 -0
- package/src/testing/e2e/page-helpers.ts +47 -0
- package/src/testing/e2e/parity.ts +13 -0
package/package.json
CHANGED
|
@@ -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
|
|
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
|
package/skills/ppr/SKILL.md
CHANGED
|
@@ -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
|
|
178
|
+
### Soft navigation caches and reuses the handler layer
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
|
195
|
-
|
|
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
|
|
208
|
-
build manifest
|
|
209
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
98
|
-
runtime?.unobserveForPrefetch(element);
|
|
92
|
+
unobserveForPrefetch(element);
|
|
99
93
|
};
|
|
100
94
|
}
|
|
101
95
|
|
|
@@ -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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
*
|
|
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
|
|
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
|
-
//
|
|
266
|
-
//
|
|
267
|
-
//
|
|
268
|
-
|
|
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).
|
package/src/browser/types.ts
CHANGED
|
@@ -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,
|
package/src/cache/types.ts
CHANGED
|
@@ -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.
|
package/src/rsc/capture-queue.ts
CHANGED
|
@@ -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
|
-
|
|
79
|
+
taskPromise,
|
|
57
80
|
new Promise<void>((resolve) => {
|
|
58
81
|
capTimer = setTimeout(resolve, QUEUE_LINK_CAP_MS);
|
|
59
82
|
(capTimer as { unref?: () => void }).unref?.();
|
package/src/rsc/full-payload.ts
CHANGED
|
@@ -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
|
package/src/rsc/handler.ts
CHANGED
|
@@ -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,
|