@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
|
@@ -0,0 +1,844 @@
|
|
|
1
|
+
# Rango compared to Next.js, TanStack Start, and Waku
|
|
2
|
+
|
|
3
|
+
If you are choosing a React framework and trying to place Rango on the map, start
|
|
4
|
+
here. This doc compares Rango against the three frameworks people most often weigh
|
|
5
|
+
it against, and it compares them on **capabilities and design** — the things that
|
|
6
|
+
stay true regardless of how old each project is. Where another framework leads
|
|
7
|
+
(ecosystem, integrations, hiring pool), this doc says so plainly; a comparison
|
|
8
|
+
that only lists wins is not useful to anyone making a real decision.
|
|
9
|
+
|
|
10
|
+
A note on naming: identifiers below (`urls()`, `revalidate()`, `createLoader`,
|
|
11
|
+
`prefetch`, `debugPerformance`, the `rango.*` spans, …) are the actual public API,
|
|
12
|
+
so you can grep for them. Numbers (bundle sizes, gating timeouts) are the measured
|
|
13
|
+
or coded values, not estimates.
|
|
14
|
+
|
|
15
|
+
## Contents
|
|
16
|
+
|
|
17
|
+
- [TL;DR](#tldr) and [at a glance](#at-a-glance)
|
|
18
|
+
- [Where Rango's design leads](#where-rangos-design-leads)
|
|
19
|
+
- [Runtime mechanics in depth](#runtime-mechanics-in-depth)
|
|
20
|
+
- [The loader as a new primitive](#the-loader-is-a-genuinely-new-primitive)
|
|
21
|
+
- [Tainted request context](#tainted-request-context-cache-safety-is-integrated)
|
|
22
|
+
- [Performance diagnostics](#performance-diagnostics-debugperformance)
|
|
23
|
+
- [Framework-specific perspective](#coming-from-a-specific-framework)
|
|
24
|
+
- [Where the others still lead](#where-the-others-still-lead)
|
|
25
|
+
- [Bottom line](#bottom-line)
|
|
26
|
+
|
|
27
|
+
## TL;DR
|
|
28
|
+
|
|
29
|
+
Rango is **RSC-first on Vite** (like Waku) but **batteries-included** (like
|
|
30
|
+
Next.js), with **type-safe, code-defined routing** (competing with TanStack
|
|
31
|
+
Start), a **composable graph of named render slots**, and a **single unified
|
|
32
|
+
caching/prerender model**. It is the only one of the four that combines
|
|
33
|
+
programmable RSC partial rendering, request-aware prefetch correctness, tainted
|
|
34
|
+
request-context guards, portable deployment-skew recovery, a server-phase
|
|
35
|
+
performance waterfall, and a public RSC/server testing harness. Its **loader** is
|
|
36
|
+
a genuinely new primitive rather than a renamed Remix/TanStack loader (see
|
|
37
|
+
[The loader is a genuinely new primitive](#the-loader-is-a-genuinely-new-primitive)).
|
|
38
|
+
|
|
39
|
+
The practical advantage is range: a Rango application can begin as one route and
|
|
40
|
+
one component, then gain type-safe links, live data, caching, partial rendering,
|
|
41
|
+
and multi-region composition without replacing its routing or data model.
|
|
42
|
+
|
|
43
|
+
## At a glance
|
|
44
|
+
|
|
45
|
+
| Dimension | **Rango** | Next.js (App Router) | TanStack Start | Waku |
|
|
46
|
+
| ----------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
|
|
47
|
+
| Routing model | Code DSL (`urls()`/`include()`), named + `reverse()` | File-system convention | File or code, type-first | File-system (+ `createPages`) |
|
|
48
|
+
| Foundation | Vite + plugin-rsc | Turbopack (default in 16; Webpack opt-in) | [Vite or Rsbuild](https://tanstack.com/start/latest/docs/framework/react/overview) | Vite + plugin-rsc |
|
|
49
|
+
| RSC model | RSC-first | RSC-first | SSR/client-first; RSC opt-in (experimental) | RSC-first |
|
|
50
|
+
| Type-safe routes/params | Generated names, params, search, `reverse()`, response MIME | Stable typed links; route-local param types | Best-in-class | Typed path params |
|
|
51
|
+
| Client render selection | Per-segment/loader `revalidate()` policy; typed action and result matching | Automatic segment reuse; refresh/invalidation APIs | Match/loader reload policy | Route refetch/reload |
|
|
52
|
+
| Slots and intercepts | Code-defined named slots with their own loaders/policy; conditional alternate soft-navigation compositions | File-system `@slot` + intercept conventions | Route masking, no parallel RSC slot graph | No equivalent route-slot graph |
|
|
53
|
+
| Caching | One segment store = runtime + build-time + `"use cache"`, tags, SWR | Cache Components plus distinct server/client cache lifecycles | Router loader cache + Query integration + HTTP/CDN policy | Minimal |
|
|
54
|
+
| Request/cache safety | Tainted request contexts, non-cacheable typed vars, guarded effects | Runtime APIs isolated from `"use cache"`; optional React client-boundary taint | Application policy | Application policy |
|
|
55
|
+
| Prerender | Build-time cache; worker serves every request; per-param `Passthrough()` | SSG/ISR + Cache Components/PPR | Static prerender + HTTP/CDN ISR patterns | Static prerender |
|
|
56
|
+
| No-JS parity | First-class, tested (semantic matrix) | Forms/Server Actions supported; no parity harness | Server functions support forms; no parity harness | Server Actions/forms; no parity harness |
|
|
57
|
+
| Middleware | Global + segment-scoped subtree | Single root Proxy (matcher filters paths); no subtree scope | Request/server-function middleware | [Hono middleware + handler interceptors](https://waku.gg/#interceptors) |
|
|
58
|
+
| Observability | Built-in CF + Vercel OTel phase spans, `Server-Timing`, perf waterfall | Built-in OTel spans; no equivalent router-phase waterfall | Client/data devtools | No equivalent built-in phase model |
|
|
59
|
+
| Deploy targets | Node, Cloudflare, Vercel — all with presets | Node/Vercel first; other platforms through adapters | Broad Vite/Rsbuild runtime support | Node plus adapters |
|
|
60
|
+
| Deployment skew | Automatic build-version handshake for navigation, prefetch, and actions; safe reload on mismatch | `deploymentId` mismatch reload; Vercel can pin clients to an immutable deploy | Application/platform policy | Build-id mismatch reload (v1.0-beta) |
|
|
61
|
+
| Multi-tenant | `createHostRouter()` built-in | Roll your own | Roll your own | Roll your own |
|
|
62
|
+
| Testing primitives | Ships `@rangojs/router/testing` (handlers/loaders/mw/Flight/e2e) | No comparable handler/Flight primitives | Documented patterns; no shipped utils | No comparable handler/Flight primitives |
|
|
63
|
+
| Client runtime | ~50 KB Rango + ~115 KB React/RSC, per-route chunks | Configuration-dependent | Configuration-dependent | Deliberately light |
|
|
64
|
+
| Ecosystem | Smaller | Largest | Growing | Small |
|
|
65
|
+
|
|
66
|
+
The rest of this doc unpacks the rows where the design difference is substantive.
|
|
67
|
+
|
|
68
|
+
## Where Rango's design leads
|
|
69
|
+
|
|
70
|
+
### Start simple; grow without changing models
|
|
71
|
+
|
|
72
|
+
Rango's advanced features are not setup requirements. The smallest useful app is
|
|
73
|
+
still a route tree and a component:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
const router = createRouter().routes(({ path }) => [
|
|
77
|
+
path("/", HomePage, { name: "home" }),
|
|
78
|
+
]);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
As the application grows, each requirement adds one local primitive to that same
|
|
82
|
+
tree:
|
|
83
|
+
|
|
84
|
+
| When you need to… | Add… |
|
|
85
|
+
| ------------------------------------------ | --------------------------------- |
|
|
86
|
+
| make navigation refactor-safe | a route `name` and `reverse()` |
|
|
87
|
+
| split the application into modules | `urls()` and `include()` |
|
|
88
|
+
| keep request data live beneath cached UI | `loader()` |
|
|
89
|
+
| cache or prerender a shared shell | `cache()` or `Prerender()` |
|
|
90
|
+
| choose what updates after an action | `revalidate()` |
|
|
91
|
+
| render independent regions | `parallel()` and named slots |
|
|
92
|
+
| open a route as a modal on soft navigation | `intercept()` |
|
|
93
|
+
| inspect where request time went | `debugPerformance` or `telemetry` |
|
|
94
|
+
|
|
95
|
+
Nothing in the first route requires learning the last row. More importantly, the
|
|
96
|
+
last row does not force a migration to a second router, client data library, or
|
|
97
|
+
static-versus-dynamic application mode. The source-visible route tree remains the
|
|
98
|
+
organizing model from the first page to the complex application.
|
|
99
|
+
|
|
100
|
+
### AI makes a coherent growth path more valuable
|
|
101
|
+
|
|
102
|
+
AI-assisted development lowers the cost of adding a feature; it does not lower the
|
|
103
|
+
cost of understanding how routing, data, caching, rendering, and invalidation
|
|
104
|
+
interact afterward. A tool that is pleasant for the first generated page but needs
|
|
105
|
+
several unrelated systems as the application grows gives both the developer and the
|
|
106
|
+
agent a fragmented model to reason about.
|
|
107
|
+
|
|
108
|
+
Rango is useful to one developer out of the box, then scales by adding declarations
|
|
109
|
+
to the same route graph. An agent can inspect `urls()` to find route ownership and
|
|
110
|
+
shared policy, follow generated names instead of guessing paths, and use the shipped
|
|
111
|
+
testing primitives and performance timeline as machine-verifiable feedback. Adding
|
|
112
|
+
authentication, live data, a cached shell, a modal route, or targeted post-action
|
|
113
|
+
updates extends the existing model rather than introducing another router, data
|
|
114
|
+
library, cache vocabulary, or observability layer.
|
|
115
|
+
|
|
116
|
+
That does not make application complexity disappear. It keeps the complexity
|
|
117
|
+
explicit, colocated, and testable—the properties that matter when code can be
|
|
118
|
+
produced faster than a person can manually reconstruct its architecture.
|
|
119
|
+
|
|
120
|
+
### Routes are expressed, and behavior composes around them
|
|
121
|
+
|
|
122
|
+
Rango makes the route graph readable from source. You do not have to reconstruct
|
|
123
|
+
it from directory topology or infer behavior from a collection of specially named
|
|
124
|
+
route, layout, loading, error, and middleware files. Reading a `urls()` tree from
|
|
125
|
+
top to bottom shows which URLs exist, which handlers own them, how modules mount,
|
|
126
|
+
and where shared concerns apply.
|
|
127
|
+
|
|
128
|
+
This does not mean keeping the application in one file. Route handlers, layouts,
|
|
129
|
+
and reusable policy can live in separate modules; `include()` makes those module
|
|
130
|
+
boundaries explicit. The distinction is that the composition returns to one
|
|
131
|
+
declared tree. Middleware, loaders, caching, loading/error policy, revalidation,
|
|
132
|
+
parallel slots, and intercepts appear beside the structure they affect instead of
|
|
133
|
+
being implied by file placement.
|
|
134
|
+
|
|
135
|
+
Rango separates **structure** from **configuration**. `path()` and `include()`
|
|
136
|
+
define which URLs exist, so they stay visible in the `urls()` tree. Middleware,
|
|
137
|
+
loaders, caching, loading/error policy, revalidation, parallels, and intercepts
|
|
138
|
+
configure a node, so they can be imported or composed through small factories:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
const withAccountPolicy = () => [
|
|
142
|
+
middleware(requireUser),
|
|
143
|
+
revalidate((ctx) => ctx.isAction(AccountActions) || undefined),
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
const accountPatterns = urls(({ path }) => [
|
|
147
|
+
path("/orders/:id", OrderPage, { name: "order" }, () => [
|
|
148
|
+
withAccountPolicy(),
|
|
149
|
+
loader(OrderLoader),
|
|
150
|
+
]),
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
urls(({ include }) => [
|
|
154
|
+
include("/account", accountPatterns, { name: "account" }),
|
|
155
|
+
]);
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The composition site still answers which URLs exist and who owns them. The
|
|
159
|
+
included module keeps local names while the mount creates stable scoped identities
|
|
160
|
+
such as `account.order`. Consumers navigate by those identities:
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
ctx.reverse("account.order", { id: order.id });
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Moving the route to a different path does not require updating every caller.
|
|
167
|
+
Generated route maps carry required/optional params, search schemas, route names,
|
|
168
|
+
loader returns, and response-route MIME payloads through server and client APIs.
|
|
169
|
+
The same tree can expose typed `path.json()`, `.text()`, `.html()`, `.xml()`,
|
|
170
|
+
`.image()`, `.stream()`, and `.any()` endpoints, including content negotiation,
|
|
171
|
+
SSE, and WebSocket upgrades, without introducing a second API-routing model.
|
|
172
|
+
|
|
173
|
+
Next.js now has stable typed links, but the URL and composition hierarchy remain
|
|
174
|
+
filesystem identities. TanStack Router is the strongest peer on inferred route and
|
|
175
|
+
search-param types; Rango's distinction is Django-style named reversal and module
|
|
176
|
+
mounting in an RSC server route tree. Waku types path parameters but exposes a much
|
|
177
|
+
smaller route-identity surface. See the [Rango overview](../../rango/SKILL.md).
|
|
178
|
+
|
|
179
|
+
### One caching model, and prerender is part of it
|
|
180
|
+
|
|
181
|
+
This is the largest architectural difference from Next.js. Rango unifies three
|
|
182
|
+
things under one `SegmentCacheStore` abstraction: the runtime segment cache
|
|
183
|
+
(`cache({ ttl, swr, tags })`), the `"use cache"` directive, and **pre-rendering**.
|
|
184
|
+
They share one mental model, one tag-invalidation API (`cacheTag` / `revalidateTag`
|
|
185
|
+
/ `updateTag`), and one SWR behavior.
|
|
186
|
+
|
|
187
|
+
The guiding principle is that **pre-rendering is just build-time caching**. There
|
|
188
|
+
are no static `.html`/`.rsc` files served from a CDN bucket — the worker handles
|
|
189
|
+
every request and either replays a stored Flight payload (a cache or prerender
|
|
190
|
+
hit) or renders live. The browser cannot tell which happened.
|
|
191
|
+
|
|
192
|
+
Next.js's
|
|
193
|
+
[Cache Components](https://nextjs.org/docs/app/getting-started/caching)
|
|
194
|
+
model (stable opt-in `cacheComponents: true` in Next 16) is powerful, but server
|
|
195
|
+
data/output lifetimes and the client router cache still follow distinct rules
|
|
196
|
+
(one `cacheLife` profile can now span both). TanStack Router has its own loader
|
|
197
|
+
cache and integrates
|
|
198
|
+
deeply with Query when an application wants a richer data cache; HTTP/CDN policy
|
|
199
|
+
remains another layer. Waku keeps caching minimal. Rango's bet is that one model
|
|
200
|
+
for "cached, `use cache`, and prerendered" is easier to hold in your head than
|
|
201
|
+
several cooperating caches.
|
|
202
|
+
|
|
203
|
+
### `Passthrough()`: prerender the common case, live-render the rest
|
|
204
|
+
|
|
205
|
+
A prerender handler can decide, **per param set**, whether to bake an artifact or
|
|
206
|
+
defer: `return ctx.passthrough()` falls through to the live handler at runtime. So
|
|
207
|
+
you statically generate your top 1,000 products and serve the long tail
|
|
208
|
+
dynamically, from one definition. Next.js approximates this with
|
|
209
|
+
`generateStaticParams` + `dynamicParams`, but that is two separate knobs rather
|
|
210
|
+
than one decision point inside your handler. See
|
|
211
|
+
[prerender-api-design.md](../../../docs/prerender-api-design.md).
|
|
212
|
+
|
|
213
|
+
### Progressive enhancement is a tested contract
|
|
214
|
+
|
|
215
|
+
Forms and server actions work with JavaScript disabled: a form POST runs the
|
|
216
|
+
action on the server, re-renders the affected segments, and returns HTML. The
|
|
217
|
+
JS and no-JS paths are held to a parity contract that is **encoded as a test** —
|
|
218
|
+
the semantic matrix (`e2e/semantic-matrix.test.ts`) pins middleware scope,
|
|
219
|
+
handler-first ordering, context visibility, and PE/JS parity. The other frameworks
|
|
220
|
+
have progressively enhanced form or server-function paths in different forms; the
|
|
221
|
+
distinction is that Rango ships parity helpers and keeps the contract under an
|
|
222
|
+
explicit semantic matrix rather than leaving parity to each application.
|
|
223
|
+
|
|
224
|
+
### CSP nonce plumbing is integrated
|
|
225
|
+
|
|
226
|
+
Strict Content Security Policy often fails at framework-owned inline scripts: the
|
|
227
|
+
application can generate a nonce, but every SSR, hydration, and streaming path has
|
|
228
|
+
to carry it consistently. Rango makes that propagation part of the request model.
|
|
229
|
+
Set `nonce: () => true` to generate a fresh cryptographic nonce per request, or
|
|
230
|
+
return an application-provided value from `nonce(request, env)`.
|
|
231
|
+
|
|
232
|
+
The resolved nonce is applied to the inline scripts that carry the RSC payload into
|
|
233
|
+
the HTML stream and is available during SSR through `useNonce()`. Document-rendered
|
|
234
|
+
scripts pushed through the typed `Script` handle receive it automatically. For
|
|
235
|
+
custom policy middleware, the same value is available as a typed context token:
|
|
236
|
+
|
|
237
|
+
```tsx
|
|
238
|
+
import { nonce, type Middleware } from "@rangojs/router";
|
|
239
|
+
|
|
240
|
+
const csp: Middleware = async (ctx, next) => {
|
|
241
|
+
await next();
|
|
242
|
+
const value = ctx.get(nonce);
|
|
243
|
+
if (value && ctx.headers.get("content-type")?.includes("text/html")) {
|
|
244
|
+
ctx.header(
|
|
245
|
+
"Content-Security-Policy",
|
|
246
|
+
`default-src 'self'; script-src 'self' 'nonce-${value}' 'strict-dynamic'`,
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Rango deliberately does not serialize the nonce into the hydrated browser, where
|
|
253
|
+
exposing it would weaken the policy. Consequently, an async script first discovered
|
|
254
|
+
on a soft navigation is client-injected without a nonce; use the recommended
|
|
255
|
+
`'strict-dynamic'` policy or allow its host. The application still owns the CSP
|
|
256
|
+
directives and reporting policy. What Rango supplies is the easy-to-miss framework
|
|
257
|
+
plumbing, including a CSP example and e2e coverage for hydration, navigation, and
|
|
258
|
+
Server Actions.
|
|
259
|
+
|
|
260
|
+
### Framework mutation channels have default CSRF protection
|
|
261
|
+
|
|
262
|
+
`originCheck` is enabled by default. Before executing a Server Action, fetchable
|
|
263
|
+
loader request, or progressively enhanced form submission, Rango compares the
|
|
264
|
+
browser's `Origin` header—or `Referer` as a fallback—with the request protocol and
|
|
265
|
+
`Host`. A mismatch, `Origin: null`, or an origin-bearing request with no trustworthy
|
|
266
|
+
`Host` fails closed with `403`. The rejection also reaches `onError` and telemetry
|
|
267
|
+
as an origin-check event.
|
|
268
|
+
|
|
269
|
+
The default deliberately ignores `X-Forwarded-Host` and `X-Forwarded-Proto`; those
|
|
270
|
+
headers are unsafe unless a trusted proxy strips user-provided values. Applications
|
|
271
|
+
behind a non-standard proxy can provide an `originCheck(ctx)` callback with access
|
|
272
|
+
to the request, environment, router id, request phase, and `defaultCheck()`. The
|
|
273
|
+
callback can allow, reject, or return a custom `Response`; `originCheck: false` is
|
|
274
|
+
the explicit opt-out.
|
|
275
|
+
|
|
276
|
+
This is framework-level CSRF protection, not a universal synchronizer-token system.
|
|
277
|
+
Requests with neither `Origin` nor `Referer` remain available to non-browser clients,
|
|
278
|
+
and ordinary response routes or custom API handlers are outside this automatic gate.
|
|
279
|
+
Protect those endpoints with authentication, route middleware, and a token or custom
|
|
280
|
+
origin policy when their threat model requires it. The useful default is that
|
|
281
|
+
Rango's own mutation transports do not begin unguarded, and the JS and no-JS form
|
|
282
|
+
paths pass through the same check.
|
|
283
|
+
|
|
284
|
+
### A deterministic execution model
|
|
285
|
+
|
|
286
|
+
The router gives you guarantees most file-based routers leave implicit:
|
|
287
|
+
|
|
288
|
+
- **Handler-first ordering** — a route's handler runs before its child layouts,
|
|
289
|
+
orphan layouts, and parallel slots in the same render pass, so a handler can set
|
|
290
|
+
context that children read.
|
|
291
|
+
- **Two clear middleware scopes** — request-level (`router.use()`) versus
|
|
292
|
+
**segment-scoped subtree** middleware, which is more granular than Next's single
|
|
293
|
+
root [`proxy.ts`](https://nextjs.org/docs/app/api-reference/file-conventions/proxy):
|
|
294
|
+
its `matcher` filters which paths the one Proxy runs on, but there is no
|
|
295
|
+
per-segment subtree middleware.
|
|
296
|
+
- **Structural context visibility** — `ctx.set()`/`ctx.get()` flow down the tree
|
|
297
|
+
only; parallel siblings do not bleed into each other.
|
|
298
|
+
- **Dev/prod matching parity** — one trie is used in both dev and production, so
|
|
299
|
+
matching cannot drift between them. See
|
|
300
|
+
[matching-and-lazy-discovery.md](../../../docs/internal/matching-and-lazy-discovery.md)
|
|
301
|
+
and [execution-model.md](../../../docs/internal/execution-model.md).
|
|
302
|
+
|
|
303
|
+
### Observability you do not wire yourself
|
|
304
|
+
|
|
305
|
+
`createCloudflareTracing()` and `createVercelTracing()` emit nested phase spans out
|
|
306
|
+
of the box — `rango.request`, `rango.middleware`, `rango.action`, `rango.loader`,
|
|
307
|
+
`rango.handler`, `rango.render`, `rango.ssr` — that nest under the platform's own
|
|
308
|
+
KV/D1/fetch spans. The same instrumentation site also powers `debugPerformance`
|
|
309
|
+
(see [the diagnostics section](#performance-diagnostics-debugperformance) below).
|
|
310
|
+
Next.js also ships automatic OTel instrumentation; Rango's distinction is that the
|
|
311
|
+
same router-owned phase registry drives its traces, local waterfall, and
|
|
312
|
+
`Server-Timing` output. TanStack's strength is client/data devtools; Waku does not
|
|
313
|
+
ship an equivalent request-phase model. See
|
|
314
|
+
[telemetry.md](../../../docs/telemetry.md).
|
|
315
|
+
|
|
316
|
+
### Deploy to Node, Cloudflare, and Vercel — and host many apps behind one entry
|
|
317
|
+
|
|
318
|
+
Three presets, each with its own cache store: `CFCacheStore` (Cloudflare KV, L1+L2),
|
|
319
|
+
`VercelCacheStore` (Vercel Runtime Cache, Node runtime), and
|
|
320
|
+
`MemorySegmentCacheStore`. Next.js self-hosts on Node/Docker with all features
|
|
321
|
+
first-class, and now ships an official Deployment Adapters API (`adapterPath`,
|
|
322
|
+
with verified adapters — Vercel and Bun today, Cloudflare and Netlify building on
|
|
323
|
+
it) for other platforms; the difference is that Rango owns its Cloudflare and
|
|
324
|
+
Vercel presets directly and was designed for the edge-worker model from the start.
|
|
325
|
+
|
|
326
|
+
On top of that, `createHostRouter()` routes by domain/subdomain to independent
|
|
327
|
+
sub-apps (each its own `createRouter()` with its own route map and cache store),
|
|
328
|
+
lazy-loaded by dynamic import. The optional `defineHosts()` helper freezes a named
|
|
329
|
+
map of reusable host patterns and preserves its exact TypeScript keys; it does not
|
|
330
|
+
perform routing itself. None of the other three offer multi-tenancy as a
|
|
331
|
+
first-class primitive.
|
|
332
|
+
|
|
333
|
+
### Deployment skew is detected before stale code executes
|
|
334
|
+
|
|
335
|
+
The Vite plugin generates a build version and injects it into the RSC handler and
|
|
336
|
+
initial payload. The browser returns that version on every partial navigation,
|
|
337
|
+
prefetch, and Server Action. If an old tab reaches a newer server, request
|
|
338
|
+
classification detects the mismatch before resolving the route or executing the
|
|
339
|
+
action and responds with `X-RSC-Reload`. The browser then performs a clean document
|
|
340
|
+
navigation instead of trying to decode new Flight with an old client or invoking a
|
|
341
|
+
stale action identifier. Even a route removed by the new build reloads rather than
|
|
342
|
+
falling through to a misleading 404.
|
|
343
|
+
|
|
344
|
+
The protection covers fresh, completed-prefetch, and in-flight-prefetch responses.
|
|
345
|
+
For action requests, the reload returns to the same-origin referrer rather than the
|
|
346
|
+
internal action URL. The cache side follows the same correctness rule:
|
|
347
|
+
`CFCacheStore` automatically versions its physical Cache API and KV keys, so a new
|
|
348
|
+
build cannot replay Flight containing an old component shape or dead client-chunk
|
|
349
|
+
reference. `VercelCacheStore` exposes the same version segmentation, but — unlike
|
|
350
|
+
`CFCacheStore` — does not default `version` to the build version: skew safety is
|
|
351
|
+
opt-in via the `version` option or the recommended deployment-specific Runtime
|
|
352
|
+
Cache namespace. The browser's Rango state also includes
|
|
353
|
+
the build version, rotating HTTP and in-memory prefetch cache identity on boot.
|
|
354
|
+
|
|
355
|
+
Next.js deserves explicit credit here: its
|
|
356
|
+
[`deploymentId`](https://nextjs.org/docs/app/api-reference/config/next-config-js/deploymentId)
|
|
357
|
+
also detects navigation skew and forces a hard navigation, while
|
|
358
|
+
[Vercel Skew Protection](https://vercel.com/docs/skew-protection) can route an old
|
|
359
|
+
client back to its original immutable deployment. Waku (v1.0-beta) also ships a
|
|
360
|
+
framework-owned build-id handshake now — a build id in every RSC payload, a reload
|
|
361
|
+
on mismatch, overridable via `onBuildIdMismatch`. Rango's distinction is the
|
|
362
|
+
breadth of one automatic handshake across its Node, Cloudflare, and Vercel presets,
|
|
363
|
+
integrated with RSC navigation, prefetch, actions, and its cache-key versioning.
|
|
364
|
+
Rango's recovery is reload-based; it does not claim Vercel's stronger
|
|
365
|
+
old-deployment request pinning.
|
|
366
|
+
|
|
367
|
+
### A shipped testing harness for server code
|
|
368
|
+
|
|
369
|
+
The `@rangojs/router/testing/*` entry points give you `runLoader`,
|
|
370
|
+
`runMiddleware`, `dispatch` (base `./testing`), `renderHandler` and real Flight
|
|
371
|
+
rendering (`renderServerTree`, `findClientBoundaries`, `findElements`) from
|
|
372
|
+
`./testing/flight`, `renderRoute` from `./testing/dom`, and a Playwright e2e
|
|
373
|
+
harness with dev/prod parity helpers (`parityDescribe`, `expectParity`) from
|
|
374
|
+
`./testing/e2e`. You can unit-test a loader, a middleware, or an RSC handler in
|
|
375
|
+
isolation. Next.js and Waku ship no official primitives for testing server
|
|
376
|
+
components/handlers; TanStack documents testing patterns (build your own harness
|
|
377
|
+
from `createRouter`/`createMemoryHistory`) but ships no testing package, and
|
|
378
|
+
nothing at the RSC-handler level. See [testing.md](../../../docs/testing.md).
|
|
379
|
+
|
|
380
|
+
### Bundle discipline
|
|
381
|
+
|
|
382
|
+
The Rango client runtime baseline is ~50 KB gzip; the React + RSC client baseline
|
|
383
|
+
is ~115 KB gzip (react-dom 96K + react 5K + rsd-webpack-client 12K + scheduler 3K).
|
|
384
|
+
Per-route client chunks are the default (`clientChunks`), and a build guard fails
|
|
385
|
+
the build if React's development bundle leaks into production. Treat those as
|
|
386
|
+
Rango baselines, not a normalized cross-framework benchmark: application shape,
|
|
387
|
+
React version, compiler output, and deployment transforms make headline bundle
|
|
388
|
+
comparisons unreliable. Waku deliberately targets a smaller surface. See
|
|
389
|
+
[client-chunking.md](../../../docs/client-chunking.md).
|
|
390
|
+
|
|
391
|
+
## Runtime mechanics in depth
|
|
392
|
+
|
|
393
|
+
The sections above are architecture. The sections below are the runtime mechanics
|
|
394
|
+
where Rango exposes unusually fine control.
|
|
395
|
+
|
|
396
|
+
### Partial rendering (segment diffing)
|
|
397
|
+
|
|
398
|
+
Every `layout()`, route, `loading()` skeleton, and `parallel()` slot is its own
|
|
399
|
+
_segment_ with a server-assigned stable `id`. On navigation the server returns
|
|
400
|
+
`metadata.isPartial`, `metadata.matched[]` (all destination segments), and
|
|
401
|
+
`metadata.diff[]` (only the segments that changed). The client:
|
|
402
|
+
|
|
403
|
+
- **`diff` empty** — commits cached segments with no re-render. DOM, component
|
|
404
|
+
instances, scroll, and local state are preserved exactly.
|
|
405
|
+
- **`diff` non-empty** — swaps only the changed segments, keyed by the stable `id`
|
|
406
|
+
so React reconciles instead of remounting. Unchanged ancestors and the other
|
|
407
|
+
parallel slots come from cache untouched.
|
|
408
|
+
- **fallback** — a non-partial response triggers a full document re-render.
|
|
409
|
+
|
|
410
|
+
Next.js's App Router also does segment-aware partial rendering; the difference is
|
|
411
|
+
that Rango's diff is explicit and inspectable, is coupled to the `revalidate()`
|
|
412
|
+
control surface below, and the same path serves the no-JS render. TanStack does
|
|
413
|
+
fine-grained nested re-rendering but client-side, not as RSC Flight diffs; Waku's
|
|
414
|
+
RSC refetch is coarser.
|
|
415
|
+
|
|
416
|
+
### Named slots: composition is part of the render model
|
|
417
|
+
|
|
418
|
+
Nested routes give you one outlet. Real applications usually have more than one
|
|
419
|
+
independently changing region: main content, navigation, cart, notifications,
|
|
420
|
+
metadata, and modal surfaces. Rango makes those regions named server-rendered
|
|
421
|
+
slots rather than layout props assembled by hand:
|
|
422
|
+
|
|
423
|
+
```tsx
|
|
424
|
+
function ShopLayout() {
|
|
425
|
+
return (
|
|
426
|
+
<>
|
|
427
|
+
<ParallelOutlet name="@banner" />
|
|
428
|
+
<ParallelOutlet name="@sidebar" />
|
|
429
|
+
<Outlet />
|
|
430
|
+
<ParallelOutlet name="@modal" />
|
|
431
|
+
</>
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
layout(<ShopLayout />, () => [
|
|
436
|
+
parallel({
|
|
437
|
+
"@banner": CampaignBanner,
|
|
438
|
+
"@sidebar": ProductFilters,
|
|
439
|
+
}),
|
|
440
|
+
path("/products", ProductList, { name: "products" }),
|
|
441
|
+
]);
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
The layout owns placement; the route composition owns what fills each slot. A
|
|
445
|
+
slot handler can carry reusable defaults through `handler.use`: loaders,
|
|
446
|
+
`loading()`, revalidation, and error/not-found boundaries.
|
|
447
|
+
The mount can broadcast configuration to all slots or refine one slot with a
|
|
448
|
+
slot-local descriptor. Merge order is explicit: handler defaults, shared mount
|
|
449
|
+
configuration, then slot-local configuration.
|
|
450
|
+
|
|
451
|
+
With `loading()`, a parallel slot is an independent streaming unit: its loader
|
|
452
|
+
can resolve behind its own skeleton without blocking the default outlet, parent
|
|
453
|
+
layout, or sibling slots. Without `loading()`, its loader deliberately blocks the
|
|
454
|
+
parent when that data is required before paint. Handler-first ordering also means
|
|
455
|
+
the slot can read context produced by its owning route or layout in the same full
|
|
456
|
+
render pass.
|
|
457
|
+
|
|
458
|
+
Slots are composition points, not just concurrency syntax. The last definition of
|
|
459
|
+
a given slot name wins while unrelated earlier slots remain, so an application can
|
|
460
|
+
provide defaults and a narrower feature composition can replace only `@sidebar`.
|
|
461
|
+
A UI-less slot can push typed handles such as metadata, scripts, or breadcrumbs,
|
|
462
|
+
keeping render output extensible without coupling it to the main handler.
|
|
463
|
+
|
|
464
|
+
Next.js has capable parallel routes, but `@folder`, `default.tsx`, intercept
|
|
465
|
+
markers, and layout props encode them in filesystem topology. Rango exposes the
|
|
466
|
+
same class of UI as code-level values with handler defaults, per-mount policy,
|
|
467
|
+
streaming control, and deterministic override semantics. TanStack route masking
|
|
468
|
+
can model modal URLs but does not create a parallel RSC slot graph; Waku slices are
|
|
469
|
+
[reusable components with their own static or dynamic render mode](https://waku.gg/#slices),
|
|
470
|
+
not route-owned slots with independent revalidation. See the
|
|
471
|
+
[parallel route guide](../../parallel/SKILL.md).
|
|
472
|
+
|
|
473
|
+
### Intercepts: alternate compositions for the same canonical route
|
|
474
|
+
|
|
475
|
+
An intercept says that a named target route should render a different composition
|
|
476
|
+
into a slot during eligible soft navigation:
|
|
477
|
+
|
|
478
|
+
```tsx
|
|
479
|
+
layout(<ShopLayout />, () => [
|
|
480
|
+
intercept(
|
|
481
|
+
"@modal",
|
|
482
|
+
"product.detail",
|
|
483
|
+
ProductQuickView,
|
|
484
|
+
{ when: ({ from }) => from.pathname === "/products" },
|
|
485
|
+
() => [
|
|
486
|
+
loader(ProductLoader),
|
|
487
|
+
loading(<QuickViewSkeleton />),
|
|
488
|
+
middleware(trackQuickView),
|
|
489
|
+
],
|
|
490
|
+
),
|
|
491
|
+
path("/products/:slug", ProductPage, { name: "product.detail" }),
|
|
492
|
+
]);
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
A click from the list renders `ProductQuickView` into `@modal` and preserves the
|
|
496
|
+
list behind it. A direct visit or reload renders the canonical full page. Back
|
|
497
|
+
closes the modal and restores the preserved background. The intercept can own its
|
|
498
|
+
middleware, layout, loaders, loading/error policy, loader-level caching, and
|
|
499
|
+
`revalidate()` rules; the `when` config selector (the 4th argument to
|
|
500
|
+
`intercept()`) can choose by navigation source.
|
|
501
|
+
|
|
502
|
+
This is integrated with the rest of the runtime rather than implemented as URL
|
|
503
|
+
masking plus local component state. Intercepts get source-scoped prefetch entries
|
|
504
|
+
so a modal Flight payload cannot leak into direct navigation. A prerendered target
|
|
505
|
+
can store a separate intercept variant while its loaders still run live at
|
|
506
|
+
request time. An action can revalidate the open intercept without remounting its
|
|
507
|
+
subtree or forcing the preserved background to render. See the
|
|
508
|
+
[intercept guide](../../intercept/SKILL.md).
|
|
509
|
+
|
|
510
|
+
### `revalidate()`: declarative control over what re-renders
|
|
511
|
+
|
|
512
|
+
There are two distinct things named "revalidate", and the split is deliberate:
|
|
513
|
+
|
|
514
|
+
1. **`revalidate(fn)` DSL predicate** — attached per segment (route, layout,
|
|
515
|
+
parallel, loader). It receives a rich arg object including `currentParams`,
|
|
516
|
+
`nextParams`, `currentUrl`, `nextUrl`, `defaultShouldRevalidate`, `segmentType`,
|
|
517
|
+
`actionId`, **`isAction(...refs)`** (typed, rename-safe action matching — you
|
|
518
|
+
pass the imported action, not a string), `actionResult`, `formData`, `method`,
|
|
519
|
+
and `stale`. Return `true`/`false` to re-render or keep the client's current
|
|
520
|
+
segment, or `{ defaultShouldRevalidate }` to change the suggestion seen by
|
|
521
|
+
downstream revalidators in the same decision chain. This is surgical
|
|
522
|
+
post-action control: "this widget re-renders only when `addToCart` ran; the
|
|
523
|
+
rest of the tree stays put."
|
|
524
|
+
See [is-action-api-design.md](../../../docs/design/is-action-api-design.md).
|
|
525
|
+
2. **`revalidate: false` on `<Link>` / `navigate()`** — shallow navigation. When
|
|
526
|
+
the pathname is unchanged (a search or hash change), it updates the URL and all
|
|
527
|
+
location hooks but skips the server fetch and re-render entirely. For filters,
|
|
528
|
+
tabs, and pagination. See
|
|
529
|
+
[shallow-navigation.md](../../../docs/design/shallow-navigation.md).
|
|
530
|
+
|
|
531
|
+
Both are separate from `revalidateTag()`/`updateTag()`, which hard-purge tagged
|
|
532
|
+
cache entries. `updateTag()` is awaitable for read-your-own-writes;
|
|
533
|
+
`revalidateTag()` schedules the same invalidation in the background. Neither API
|
|
534
|
+
selects a client segment to render. Next.js offers `router.refresh()` (and
|
|
535
|
+
`refresh()` from `next/cache`) plus path/tag cache invalidation, but no per-segment
|
|
536
|
+
render predicate and no typed action discrimination — and its invalidations clear
|
|
537
|
+
the whole client cache rather than selecting a segment. TanStack's `shouldReload`/`router.invalidate()` is the nearest
|
|
538
|
+
analog but operates on loader/query reload, not RSC-segment render.
|
|
539
|
+
|
|
540
|
+
### Prefetching: stability and control
|
|
541
|
+
|
|
542
|
+
`<Link prefetch="hover|viewport|render|adaptive|none">` (default: the router's
|
|
543
|
+
`defaultPrefetch`, `"none"` in development and `"viewport"` in production), plus
|
|
544
|
+
`prefetchKey` (`":source"` scopes a prefetch to the originating page for routes
|
|
545
|
+
whose response branches on `currentUrl`). Intercepted plain `<a href>` elements
|
|
546
|
+
inside the router basename follow the same default; common static-resource
|
|
547
|
+
extensions are excluded unless `data-prefetch="true"` identifies an application
|
|
548
|
+
route, and `data-prefetch="false"` or `"none"` opts out unsafe GET links. A
|
|
549
|
+
container with `data-prefetch-scope="false"` or `"none"` is a hard subtree boundary for both
|
|
550
|
+
Links and plain anchors, so one annotation suppresses speculative work for a
|
|
551
|
+
whole navigation section. The distinguishing part is the stability
|
|
552
|
+
gating: a queued prefetch (`viewport`/`render`) will not fire until **both** the
|
|
553
|
+
main thread is idle (`requestIdleCallback`, 200ms fallback) **and**
|
|
554
|
+
`waitForViewportImages()` resolves — in-viewport images that are not `.complete`
|
|
555
|
+
have loaded — or a 2s hard cap elapses. This keeps speculative fetches out of the
|
|
556
|
+
connection pool while critical above-the-fold images are still pending, without
|
|
557
|
+
letting a slow image stall prefetch indefinitely.
|
|
558
|
+
|
|
559
|
+
Other guarantees: a completed prefetch payload is eagerly decoded — importing its
|
|
560
|
+
client references before the click — and **reused verbatim on the real navigation**.
|
|
561
|
+
Navigation can adopt a still-in-flight destination prefetch instead of issuing a
|
|
562
|
+
duplicate request; it cancels queued work and aborts unrelated executing work.
|
|
563
|
+
Fetches run at `priority: "low"`, all prefetch paths have a 30s stall ceiling, and
|
|
564
|
+
the bounded cache uses a configurable TTL. `Save-Data`,
|
|
565
|
+
`prefers-reduced-data`, or `prefetchCacheTTL: false` disable speculation.
|
|
566
|
+
|
|
567
|
+
Correctness is part of the prefetch contract. Keys include Rango state, destination
|
|
568
|
+
URL, and the mounted segment set used to compute the diff. Server actions rotate
|
|
569
|
+
state and abort stale speculative work; a generation check prevents a late result
|
|
570
|
+
from repopulating an invalidated cache. Intercepts are automatically source-scoped,
|
|
571
|
+
and malformed, cross-origin, foreign-router, redirect, and reload responses are
|
|
572
|
+
dropped rather than warmed. `useLinkStatus()` exposes `{ pending }` for the owning
|
|
573
|
+
link.
|
|
574
|
+
|
|
575
|
+
**Rango State ties prefetch and client-cache invalidation together.** It is a
|
|
576
|
+
session-cookie value shaped as `{buildVersion}:{invalidationTimestamp}`. Navigation
|
|
577
|
+
and prefetch requests send it as `X-Rango-State`, and RSC responses vary on that
|
|
578
|
+
header, so the browser HTTP cache and Rango's decoded prefetch map share one cache
|
|
579
|
+
identity. A deployment changes the version; a mutation rotates the timestamp. Old
|
|
580
|
+
responses become unreachable under the retired identity instead of requiring every
|
|
581
|
+
cache layer to delete the same entries successfully.
|
|
582
|
+
|
|
583
|
+
Userland controls that rotation through `invalidateClientCache()`, imported from
|
|
584
|
+
`@rangojs/router` on either side of the RSC boundary. In the browser it immediately
|
|
585
|
+
marks history entries stale, flushes prefetches, rotates Rango State, and broadcasts
|
|
586
|
+
when cross-tab sync is enabled. Back/forward can still paint its cached entry and
|
|
587
|
+
then revalidate, giving stale-while-revalidate behavior instead of a destructive
|
|
588
|
+
clear. On the server, the same function rotates the responding client's state
|
|
589
|
+
cookie. Across those two seats, it covers mutations initiated outside the action
|
|
590
|
+
bridge: REST calls, client-observed WebSocket events, authentication changes, or
|
|
591
|
+
middleware/loader decisions.
|
|
592
|
+
|
|
593
|
+
Server Actions invalidate automatically after a response reaches the browser. If
|
|
594
|
+
an action knows it changed nothing that any route renders, `keepClientCache()` is
|
|
595
|
+
the explicit per-response escape hatch: it suppresses that automatic state
|
|
596
|
+
rotation, prefetch flush, broadcast, and revalidation fetch. Together,
|
|
597
|
+
`invalidateClientCache()` and `keepClientCache()` give application code control in
|
|
598
|
+
both directions — force a miss for mutations the router cannot observe, or preserve
|
|
599
|
+
the current state for a known no-op.
|
|
600
|
+
|
|
601
|
+
TanStack Router is the real peer here (`preload="intent|viewport|render"`,
|
|
602
|
+
`preloadDelay`, `preloadStaleTime`); Rango's edge is the resource-aware
|
|
603
|
+
idle + image-ready gating and RSC-payload reuse. Next has an internal prefetch
|
|
604
|
+
scheduler, but its public `<Link prefetch>` surface does not expose Rango's choice
|
|
605
|
+
of trigger and resource gates. Waku has manual route prefetching plus experimental
|
|
606
|
+
`unstable_prefetchOnEnter` / `unstable_prefetchOnView` Link triggers, but without
|
|
607
|
+
this resource-aware policy layer.
|
|
608
|
+
|
|
609
|
+
### Loaders, and tagged loading
|
|
610
|
+
|
|
611
|
+
`createLoader(fn)` / `loader()` define **live-by-default** data units: they are
|
|
612
|
+
excluded from an enclosing segment cache and resolve on every request unless the
|
|
613
|
+
loader itself explicitly opts into `cache()`. They may safely read `cookies()`,
|
|
614
|
+
`headers()`, request context, and `env` because loader execution is outside the
|
|
615
|
+
cached shell. Loaders run in parallel, stream independently under `loading()`
|
|
616
|
+
boundaries, compose server-side via `ctx.use(OtherLoader)`, and can
|
|
617
|
+
`await ctx.rendered()` to read handle data after the render settles. Reads happen
|
|
618
|
+
through `useLoader` in a client component (including its SSR pass) or
|
|
619
|
+
`useFetchLoader` for standalone client fetches. "Fetchable" loaders are callable
|
|
620
|
+
endpoints with their own middleware and GET/POST/PUT/PATCH/DELETE bodies.
|
|
621
|
+
|
|
622
|
+
One sharp edge is worth stating because the distinction matters: a cached handler
|
|
623
|
+
can call `await ctx.use(Loader)`, but if it renders that result inline, it bakes the
|
|
624
|
+
request value into the cached parent. That server escape hatch is deliberately not
|
|
625
|
+
a safe dynamic-hole renderer. The safe UI path is the registered loader segment
|
|
626
|
+
consumed through `useLoader()`.
|
|
627
|
+
|
|
628
|
+
**Tagged loading** is two orthogonal tags on a read:
|
|
629
|
+
|
|
630
|
+
- **`key`** — a per-instance bucket (`useLoader(Profile, { key: userId })`) so
|
|
631
|
+
different keys store and refresh independently.
|
|
632
|
+
- **`refreshGroup`** — one or more cross-loader tags.
|
|
633
|
+
`const refresh = useRefreshLoaders(); refresh("account")` re-runs every
|
|
634
|
+
currently-mounted read tagged with that group (union + dedupe across groups), as a
|
|
635
|
+
plain GET with no params, body, or mutations, and never render-throws. This
|
|
636
|
+
refreshes a set of _different_ loaders together — profile + orders after an
|
|
637
|
+
account switch — which `key` (single loader) cannot.
|
|
638
|
+
|
|
639
|
+
This is distinct from cache tags (`revalidateTag`). TanStack Start is the genuine
|
|
640
|
+
peer on loaders (route loaders + Query-key invalidation as the `refreshGroup`
|
|
641
|
+
analog); Rango's loaders are RSC-native, live-by-default, stream under RSC
|
|
642
|
+
`loading()`, and the tag system is built into the router with no separate data
|
|
643
|
+
library. Next.js and Waku have no loader primitive — they fetch inside async server
|
|
644
|
+
components.
|
|
645
|
+
|
|
646
|
+
## The loader is a genuinely new primitive
|
|
647
|
+
|
|
648
|
+
"Loader" is a word Remix and TanStack already use, so it is worth being precise
|
|
649
|
+
about why Rango's is a new concept rather than a renamed one.
|
|
650
|
+
|
|
651
|
+
Every prior loader is one of two things:
|
|
652
|
+
|
|
653
|
+
- **Loader-before-render** (Remix, React Router, TanStack) — a route-coupled
|
|
654
|
+
function that runs as a data phase _ahead of_ the render, populates a loader
|
|
655
|
+
cache, and gates the route until its data is ready. The loader **is** the data
|
|
656
|
+
path, and the cache is the loader's cache.
|
|
657
|
+
- **Fetch-in-component** (Next.js App Router, Waku, plain RSC) — there is no loader;
|
|
658
|
+
the async server component awaits its own data inline. Fetching _is_ rendering.
|
|
659
|
+
|
|
660
|
+
Rango's loader is a third model, and the difference is a polarity flip. In the
|
|
661
|
+
loader-before-render model the loader _feeds_ the cache. In Rango the loader
|
|
662
|
+
**punches a hole through** it. The segment tree — layouts, handlers, the whole RSC
|
|
663
|
+
shell — is cacheable and prerenderable by default (prerender is literally
|
|
664
|
+
build-time caching here). The loader is the one thing that stays live by default
|
|
665
|
+
and is excluded from the enclosing segment cache, even inside a `cache()` scope or
|
|
666
|
+
a fully prerendered route. Caching loader data is a separate, explicit opt-in on
|
|
667
|
+
that loader.
|
|
668
|
+
|
|
669
|
+
The mechanism is concrete: a prerendered route serves its baked Flight shell from
|
|
670
|
+
the store, then `resolveLoadersOnly()` resolves the loaders through their own
|
|
671
|
+
freshness policy at request time and merges their segments into that replayed
|
|
672
|
+
shell. With the default policy you get a cached/prerendered shell plus live data,
|
|
673
|
+
automatically, with no per-route static-vs-dynamic decision. The loader is the
|
|
674
|
+
carve-out where liveness re-enters an otherwise-static tree.
|
|
675
|
+
|
|
676
|
+
That reframes what a loader _is_: not "the route's data dependency" but **the
|
|
677
|
+
designated live data slot in a cache-first RSC tree.** Several properties follow
|
|
678
|
+
that no loader-before-render has:
|
|
679
|
+
|
|
680
|
+
- it is the **cache-safety escape hatch** — the only place request-coupled reads
|
|
681
|
+
are allowed inside a cache scope, because it is the part guaranteed to re-run;
|
|
682
|
+
- it is **standalone and composable**, not route-coupled — one `createLoader()`
|
|
683
|
+
read by many segments, composed via `ctx.use`, or exposed as a fetchable endpoint;
|
|
684
|
+
- it **streams as a hole, not a gate** — concurrent, Suspense-resolved under
|
|
685
|
+
`loading()`, so the shell never blocks on it;
|
|
686
|
+
- it is **client-addressable and refreshable** independent of navigation (`key`,
|
|
687
|
+
`refreshGroup`, `useRefreshLoaders`), behaving like a built-in, server-defined
|
|
688
|
+
data cell with zero loader logic in the client bundle;
|
|
689
|
+
- it can **read render output** via `await ctx.rendered()` — a loader that depends
|
|
690
|
+
on what the render produced, which a strictly before-render model cannot express.
|
|
691
|
+
|
|
692
|
+
The fair objections, and why they do not collapse the distinction:
|
|
693
|
+
|
|
694
|
+
- **TanStack has loaders.** It does, and they are the closest peer — but they are
|
|
695
|
+
loader-before-render: route-match-coupled and participants in the router data
|
|
696
|
+
cache. Rango's loader is the thing that stays live _against_ the enclosing
|
|
697
|
+
render cache, RSC-native, and independently addressable.
|
|
698
|
+
- **Next has Partial Prerendering.** PPR is the nearest idea in spirit (static
|
|
699
|
+
shell, dynamic holes) and deserves credit. But PPR's holes are inline
|
|
700
|
+
async-component work gated by `Suspense`, not independently addressable data
|
|
701
|
+
primitives: you cannot register one once, read it from three components,
|
|
702
|
+
refresh its mounted readers as a group, or test it through a loader harness.
|
|
703
|
+
Rango makes the hole a first-class, named, composable, refetchable, cache-safe
|
|
704
|
+
primitive and makes that liveness the default.
|
|
705
|
+
|
|
706
|
+
The point of the primitive: the hard problem in a cache-first architecture is
|
|
707
|
+
"where does freshness live, and how do I keep it from corrupting the cache?" Rango's
|
|
708
|
+
answer is one primitive — cache and prerender aggressively, and let loaders be the
|
|
709
|
+
live, named, testable, client-refreshable slots that punch through. That is the
|
|
710
|
+
sense in which it is new.
|
|
711
|
+
|
|
712
|
+
## Tainted request context: cache safety is integrated
|
|
713
|
+
|
|
714
|
+
A cache-first RSC tree is only useful if request-specific data cannot silently
|
|
715
|
+
become shared output. Rango brands its handler, request, and response-route context
|
|
716
|
+
objects at construction time. The brand is consumed by the cache runtime;
|
|
717
|
+
applications do not have to remember to mark every context manually.
|
|
718
|
+
|
|
719
|
+
For a `"use cache"` function, a tainted context object is not serialized wholesale
|
|
720
|
+
into the cache key. Rango instead extracts the safe identity dimensions that make
|
|
721
|
+
the call reusable without collisions: host, route name, pathname, params, response
|
|
722
|
+
type, and normalized user-facing search params. A shared cached function called
|
|
723
|
+
from two hosts, route scopes, param sets, or query variants therefore does not
|
|
724
|
+
collapse into one entry just because both calls received a `ctx` object.
|
|
725
|
+
|
|
726
|
+
The same boundary guards operations whose meaning cannot survive a hit. Direct
|
|
727
|
+
`cookies()`/`headers()` reads and request/response mutations such as `ctx.set()`,
|
|
728
|
+
`ctx.header()`, status, theme, and location-state writes throw inside
|
|
729
|
+
`"use cache"`. If a cached function pushes typed handles through
|
|
730
|
+
`ctx.use(Breadcrumbs)` or `ctx.use(Meta)`, Rango captures those pushes on a miss and
|
|
731
|
+
replays them into the current request's `HandleStore` on a hit; the return value and
|
|
732
|
+
its render-side output stay coherent.
|
|
733
|
+
|
|
734
|
+
Route-level `cache()` has a related but deliberately different guard. Typed context
|
|
735
|
+
variables can declare that their values are request-specific:
|
|
736
|
+
|
|
737
|
+
```ts
|
|
738
|
+
const CurrentUser = createVar<User>({ cache: false });
|
|
739
|
+
|
|
740
|
+
cache({ ttl: 300 }, () => [
|
|
741
|
+
path("/account", (ctx) => {
|
|
742
|
+
const user = ctx.get(CurrentUser); // throws instead of caching one user
|
|
743
|
+
return <Account user={user} />;
|
|
744
|
+
}),
|
|
745
|
+
]);
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
A write can also escalate an otherwise cacheable variable with
|
|
749
|
+
`ctx.set(Var, value, { cache: false })`; least-cacheable wins. The guard fires when
|
|
750
|
+
that variable is read directly inside the cached segment. It intentionally does
|
|
751
|
+
not track derived values after they have been copied into an ordinary value, so the
|
|
752
|
+
safe rule remains simple: read request-specific context at the live point of use,
|
|
753
|
+
normally a loader, rather than deriving it outside and carrying it into a cached
|
|
754
|
+
shell.
|
|
755
|
+
|
|
756
|
+
This is where the taint and loader designs meet. Loaders are the sanctioned dynamic
|
|
757
|
+
holes: they run outside the enclosing segment cache and may read the current
|
|
758
|
+
request, while the shared shell remains protected. Next.js also isolates runtime
|
|
759
|
+
APIs from ordinary `"use cache"`, and React's optional taint APIs protect values at
|
|
760
|
+
the server-to-client serialization boundary. Those are useful but different
|
|
761
|
+
contracts; they do not provide Rango's route-aware tainted-argument keying,
|
|
762
|
+
non-cacheable typed context variables, handle capture/replay, and loader escape
|
|
763
|
+
path as one system. TanStack Start and Waku leave this boundary primarily to
|
|
764
|
+
application architecture. See the [cache guide](../../cache-guide/SKILL.md) and
|
|
765
|
+
[`"use cache"` design](../../../docs/use-cache-api-design.md).
|
|
766
|
+
|
|
767
|
+
## Performance diagnostics (`debugPerformance`)
|
|
768
|
+
|
|
769
|
+
`createRouter({ debugPerformance: true })` — one boolean — turns on a per-request
|
|
770
|
+
server-side waterfall. Middleware can instead call `ctx.debugPerformance()` before
|
|
771
|
+
`await next()` to diagnose one route, query flag, or internal user without enabling
|
|
772
|
+
the full timeline globally. The output is a
|
|
773
|
+
`[RSC Perf] METHOD /path (12.34ms)` console table with `start`, `dur`, an indented
|
|
774
|
+
phase label, and a 40-cell ASCII timeline showing each phase's position, plus the
|
|
775
|
+
same data as a `Server-Timing` response header (so it appears in the browser
|
|
776
|
+
DevTools Network → Timing panel). Phases metered include `handler:total`,
|
|
777
|
+
per-middleware pre/post own-time, `action:<id>`, `loader:<id>`, `handler:<id>` per
|
|
778
|
+
segment, `render:total:<routeName>`, and `ssr:render-html`. Bootstrap handler phases
|
|
779
|
+
remain in `Server-Timing` even without the full debug timeline, so ordinary
|
|
780
|
+
responses retain a low-level latency baseline.
|
|
781
|
+
|
|
782
|
+
The distinctive part is that measured router work and distributed tracing share
|
|
783
|
+
one phase registry. A single internal wrap site (`observePhase()` in
|
|
784
|
+
`src/router/instrument.ts` — an implementation detail, not a public export)
|
|
785
|
+
co-emits the perf metric and trace span where both surfaces apply; request totals
|
|
786
|
+
and middleware pre/post own-time retain their intentional surface-specific
|
|
787
|
+
representations. The local and
|
|
788
|
+
production views therefore use the same execution vocabulary instead of two sets
|
|
789
|
+
of hand-maintained instrumentation. It is best-effort and construction-bound
|
|
790
|
+
(never buffers the response; streaming phases settle at stream construction, not
|
|
791
|
+
drain). When a phase has neither metric nor tracing enabled, its wrapper is a
|
|
792
|
+
direct call with no phase-store allocation.
|
|
793
|
+
|
|
794
|
+
Next.js has no equivalent flip-a-boolean per-request phase waterfall: its automatic
|
|
795
|
+
OTel spans still need an exporter and trace viewer. TanStack's strength is
|
|
796
|
+
client/data devtools, a different axis from server request-phase diagnostics. Waku
|
|
797
|
+
does not ship an equivalent phase model. See
|
|
798
|
+
[telemetry.md](../../../docs/telemetry.md).
|
|
799
|
+
|
|
800
|
+
## Coming from a specific framework
|
|
801
|
+
|
|
802
|
+
**From Next.js.** You keep RSC, Server Actions, parallel/intercepting routes, and
|
|
803
|
+
prerendering, but trade file-convention plus the historically confusing cache
|
|
804
|
+
layers for a code-defined, refactor-safe router and one caching model. You gain
|
|
805
|
+
Cloudflare as a first-class target and phase spans for free. You give up the
|
|
806
|
+
largest ecosystem and talent pool in the React world — the real cost.
|
|
807
|
+
|
|
808
|
+
**From TanStack Start.** You get comparable type-safe routing (`reverse()`, typed
|
|
809
|
+
params/search, even typed response MIME via `.json()`/`.text()`/`.image()`), plus a
|
|
810
|
+
true RSC-first model (zero-bundle server components, Flight) that TanStack's
|
|
811
|
+
client-first core added later and opt-in. You give up TanStack's best-in-class
|
|
812
|
+
search-param ergonomics and its devtools/Query integration.
|
|
813
|
+
|
|
814
|
+
**From Waku.** Same RSC-first-on-Vite spirit and light footprint, but Rango is the
|
|
815
|
+
batteries-included version: unified caching + prerender, segment-scoped middleware,
|
|
816
|
+
observability, host router, typed named routes, and a testing harness, where Waku
|
|
817
|
+
stays deliberately minimal. If you have outgrown Waku for a complex production app,
|
|
818
|
+
Rango is the natural step up.
|
|
819
|
+
|
|
820
|
+
## Where the others still lead
|
|
821
|
+
|
|
822
|
+
- **Ecosystem and hiring (Next.js).** Next dwarfs all three in plugins, tutorials,
|
|
823
|
+
Stack Overflow answers, and developers who already know it. That is a genuine,
|
|
824
|
+
non-technical advantage that often decides framework choice on its own.
|
|
825
|
+
- **Search-param ergonomics and client/data devtools (TanStack Start).** TanStack's
|
|
826
|
+
validated, fully-typed search-param state and its Router/Query devtools are the
|
|
827
|
+
gold standard; Rango is strong but TanStack set the bar there.
|
|
828
|
+
- **Minimal surface area (Waku).** Rango does not require its advanced features,
|
|
829
|
+
but Waku has fewer framework primitives to learn when an application intends to
|
|
830
|
+
remain small.
|
|
831
|
+
- **The DSL has a learning curve.** Code-defined routing is more powerful and
|
|
832
|
+
refactor-safe, but file-based routing is more discoverable for newcomers ("the URL
|
|
833
|
+
is the folder"). That is a real onboarding tradeoff.
|
|
834
|
+
|
|
835
|
+
## Bottom line
|
|
836
|
+
|
|
837
|
+
Rango starts comfortably at route-and-component scale. Its advantage becomes more
|
|
838
|
+
visible as requirements accumulate: type-safe routing, live data beneath cached
|
|
839
|
+
UI, partial updates, named compositions, working no-JS forms, tracing, and testable
|
|
840
|
+
server code all extend the same model rather than replacing it. That makes its
|
|
841
|
+
ceiling particularly useful for complex, production, multi-runtime applications —
|
|
842
|
+
especially edge/Cloudflare or multi-tenant systems — without making that complexity
|
|
843
|
+
the entry price. Ecosystem breadth remains the main advantage you trade away when
|
|
844
|
+
leaving Next.js.
|