@rangojs/router 0.0.0-experimental.f2d1a2f1 → 0.0.0-experimental.f4a8e8de
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/AGENTS.md +8 -4
- package/README.md +318 -821
- package/dist/bin/rango.js +925 -271
- package/dist/testing/vitest.js +82 -0
- package/dist/types/__internal.d.ts +127 -0
- package/dist/types/bin/rango.d.ts +1 -0
- package/dist/types/browser/action-coordinator.d.ts +57 -0
- package/dist/types/browser/action-fence.d.ts +33 -0
- package/dist/types/browser/app-shell.d.ts +34 -0
- package/dist/types/browser/app-version.d.ts +6 -0
- package/dist/types/browser/connection-warmup.d.ts +31 -0
- package/dist/types/browser/cookie-name.d.ts +66 -0
- package/dist/types/browser/dev-discovery.d.ts +11 -0
- package/dist/types/browser/event-controller.d.ts +231 -0
- package/dist/types/browser/history-state.d.ts +26 -0
- package/dist/types/browser/index.d.ts +1 -0
- package/dist/types/browser/intercept-utils.d.ts +30 -0
- package/dist/types/browser/invalidate-client-cache.d.ts +17 -0
- package/dist/types/browser/link-interceptor.d.ts +53 -0
- package/dist/types/browser/logging.d.ts +33 -0
- package/dist/types/browser/merge-segment-loaders.d.ts +38 -0
- package/dist/types/browser/navigation-bridge.d.ts +39 -0
- package/dist/types/browser/navigation-client.d.ts +17 -0
- package/dist/types/browser/navigation-store-handle.d.ts +25 -0
- package/dist/types/browser/navigation-store.d.ts +85 -0
- package/dist/types/browser/navigation-transaction.d.ts +75 -0
- package/dist/types/browser/network-error-handler.d.ts +35 -0
- package/dist/types/browser/notify-listeners.d.ts +2 -0
- package/dist/types/browser/partial-update.d.ts +61 -0
- package/dist/types/browser/prefetch/cache.d.ts +224 -0
- package/dist/types/browser/prefetch/default-strategy.d.ts +31 -0
- package/dist/types/browser/prefetch/fetch.d.ts +52 -0
- package/dist/types/browser/prefetch/invalidation.d.ts +6 -0
- package/dist/types/browser/prefetch/loader.d.ts +12 -0
- package/dist/types/browser/prefetch/observer.d.ts +24 -0
- package/dist/types/browser/prefetch/policy.d.ts +13 -0
- package/dist/types/browser/prefetch/queue.d.ts +48 -0
- package/dist/types/browser/prefetch/resource-ready.d.ts +28 -0
- package/dist/types/browser/prefetch/runtime.d.ts +2 -0
- package/dist/types/browser/rango-state.d.ts +56 -0
- package/dist/types/browser/react/Link.d.ts +132 -0
- package/dist/types/browser/react/NavigationProvider.d.ts +88 -0
- package/dist/types/browser/react/ScrollRestoration.d.ts +78 -0
- package/dist/types/browser/react/context.d.ts +57 -0
- package/dist/types/browser/react/filter-segment-order.d.ts +35 -0
- package/dist/types/browser/react/index.d.ts +1 -0
- package/dist/types/browser/react/location-state-shared.d.ts +162 -0
- package/dist/types/browser/react/location-state.d.ts +29 -0
- package/dist/types/browser/react/mount-context.d.ts +23 -0
- package/dist/types/browser/react/nonce-context.d.ts +14 -0
- package/dist/types/browser/react/shallow-equal.d.ts +5 -0
- package/dist/types/browser/react/use-action.d.ts +61 -0
- package/dist/types/browser/react/use-handle.d.ts +21 -0
- package/dist/types/browser/react/use-href.d.ts +32 -0
- package/dist/types/browser/react/use-link-status.d.ts +36 -0
- package/dist/types/browser/react/use-mount.d.ts +24 -0
- package/dist/types/browser/react/use-navigation.d.ts +15 -0
- package/dist/types/browser/react/use-params.d.ts +21 -0
- package/dist/types/browser/react/use-pathname.d.ts +13 -0
- package/dist/types/browser/react/use-reverse.d.ts +40 -0
- package/dist/types/browser/react/use-router.d.ts +23 -0
- package/dist/types/browser/react/use-search-params.d.ts +19 -0
- package/dist/types/browser/react/use-segments.d.ts +29 -0
- package/dist/types/browser/response-adapter.d.ts +58 -0
- package/dist/types/browser/rsc-router.d.ts +146 -0
- package/dist/types/browser/scroll-restoration.d.ts +103 -0
- package/dist/types/browser/segment-reconciler.d.ts +74 -0
- package/dist/types/browser/segment-structure-assert.d.ts +16 -0
- package/dist/types/browser/server-action-bridge.d.ts +29 -0
- package/dist/types/browser/types.d.ts +546 -0
- package/dist/types/browser/validate-redirect-origin.d.ts +28 -0
- package/dist/types/build/collect-fallback-refs.d.ts +5 -0
- package/dist/types/build/generate-manifest.d.ts +106 -0
- package/dist/types/build/generate-route-types.d.ts +8 -0
- package/dist/types/build/index.d.ts +21 -0
- package/dist/types/build/merge-full-manifests.d.ts +3 -0
- package/dist/types/build/prefix-tree-utils.d.ts +56 -0
- package/dist/types/build/route-trie.d.ts +20 -0
- package/dist/types/build/route-types/ast-helpers.d.ts +3 -0
- package/dist/types/build/route-types/ast-route-extraction.d.ts +13 -0
- package/dist/types/build/route-types/codegen.d.ts +16 -0
- package/dist/types/build/route-types/include-resolution.d.ts +74 -0
- package/dist/types/build/route-types/param-extraction.d.ts +13 -0
- package/dist/types/build/route-types/per-module-writer.d.ts +20 -0
- package/dist/types/build/route-types/router-processing.d.ts +81 -0
- package/dist/types/build/route-types/scan-filter.d.ts +17 -0
- package/dist/types/build/route-types/source-scan.d.ts +13 -0
- package/dist/types/build/runtime-discovery.d.ts +24 -0
- package/dist/types/cache/background-task.d.ts +21 -0
- package/dist/types/cache/cache-error.d.ts +71 -0
- package/dist/types/cache/cache-exec-scope.d.ts +31 -0
- package/dist/types/cache/cache-key-utils.d.ts +43 -0
- package/dist/types/cache/cache-policy.d.ts +59 -0
- package/dist/types/cache/cache-runtime.d.ts +51 -0
- package/dist/types/cache/cache-scope.d.ts +215 -0
- package/dist/types/cache/cache-tag.d.ts +79 -0
- package/dist/types/cache/cf/cf-base64.d.ts +4 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +112 -0
- package/dist/types/cache/cf/cf-cache-store.d.ts +616 -0
- package/dist/types/cache/cf/cf-cache-types.d.ts +365 -0
- package/dist/types/cache/cf/cf-kv-utils.d.ts +43 -0
- package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +15 -0
- package/dist/types/cache/cf/cf-zone-purge.d.ts +31 -0
- package/dist/types/cache/cf/index.d.ts +4 -0
- package/dist/types/cache/document-cache.d.ts +71 -0
- package/dist/types/cache/handle-capture.d.ts +23 -0
- package/dist/types/cache/handle-snapshot.d.ts +39 -0
- package/dist/types/cache/index.d.ts +9 -0
- package/dist/types/cache/memory-segment-store.d.ts +163 -0
- package/dist/types/cache/profile-registry.d.ts +40 -0
- package/dist/types/cache/read-through-swr.d.ts +61 -0
- package/dist/types/cache/search-params-filter.d.ts +64 -0
- package/dist/types/cache/segment-codec.d.ts +78 -0
- package/dist/types/cache/shell-snapshot.d.ts +186 -0
- package/dist/types/cache/tag-invalidation.d.ts +74 -0
- package/dist/types/cache/taint.d.ts +77 -0
- package/dist/types/cache/types.d.ts +503 -0
- package/dist/types/cache/vercel/index.d.ts +1 -0
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +268 -0
- package/dist/types/client-urls/client-root.d.ts +38 -0
- package/dist/types/client-urls/client-urls.d.ts +5 -0
- package/dist/types/client-urls/navigation.d.ts +38 -0
- package/dist/types/client-urls/revalidation-protocol.d.ts +25 -0
- package/dist/types/client-urls/server-projection.d.ts +57 -0
- package/dist/types/client-urls/types.d.ts +132 -0
- package/dist/types/client.d.ts +191 -0
- package/dist/types/client.rsc.d.ts +41 -0
- package/dist/types/cloudflare/index.d.ts +7 -0
- package/dist/types/cloudflare/tracing.d.ts +57 -0
- package/dist/types/component-utils.d.ts +46 -0
- package/dist/types/components/DefaultDocument.d.ts +13 -0
- package/dist/types/context-var.d.ts +84 -0
- package/dist/types/debug.d.ts +57 -0
- package/dist/types/decode-loader-results.d.ts +42 -0
- package/dist/types/default-error-boundary.d.ts +10 -0
- package/dist/types/defer.d.ts +89 -0
- package/dist/types/deps/browser.d.ts +1 -0
- package/dist/types/deps/html-stream-client.d.ts +1 -0
- package/dist/types/deps/html-stream-server.d.ts +1 -0
- package/dist/types/deps/rsc.d.ts +1 -0
- package/dist/types/deps/ssr.d.ts +1 -0
- package/dist/types/dev-discovery-protocol.d.ts +5 -0
- package/dist/types/encode-kv.d.ts +35 -0
- package/dist/types/errors.d.ts +227 -0
- package/dist/types/escape-script.d.ts +44 -0
- package/dist/types/handle.d.ts +93 -0
- package/dist/types/handles/MetaTags.d.ts +17 -0
- package/dist/types/handles/Scripts.d.ts +38 -0
- package/dist/types/handles/breadcrumbs.d.ts +43 -0
- package/dist/types/handles/deferred-resolution.d.ts +53 -0
- package/dist/types/handles/is-thenable.d.ts +10 -0
- package/dist/types/handles/meta.d.ts +43 -0
- package/dist/types/handles/script.d.ts +139 -0
- package/dist/types/host/cookie-handler.d.ts +8 -0
- package/dist/types/host/errors.d.ts +40 -0
- package/dist/types/host/index.d.ts +33 -0
- package/dist/types/host/pattern-matcher.d.ts +30 -0
- package/dist/types/host/router.d.ts +12 -0
- package/dist/types/host/testing.d.ts +41 -0
- package/dist/types/host/types.d.ts +148 -0
- package/dist/types/host/utils.d.ts +20 -0
- package/dist/types/href-client.d.ts +214 -0
- package/dist/types/index.d.ts +113 -0
- package/dist/types/index.rsc.d.ts +52 -0
- package/dist/types/internal-debug.d.ts +1 -0
- package/dist/types/loader-redirect.d.ts +18 -0
- package/dist/types/loader-store.d.ts +193 -0
- package/dist/types/loader.d.ts +18 -0
- package/dist/types/loader.rsc.d.ts +18 -0
- package/dist/types/missing-id-error.d.ts +1 -0
- package/dist/types/outlet-context.d.ts +24 -0
- package/dist/types/outlet-provider.d.ts +14 -0
- package/dist/types/prerender/build-shell-capture.d.ts +104 -0
- package/dist/types/prerender/param-hash.d.ts +6 -0
- package/dist/types/prerender/shell-manifest-key.d.ts +18 -0
- package/dist/types/prerender/store.d.ts +63 -0
- package/dist/types/prerender.d.ts +292 -0
- package/dist/types/redirect-origin.d.ts +67 -0
- package/dist/types/regex-escape.d.ts +6 -0
- package/dist/types/render-error-thrower.d.ts +13 -0
- package/dist/types/response-utils.d.ts +35 -0
- package/dist/types/reverse.d.ts +206 -0
- package/dist/types/root-error-boundary.d.ts +32 -0
- package/dist/types/route-content-wrapper.d.ts +81 -0
- package/dist/types/route-definition/dsl-helpers.d.ts +130 -0
- package/dist/types/route-definition/helper-factories.d.ts +22 -0
- package/dist/types/route-definition/helpers-types.d.ts +393 -0
- package/dist/types/route-definition/index.d.ts +7 -0
- package/dist/types/route-definition/redirect.d.ts +48 -0
- package/dist/types/route-definition/resolve-handler-use.d.ts +19 -0
- package/dist/types/route-definition/use-item-types.d.ts +1 -0
- package/dist/types/route-definition.d.ts +1 -0
- package/dist/types/route-map-builder.d.ts +102 -0
- package/dist/types/route-name.d.ts +27 -0
- package/dist/types/route-types.d.ts +172 -0
- package/dist/types/router/basename.d.ts +10 -0
- package/dist/types/router/content-negotiation.d.ts +91 -0
- package/dist/types/router/debug-manifest.d.ts +7 -0
- package/dist/types/router/error-handling.d.ts +110 -0
- package/dist/types/router/find-match.d.ts +19 -0
- package/dist/types/router/handler-context.d.ts +41 -0
- package/dist/types/router/instrument.d.ts +191 -0
- package/dist/types/router/intercept-resolution.d.ts +91 -0
- package/dist/types/router/lazy-includes.d.ts +26 -0
- package/dist/types/router/loader-resolution.d.ts +85 -0
- package/dist/types/router/logging.d.ts +41 -0
- package/dist/types/router/manifest.d.ts +8 -0
- package/dist/types/router/match-api.d.ts +19 -0
- package/dist/types/router/match-context.d.ts +184 -0
- package/dist/types/router/match-handlers.d.ts +48 -0
- package/dist/types/router/match-middleware/background-revalidation.d.ts +113 -0
- package/dist/types/router/match-middleware/cache-lookup.d.ts +126 -0
- package/dist/types/router/match-middleware/cache-store.d.ts +112 -0
- package/dist/types/router/match-middleware/index.d.ts +80 -0
- package/dist/types/router/match-middleware/intercept-resolution.d.ts +116 -0
- package/dist/types/router/match-middleware/segment-resolution.d.ts +94 -0
- package/dist/types/router/match-pipelines.d.ts +103 -0
- package/dist/types/router/match-result.d.ts +114 -0
- package/dist/types/router/metrics.d.ts +6 -0
- package/dist/types/router/middleware-types.d.ts +74 -0
- package/dist/types/router/middleware.d.ts +116 -0
- package/dist/types/router/navigation-snapshot.d.ts +51 -0
- package/dist/types/router/params-util.d.ts +8 -0
- package/dist/types/router/parse-pattern.d.ts +38 -0
- package/dist/types/router/pattern-matching.d.ts +169 -0
- package/dist/types/router/prefetch-cache-ttl.d.ts +27 -0
- package/dist/types/router/prefetch-default.d.ts +28 -0
- package/dist/types/router/prefetch-limits.d.ts +20 -0
- package/dist/types/router/prerender-match.d.ts +53 -0
- package/dist/types/router/preview-match.d.ts +22 -0
- package/dist/types/router/request-classification.d.ts +104 -0
- package/dist/types/router/revalidation.d.ts +64 -0
- package/dist/types/router/route-snapshot.d.ts +112 -0
- package/dist/types/router/route-trie-builder.d.ts +77 -0
- package/dist/types/router/router-context.d.ts +137 -0
- package/dist/types/router/router-interfaces.d.ts +461 -0
- package/dist/types/router/router-options.d.ts +792 -0
- package/dist/types/router/router-registry.d.ts +15 -0
- package/dist/types/router/segment-resolution/fresh.d.ts +55 -0
- package/dist/types/router/segment-resolution/helpers.d.ts +93 -0
- package/dist/types/router/segment-resolution/loader-cache.d.ts +33 -0
- package/dist/types/router/segment-resolution/loader-mask.d.ts +44 -0
- package/dist/types/router/segment-resolution/loader-snapshot.d.ts +90 -0
- package/dist/types/router/segment-resolution/mask-nested.d.ts +53 -0
- package/dist/types/router/segment-resolution/revalidation.d.ts +85 -0
- package/dist/types/router/segment-resolution/static-store.d.ts +17 -0
- package/dist/types/router/segment-resolution/streamed-handler-telemetry.d.ts +16 -0
- package/dist/types/router/segment-resolution/view-transition-default.d.ts +27 -0
- package/dist/types/router/segment-resolution.d.ts +3 -0
- package/dist/types/router/segment-wrappers.d.ts +53 -0
- package/dist/types/router/state-cookie-name.d.ts +1 -0
- package/dist/types/router/substitute-pattern-params.d.ts +23 -0
- package/dist/types/router/telemetry-otel.d.ts +113 -0
- package/dist/types/router/telemetry.d.ts +216 -0
- package/dist/types/router/timeout.d.ts +107 -0
- package/dist/types/router/tracing.d.ts +139 -0
- package/dist/types/router/transition-when.d.ts +13 -0
- package/dist/types/router/trie-matching.d.ts +32 -0
- package/dist/types/router/types.d.ts +98 -0
- package/dist/types/router/url-params.d.ts +26 -0
- package/dist/types/router.d.ts +7 -0
- package/dist/types/rsc/capture-queue.d.ts +49 -0
- package/dist/types/rsc/full-payload.d.ts +22 -0
- package/dist/types/rsc/handler-context.d.ts +32 -0
- package/dist/types/rsc/handler.d.ts +9 -0
- package/dist/types/rsc/helpers.d.ts +127 -0
- package/dist/types/rsc/index.d.ts +17 -0
- package/dist/types/rsc/json-route-result.d.ts +20 -0
- package/dist/types/rsc/loader-fetch.d.ts +14 -0
- package/dist/types/rsc/manifest-init.d.ts +18 -0
- package/dist/types/rsc/nonce.d.ts +28 -0
- package/dist/types/rsc/origin-guard.d.ts +50 -0
- package/dist/types/rsc/progressive-enhancement.d.ts +19 -0
- package/dist/types/rsc/redirect-guard.d.ts +37 -0
- package/dist/types/rsc/render-pipeline.d.ts +148 -0
- package/dist/types/rsc/response-cache-serve.d.ts +46 -0
- package/dist/types/rsc/response-error.d.ts +19 -0
- package/dist/types/rsc/response-route-handler.d.ts +29 -0
- package/dist/types/rsc/routine-plan.d.ts +124 -0
- package/dist/types/rsc/rsc-rendering.d.ts +18 -0
- package/dist/types/rsc/runtime-warnings.d.ts +22 -0
- package/dist/types/rsc/server-action.d.ts +68 -0
- package/dist/types/rsc/shell-build-manifest.d.ts +90 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +44 -0
- package/dist/types/rsc/shell-capture.d.ts +406 -0
- package/dist/types/rsc/shell-serve.d.ts +189 -0
- package/dist/types/rsc/ssr-setup.d.ts +73 -0
- package/dist/types/rsc/stream-idle.d.ts +60 -0
- package/dist/types/rsc/transition-gate.d.ts +23 -0
- package/dist/types/rsc/types.d.ts +328 -0
- package/dist/types/runtime-env.d.ts +1 -0
- package/dist/types/search-params.d.ts +125 -0
- package/dist/types/segment-content-promise.d.ts +13 -0
- package/dist/types/segment-fragments.d.ts +79 -0
- package/dist/types/segment-loader-promise.d.ts +22 -0
- package/dist/types/segment-system.d.ts +86 -0
- package/dist/types/serialize.d.ts +164 -0
- package/dist/types/server/context.d.ts +510 -0
- package/dist/types/server/cookie-parse.d.ts +10 -0
- package/dist/types/server/cookie-store.d.ts +107 -0
- package/dist/types/server/fetchable-loader-store.d.ts +20 -0
- package/dist/types/server/handle-store.d.ts +131 -0
- package/dist/types/server/loader-registry.d.ts +32 -0
- package/dist/types/server/request-context.d.ts +707 -0
- package/dist/types/server/root-layout.d.ts +3 -0
- package/dist/types/server.d.ts +16 -0
- package/dist/types/ssr/index.d.ts +233 -0
- package/dist/types/ssr/inject-rsc-eager.d.ts +3 -0
- package/dist/types/ssr/preinit-client-references.d.ts +71 -0
- package/dist/types/ssr/ssr-root.d.ts +69 -0
- package/dist/types/static-handler.d.ts +71 -0
- package/dist/types/testing/cache-status.d.ts +63 -0
- package/dist/types/testing/collect-handle.d.ts +20 -0
- package/dist/types/testing/dispatch.d.ts +127 -0
- package/dist/types/testing/dom.entry.d.ts +15 -0
- package/dist/types/testing/e2e/fixture.d.ts +37 -0
- package/dist/types/testing/e2e/index.d.ts +31 -0
- package/dist/types/testing/e2e/matchers.d.ts +17 -0
- package/dist/types/testing/e2e/page-helpers.d.ts +86 -0
- package/dist/types/testing/e2e/parity.d.ts +111 -0
- package/dist/types/testing/e2e/server.d.ts +35 -0
- package/dist/types/testing/flight-matchers.d.ts +55 -0
- package/dist/types/testing/flight-normalize.d.ts +1 -0
- package/dist/types/testing/flight-tree.d.ts +192 -0
- package/dist/types/testing/flight.d.ts +115 -0
- package/dist/types/testing/flight.entry.d.ts +27 -0
- package/dist/types/testing/generated-routes.d.ts +66 -0
- package/dist/types/testing/index.d.ts +54 -0
- package/dist/types/testing/internal/context.d.ts +225 -0
- package/dist/types/testing/internal/flight-client-globals.d.ts +1 -0
- package/dist/types/testing/internal/seed-vars.d.ts +30 -0
- package/dist/types/testing/render-handler.d.ts +160 -0
- package/dist/types/testing/render-route.d.ts +265 -0
- package/dist/types/testing/run-loader.d.ts +195 -0
- package/dist/types/testing/run-middleware.d.ts +132 -0
- package/dist/types/testing/run-transition-when.d.ts +78 -0
- package/dist/types/testing/shell-status.d.ts +81 -0
- package/dist/types/testing/vitest-stubs/cloudflare-email.d.ts +6 -0
- package/dist/types/testing/vitest-stubs/cloudflare-workers.d.ts +13 -0
- package/dist/types/testing/vitest-stubs/plugin-rsc.d.ts +7 -0
- package/dist/types/testing/vitest-stubs/version.d.ts +1 -0
- package/dist/types/testing/vitest.d.ts +205 -0
- package/dist/types/theme/ThemeProvider.d.ts +13 -0
- package/dist/types/theme/ThemeScript.d.ts +45 -0
- package/dist/types/theme/constants.d.ts +39 -0
- package/dist/types/theme/index.d.ts +29 -0
- package/dist/types/theme/theme-context.d.ts +21 -0
- package/dist/types/theme/theme-script.d.ts +26 -0
- package/dist/types/theme/types.d.ts +162 -0
- package/dist/types/theme/use-theme.d.ts +8 -0
- package/dist/types/types/boundaries.d.ts +110 -0
- package/dist/types/types/cache-types.d.ts +191 -0
- package/dist/types/types/error-types.d.ts +114 -0
- package/dist/types/types/global-namespace.d.ts +90 -0
- package/dist/types/types/handler-context.d.ts +658 -0
- package/dist/types/types/index.d.ts +11 -0
- package/dist/types/types/loader-types.d.ts +208 -0
- package/dist/types/types/request-scope.d.ts +93 -0
- package/dist/types/types/route-config.d.ts +105 -0
- package/dist/types/types/route-entry.d.ts +98 -0
- package/dist/types/types/segments.d.ts +246 -0
- package/dist/types/types.d.ts +1 -0
- package/dist/types/urls/include-helper.d.ts +17 -0
- package/dist/types/urls/include-provider.d.ts +27 -0
- package/dist/types/urls/index.d.ts +6 -0
- package/dist/types/urls/path-helper-types.d.ts +198 -0
- package/dist/types/urls/path-helper.d.ts +12 -0
- package/dist/types/urls/pattern-types.d.ts +166 -0
- package/dist/types/urls/response-types.d.ts +67 -0
- package/dist/types/urls/type-extraction.d.ts +157 -0
- package/dist/types/urls/urls-function.d.ts +24 -0
- package/dist/types/urls.d.ts +1 -0
- package/dist/types/use-loader.d.ts +150 -0
- package/dist/types/vercel/index.d.ts +10 -0
- package/dist/types/vercel/tracing.d.ts +71 -0
- package/dist/types/vite/debug.d.ts +80 -0
- package/dist/types/vite/discovery/bundle-postprocess.d.ts +12 -0
- package/dist/types/vite/discovery/client-urls-projection.d.ts +53 -0
- package/dist/types/vite/discovery/dev-prerender-cache.d.ts +65 -0
- package/dist/types/vite/discovery/discover-routers.d.ts +17 -0
- package/dist/types/vite/discovery/discovery-errors.d.ts +113 -0
- package/dist/types/vite/discovery/gate-state.d.ts +79 -0
- package/dist/types/vite/discovery/prerender-collection.d.ts +24 -0
- package/dist/types/vite/discovery/route-types-writer.d.ts +32 -0
- package/dist/types/vite/discovery/self-gen-tracking.d.ts +22 -0
- package/dist/types/vite/discovery/shell-prerender-phase.d.ts +40 -0
- package/dist/types/vite/discovery/state.d.ts +170 -0
- package/dist/types/vite/discovery/virtual-module-codegen.d.ts +15 -0
- package/dist/types/vite/encryption-key.d.ts +2 -0
- package/dist/types/vite/index.d.ts +11 -0
- package/dist/types/vite/inject-client-debug.d.ts +56 -0
- package/dist/types/vite/plugin-types.d.ts +298 -0
- package/dist/types/vite/plugins/cjs-to-esm.d.ts +6 -0
- package/dist/types/vite/plugins/client-ref-dedup.d.ts +40 -0
- package/dist/types/vite/plugins/client-ref-hashing.d.ts +35 -0
- package/dist/types/vite/plugins/cloudflare-protocol-stub.d.ts +64 -0
- package/dist/types/vite/plugins/expose-action-id.d.ts +18 -0
- package/dist/types/vite/plugins/expose-id-utils.d.ts +37 -0
- package/dist/types/vite/plugins/expose-ids/export-analysis.d.ts +19 -0
- package/dist/types/vite/plugins/expose-ids/handler-transform.d.ts +10 -0
- package/dist/types/vite/plugins/expose-ids/loader-transform.d.ts +8 -0
- package/dist/types/vite/plugins/expose-ids/router-transform.d.ts +13 -0
- package/dist/types/vite/plugins/expose-ids/types.d.ts +29 -0
- package/dist/types/vite/plugins/expose-internal-ids.d.ts +16 -0
- package/dist/types/vite/plugins/performance-tracks.d.ts +25 -0
- package/dist/types/vite/plugins/refresh-cmd.d.ts +20 -0
- package/dist/types/vite/plugins/server-ref-hashing.d.ts +24 -0
- package/dist/types/vite/plugins/server-reference-pattern.d.ts +1 -0
- package/dist/types/vite/plugins/use-cache-transform.d.ts +20 -0
- package/dist/types/vite/plugins/vercel-output.d.ts +85 -0
- package/dist/types/vite/plugins/version-injector.d.ts +21 -0
- package/dist/types/vite/plugins/version-plugin.d.ts +19 -0
- package/dist/types/vite/plugins/virtual-entries.d.ts +36 -0
- package/dist/types/vite/plugins/virtual-stub-plugin.d.ts +7 -0
- package/dist/types/vite/rango.d.ts +29 -0
- package/dist/types/vite/router-discovery.d.ts +23 -0
- package/dist/types/vite/utils/ast-handler-extract.d.ts +64 -0
- package/dist/types/vite/utils/banner.d.ts +2 -0
- package/dist/types/vite/utils/bundle-analysis.d.ts +28 -0
- package/dist/types/vite/utils/client-chunks.d.ts +55 -0
- package/dist/types/vite/utils/directive-prologue.d.ts +16 -0
- package/dist/types/vite/utils/forward-user-plugins.d.ts +37 -0
- package/dist/types/vite/utils/manifest-utils.d.ts +7 -0
- package/dist/types/vite/utils/package-resolution.d.ts +6 -0
- package/dist/types/vite/utils/prerender-utils.d.ts +32 -0
- package/dist/types/vite/utils/shared-utils.d.ts +67 -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 +9695 -3592
- package/package.json +119 -39
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +82 -5
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +232 -34
- package/skills/caching/SKILL.md +375 -19
- package/skills/catalog.json +283 -0
- package/skills/cloudflare/SKILL.md +151 -0
- package/skills/cloudflare/agents/openai.yaml +4 -0
- package/skills/cloudflare/references/d1-and-local-dev.md +131 -0
- package/skills/cloudflare/references/streaming-and-deploy.md +107 -0
- package/skills/cloudflare/references/webhooks-and-crypto.md +147 -0
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +844 -0
- package/skills/composability/SKILL.md +124 -4
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +5 -11
- package/skills/defer-hydration/SKILL.md +235 -0
- package/skills/deployment-caching/SKILL.md +176 -0
- package/skills/document-cache/SKILL.md +116 -58
- package/skills/fonts/SKILL.md +1 -1
- package/skills/handler-use/SKILL.md +12 -10
- package/skills/hooks/SKILL.md +73 -699
- package/skills/hooks/data.md +273 -0
- package/skills/hooks/handle-and-actions.md +103 -0
- package/skills/hooks/navigation.md +110 -0
- package/skills/hooks/outlets.md +62 -0
- package/skills/hooks/state.md +228 -0
- package/skills/hooks/urls.md +135 -0
- package/skills/host-router/SKILL.md +129 -27
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +75 -19
- package/skills/layout/SKILL.md +40 -19
- package/skills/links/SKILL.md +211 -17
- package/skills/loader/SKILL.md +230 -25
- package/skills/middleware/SKILL.md +58 -13
- package/skills/migrate-nextjs/SKILL.md +267 -33
- package/skills/migrate-nextjs/backend-host-swap.md +120 -0
- package/skills/migrate-react-router/SKILL.md +59 -671
- package/skills/migrate-react-router/component-migration.md +196 -0
- package/skills/migrate-react-router/data-and-actions.md +225 -0
- package/skills/migrate-react-router/route-mapping.md +271 -0
- package/skills/mime-routes/SKILL.md +55 -18
- package/skills/observability/SKILL.md +231 -0
- package/skills/parallel/SKILL.md +50 -10
- package/skills/ppr/SKILL.md +904 -0
- package/skills/prerender/SKILL.md +130 -68
- package/skills/rango/SKILL.md +321 -26
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +172 -52
- package/skills/route/SKILL.md +123 -9
- package/skills/router-setup/SKILL.md +53 -9
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +776 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +1 -1
- package/skills/tailwind/SKILL.md +28 -4
- package/skills/testing/SKILL.md +131 -0
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +172 -0
- package/skills/testing/client-components.md +131 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +91 -0
- package/skills/testing/handles.md +131 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +122 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +85 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +123 -0
- package/skills/theme/SKILL.md +1 -1
- package/skills/typesafety/SKILL.md +45 -628
- package/skills/typesafety/env-and-bindings.md +254 -0
- package/skills/typesafety/generated-files-and-cli.md +342 -0
- package/skills/typesafety/params-and-search.md +153 -0
- package/skills/typesafety/route-types.md +213 -0
- package/skills/use-cache/SKILL.md +121 -15
- package/skills/vercel/SKILL.md +149 -0
- package/skills/view-transitions/SKILL.md +341 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +0 -65
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +14 -27
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/dev-discovery.ts +66 -0
- package/src/browser/event-controller.ts +400 -168
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +469 -20
- package/src/browser/logging.ts +28 -0
- package/src/browser/merge-segment-loaders.ts +6 -4
- package/src/browser/navigation-bridge.ts +164 -69
- package/src/browser/navigation-client.ts +199 -96
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +165 -345
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/notify-listeners.ts +22 -0
- package/src/browser/partial-update.ts +219 -163
- package/src/browser/prefetch/cache.ts +240 -97
- package/src/browser/prefetch/default-strategy.ts +74 -0
- package/src/browser/prefetch/fetch.ts +317 -51
- package/src/browser/prefetch/invalidation.ts +30 -0
- package/src/browser/prefetch/loader.ts +111 -0
- package/src/browser/prefetch/observer.ts +50 -22
- package/src/browser/prefetch/queue.ts +25 -7
- package/src/browser/prefetch/runtime.ts +6 -0
- package/src/browser/rango-state.ts +177 -114
- package/src/browser/react/Link.tsx +115 -75
- package/src/browser/react/NavigationProvider.tsx +194 -143
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +4 -0
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +17 -14
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +10 -5
- package/src/browser/react/use-params.ts +11 -11
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +21 -6
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +99 -8
- package/src/browser/rsc-router.tsx +230 -42
- package/src/browser/scroll-restoration.ts +37 -22
- package/src/browser/segment-reconciler.ts +31 -21
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +262 -65
- package/src/browser/types.ts +132 -47
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +213 -184
- package/src/build/generate-route-types.ts +3 -1
- package/src/build/index.ts +11 -3
- package/src/build/merge-full-manifests.ts +161 -0
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +43 -280
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +513 -64
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +33 -12
- package/src/build/route-types/router-processing.ts +312 -204
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +32 -29
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-exec-scope.ts +47 -0
- package/src/cache/cache-key-utils.ts +73 -15
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +566 -121
- package/src/cache/cache-scope.ts +383 -105
- package/src/cache/cache-tag.ts +149 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +134 -0
- package/src/cache/cf/cf-cache-store.ts +3028 -391
- package/src/cache/cf/cf-cache-types.ts +417 -0
- package/src/cache/cf/cf-kv-utils.ts +84 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +108 -0
- package/src/cache/cf/cf-zone-purge.ts +101 -0
- package/src/cache/cf/index.ts +11 -16
- package/src/cache/document-cache.ts +184 -53
- package/src/cache/handle-snapshot.ts +92 -1
- package/src/cache/index.ts +32 -20
- package/src/cache/memory-segment-store.ts +286 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +66 -16
- package/src/cache/search-params-filter.ts +118 -0
- package/src/cache/segment-codec.ts +80 -25
- package/src/cache/shell-snapshot.ts +516 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +28 -9
- package/src/cache/types.ts +323 -100
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1264 -0
- package/src/client-urls/client-root.tsx +161 -0
- package/src/client-urls/client-urls.ts +665 -0
- package/src/client-urls/navigation.ts +237 -0
- package/src/client-urls/revalidation-protocol.ts +56 -0
- package/src/client-urls/server-projection.ts +563 -0
- package/src/client-urls/types.ts +178 -0
- package/src/client.rsc.tsx +48 -21
- package/src/client.tsx +77 -67
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +112 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +18 -6
- package/src/decode-loader-results.ts +160 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +4 -2
- package/src/dev-discovery-protocol.ts +11 -0
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +44 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +67 -37
- package/src/handles/MetaTags.tsx +24 -53
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +35 -8
- package/src/handles/deferred-resolution.ts +134 -0
- package/src/handles/is-thenable.ts +16 -0
- package/src/handles/meta.ts +14 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +13 -22
- package/src/host/index.ts +9 -2
- package/src/host/pattern-matcher.ts +23 -52
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +105 -12
- package/src/index.ts +102 -14
- package/src/internal-debug.ts +11 -10
- package/src/loader-redirect.tsx +47 -0
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +12 -0
- package/src/outlet-provider.tsx +16 -6
- package/src/prerender/build-shell-capture.ts +453 -0
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/shell-manifest-key.ts +20 -0
- package/src/prerender/store.ts +47 -38
- package/src/prerender.ts +81 -13
- package/src/redirect-origin.ts +143 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +34 -0
- package/src/reverse.ts +65 -40
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +112 -78
- package/src/route-definition/dsl-helpers.ts +300 -313
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +92 -62
- package/src/route-definition/index.ts +1 -2
- package/src/route-definition/redirect.ts +44 -11
- package/src/route-definition/resolve-handler-use.ts +6 -1
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +102 -74
- package/src/route-types.ts +19 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +120 -30
- package/src/router/error-handling.ts +110 -29
- package/src/router/find-match.ts +129 -30
- package/src/router/handler-context.ts +41 -57
- package/src/router/instrument.ts +401 -0
- package/src/router/intercept-resolution.ts +98 -21
- package/src/router/lazy-includes.ts +82 -58
- package/src/router/loader-resolution.ts +401 -85
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +74 -40
- package/src/router/match-api.ts +91 -55
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +268 -171
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +316 -302
- package/src/router/match-middleware/cache-store.ts +134 -52
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +0 -22
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +76 -79
- package/src/router/metrics.ts +17 -36
- package/src/router/middleware-types.ts +20 -110
- package/src/router/middleware.ts +275 -173
- package/src/router/navigation-snapshot.ts +51 -60
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +134 -154
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-default.ts +59 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +159 -69
- package/src/router/preview-match.ts +6 -2
- package/src/router/request-classification.ts +50 -69
- package/src/router/revalidation.ts +146 -83
- package/src/router/route-snapshot.ts +14 -3
- package/src/router/route-trie-builder.ts +334 -0
- package/src/router/router-context.ts +6 -29
- package/src/router/router-interfaces.ts +168 -38
- package/src/router/router-options.ts +235 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +163 -88
- package/src/router/segment-resolution/helpers.ts +96 -18
- package/src/router/segment-resolution/loader-cache.ts +187 -39
- package/src/router/segment-resolution/loader-mask.ts +60 -0
- package/src/router/segment-resolution/loader-snapshot.ts +259 -0
- package/src/router/segment-resolution/mask-nested.ts +99 -0
- package/src/router/segment-resolution/revalidation.ts +316 -321
- package/src/router/segment-resolution/static-store.ts +55 -15
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +60 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +171 -200
- package/src/router/telemetry.ts +106 -20
- package/src/router/timeout.ts +53 -22
- package/src/router/tracing.ts +235 -0
- package/src/router/transition-when.ts +76 -0
- package/src/router/trie-matching.ts +170 -64
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +13 -5
- package/src/router.ts +248 -77
- package/src/rsc/capture-queue.ts +218 -0
- package/src/rsc/full-payload.ts +77 -0
- package/src/rsc/handler-context.ts +4 -2
- package/src/rsc/handler.ts +562 -284
- package/src/rsc/helpers.ts +179 -9
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +116 -40
- package/src/rsc/manifest-init.ts +55 -56
- package/src/rsc/nonce.ts +10 -1
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +377 -84
- package/src/rsc/redirect-guard.ts +102 -0
- package/src/rsc/render-pipeline.ts +611 -0
- package/src/rsc/response-cache-serve.ts +259 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +73 -212
- package/src/rsc/routine-plan.ts +359 -0
- package/src/rsc/rsc-rendering.ts +1624 -171
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +420 -139
- package/src/rsc/shell-build-manifest.ts +336 -0
- package/src/rsc/shell-capture-constants.ts +45 -0
- package/src/rsc/shell-capture.ts +2063 -0
- package/src/rsc/shell-serve.ts +337 -0
- package/src/rsc/ssr-setup.ts +111 -16
- package/src/rsc/stream-idle.ts +137 -0
- package/src/rsc/transition-gate.ts +86 -0
- package/src/rsc/types.ts +91 -5
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-fragments.ts +165 -0
- package/src/segment-loader-promise.ts +49 -4
- package/src/segment-system.tsx +441 -153
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +416 -55
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +162 -15
- package/src/server/handle-store.ts +190 -70
- package/src/server/loader-registry.ts +33 -42
- package/src/server/request-context.ts +805 -177
- package/src/server.ts +7 -2
- package/src/ssr/index.tsx +631 -183
- package/src/ssr/inject-rsc-eager.ts +167 -0
- package/src/ssr/preinit-client-references.ts +106 -0
- package/src/ssr/ssr-root.tsx +262 -0
- package/src/static-handler.ts +28 -15
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +951 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +147 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +319 -0
- package/src/testing/e2e/parity.ts +400 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +97 -0
- package/src/testing/flight-normalize.ts +11 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +52 -0
- package/src/testing/flight.ts +257 -0
- package/src/testing/generated-routes.ts +199 -0
- package/src/testing/index.ts +121 -0
- package/src/testing/internal/context.ts +380 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +54 -0
- package/src/testing/render-handler.ts +371 -0
- package/src/testing/render-route.tsx +667 -0
- package/src/testing/run-loader.ts +423 -0
- package/src/testing/run-middleware.ts +219 -0
- package/src/testing/run-transition-when.ts +197 -0
- package/src/testing/shell-status.ts +206 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +305 -0
- package/src/theme/ThemeProvider.tsx +56 -84
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +15 -35
- package/src/types/cache-types.ts +13 -4
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +121 -30
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +38 -7
- package/src/types/request-scope.ts +8 -22
- package/src/types/route-config.ts +20 -52
- package/src/types/route-entry.ts +3 -6
- package/src/types/segments.ts +147 -14
- package/src/urls/include-helper.ts +38 -64
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +2 -11
- package/src/urls/path-helper-types.ts +76 -24
- package/src/urls/path-helper.ts +30 -110
- package/src/urls/pattern-types.ts +101 -19
- package/src/urls/response-types.ts +20 -19
- package/src/urls/type-extraction.ts +98 -154
- package/src/urls/urls-function.ts +1 -19
- package/src/use-loader.tsx +355 -109
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +89 -0
- package/src/vite/debug.ts +102 -3
- package/src/vite/discovery/bundle-postprocess.ts +18 -14
- package/src/vite/discovery/client-urls-projection.ts +322 -0
- package/src/vite/discovery/dev-prerender-cache.ts +117 -0
- package/src/vite/discovery/discover-routers.ts +178 -151
- package/src/vite/discovery/discovery-errors.ts +255 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +125 -70
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/shell-prerender-phase.ts +397 -0
- package/src/vite/discovery/state.ts +104 -6
- package/src/vite/discovery/virtual-module-codegen.ts +226 -87
- package/src/vite/encryption-key.ts +29 -0
- package/src/vite/index.ts +12 -0
- package/src/vite/inject-client-debug.ts +88 -0
- package/src/vite/plugin-types.ts +243 -10
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- package/src/vite/plugins/cloudflare-protocol-stub.ts +1 -21
- package/src/vite/plugins/expose-action-id.ts +50 -97
- package/src/vite/plugins/expose-id-utils.ts +88 -55
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +11 -90
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +551 -486
- package/src/vite/plugins/performance-tracks.ts +25 -22
- package/src/vite/plugins/refresh-cmd.ts +1 -1
- package/src/vite/plugins/server-ref-hashing.ts +74 -0
- package/src/vite/plugins/server-reference-pattern.ts +10 -0
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +39 -29
- package/src/vite/plugins/version-plugin.ts +45 -40
- package/src/vite/plugins/virtual-entries.ts +193 -30
- package/src/vite/rango.ts +240 -128
- package/src/vite/router-discovery.ts +1518 -174
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/directive-prologue.ts +40 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +1 -59
- package/src/vite/utils/package-resolution.ts +2 -73
- package/src/vite/utils/prerender-utils.ts +96 -49
- package/src/vite/utils/shared-utils.ts +156 -43
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
|
@@ -20,7 +20,11 @@ import {
|
|
|
20
20
|
encodeReply,
|
|
21
21
|
createClientTemporaryReferenceSet,
|
|
22
22
|
} from "@vitejs/plugin-rsc/rsc";
|
|
23
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
getRequestContext,
|
|
25
|
+
runWithRequestContext,
|
|
26
|
+
} from "../server/request-context.js";
|
|
27
|
+
import { isUnderTestRunner } from "../runtime-env.js";
|
|
24
28
|
import {
|
|
25
29
|
isTainted,
|
|
26
30
|
CACHED_FN_SYMBOL,
|
|
@@ -32,20 +36,232 @@ import {
|
|
|
32
36
|
export { isCachedFunction };
|
|
33
37
|
import { serializeResult, deserializeResult } from "./segment-codec.js";
|
|
34
38
|
import { createHandleStore } from "../server/handle-store.js";
|
|
35
|
-
import {
|
|
39
|
+
import {
|
|
40
|
+
restoreHandles,
|
|
41
|
+
encodeHandles,
|
|
42
|
+
decodeHandles,
|
|
43
|
+
} from "./handle-snapshot.js";
|
|
36
44
|
import { startHandleCapture, type HandleCapture } from "./handle-capture.js";
|
|
37
45
|
import { sortedSearchString } from "./cache-key-utils.js";
|
|
46
|
+
import { encodeKV } from "../encode-kv.js";
|
|
38
47
|
import { runBackground } from "./background-task.js";
|
|
48
|
+
import { observePhase, PHASES } from "../router/instrument.js";
|
|
49
|
+
import {
|
|
50
|
+
normalizeTags,
|
|
51
|
+
recordRequestTags,
|
|
52
|
+
runWithCacheTagScope,
|
|
53
|
+
} from "./cache-tag.js";
|
|
54
|
+
import { runWithCacheExecScope } from "./cache-exec-scope.js";
|
|
55
|
+
import { reportCacheError } from "./cache-error.js";
|
|
56
|
+
import type { CacheItemResult } from "./types.js";
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* DJB2 hash returning an 8-char hex string. Deterministic across runtimes
|
|
60
|
+
* (no crypto import — cache-runtime runs on the edge). Mirrors prerender's
|
|
61
|
+
* param-hash djb2Hex so binary key parts hash consistently.
|
|
62
|
+
*/
|
|
63
|
+
function djb2HexBytes(bytes: Uint8Array): string {
|
|
64
|
+
let hash = 5381;
|
|
65
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
66
|
+
hash = ((hash << 5) + hash + bytes[i]!) >>> 0;
|
|
67
|
+
}
|
|
68
|
+
return hash.toString(16).padStart(8, "0");
|
|
69
|
+
}
|
|
39
70
|
|
|
40
71
|
/**
|
|
41
72
|
* Convert encodeReply result to a stable string key.
|
|
42
|
-
*
|
|
73
|
+
*
|
|
74
|
+
* encodeReply may return a string or FormData. A plain string is already
|
|
75
|
+
* deterministic for a given arg set, so return it verbatim. FormData (emitted
|
|
76
|
+
* whenever a key arg is a typed array / Blob / File / a large object React
|
|
77
|
+
* lazily chunks) carries a per-call RANDOM multipart boundary
|
|
78
|
+
* (`formdata-undici-<random>`); stringifying the whole body via
|
|
79
|
+
* `new Response(formData).text()` would therefore produce a DIFFERENT key on
|
|
80
|
+
* every call, so the cached function would always miss and the store would
|
|
81
|
+
* accumulate one duplicate entry per call (unbounded growth).
|
|
82
|
+
*
|
|
83
|
+
* Instead derive the key from the entries themselves, independent of the
|
|
84
|
+
* boundary: iterate in sorted-key order and, for each value, emit a
|
|
85
|
+
* boundary-free token — `s:<value>` for strings, `b:<size>:<type>:<name>:<hash>`
|
|
86
|
+
* for Blob/File (bytes folded via djb2 so distinct payloads of equal
|
|
87
|
+
* size/type/name still differ). Strings carry an `s:` type tag so a string whose
|
|
88
|
+
* value happens to equal a blob token (e.g. the literal `b:4::a:b:<hash>`) cannot
|
|
89
|
+
* collide with an actual Blob/File entry under the same FormData key. The
|
|
90
|
+
* user-controlled `type`/`name` are percent-encoded before joining so an embedded
|
|
91
|
+
* `:` cannot shift the field boundaries and collide two distinct files (e.g.
|
|
92
|
+
* {name:"a:b",type:""} vs {name:"b",type:":a"}). The result is stable across
|
|
93
|
+
* identical arg sets.
|
|
43
94
|
*/
|
|
44
|
-
async function replyToCacheKey(
|
|
95
|
+
export async function replyToCacheKey(
|
|
96
|
+
encoded: string | FormData,
|
|
97
|
+
): Promise<string> {
|
|
45
98
|
if (typeof encoded === "string") return encoded;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
99
|
+
|
|
100
|
+
// Snapshot entries synchronously (forEach avoids relying on FormData's
|
|
101
|
+
// iterator typings), then fold any Blob/File bytes asynchronously.
|
|
102
|
+
const raw: [string, FormDataEntryValue][] = [];
|
|
103
|
+
encoded.forEach((value, key) => {
|
|
104
|
+
raw.push([key, value]);
|
|
105
|
+
});
|
|
106
|
+
const pairs: [string, string][] = [];
|
|
107
|
+
for (const [key, value] of raw) {
|
|
108
|
+
if (typeof value === "string") {
|
|
109
|
+
// Type-tag strings with `s:` so a string equal to a blob token (e.g.
|
|
110
|
+
// `b:4::a:b:<hash>`) cannot collide with a Blob/File entry under the same
|
|
111
|
+
// key (which carries the `b:` tag below).
|
|
112
|
+
pairs.push([key, "s:" + value]);
|
|
113
|
+
} else {
|
|
114
|
+
// Blob/File: fold the bytes into a deterministic, boundary-free token.
|
|
115
|
+
// Percent-encode the user-controlled type/name so an embedded `:` cannot
|
|
116
|
+
// shift the `:`-delimited field boundaries and collide distinct files.
|
|
117
|
+
const buf = await value.arrayBuffer();
|
|
118
|
+
const hash = djb2HexBytes(new Uint8Array(buf));
|
|
119
|
+
const name = "name" in value ? value.name : "";
|
|
120
|
+
const encType = encodeURIComponent(value.type);
|
|
121
|
+
const encName = encodeURIComponent(name);
|
|
122
|
+
pairs.push([key, `b:${value.size}:${encType}:${encName}:${hash}`]);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return encodeKV(pairs, { sort: true });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Cached-fn ids already warned about running uncached under a test runner, so
|
|
129
|
+
// the test-ergonomics warning fires once per fn rather than once per call.
|
|
130
|
+
const warnedUncachedUnderTest = new Set<string>();
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Fast-path cache-key builder for JSON-safe key args. Returns a deterministic
|
|
134
|
+
* string (object keys recursively sorted so insertion order can't change the
|
|
135
|
+
* key) when EVERY part is a primitive or a plain object/array of the same, and
|
|
136
|
+
* `undefined` otherwise so the caller falls back to the Flight reply encoder.
|
|
137
|
+
*
|
|
138
|
+
* Strings are always quoted via JSON.stringify, so they can never collide with
|
|
139
|
+
* the bareword encodings of null/true/false/undefined/numbers. Anything the
|
|
140
|
+
* reply encoder must handle instead — functions, symbols, bigint, non-finite
|
|
141
|
+
* numbers, Dates, Maps, class instances, promises, and React elements (whose
|
|
142
|
+
* `$$typeof` symbol value trips the symbol reject) — yields `undefined`.
|
|
143
|
+
*/
|
|
144
|
+
function jsonSafeKeyPart(value: unknown): string | undefined {
|
|
145
|
+
if (value === null) return "null";
|
|
146
|
+
switch (typeof value) {
|
|
147
|
+
case "string":
|
|
148
|
+
return JSON.stringify(value);
|
|
149
|
+
case "boolean":
|
|
150
|
+
return value ? "true" : "false";
|
|
151
|
+
case "number":
|
|
152
|
+
return Number.isFinite(value) ? String(value) : undefined;
|
|
153
|
+
case "undefined":
|
|
154
|
+
return "undefined";
|
|
155
|
+
case "object": {
|
|
156
|
+
if (Array.isArray(value)) {
|
|
157
|
+
const parts: string[] = [];
|
|
158
|
+
for (const item of value) {
|
|
159
|
+
const encoded = jsonSafeKeyPart(item);
|
|
160
|
+
if (encoded === undefined) return undefined;
|
|
161
|
+
parts.push(encoded);
|
|
162
|
+
}
|
|
163
|
+
return `[${parts.join(",")}]`;
|
|
164
|
+
}
|
|
165
|
+
// Only plain objects (Object.prototype or null proto) are fast-path safe.
|
|
166
|
+
// Dates, Maps, class instances, promises, etc. carry a different prototype
|
|
167
|
+
// and fall back to the encoder.
|
|
168
|
+
const proto = Object.getPrototypeOf(value);
|
|
169
|
+
if (proto !== Object.prototype && proto !== null) return undefined;
|
|
170
|
+
const obj = value as Record<string, unknown>;
|
|
171
|
+
const parts: string[] = [];
|
|
172
|
+
for (const key of Object.keys(obj).sort()) {
|
|
173
|
+
const encoded = jsonSafeKeyPart(obj[key]);
|
|
174
|
+
if (encoded === undefined) return undefined;
|
|
175
|
+
parts.push(`${JSON.stringify(key)}:${encoded}`);
|
|
176
|
+
}
|
|
177
|
+
return `{${parts.join(",")}}`;
|
|
178
|
+
}
|
|
179
|
+
default:
|
|
180
|
+
// bigint, symbol, function
|
|
181
|
+
return undefined;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The serialized product of one "use cache" execution: exactly what the store
|
|
187
|
+
* write persists. Followers that dedup onto an in-flight execution (see
|
|
188
|
+
* inFlightExecutions) await this and serve it as a synthetic cache hit — each
|
|
189
|
+
* deserializing its OWN copy of `serialized` and replaying `handles`/`tags`
|
|
190
|
+
* against its OWN request. A deserialized result object is never shared.
|
|
191
|
+
*/
|
|
192
|
+
interface CacheEnvelope {
|
|
193
|
+
/** RSC-serialized return value (never null — a null serialize rejects). */
|
|
194
|
+
serialized: string;
|
|
195
|
+
/** Merged profile/DSL + runtime cacheTag() tags. */
|
|
196
|
+
tags: string[];
|
|
197
|
+
/** RSC-encoded handle blob captured during execution, if any. */
|
|
198
|
+
handles?: string;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* In-flight "use cache" executions keyed by cache key. When N concurrent calls
|
|
203
|
+
* miss on the same key, only the first (the leader) runs the function; the rest
|
|
204
|
+
* await its {@link CacheEnvelope} and serve it as a synthetic hit rather than
|
|
205
|
+
* re-running the function and re-writing the store. Isolate-scoped (module
|
|
206
|
+
* singleton), and cleared for a key as soon as the leader settles: a rejected
|
|
207
|
+
* leader (function threw, or the result was not serializable) propagates to
|
|
208
|
+
* current waiters, which then retry fresh.
|
|
209
|
+
*
|
|
210
|
+
* A leader that NEVER settles must not hang followers (scar tissue, autobarn
|
|
211
|
+
* pilot outage): a background shell capture's render became leader, awaited a
|
|
212
|
+
* tarpitting upstream fetch, and workerd killed the capture's waitUntil context
|
|
213
|
+
* — orphaning the leader promise as permanently pending, its map entry never
|
|
214
|
+
* cleared. Every later document render calling the same cached function (an
|
|
215
|
+
* isolate-global key for plain-args calls) awaited it forever before first
|
|
216
|
+
* byte: isolate-wide TTFB-0 until redeploy. Followers therefore trust an entry
|
|
217
|
+
* only for {@link IN_FLIGHT_LEADER_MAX_WAIT_MS} from registration; past it
|
|
218
|
+
* they evict the entry and run fresh — bounded duplicate upstream work instead
|
|
219
|
+
* of an unbounded hang. Eviction is age-based off `registeredAt`, so it also
|
|
220
|
+
* heals entries stranded by a killed context (no timer in that context needs
|
|
221
|
+
* to survive).
|
|
222
|
+
*/
|
|
223
|
+
interface InFlightExecution {
|
|
224
|
+
promise: Promise<CacheEnvelope>;
|
|
225
|
+
registeredAt: number;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const inFlightExecutions = new Map<string, InFlightExecution>();
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* How long a follower trusts an in-flight leader before evicting it and
|
|
232
|
+
* running fresh. High enough that a slow-but-healthy upstream never triggers
|
|
233
|
+
* duplicate work (a legitimate cached call taking >15s is already pathological);
|
|
234
|
+
* low enough to bound the blast radius of a wedged leader to seconds, not the
|
|
235
|
+
* isolate lifetime. Aligned with SHELL_CAPTURE_MAX_WAIT_MS.
|
|
236
|
+
*/
|
|
237
|
+
const IN_FLIGHT_LEADER_MAX_WAIT_MS = 15_000;
|
|
238
|
+
|
|
239
|
+
/** Distinguishes a leader timeout from a leader rejection in raceLeader. */
|
|
240
|
+
const LEADER_TIMED_OUT = Symbol("leader-timed-out");
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Await a leader's envelope for at most `remainingMs`. Resolves with the
|
|
244
|
+
* envelope, `undefined` on leader rejection (the leader already cleared its
|
|
245
|
+
* entry — caller falls through to a fresh run), or {@link LEADER_TIMED_OUT}
|
|
246
|
+
* when the window expires first (caller must evict the entry itself).
|
|
247
|
+
*/
|
|
248
|
+
function raceLeader(
|
|
249
|
+
promise: Promise<CacheEnvelope>,
|
|
250
|
+
remainingMs: number,
|
|
251
|
+
): Promise<CacheEnvelope | undefined | typeof LEADER_TIMED_OUT> {
|
|
252
|
+
return new Promise((resolve) => {
|
|
253
|
+
const timer = setTimeout(() => resolve(LEADER_TIMED_OUT), remainingMs);
|
|
254
|
+
promise.then(
|
|
255
|
+
(envelope) => {
|
|
256
|
+
clearTimeout(timer);
|
|
257
|
+
resolve(envelope);
|
|
258
|
+
},
|
|
259
|
+
() => {
|
|
260
|
+
clearTimeout(timer);
|
|
261
|
+
resolve(undefined);
|
|
262
|
+
},
|
|
263
|
+
);
|
|
264
|
+
});
|
|
49
265
|
}
|
|
50
266
|
|
|
51
267
|
// ============================================================================
|
|
@@ -70,9 +286,39 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
70
286
|
const store = requestCtx?._cacheStore;
|
|
71
287
|
const resolvedProfileName = profileName || "default";
|
|
72
288
|
|
|
73
|
-
// Bypass: no store or no getItem support
|
|
289
|
+
// Bypass: no store or no getItem support. Still run inside a tag scope so a
|
|
290
|
+
// cacheTag() call inside the function degrades to a no-op rather than
|
|
291
|
+
// throwing "must be called inside a use cache function" - adopting cacheTag()
|
|
292
|
+
// must not hard-fail in apps/tests without an item-capable cache configured.
|
|
293
|
+
// Note: the cache-exec guards (cookies()/headers()/ctx.set() rejection —
|
|
294
|
+
// runWithCacheExecScope + the INSIDE_CACHE_EXEC arg stamp) are intentionally
|
|
295
|
+
// NOT active here. They are cached-path-only checks; in the bypass the body
|
|
296
|
+
// actually executes, so the guarded side effects take effect and nothing is
|
|
297
|
+
// lost on a (non-existent) hit. Same applies to the non-serializable-args
|
|
298
|
+
// bypass below.
|
|
74
299
|
if (!store?.getItem) {
|
|
75
|
-
|
|
300
|
+
// Test-ergonomics guard: under a test runner, a "use cache" function that
|
|
301
|
+
// executes with no item-capable store seeded is exercising the UNCACHED
|
|
302
|
+
// path — a green test that proves nothing about caching. Warn once per fn
|
|
303
|
+
// id so the author knows to seed a cacheStore. Advisory (never throws), so
|
|
304
|
+
// a test that DELIBERATELY runs uncached is unaffected. Gated on the test
|
|
305
|
+
// runner (process.env.VITEST, not folded) so production never evaluates it.
|
|
306
|
+
if (isUnderTestRunner() && !warnedUncachedUnderTest.has(id)) {
|
|
307
|
+
warnedUncachedUnderTest.add(id);
|
|
308
|
+
console.warn(
|
|
309
|
+
`[rango] "use cache" function "${id}" executed but no cacheStore was ` +
|
|
310
|
+
`seeded; the cached path is NOT under test (it ran uncached). Pass ` +
|
|
311
|
+
`{ cacheStore, cacheProfiles } to runLoader/runMiddleware/renderHandler/` +
|
|
312
|
+
`runInRequestContext (or configure createRouter({ cache }) for dispatch) ` +
|
|
313
|
+
`to exercise it.`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
const scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
317
|
+
const result = await scoped.result;
|
|
318
|
+
// Still record the runtime tags into the request set so a cacheTag() in an
|
|
319
|
+
// uncached function tags the document, even with no item-capable store.
|
|
320
|
+
recordRequestTags(scoped.tags, requestCtx);
|
|
321
|
+
return result;
|
|
76
322
|
}
|
|
77
323
|
|
|
78
324
|
// Resolve profile strictly from request-scoped config (set by the
|
|
@@ -114,9 +360,14 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
114
360
|
if (ctx._responseType) {
|
|
115
361
|
keyArgs.push(ctx._responseType);
|
|
116
362
|
}
|
|
117
|
-
// Include user-facing search params (exclude internal _rsc*/__
|
|
363
|
+
// Include user-facing search params (exclude internal _rsc*/__
|
|
364
|
+
// params, plus the request's cache.searchParams filter -- same
|
|
365
|
+
// normalization as the URL-keyed tiers).
|
|
118
366
|
if (ctx.searchParams instanceof URLSearchParams) {
|
|
119
|
-
const normalized = sortedSearchString(
|
|
367
|
+
const normalized = sortedSearchString(
|
|
368
|
+
ctx.searchParams,
|
|
369
|
+
requestCtx?._searchParamsFilter,
|
|
370
|
+
);
|
|
120
371
|
if (normalized) {
|
|
121
372
|
keyArgs.push(normalized);
|
|
122
373
|
}
|
|
@@ -145,67 +396,105 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
145
396
|
let cacheKey: string;
|
|
146
397
|
try {
|
|
147
398
|
if (keyArgs.length > 0) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
399
|
+
// Fast path: when every key arg is JSON-safe, build the key with a
|
|
400
|
+
// deterministic stable-stringify and skip encodeReply (the Flight reply
|
|
401
|
+
// encoder runs on EVERY call, including hits). The `:j:` namespace keeps
|
|
402
|
+
// these keys disjoint from the encoder path so the two can never collide
|
|
403
|
+
// for one fn id. Entries cached under the old encoder key for JSON-safe
|
|
404
|
+
// args cold-start once after this upgrade.
|
|
405
|
+
const fastKey = jsonSafeKeyPart(keyArgs);
|
|
406
|
+
if (fastKey !== undefined) {
|
|
407
|
+
cacheKey = `use-cache:${id}:j:${fastKey}`;
|
|
408
|
+
} else {
|
|
409
|
+
const tempRefs = createClientTemporaryReferenceSet();
|
|
410
|
+
const encoded = await encodeReply(keyArgs as unknown[], {
|
|
411
|
+
temporaryReferences: tempRefs,
|
|
412
|
+
});
|
|
413
|
+
const argsKey = await replyToCacheKey(encoded);
|
|
414
|
+
cacheKey = `use-cache:${id}:${argsKey}`;
|
|
415
|
+
}
|
|
154
416
|
} else {
|
|
155
417
|
cacheKey = `use-cache:${id}`;
|
|
156
418
|
}
|
|
157
419
|
} catch {
|
|
158
|
-
// Non-serializable args: run uncached
|
|
159
|
-
|
|
420
|
+
// Non-serializable args: run uncached (within a tag scope so cacheTag()
|
|
421
|
+
// still does not throw). Record runtime tags so the document union still
|
|
422
|
+
// sees them even though this call is not itself cached.
|
|
423
|
+
const scoped = runWithCacheTagScope(() => fn.apply(this, args));
|
|
424
|
+
const result = await scoped.result;
|
|
425
|
+
recordRequestTags(scoped.tags, requestCtx);
|
|
426
|
+
return result;
|
|
160
427
|
}
|
|
161
428
|
|
|
162
429
|
// Cache lookup
|
|
163
430
|
const cached = await store.getItem(cacheKey);
|
|
164
431
|
|
|
432
|
+
// Serve a cached entry on the hit path: deserialize the stored value,
|
|
433
|
+
// replay handle data (gated on tainted args), and surface the entry's tags
|
|
434
|
+
// to the request set (the function did not re-run, so its runtime cacheTag()
|
|
435
|
+
// tags are only available from the stored entry). Shared by the fresh-hit
|
|
436
|
+
// and stale-hit branches; the only divergence is the stale branch scheduling
|
|
437
|
+
// background revalidation, which it does after this returns.
|
|
438
|
+
const serveCached = async (entry: CacheItemResult): Promise<any> => {
|
|
439
|
+
const result = await deserializeResult(entry.value);
|
|
440
|
+
if (entry.handles && hasTaintedArgs) {
|
|
441
|
+
const handleStore = requestCtx?._handleStore;
|
|
442
|
+
if (handleStore) {
|
|
443
|
+
const r = await decodeHandles(entry.handles);
|
|
444
|
+
if (r) restoreHandles(r, handleStore);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
recordRequestTags(entry.tags, requestCtx);
|
|
448
|
+
return result;
|
|
449
|
+
};
|
|
450
|
+
|
|
165
451
|
if (cached && !cached.shouldRevalidate) {
|
|
166
452
|
// Fresh hit: deserialize and return
|
|
167
453
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// Deserialization failed, fall through to fresh execution
|
|
454
|
+
return await serveCached(cached);
|
|
455
|
+
} catch (error) {
|
|
456
|
+
// The stored value is corrupt/partial (failed RSC deserialize). Report
|
|
457
|
+
// it, then fall through to fresh execution - the miss path below re-runs
|
|
458
|
+
// and setItem() overwrites the faulty entry under the same key (self-heal).
|
|
459
|
+
reportCacheError(
|
|
460
|
+
error,
|
|
461
|
+
"cache-corrupt",
|
|
462
|
+
`[use cache] "${id}" fresh-hit`,
|
|
463
|
+
);
|
|
179
464
|
}
|
|
180
465
|
}
|
|
181
466
|
|
|
182
|
-
|
|
467
|
+
// foregroundOnAction (opt-in; see CacheProfile.foregroundOnAction): during an
|
|
468
|
+
// action's revalidation render, a stale entry falls through to the foreground
|
|
469
|
+
// miss path below instead of SWR. The flag is set by revalidateAfterAction.
|
|
470
|
+
const foregroundOnActionRevalidation =
|
|
471
|
+
requestCtx?._inActionRevalidation === true &&
|
|
472
|
+
profile.foregroundOnAction === true;
|
|
473
|
+
if (cached?.shouldRevalidate && !foregroundOnActionRevalidation) {
|
|
183
474
|
// Stale hit: return stale value, revalidate in background
|
|
184
475
|
try {
|
|
185
|
-
const result = await
|
|
186
|
-
if (cached.handles && hasTaintedArgs) {
|
|
187
|
-
const handleStore = requestCtx?._handleStore;
|
|
188
|
-
if (handleStore) {
|
|
189
|
-
restoreHandles(cached.handles, handleStore);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
476
|
+
const result = await serveCached(cached);
|
|
192
477
|
// Background revalidation — must capture handles if tainted args present.
|
|
193
|
-
// Use an isolated handle store so background pushes don't pollute the
|
|
194
|
-
// live response or throw LateHandlePushError on the completed store.
|
|
195
|
-
// Same isolation pattern as route-level background-revalidation.ts.
|
|
196
478
|
runBackground(requestCtx, async () => {
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
479
|
+
// The background body runs under a DERIVED context with an OWN
|
|
480
|
+
// _handleStore (the shell-capture isolation pattern —
|
|
481
|
+
// shell-capture.ts attemptCapture): its handle pushes land in the
|
|
482
|
+
// isolated store (captured below, persisted with the entry) while
|
|
483
|
+
// the foreground keeps pushing into the ORIGINAL store, untouched.
|
|
484
|
+
// Derivation matters because the foreground is STILL RENDERING here
|
|
485
|
+
// — runBackground/waitUntil starts the task on the next microtask,
|
|
486
|
+
// not after the response. The previous shape swapped
|
|
487
|
+
// requestCtx._handleStore in place (restore in finally), which
|
|
488
|
+
// routed the whole overlap window's foreground pushes into the
|
|
489
|
+
// background store: lost from the live document AND persisted into
|
|
490
|
+
// the revalidated entry (issue #684, plan 010).
|
|
491
|
+
const bgHandleStore =
|
|
492
|
+
hasTaintedArgs && requestCtx ? createHandleStore() : undefined;
|
|
493
|
+
const bgCtx: typeof requestCtx = bgHandleStore
|
|
494
|
+
? Object.assign(Object.create(requestCtx), {
|
|
495
|
+
_handleStore: bgHandleStore,
|
|
496
|
+
})
|
|
497
|
+
: requestCtx;
|
|
209
498
|
let bgCapture: HandleCapture | undefined;
|
|
210
499
|
let bgStopCapture: (() => void) | undefined;
|
|
211
500
|
if (bgHandleStore) {
|
|
@@ -214,61 +503,172 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
214
503
|
bgStopCapture = c.stop;
|
|
215
504
|
}
|
|
216
505
|
|
|
217
|
-
//
|
|
218
|
-
//
|
|
219
|
-
//
|
|
220
|
-
//
|
|
221
|
-
//
|
|
222
|
-
//
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
//
|
|
228
|
-
//
|
|
229
|
-
// 3. The foreground miss path already stamps requestCtx and catches
|
|
230
|
-
// cookies()/headers() misuse on first execution. The background
|
|
231
|
-
// re-runs the same function with the same request.
|
|
232
|
-
const bgTaintedArgs: unknown[] = [];
|
|
233
|
-
for (const arg of args) {
|
|
234
|
-
if (isTainted(arg)) {
|
|
235
|
-
stampCacheExec(arg as object);
|
|
236
|
-
bgTaintedArgs.push(arg);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
506
|
+
// Tainted args are NOT stamped here, in contrast to the foreground
|
|
507
|
+
// miss path below. The args include the live HandlerContext the
|
|
508
|
+
// still-rendering foreground holds, and INSIDE_CACHE_EXEC is a
|
|
509
|
+
// property stamped onto that SHARED object — so for the whole
|
|
510
|
+
// revalidation window a concurrent foreground ctx.set() /
|
|
511
|
+
// ctx.headers.*() would throw (issue #684, plan 010). requestCtx is
|
|
512
|
+
// never stamped anywhere for the same reason. In-body misuse IS
|
|
513
|
+
// still guarded here: runWithCacheExecScope below follows only this
|
|
514
|
+
// body's async chain, so a conditional cookies()/headers() read
|
|
515
|
+
// that fires only during revalidation throws instead of baking one
|
|
516
|
+
// user's value into the shared entry — with zero visibility to the
|
|
517
|
+
// concurrent foreground.
|
|
239
518
|
|
|
240
519
|
try {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
520
|
+
// Re-establish the request-context ALS so a "use cache" body that
|
|
521
|
+
// reads the ambient getRequestContext() (e.g.
|
|
522
|
+
// getRequestContext().env.ApiKey) resolves during the background
|
|
523
|
+
// revalidation instead of throwing "called outside of a request
|
|
524
|
+
// context". runWithRequestContext sets the store for fn's
|
|
525
|
+
// synchronous kickoff; its async continuations inherit it. The
|
|
526
|
+
// DERIVED context goes in, so ambient _handleStore reads inside
|
|
527
|
+
// the body resolve to the isolated store.
|
|
528
|
+
//
|
|
529
|
+
// The span opens inside the request ALS and wraps the WHOLE task —
|
|
530
|
+
// fn kickoff through the store write — so its platform spans nest
|
|
531
|
+
// under rango.background and a slow or failing setItem is part of
|
|
532
|
+
// the traced revalidation, not an untraced tail.
|
|
533
|
+
await runWithRequestContext(bgCtx, () =>
|
|
534
|
+
observePhase(
|
|
535
|
+
PHASES.background("use-cache-revalidation"),
|
|
536
|
+
async () => {
|
|
537
|
+
const scoped = runWithCacheTagScope(() =>
|
|
538
|
+
runWithCacheExecScope(() => fn.apply(this, args)),
|
|
539
|
+
);
|
|
540
|
+
const freshResult = await scoped.result;
|
|
541
|
+
bgStopCapture?.();
|
|
542
|
+
// Merge profile/DSL tags with runtime cacheTag() tags, read
|
|
543
|
+
// after awaiting so post-await cacheTag() calls are included.
|
|
544
|
+
// Normalize (drops empty profile tags, matching the
|
|
545
|
+
// invalidate path) + dedupe.
|
|
546
|
+
const freshTags = [
|
|
547
|
+
...new Set(
|
|
548
|
+
normalizeTags([...(profile.tags ?? []), ...scoped.tags]),
|
|
549
|
+
),
|
|
550
|
+
];
|
|
551
|
+
recordRequestTags(freshTags, requestCtx);
|
|
552
|
+
const serialized = await serializeResult(freshResult);
|
|
553
|
+
if (serialized !== null) {
|
|
554
|
+
const encodedHandles = bgCapture?.data
|
|
555
|
+
? await encodeHandles(bgCapture.data)
|
|
556
|
+
: undefined;
|
|
557
|
+
await store.setItem!(cacheKey, serialized, {
|
|
558
|
+
handles: encodedHandles,
|
|
559
|
+
ttl: profile.ttl,
|
|
560
|
+
swr: profile.swr,
|
|
561
|
+
tags: freshTags.length > 0 ? freshTags : undefined,
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
},
|
|
565
|
+
),
|
|
566
|
+
);
|
|
252
567
|
} catch (bgError) {
|
|
253
568
|
bgStopCapture?.();
|
|
254
|
-
requestCtx
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
requestCtx
|
|
262
|
-
|
|
569
|
+
// Pass requestCtx explicitly: this runs in a detached background
|
|
570
|
+
// task where the ALS context is gone, so onError can only fire if
|
|
571
|
+
// we hand it the context captured up front.
|
|
572
|
+
reportCacheError(
|
|
573
|
+
bgError,
|
|
574
|
+
"stale-revalidation",
|
|
575
|
+
"[use cache] background revalidation failed",
|
|
576
|
+
requestCtx,
|
|
577
|
+
);
|
|
263
578
|
}
|
|
579
|
+
// No finally: nothing shared was mutated — the derived context and
|
|
580
|
+
// its handle store are garbage after the task settles.
|
|
264
581
|
});
|
|
265
582
|
return result;
|
|
266
|
-
} catch {
|
|
267
|
-
//
|
|
583
|
+
} catch (error) {
|
|
584
|
+
// Stale value is corrupt/partial; report and fall through to a fresh
|
|
585
|
+
// execution, which overwrites the faulty entry under the same key.
|
|
586
|
+
reportCacheError(
|
|
587
|
+
error,
|
|
588
|
+
"cache-corrupt",
|
|
589
|
+
`[use cache] "${id}" stale-hit`,
|
|
590
|
+
);
|
|
268
591
|
}
|
|
269
592
|
}
|
|
270
593
|
|
|
271
|
-
// Cache miss
|
|
594
|
+
// Cache miss.
|
|
595
|
+
//
|
|
596
|
+
// In-flight dedup: if a concurrent call for this key is already executing,
|
|
597
|
+
// await its envelope and serve it as a synthetic hit rather than re-running
|
|
598
|
+
// the function. Each follower deserializes its OWN copy, replays handles
|
|
599
|
+
// against its OWN handle store (gated on ITS hasTaintedArgs), and records
|
|
600
|
+
// tags into its OWN request — no deserialized result is shared across
|
|
601
|
+
// requests. The store write stays exactly once (the leader's).
|
|
602
|
+
const existing = inFlightExecutions.get(cacheKey);
|
|
603
|
+
if (existing) {
|
|
604
|
+
const remainingMs =
|
|
605
|
+
IN_FLIGHT_LEADER_MAX_WAIT_MS - (Date.now() - existing.registeredAt);
|
|
606
|
+
const raced =
|
|
607
|
+
remainingMs <= 0
|
|
608
|
+
? LEADER_TIMED_OUT
|
|
609
|
+
: await raceLeader(existing.promise, remainingMs);
|
|
610
|
+
if (raced === LEADER_TIMED_OUT) {
|
|
611
|
+
// Wedged (or context-orphaned) leader: evict so this call and every
|
|
612
|
+
// later one run fresh. Guard the delete so a newer leader's entry is
|
|
613
|
+
// never removed; the stale leader's own clearSelf is identity-guarded
|
|
614
|
+
// the same way, so it can't evict our replacement if it settles late.
|
|
615
|
+
if (inFlightExecutions.get(cacheKey) === existing) {
|
|
616
|
+
inFlightExecutions.delete(cacheKey);
|
|
617
|
+
}
|
|
618
|
+
reportCacheError(
|
|
619
|
+
new Error(
|
|
620
|
+
`in-flight leader did not settle within ${IN_FLIGHT_LEADER_MAX_WAIT_MS}ms; evicted — executing fresh`,
|
|
621
|
+
),
|
|
622
|
+
"cache-read",
|
|
623
|
+
`[use cache] "${id}" inflight-timeout`,
|
|
624
|
+
);
|
|
625
|
+
// Fall through to a fresh execution below (this call becomes leader).
|
|
626
|
+
} else if (raced) {
|
|
627
|
+
try {
|
|
628
|
+
return await serveCached({
|
|
629
|
+
value: raced.serialized,
|
|
630
|
+
handles: raced.handles,
|
|
631
|
+
tags: raced.tags,
|
|
632
|
+
shouldRevalidate: false,
|
|
633
|
+
});
|
|
634
|
+
} catch (error) {
|
|
635
|
+
reportCacheError(
|
|
636
|
+
error,
|
|
637
|
+
"cache-corrupt",
|
|
638
|
+
`[use cache] "${id}" inflight-hit`,
|
|
639
|
+
);
|
|
640
|
+
// Fall through to a fresh execution below.
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
// raced === undefined: leader rejected; its map entry is already
|
|
644
|
+
// cleared, so fall through to a fresh run.
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// This call becomes the leader. Register a deferred envelope so concurrent
|
|
648
|
+
// callers dedup onto it; it is resolved/rejected exactly once below (or on a
|
|
649
|
+
// function throw). clearSelf only deletes the map slot if it still holds
|
|
650
|
+
// THIS promise, so a fall-through retry (rare rejected-leader path) can't
|
|
651
|
+
// evict a newer leader's entry.
|
|
652
|
+
let resolveEnvelope!: (env: CacheEnvelope) => void;
|
|
653
|
+
let rejectEnvelope!: (err: unknown) => void;
|
|
654
|
+
const envelopePromise = new Promise<CacheEnvelope>((res, rej) => {
|
|
655
|
+
resolveEnvelope = res;
|
|
656
|
+
rejectEnvelope = rej;
|
|
657
|
+
});
|
|
658
|
+
// Followers attach their own catch; guard the map's own reference so a
|
|
659
|
+
// rejected envelope with no waiter is not an unhandled rejection.
|
|
660
|
+
envelopePromise.catch(() => {});
|
|
661
|
+
inFlightExecutions.set(cacheKey, {
|
|
662
|
+
promise: envelopePromise,
|
|
663
|
+
registeredAt: Date.now(),
|
|
664
|
+
});
|
|
665
|
+
const clearSelf = (): void => {
|
|
666
|
+
if (inFlightExecutions.get(cacheKey)?.promise === envelopePromise) {
|
|
667
|
+
inFlightExecutions.delete(cacheKey);
|
|
668
|
+
}
|
|
669
|
+
};
|
|
670
|
+
|
|
671
|
+
// execute, serialize, store
|
|
272
672
|
const handleStore = hasTaintedArgs ? requestCtx?._handleStore : undefined;
|
|
273
673
|
let capture: HandleCapture | undefined;
|
|
274
674
|
let stopCapture: (() => void) | undefined;
|
|
@@ -282,6 +682,14 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
282
682
|
// inside the cached function body (those side effects are lost on hit).
|
|
283
683
|
// Uses ref-counted stamp/unstamp so overlapping executions
|
|
284
684
|
// sharing the same ctx don't clear each other's guards.
|
|
685
|
+
//
|
|
686
|
+
// The ambient guards (cookies()/headers() and getRequestContext()-reached
|
|
687
|
+
// ctx methods) ride runWithCacheExecScope below instead — an ALS scoped to
|
|
688
|
+
// the cached body's own async chain. The RequestContext itself is
|
|
689
|
+
// deliberately NOT stamped: a property on that SHARED object made every
|
|
690
|
+
// parallel read on the request throw for the cached body's whole
|
|
691
|
+
// execution window (a 2s cached fetch poisoned a sibling loader's
|
|
692
|
+
// cookies() — same hazard class as issue #684, plan 010).
|
|
285
693
|
const taintedArgs: unknown[] = [];
|
|
286
694
|
for (const arg of args) {
|
|
287
695
|
if (isTainted(arg)) {
|
|
@@ -289,47 +697,84 @@ export function registerCachedFunction<T extends (...args: any[]) => any>(
|
|
|
289
697
|
taintedArgs.push(arg);
|
|
290
698
|
}
|
|
291
699
|
}
|
|
292
|
-
// Always stamp the ALS RequestContext so cookies()/headers() guards fire
|
|
293
|
-
// even when the cached function receives no tainted args. The guard in
|
|
294
|
-
// cookie-store.ts checks RequestContext, not function args.
|
|
295
|
-
if (requestCtx) {
|
|
296
|
-
stampCacheExec(requestCtx as object);
|
|
297
|
-
}
|
|
298
700
|
|
|
299
701
|
let result: any;
|
|
702
|
+
let scoped: ReturnType<typeof runWithCacheTagScope>;
|
|
300
703
|
try {
|
|
301
|
-
|
|
704
|
+
scoped = runWithCacheTagScope(() =>
|
|
705
|
+
runWithCacheExecScope(() => fn.apply(this, args)),
|
|
706
|
+
);
|
|
707
|
+
result = await scoped.result;
|
|
708
|
+
} catch (execError) {
|
|
709
|
+
// The function threw: drop the in-flight entry and reject any waiters so
|
|
710
|
+
// they retry fresh, then propagate to this caller.
|
|
711
|
+
clearSelf();
|
|
712
|
+
rejectEnvelope(execError);
|
|
713
|
+
throw execError;
|
|
302
714
|
} finally {
|
|
303
715
|
// Decrement ref count; symbol is deleted when it reaches zero
|
|
304
716
|
for (const arg of taintedArgs) {
|
|
305
717
|
unstampCacheExec(arg as object);
|
|
306
718
|
}
|
|
307
|
-
if (requestCtx) {
|
|
308
|
-
unstampCacheExec(requestCtx as object);
|
|
309
|
-
}
|
|
310
719
|
// Remove this capture token (order-independent, safe for concurrent use)
|
|
311
720
|
stopCapture?.();
|
|
312
721
|
}
|
|
313
722
|
|
|
314
|
-
//
|
|
315
|
-
//
|
|
316
|
-
|
|
723
|
+
// Merge profile/DSL tags with runtime cacheTag() tags. Read scoped.tags
|
|
724
|
+
// after awaiting result so post-await cacheTag() calls are included.
|
|
725
|
+
// Normalize (drops empty profile tags, matching the invalidate path) + dedupe.
|
|
726
|
+
const allTags = [
|
|
727
|
+
...new Set(normalizeTags([...(profile.tags ?? []), ...scoped!.tags])),
|
|
728
|
+
];
|
|
729
|
+
recordRequestTags(allTags, requestCtx);
|
|
730
|
+
|
|
731
|
+
// Serialize + encode handles ONCE, resolve the in-flight envelope so any
|
|
732
|
+
// concurrent followers can serve a synthetic hit, then persist to the store.
|
|
733
|
+
// Fully non-blocking when waitUntil is available — the leader's response
|
|
734
|
+
// waits on neither serialization nor the store write.
|
|
735
|
+
const finalizeAndWrite = async (): Promise<void> => {
|
|
736
|
+
let serialized: string | null;
|
|
737
|
+
let encodedHandles: string | undefined;
|
|
317
738
|
try {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
await
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
739
|
+
serialized = await serializeResult(result);
|
|
740
|
+
encodedHandles = capture?.data
|
|
741
|
+
? await encodeHandles(capture.data)
|
|
742
|
+
: undefined;
|
|
743
|
+
} catch (buildError) {
|
|
744
|
+
// Serialize/handle-encode failed: no envelope for followers (they run
|
|
745
|
+
// fresh) and nothing to write.
|
|
746
|
+
clearSelf();
|
|
747
|
+
rejectEnvelope(buildError);
|
|
748
|
+
requestCtx?._reportBackgroundError?.(buildError, "cache-write");
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
clearSelf();
|
|
752
|
+
if (serialized === null) {
|
|
753
|
+
// Non-serializable result: no store write (matches the prior silent
|
|
754
|
+
// skip); reject so any waiter falls through to a fresh execution.
|
|
755
|
+
rejectEnvelope(
|
|
756
|
+
new Error(
|
|
757
|
+
`[use cache] "${id}" result is not serializable; not cached`,
|
|
758
|
+
),
|
|
759
|
+
);
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
// Hand followers the envelope before the store write so a slow/failed
|
|
763
|
+
// write never stalls them.
|
|
764
|
+
resolveEnvelope({ serialized, tags: allTags, handles: encodedHandles });
|
|
765
|
+
try {
|
|
766
|
+
await store.setItem!(cacheKey, serialized, {
|
|
767
|
+
handles: encodedHandles,
|
|
768
|
+
ttl: profile.ttl,
|
|
769
|
+
swr: profile.swr,
|
|
770
|
+
tags: allTags.length > 0 ? allTags : undefined,
|
|
771
|
+
});
|
|
327
772
|
} catch (writeError) {
|
|
328
773
|
requestCtx?._reportBackgroundError?.(writeError, "cache-write");
|
|
329
774
|
}
|
|
330
775
|
};
|
|
331
776
|
|
|
332
|
-
await runBackground(requestCtx,
|
|
777
|
+
await runBackground(requestCtx, finalizeAndWrite, true);
|
|
333
778
|
|
|
334
779
|
return result;
|
|
335
780
|
};
|