@rangojs/router 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- 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/document-cache.d.ts +3 -1
- package/dist/types/cache/types.d.ts +10 -3
- package/dist/types/route-definition/helpers-types.d.ts +6 -6
- package/dist/types/router/match-handlers.d.ts +2 -3
- 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/router/segment-resolution/view-transition-default.d.ts +3 -4
- package/dist/types/router/transition-when.d.ts +13 -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 +6 -3
- package/dist/types/rsc/transition-gate.d.ts +10 -14
- package/dist/types/rsc/types.d.ts +2 -0
- package/dist/types/server/request-context.d.ts +5 -1
- package/dist/types/testing/e2e/index.d.ts +3 -3
- package/dist/types/testing/e2e/page-helpers.d.ts +24 -0
- package/dist/types/testing/index.d.ts +2 -2
- package/dist/types/testing/run-transition-when.d.ts +6 -5
- package/dist/types/testing/shell-status.d.ts +23 -3
- package/dist/types/types/segments.d.ts +27 -22
- package/dist/types/urls/path-helper-types.d.ts +4 -3
- 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 +20 -21
- package/skills/cache-guide/SKILL.md +6 -3
- package/skills/catalog.json +7 -1
- package/skills/comparison/references/framework-comparison.md +2 -1
- package/skills/deployment-caching/SKILL.md +176 -0
- package/skills/document-cache/SKILL.md +30 -3
- package/skills/ppr/SKILL.md +81 -34
- package/skills/prerender/SKILL.md +15 -8
- package/skills/rango/SKILL.md +20 -17
- package/skills/router-setup/SKILL.md +4 -0
- package/skills/testing/SKILL.md +1 -1
- package/skills/testing/cache-prerender.md +5 -1
- package/skills/vercel/SKILL.md +22 -1
- package/skills/view-transitions/SKILL.md +12 -8
- 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/cache-scope.ts +6 -1
- package/src/cache/cf/cf-cache-store.ts +4 -0
- package/src/cache/document-cache.ts +4 -2
- package/src/cache/types.ts +10 -3
- package/src/cache/vercel/vercel-cache-store.ts +6 -1
- package/src/route-definition/helpers-types.ts +6 -6
- package/src/router/match-handlers.ts +44 -6
- package/src/router/match-middleware/cache-lookup.ts +10 -3
- 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/segment-resolution/view-transition-default.ts +9 -5
- package/src/router/transition-when.ts +76 -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/progressive-enhancement.ts +9 -14
- package/src/rsc/rsc-rendering.ts +261 -48
- package/src/rsc/shell-capture.ts +94 -50
- package/src/rsc/shell-serve.ts +9 -4
- package/src/rsc/transition-gate.ts +37 -40
- package/src/rsc/types.ts +2 -0
- package/src/server/request-context.ts +6 -0
- package/src/testing/e2e/index.ts +11 -0
- package/src/testing/e2e/page-helpers.ts +47 -0
- package/src/testing/e2e/parity.ts +13 -0
- package/src/testing/index.ts +9 -1
- package/src/testing/run-transition-when.ts +42 -9
- package/src/testing/shell-status.ts +92 -3
- package/src/types/segments.ts +27 -22
- package/src/urls/path-helper-types.ts +4 -3
package/skills/rango/SKILL.md
CHANGED
|
@@ -110,6 +110,7 @@ stated, greppable contract.
|
|
|
110
110
|
| pre-render a route at build time | `Prerender(...)` wrapper | /prerender |
|
|
111
111
|
| feed live loaders from a cached shell | replayed handle + `ctx.rendered()` | /shell-manifest |
|
|
112
112
|
| cache the HTML shell, keep loaders live | `ppr` path option | /ppr |
|
|
113
|
+
| choose in-function vs CDN caching | deployment cache boundary | /deployment-caching |
|
|
113
114
|
| stream SSE / upgrade a WebSocket | `path.stream()` / `path.any()` | /streams-and-websockets |
|
|
114
115
|
|
|
115
116
|
## Invariants
|
|
@@ -161,8 +162,8 @@ Same words, different jobs — this is the most common source of the
|
|
|
161
162
|
| Next.js `export const revalidate = N` | **Axis 1** (cache) | Same word, opposite meaning. Next's `revalidate` is time-based cache expiry; Rango's `revalidate()` is **axis 2**. Use `cache({ ttl })` for the Next behavior. |
|
|
162
163
|
| Next.js `revalidateTag` / `updateTag` | **Axis 1** (cache) | Cache busting by tag. Tag via `cache({ tags })` / `cacheTag(...tags)`; invalidate with `updateTag(...tags)` (awaitable, read-your-own-writes) or `revalidateTag(...tags)` (background, non-blocking). Built-in stores index by tag. No `revalidatePath` (path-based busting); use tags. |
|
|
163
164
|
| React Router / Remix `shouldRevalidate` | **Axis 2** | This is the correct mental model for Rango's `revalidate()`. |
|
|
164
|
-
| HTTP `Cache-Control` / ISR |
|
|
165
|
-
| Next.js PPR (partial prerendering) | HTML shell layer | Same
|
|
165
|
+
| HTTP `Cache-Control` / ISR | Deployment layer | Complete-response deployment layer. A CDN hit bypasses Rango entirely; the store-backed middleware does not. See `/deployment-caching` and `/document-cache`. |
|
|
166
|
+
| Next.js PPR (partial prerendering) | HTML shell layer | Same React primitive, different transport: Rango serves shells in-function after middleware. Ordinary `ppr` captures at runtime; `Prerender + ppr` captures at build. See `/ppr`, `/prerender`, and `/deployment-caching`. |
|
|
166
167
|
| Remix/RR `loader` | live data | Like Rango loaders, fresh per request — but Rango loaders run in parallel and stream (latency overlaps first paint), and can opt into caching on demand. |
|
|
167
168
|
|
|
168
169
|
See `/cache-guide` for the axis-1 decision guide, `/loader` and `/route` for
|
|
@@ -257,17 +258,18 @@ Grouped by concern — read when you need to…
|
|
|
257
258
|
|
|
258
259
|
**Data & caching** — fetch, mutate, and cache:
|
|
259
260
|
|
|
260
|
-
| Skill
|
|
261
|
-
|
|
|
262
|
-
| `/loader`
|
|
263
|
-
| `/server-actions`
|
|
264
|
-
| `/caching`
|
|
265
|
-
| `/use-cache`
|
|
266
|
-
| `/cache-guide`
|
|
267
|
-
| `/document-cache`
|
|
268
|
-
| `/
|
|
269
|
-
| `/
|
|
270
|
-
| `/
|
|
261
|
+
| Skill | Description |
|
|
262
|
+
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
263
|
+
| `/loader` | Data loaders with `createLoader()` and `revalidate()` |
|
|
264
|
+
| `/server-actions` | Mutations with `"use server"`, useActionState, validation, revalidation |
|
|
265
|
+
| `/caching` | Segment caching with memory or KV stores |
|
|
266
|
+
| `/use-cache` | Function-level caching with `"use cache"` directive |
|
|
267
|
+
| `/cache-guide` | When to use `cache()` vs `"use cache"` — differences and decision guide |
|
|
268
|
+
| `/document-cache` | Store-backed complete-response middleware using Cache-Control policy |
|
|
269
|
+
| `/deployment-caching` | Choose between in-function caches, store-backed responses, and an external CDN cache |
|
|
270
|
+
| `/ppr` | PPR shell caching: cached shell served instantly, live holes resumed — a hole is a `loading()` subtree OR a pending promise under `<Suspense>` (no loader needed) |
|
|
271
|
+
| `/prerender` | Pre-render route segments at build time (Passthrough live fallback) |
|
|
272
|
+
| `/shell-manifest` | Replayed handles as cache metadata read by live loaders (frozen shell, batched live holes) |
|
|
271
273
|
|
|
272
274
|
**Client & presentation** — build the client-side UX:
|
|
273
275
|
|
|
@@ -295,10 +297,11 @@ Grouped by concern — read when you need to…
|
|
|
295
297
|
|
|
296
298
|
**Deployment**:
|
|
297
299
|
|
|
298
|
-
| Skill
|
|
299
|
-
|
|
|
300
|
-
| `/cloudflare`
|
|
301
|
-
| `/vercel`
|
|
300
|
+
| Skill | Description |
|
|
301
|
+
| --------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
302
|
+
| `/cloudflare` | Deploy to Cloudflare Workers with the Vite plugin, typed D1/KV bindings, migrations, secrets, and preview parity |
|
|
303
|
+
| `/vercel` | Deploy to Vercel Functions (`preset: "vercel"`), Runtime Cache, and `createVercelTracing` |
|
|
304
|
+
| `/deployment-caching` | Compare deployment cache boundaries, middleware execution, PPR transport, and HTTP CDN caching |
|
|
302
305
|
|
|
303
306
|
**Testing**:
|
|
304
307
|
|
|
@@ -120,6 +120,10 @@ interface RangoOptions<TEnv> {
|
|
|
120
120
|
// Set to false to disable prefetch caching.
|
|
121
121
|
prefetchCacheTTL?: number | false;
|
|
122
122
|
|
|
123
|
+
// Default prefetch strategy for Links without a `prefetch` prop
|
|
124
|
+
// (dev: "none", production: "viewport"). Per-Link props win in both directions.
|
|
125
|
+
defaultPrefetch?: "hover" | "viewport" | "render" | "adaptive" | "none";
|
|
126
|
+
|
|
123
127
|
// CSP nonce provider (for router.fetch)
|
|
124
128
|
nonce?: (
|
|
125
129
|
request: Request,
|
package/skills/testing/SKILL.md
CHANGED
|
@@ -88,7 +88,7 @@ Each primitive links to its sub-file (API + recipe + caveats).
|
|
|
88
88
|
| a loader's cookie / header / redirect output (auth-loader pattern) | unit (node) | [`runLoaderResult`](./loader.md) | `@rangojs/router/testing` |
|
|
89
89
|
| one middleware's ordering / short-circuit / cookie+header merge | unit (node) | [`runMiddleware`](./middleware.md) | `@rangojs/router/testing` |
|
|
90
90
|
| a `"use server"` action's cookie / header / flash output (even on `throw redirect()`) | unit (node) | [`runInRequestContext`](./server-actions.md) | `@rangojs/router/testing` |
|
|
91
|
-
| a `transition({ when })` gate (keep/drop) against nav source / target / action metadata | unit (node) | `runTransitionWhen` (`{ kept, whenContext }`)
|
|
91
|
+
| a `transition({ when })` gate (keep/drop) against nav source / target / action metadata | unit (node) | `runTransitionWhen` (`{ kept, whenContext }`; pass `{ ppr: true }` for pre-handler timing) | `@rangojs/router/testing` |
|
|
92
92
|
| a handle's `collect`/accumulator, or a seeded handle read | unit | [`collectHandle` / seeded `handles`](./handles.md) | `@rangojs/router/testing` |
|
|
93
93
|
| a CLIENT component reading router context (`useParams`/`useReverse`/`Outlet`/`useNavigation`/`useLoader`) | unit (DOM) | [`renderRoute`](./client-components.md) | `@rangojs/router/testing/dom` |
|
|
94
94
|
| a redirect / status / headers / cookies / **response route** (json/text/html/xml/md), no Flight | integration | [`dispatch`](./response-routes.md) | `@rangojs/router/testing` |
|
|
@@ -113,7 +113,7 @@ expect(decision.segments?.[0].shouldRevalidate).toBe(true);
|
|
|
113
113
|
|
|
114
114
|
`events` accumulates across requests, so the FIRST matching segment for a `routeKey` wins — slice or recreate the sink between requests for the same route.
|
|
115
115
|
|
|
116
|
-
## PPR shell
|
|
116
|
+
## PPR shell and navigation replay
|
|
117
117
|
|
|
118
118
|
**DSL:** `ppr: true | PartialPrerenderProps` on a page route (see `/ppr`). **Not** the same header as `X-Rango-Cache` — shell is a second render axis.
|
|
119
119
|
|
|
@@ -123,6 +123,9 @@ expect(decision.segments?.[0].shouldRevalidate).toBe(true);
|
|
|
123
123
|
| `parseShellStatus(res)` | same | `"HIT" \| "MISS" \| null` (null = header absent / unrecognized) |
|
|
124
124
|
| `shellCacheKey(url)` | same | Production shell store key (`host+pathname+sorted search+:shell`) for `store.getShell` / custom stores |
|
|
125
125
|
| `SHELL_STATUS_HEADER` | same | `"x-rango-shell"` constant |
|
|
126
|
+
| `assertPprReplayStatus(res, expected)` | same | Assert fresh/stale replay or a bounded bypass decision |
|
|
127
|
+
| `parsePprReplayStatus(res)` | same | Structured replay/bypass status, or null for an absent/unrecognized header |
|
|
128
|
+
| `PPR_REPLAY_STATUS_HEADER` | same | `"x-rango-ppr-replay"` constant |
|
|
126
129
|
|
|
127
130
|
### What unit can prove vs e2e
|
|
128
131
|
|
|
@@ -131,6 +134,7 @@ expect(decision.segments?.[0].shouldRevalidate).toBe(true);
|
|
|
131
134
|
| **Unit** | store family + key identity | `MemorySegmentCacheStore` + `shellCacheKey(url)` + `putShell`/`getShell` / tag eviction — dogfood in `e2e/mini/test/shell-store-family.test.ts` and `src/testing/__tests__/shell-status.test.ts` |
|
|
132
135
|
| **Unit** | header helper contract | `assertShellStatus` on a Response that already carries the header (characterizes the helper; **never** invent a HIT to claim capture worked) |
|
|
133
136
|
| **E2E** | live MISS → capture → HIT | document GET, poll until `x-rango-shell: HIT` (background capture) — `e2e/shell-cache.test.ts` |
|
|
137
|
+
| **E2E** | partial replay decision | soft navigation to a warmed shell and `assertPprReplayStatus(response, { outcome: "HIT", freshness: "fresh" })` |
|
|
134
138
|
|
|
135
139
|
`dispatch` is RSC-free: it never runs shell serve/capture. `renderHandler` only surfaces `ctx.dynamic()` opt-out, not bake/serve.
|
|
136
140
|
|
package/skills/vercel/SKILL.md
CHANGED
|
@@ -8,6 +8,25 @@ argument-hint:
|
|
|
8
8
|
|
|
9
9
|
The `vercel` preset builds like the `node` preset (Vercel runs Node Functions, not Workers): rango owns the RSC entry, folds `process.env.NODE_ENV` for the SSR/RSC build, and after `vite build` assembles a `.vercel/output` directory (Build Output API v3) from `dist/` — a single streaming Node Function plus the static client assets.
|
|
10
10
|
|
|
11
|
+
## Deployment boundary
|
|
12
|
+
|
|
13
|
+
Only client JS, CSS, and public assets are emitted under
|
|
14
|
+
`.vercel/output/static`. HTML, Flight, prerender payloads, and PPR shells are
|
|
15
|
+
served from the streaming Node Function. `VercelCacheStore` is an in-function
|
|
16
|
+
Runtime Cache backend; it is separate from Vercel's CDN/ISR cache.
|
|
17
|
+
|
|
18
|
+
The preset does not emit `.prerender-config.json`, a response `chain`, or a
|
|
19
|
+
CDN-stitched PPR resume function. Rango PPR intentionally runs the whole global
|
|
20
|
+
and route middleware chain before committing shell bytes. A CDN-first shell
|
|
21
|
+
cannot preserve that contract because the resume function is invoked after the
|
|
22
|
+
shell starts streaming.
|
|
23
|
+
|
|
24
|
+
For fully public responses, HTTP `s-maxage`/`stale-while-revalidate` can cache
|
|
25
|
+
the completed response at Vercel's CDN and avoid the function on a hit. That is
|
|
26
|
+
whole-response caching: it freezes loader output and bypasses all Rango
|
|
27
|
+
middleware. Use `/deployment-caching` for the execution matrix and safety
|
|
28
|
+
checklist before adding shared-cache headers.
|
|
29
|
+
|
|
11
30
|
## Setup
|
|
12
31
|
|
|
13
32
|
```bash
|
|
@@ -48,7 +67,9 @@ rango({
|
|
|
48
67
|
|
|
49
68
|
## Runtime Cache
|
|
50
69
|
|
|
51
|
-
`VercelCacheStore` wraps the Vercel Runtime Cache
|
|
70
|
+
`VercelCacheStore` wraps the Vercel Runtime Cache for segment, item, response,
|
|
71
|
+
and PPR shell families. Locally (no `process.env.VERCEL`) fall back to an
|
|
72
|
+
in-memory store so dev/preview work without the platform:
|
|
52
73
|
|
|
53
74
|
```typescript
|
|
54
75
|
import {
|
|
@@ -209,9 +209,8 @@ interface TransitionConfig {
|
|
|
209
209
|
default?: string | Record<string, string>; // fallback for any phase
|
|
210
210
|
name?: string; // explicit view-transition-name
|
|
211
211
|
viewTransition?: "auto" | false; // boundary opt-out (see below)
|
|
212
|
-
// Conditional
|
|
213
|
-
//
|
|
214
|
-
// loading() fallback instead of holding. See the gate section below.
|
|
212
|
+
// Conditional server-side gate. PPR routes run it before route handlers and
|
|
213
|
+
// on every replay; other routes run it after handlers on fresh resolution.
|
|
215
214
|
when?: (ctx: TransitionWhenContext) => boolean;
|
|
216
215
|
}
|
|
217
216
|
```
|
|
@@ -223,14 +222,19 @@ interface TransitionConfig {
|
|
|
223
222
|
|
|
224
223
|
## Conditional transitions (`when`)
|
|
225
224
|
|
|
226
|
-
`transition({ when })` gates the hold per request. The predicate runs
|
|
225
|
+
`transition({ when })` gates the hold per request. The predicate runs server-side and outside any cache scope; return `false` to drop this segment's transition for the request (the navigation streams its `loading()` fallback instead of holding).
|
|
227
226
|
|
|
228
|
-
|
|
227
|
+
Timing follows the route's rendering contract:
|
|
228
|
+
|
|
229
|
+
- On an ordinary route it runs after the route handler during fresh resolution, so `get()` can read handler- and middleware-set context. Cache/prerender hits replay the stored decision.
|
|
230
|
+
- On a `ppr` route it is automatically hoisted before route handlers and runs on every match, including runtime-cache, prerender, document-shell, and partial-navigation replay. It can read URL/params/action metadata, `env`, and middleware-set context, but not values set by route handlers. This is what keeps the handler-free PPR fast path available without a second API.
|
|
231
|
+
|
|
232
|
+
Its context mirrors the `revalidate()` predicate args — the same navigation/action metadata — plus `get`/`env` for request-context reads:
|
|
229
233
|
|
|
230
234
|
```ts
|
|
231
235
|
import type { TransitionWhenContext } from "@rangojs/router";
|
|
232
236
|
|
|
233
|
-
//
|
|
237
|
+
// Ordinary route: hold only when the handler marked this request:
|
|
234
238
|
transition({ when: (ctx) => ctx.get(KeepScroll) === true });
|
|
235
239
|
|
|
236
240
|
// Hold only when arriving from a specific page (the navigation SOURCE):
|
|
@@ -252,13 +256,13 @@ transition({
|
|
|
252
256
|
| `toRouteName` (and `fromRouteName`) | route **name** | when the route is named (undefined for unnamed/auto-generated) |
|
|
253
257
|
| `actionId` / `actionUrl` / `actionResult` / `formData` | the server action that triggered this render | action-triggered renders only |
|
|
254
258
|
| `method` | `"GET"` (nav) / `"POST"` (action) | always |
|
|
255
|
-
| `get` / `env` | read
|
|
259
|
+
| `get` / `env` | read request vars + app env | always; PPR timing exposes middleware vars, not handler writes |
|
|
256
260
|
|
|
257
261
|
A predicate that throws is reported to `router.onError` (phase `"rendering"`) and treated as no-hold (conservative).
|
|
258
262
|
|
|
259
263
|
**Same-route content-holds need the transition present on the FIRST render.** The same-route hold works by giving the route a param-agnostic key so a param change reconciles instead of remounting — but that key is established when the route first mounts. A source gate that returns `false` on the initial full load (where `currentUrl`/`currentParams`/`fromRouteName` are undefined) drops the transition before the route mounts, so the route mounts _outside_ a transition scope and **every** later same-route param nav remounts (flashing the skeleton) regardless of what the gate decides on those navs. Write source gates so they hold when there is no source — e.g. `({ currentParams }) => currentParams?.tab !== "raw"` (true on the initial load) rather than `=== "details"` (false on the initial load) — when the same-route content-hold must engage. This only affects same-route param navigations; action-only or cross-route gating is unaffected (no shared param key is in play).
|
|
260
264
|
|
|
261
|
-
**Prefetch / cache caveat.**
|
|
265
|
+
**Prefetch / cache caveat.** A **prefetched** navigation still decides at prefetch time — `currentUrl`/`currentParams`/`fromRouteName` reflect the page the prefetch fired from, not necessarily the click-time source. Non-PPR `cache()`/prerender hits also replay the stored transition without rerunning the predicate. PPR routes rerun it on the server for each cache/prerender/PPR match, but a completed browser prefetch still carries its earlier Flight decision. If the exact click-time source matters, source-scope the prefetch (`<Link prefetchKey=":source">`).
|
|
262
266
|
|
|
263
267
|
## Opting out of the router boundary (place your own `<ViewTransition>`)
|
|
264
268
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Router-wide default Link prefetch strategy (client seat).
|
|
3
|
+
*
|
|
4
|
+
* The server resolves `createRouter({ defaultPrefetch })` once at router init
|
|
5
|
+
* (router/prefetch-default.ts) and ships it in initial payload metadata; the
|
|
6
|
+
* browser entry applies it here before hydration — same lifecycle as
|
|
7
|
+
* `initPrefetchCache` / `setPrefetchConcurrency`. Every `<Link>` without an
|
|
8
|
+
* explicit `prefetch` prop reads the value at render time.
|
|
9
|
+
*
|
|
10
|
+
* The module initial value must equal the server resolver's environment default:
|
|
11
|
+
* `"none"` in development and `"viewport"` in production. During SSR this
|
|
12
|
+
* module is never initialized from metadata, so keeping both seats aligned also
|
|
13
|
+
* gives metadata-less payloads the documented behavior.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type { PrefetchStrategy } from "../../router/prefetch-default.js";
|
|
17
|
+
|
|
18
|
+
// Mirrors DEFAULT_PREFETCH_STRATEGY without pulling router-layer code into the
|
|
19
|
+
// client bundle. NODE_ENV is folded by the app build.
|
|
20
|
+
let defaultStrategy: PrefetchStrategy =
|
|
21
|
+
process.env.NODE_ENV === "production" ? "viewport" : "none";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Apply the server-resolved default strategy. Called once at browser app init
|
|
25
|
+
* from payload metadata; also used by tests to reset state.
|
|
26
|
+
*/
|
|
27
|
+
export function setDefaultPrefetchStrategy(strategy: PrefetchStrategy): void {
|
|
28
|
+
defaultStrategy = strategy;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Current default strategy for Links without an explicit `prefetch` prop. */
|
|
32
|
+
export function getDefaultPrefetchStrategy(): PrefetchStrategy {
|
|
33
|
+
return defaultStrategy;
|
|
34
|
+
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { RscPayload } from "../types.js";
|
|
2
|
+
import {
|
|
3
|
+
observeForPrefetch as observeElementForPrefetch,
|
|
4
|
+
unobserveForPrefetch,
|
|
5
|
+
} from "./observer.js";
|
|
2
6
|
|
|
3
7
|
type PrefetchDecoder = (response: Promise<Response>) => Promise<RscPayload>;
|
|
4
8
|
|
|
@@ -83,19 +87,9 @@ export function observeForPrefetch(
|
|
|
83
87
|
callback: () => void,
|
|
84
88
|
): () => void {
|
|
85
89
|
if (typeof IntersectionObserver === "undefined") return () => {};
|
|
86
|
-
|
|
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
|
package/src/cache/cache-scope.ts
CHANGED
|
@@ -108,6 +108,8 @@ function getDefaultRouteCacheKey(
|
|
|
108
108
|
// CacheScope
|
|
109
109
|
// ============================================================================
|
|
110
110
|
|
|
111
|
+
const CACHE_HIT_OBSERVERS = new WeakMap<CacheScope, () => void>();
|
|
112
|
+
|
|
111
113
|
/**
|
|
112
114
|
* CacheScope represents a cache boundary in the route tree.
|
|
113
115
|
*
|
|
@@ -348,6 +350,7 @@ export class CacheScope {
|
|
|
348
350
|
);
|
|
349
351
|
}
|
|
350
352
|
|
|
353
|
+
CACHE_HIT_OBSERVERS.get(this)?.();
|
|
351
354
|
return { segments, shouldRevalidate };
|
|
352
355
|
} catch (error) {
|
|
353
356
|
// Covers a store.get() failure AND a throwing consumer key()/keyGenerator
|
|
@@ -555,9 +558,11 @@ export function resolveShellImplicitCacheScope(
|
|
|
555
558
|
if (scope) return scope;
|
|
556
559
|
const marker = getRequestContext()?._shellImplicitCache;
|
|
557
560
|
if (!marker) return null;
|
|
558
|
-
|
|
561
|
+
const implicitScope = new CacheScope(
|
|
559
562
|
{ ttl: marker.ttl, swr: marker.swr, store: marker.store },
|
|
560
563
|
null,
|
|
561
564
|
marker.keyPrefix,
|
|
562
565
|
);
|
|
566
|
+
if (marker.onHit) CACHE_HIT_OBSERVERS.set(implicitScope, marker.onHit);
|
|
567
|
+
return implicitScope;
|
|
563
568
|
}
|
|
@@ -295,6 +295,8 @@ interface KVShellEnvelope {
|
|
|
295
295
|
lh?: boolean;
|
|
296
296
|
/** ShellCacheEntry.transitionWhen; conditional transitions must re-run. */
|
|
297
297
|
tw?: true;
|
|
298
|
+
/** ShellCacheEntry.navigationOnly; its partial-context prelude is not document-safe. */
|
|
299
|
+
no?: true;
|
|
298
300
|
}
|
|
299
301
|
|
|
300
302
|
/**
|
|
@@ -1819,6 +1821,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1819
1821
|
snapshot: envelope.sn,
|
|
1820
1822
|
handlerLiveHoles: envelope.lh,
|
|
1821
1823
|
transitionWhen: envelope.tw,
|
|
1824
|
+
navigationOnly: envelope.no,
|
|
1822
1825
|
createdAt: envelope.c,
|
|
1823
1826
|
},
|
|
1824
1827
|
shouldRevalidate,
|
|
@@ -1907,6 +1910,7 @@ export class CFCacheStore<TEnv = unknown> implements SegmentCacheStore<TEnv> {
|
|
|
1907
1910
|
sn: entry.snapshot,
|
|
1908
1911
|
lh: entry.handlerLiveHoles,
|
|
1909
1912
|
tw: entry.transitionWhen,
|
|
1913
|
+
no: entry.navigationOnly,
|
|
1910
1914
|
};
|
|
1911
1915
|
await this.kv!.put(kvKey, JSON.stringify(envelope), {
|
|
1912
1916
|
expirationTtl: retentionTtl,
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Document-Level Cache Middleware
|
|
3
3
|
*
|
|
4
|
-
* Caches full HTTP responses
|
|
4
|
+
* Caches full HTTP responses in the configured app store based on Cache-Control
|
|
5
|
+
* headers. A deployment CDN may independently consume the same shared-cache
|
|
6
|
+
* directives; this middleware itself runs inside the worker/function.
|
|
5
7
|
* Routes opt-in to caching by setting s-maxage or stale-while-revalidate headers.
|
|
6
8
|
*
|
|
7
9
|
* Flow:
|
|
@@ -58,7 +60,7 @@ function parseCacheControl(header: string | null): CacheDirectives | null {
|
|
|
58
60
|
|
|
59
61
|
// RFC 7234: in a SHARED cache, `private` and `no-store` forbid storage and
|
|
60
62
|
// MUST win over `s-maxage` even though `private, s-maxage` is contradictory.
|
|
61
|
-
// The document cache is a shared
|
|
63
|
+
// The document cache is a shared app store, so refuse both regardless of any
|
|
62
64
|
// s-maxage / stale-while-revalidate also present. Match standalone directive
|
|
63
65
|
// tokens (start/end, whitespace, comma, semicolon, or `=` bounded), not a
|
|
64
66
|
// substring, so a value containing "private" cannot false-veto.
|
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
|
|
@@ -319,9 +325,10 @@ export interface ShellCacheEntry {
|
|
|
319
325
|
*/
|
|
320
326
|
handlerLiveHoles?: boolean;
|
|
321
327
|
/**
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
328
|
+
* Legacy/fallback marker for a transition({ when }) predicate that was not
|
|
329
|
+
* evaluated by the PPR pre-handler gate. Such an entry stays conservatively
|
|
330
|
+
* ineligible for handler-free replay. New PPR matches evaluate known segment
|
|
331
|
+
* predicates before the pipeline and do not set this marker.
|
|
325
332
|
*/
|
|
326
333
|
transitionWhen?: true;
|
|
327
334
|
/** Capture-generation start time; tag invalidations at or after it win. */
|
|
@@ -211,6 +211,8 @@ interface VercelShellEnvelope {
|
|
|
211
211
|
lh?: boolean;
|
|
212
212
|
/** ShellCacheEntry.transitionWhen; conditional transitions must re-run. */
|
|
213
213
|
tw?: true;
|
|
214
|
+
/** ShellCacheEntry.navigationOnly; its partial-context prelude is not document-safe. */
|
|
215
|
+
no?: true;
|
|
214
216
|
}
|
|
215
217
|
|
|
216
218
|
/** Read-path outcome for the debug sink. */
|
|
@@ -816,6 +818,7 @@ export class VercelCacheStore<
|
|
|
816
818
|
snapshot: env.sn,
|
|
817
819
|
handlerLiveHoles: env.lh,
|
|
818
820
|
transitionWhen: env.tw,
|
|
821
|
+
navigationOnly: env.no,
|
|
819
822
|
createdAt: env.c,
|
|
820
823
|
},
|
|
821
824
|
shouldRevalidate,
|
|
@@ -865,6 +868,7 @@ export class VercelCacheStore<
|
|
|
865
868
|
sn: entry.snapshot,
|
|
866
869
|
lh: entry.handlerLiveHoles,
|
|
867
870
|
tw: entry.transitionWhen,
|
|
871
|
+
no: entry.navigationOnly,
|
|
868
872
|
};
|
|
869
873
|
// write() enforces the 2 MB per-item ceiling (withinSizeLimit): an
|
|
870
874
|
// oversized shell prelude is reported and skipped (fail-open to a full
|
|
@@ -1192,7 +1196,7 @@ export class VercelCacheStore<
|
|
|
1192
1196
|
|
|
1193
1197
|
private asShellEnvelope(raw: unknown): VercelShellEnvelope | null {
|
|
1194
1198
|
if (!isRecord(raw)) return null;
|
|
1195
|
-
const { p, po, rv, bv, c, s, e, t, i, sn, lh, tw } = raw;
|
|
1199
|
+
const { p, po, rv, bv, c, s, e, t, i, sn, lh, tw, no } = raw;
|
|
1196
1200
|
if (typeof p !== "string" || typeof rv !== "string") return null;
|
|
1197
1201
|
if (po !== null && typeof po !== "string") return null;
|
|
1198
1202
|
if (typeof c !== "number") return null;
|
|
@@ -1210,6 +1214,7 @@ export class VercelCacheStore<
|
|
|
1210
1214
|
sn: Array.isArray(sn) ? (sn as ShellSnapshotRecord[]) : undefined,
|
|
1211
1215
|
lh: lh === true ? true : undefined,
|
|
1212
1216
|
tw: tw === true ? true : undefined,
|
|
1217
|
+
no: no === true ? true : undefined,
|
|
1213
1218
|
};
|
|
1214
1219
|
}
|
|
1215
1220
|
|
|
@@ -460,11 +460,11 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
460
460
|
* startTransition only when the router sets viewTransition: false.
|
|
461
461
|
*
|
|
462
462
|
* Conditional hold: pass `when: (ctx) => boolean` to gate the transition per
|
|
463
|
-
* request. It runs server-side
|
|
464
|
-
*
|
|
465
|
-
*
|
|
466
|
-
*
|
|
467
|
-
*
|
|
463
|
+
* request. It normally runs server-side after the route handler. On a `ppr`
|
|
464
|
+
* route it is automatically hoisted before route handlers and reevaluated on
|
|
465
|
+
* every replay, so it may read URL/params/action/env and middleware-set context
|
|
466
|
+
* but not handler-set context. Returning false drops this transition for the
|
|
467
|
+
* request. This is distinct from intercept()'s match-time `when` selector.
|
|
468
468
|
*
|
|
469
469
|
* ```typescript
|
|
470
470
|
* // Attach to a single route
|
|
@@ -491,7 +491,7 @@ export type RouteHelpers<T extends RouteDefinition, TEnv> = {
|
|
|
491
491
|
* @param config - ViewTransition configuration (enter, exit, update, share,
|
|
492
492
|
* default, name), `viewTransition: "auto" | false` to toggle the router
|
|
493
493
|
* boundary (createRouter({ viewTransition }) sets the app-wide default), and
|
|
494
|
-
* `when: (ctx) => boolean` to gate the transition per request
|
|
494
|
+
* `when: (ctx) => boolean` to gate the transition per request
|
|
495
495
|
* @param children - Optional callback returning child routes to wrap
|
|
496
496
|
*/
|
|
497
497
|
transition: {
|