@rangojs/router 0.0.0-experimental.14 → 0.0.0-experimental.141
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 +17 -0
- package/README.md +432 -7
- package/dist/bin/rango.js +2073 -213
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +7258 -2714
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +140 -67
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +329 -0
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +487 -0
- package/skills/caching/SKILL.md +357 -25
- package/skills/comparison/SKILL.md +50 -0
- package/skills/comparison/agents/openai.yaml +4 -0
- package/skills/comparison/references/framework-comparison.md +837 -0
- package/skills/composability/SKILL.md +246 -0
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +16 -10
- package/skills/document-cache/SKILL.md +87 -62
- package/skills/fonts/SKILL.md +6 -4
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +557 -79
- package/skills/host-router/SKILL.md +320 -0
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +207 -15
- package/skills/layout/SKILL.md +146 -6
- package/skills/links/SKILL.md +304 -25
- package/skills/loader/SKILL.md +616 -54
- package/skills/middleware/SKILL.md +217 -37
- package/skills/migrate-nextjs/SKILL.md +611 -0
- package/skills/migrate-react-router/SKILL.md +927 -0
- package/skills/mime-routes/SKILL.md +42 -11
- package/skills/observability/SKILL.md +194 -0
- package/skills/parallel/SKILL.md +284 -3
- package/skills/ppr/SKILL.md +293 -0
- package/skills/prerender/SKILL.md +437 -52
- package/skills/rango/SKILL.md +369 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +263 -121
- package/skills/route/SKILL.md +350 -21
- package/skills/router-setup/SKILL.md +246 -33
- package/skills/scripts/SKILL.md +179 -0
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/shell-manifest/SKILL.md +185 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +126 -222
- package/skills/testing/bindings.md +103 -0
- package/skills/testing/cache-prerender.md +127 -0
- package/skills/testing/client-components.md +124 -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 +9 -8
- package/skills/typesafety/SKILL.md +532 -103
- package/skills/use-cache/SKILL.md +367 -0
- package/skills/vercel/SKILL.md +128 -0
- package/skills/view-transitions/SKILL.md +337 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +77 -44
- package/src/bin/rango.ts +312 -15
- package/src/browser/action-coordinator.ts +114 -0
- package/src/browser/action-fence.ts +47 -0
- package/src/browser/app-shell.ts +39 -0
- package/src/browser/app-version.ts +14 -0
- package/src/browser/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +293 -202
- package/src/browser/history-state.ts +101 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/intercept-utils.ts +52 -0
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +24 -4
- package/src/browser/logging.ts +11 -0
- package/src/browser/merge-segment-loaders.ts +20 -12
- package/src/browser/navigation-bridge.ts +385 -576
- package/src/browser/navigation-client.ts +245 -75
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +184 -118
- package/src/browser/navigation-transaction.ts +247 -0
- package/src/browser/network-error-handler.ts +88 -0
- package/src/browser/partial-update.ts +412 -364
- package/src/browser/prefetch/cache.ts +359 -0
- package/src/browser/prefetch/fetch.ts +452 -0
- package/src/browser/prefetch/observer.ts +65 -0
- package/src/browser/prefetch/policy.ts +48 -0
- package/src/browser/prefetch/queue.ts +209 -0
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +194 -0
- package/src/browser/react/Link.tsx +275 -68
- package/src/browser/react/NavigationProvider.tsx +265 -109
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +11 -0
- package/src/browser/react/filter-segment-order.ts +70 -0
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +272 -60
- package/src/browser/react/location-state.ts +90 -20
- package/src/browser/react/mount-context.ts +6 -1
- package/src/browser/react/nonce-context.ts +23 -0
- package/src/browser/react/shallow-equal.ts +27 -0
- package/src/browser/react/use-action.ts +35 -66
- package/src/browser/react/use-handle.ts +39 -126
- package/src/browser/react/use-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +39 -13
- package/src/browser/react/use-navigation.ts +53 -69
- package/src/browser/react/use-params.ts +75 -0
- package/src/browser/react/use-pathname.ts +47 -0
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +98 -0
- package/src/browser/react/use-search-params.ts +51 -0
- package/src/browser/react/use-segments.ts +72 -99
- package/src/browser/response-adapter.ts +164 -0
- package/src/browser/rsc-router.tsx +300 -72
- package/src/browser/scroll-restoration.ts +138 -50
- package/src/browser/segment-reconciler.ts +243 -0
- package/src/browser/segment-structure-assert.ts +17 -1
- package/src/browser/server-action-bridge.ts +668 -613
- package/src/browser/types.ts +223 -51
- package/src/browser/validate-redirect-origin.ts +56 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +252 -161
- package/src/build/generate-route-types.ts +41 -1038
- package/src/build/index.ts +12 -7
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +225 -42
- package/src/build/route-types/ast-helpers.ts +25 -0
- package/src/build/route-types/ast-route-extraction.ts +105 -0
- package/src/build/route-types/codegen.ts +113 -0
- package/src/build/route-types/include-resolution.ts +812 -0
- package/src/build/route-types/param-extraction.ts +51 -0
- package/src/build/route-types/per-module-writer.ts +144 -0
- package/src/build/route-types/router-processing.ts +695 -0
- package/src/build/route-types/scan-filter.ts +85 -0
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +223 -0
- package/src/cache/background-task.ts +34 -0
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +60 -0
- package/src/cache/cache-policy.ts +199 -0
- package/src/cache/cache-runtime.ts +525 -0
- package/src/cache/cache-scope.ts +298 -332
- package/src/cache/cache-tag.ts +103 -0
- package/src/cache/cf/cf-base64.ts +33 -0
- package/src/cache/cf/cf-cache-constants.ts +127 -0
- package/src/cache/cf/cf-cache-store.ts +2508 -158
- package/src/cache/cf/cf-cache-types.ts +349 -0
- package/src/cache/cf/cf-kv-utils.ts +46 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +105 -0
- package/src/cache/cf/index.ts +17 -17
- package/src/cache/document-cache.ts +199 -92
- package/src/cache/handle-capture.ts +81 -0
- package/src/cache/handle-snapshot.ts +111 -0
- package/src/cache/index.ts +24 -35
- package/src/cache/memory-segment-store.ts +363 -30
- package/src/cache/profile-registry.ts +88 -0
- package/src/cache/read-through-swr.ts +178 -0
- package/src/cache/segment-codec.ts +248 -0
- package/src/cache/shell-snapshot.ts +368 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +222 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1113 -0
- package/src/client.rsc.tsx +43 -21
- package/src/client.tsx +131 -347
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +23 -4
- package/src/components/DefaultDocument.tsx +13 -3
- package/src/context-var.ts +168 -0
- package/src/debug.ts +19 -9
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +185 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +106 -10
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +110 -35
- package/src/handles/MetaTags.tsx +83 -59
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +93 -0
- package/src/handles/deferred-resolution.ts +127 -0
- package/src/handles/is-thenable.ts +18 -0
- package/src/handles/meta.ts +44 -53
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +20 -65
- package/src/host/errors.ts +21 -30
- package/src/host/index.ts +13 -9
- package/src/host/pattern-matcher.ts +50 -79
- package/src/host/router.ts +151 -121
- package/src/host/testing.ts +45 -32
- package/src/host/types.ts +52 -11
- package/src/host/utils.ts +2 -2
- package/src/href-client.ts +192 -57
- package/src/index.rsc.ts +173 -35
- package/src/index.ts +241 -73
- package/src/internal-debug.ts +9 -2
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +31 -99
- package/src/loader.ts +30 -12
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +41 -0
- package/src/prerender/param-hash.ts +16 -14
- package/src/prerender/store.ts +121 -21
- package/src/prerender.ts +460 -26
- package/src/redirect-origin.ts +100 -0
- package/src/regex-escape.ts +8 -0
- package/src/render-error-thrower.tsx +20 -0
- package/src/response-utils.ts +62 -0
- package/src/reverse.ts +198 -128
- package/src/root-error-boundary.tsx +42 -48
- package/src/route-content-wrapper.tsx +22 -77
- package/src/route-definition/dsl-helpers.ts +1116 -0
- package/src/route-definition/helper-factories.ts +88 -0
- package/src/route-definition/helpers-types.ts +505 -0
- package/src/route-definition/index.ts +54 -0
- package/src/route-definition/redirect.ts +134 -0
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-definition.ts +1 -1481
- package/src/route-map-builder.ts +82 -144
- package/src/route-name.ts +53 -0
- package/src/route-types.ts +71 -45
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +263 -0
- package/src/router/debug-manifest.ts +72 -0
- package/src/router/error-handling.ts +54 -27
- package/src/router/find-match.ts +245 -0
- package/src/router/handler-context.ts +377 -125
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +59 -28
- package/src/router/lazy-includes.ts +254 -0
- package/src/router/loader-resolution.ts +421 -157
- package/src/router/logging.ts +106 -6
- package/src/router/manifest.ts +131 -57
- package/src/router/match-api.ts +167 -246
- package/src/router/match-context.ts +4 -24
- package/src/router/match-handlers.ts +440 -0
- package/src/router/match-middleware/background-revalidation.ts +117 -93
- package/src/router/match-middleware/cache-lookup.ts +297 -150
- package/src/router/match-middleware/cache-store.ts +123 -51
- package/src/router/match-middleware/intercept-resolution.ts +44 -43
- package/src/router/match-middleware/segment-resolution.ts +64 -22
- package/src/router/match-pipelines.ts +11 -87
- package/src/router/match-result.ts +121 -50
- package/src/router/metrics.ts +219 -28
- package/src/router/middleware-types.ts +93 -0
- package/src/router/middleware.ts +505 -441
- package/src/router/navigation-snapshot.ts +133 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/parse-pattern.ts +115 -0
- package/src/router/pattern-matching.ts +311 -142
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prefetch-limits.ts +37 -0
- package/src/router/prerender-match.ts +547 -0
- package/src/router/preview-match.ts +102 -0
- package/src/router/request-classification.ts +278 -0
- package/src/router/revalidation.ts +203 -62
- package/src/router/route-snapshot.ts +246 -0
- package/src/router/router-context.ts +45 -48
- package/src/router/router-interfaces.ts +554 -0
- package/src/router/router-options.ts +779 -0
- package/src/router/router-registry.ts +21 -0
- package/src/router/segment-resolution/fresh.ts +772 -0
- package/src/router/segment-resolution/helpers.ts +348 -0
- package/src/router/segment-resolution/loader-cache.ts +250 -0
- package/src/router/segment-resolution/loader-mask.ts +44 -0
- package/src/router/segment-resolution/revalidation.ts +1331 -0
- package/src/router/segment-resolution/static-store.ts +81 -0
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +56 -0
- package/src/router/segment-resolution.ts +25 -1354
- package/src/router/segment-wrappers.ts +292 -0
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +75 -0
- package/src/router/telemetry-otel.ts +261 -0
- package/src/router/telemetry.ts +377 -0
- package/src/router/timeout.ts +128 -0
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +240 -61
- package/src/router/types.ts +23 -70
- package/src/router/url-params.ts +57 -0
- package/src/router.ts +781 -2378
- package/src/rsc/full-payload.ts +70 -0
- package/src/rsc/handler-context.ts +46 -0
- package/src/rsc/handler.ts +905 -1142
- package/src/rsc/helpers.ts +275 -19
- package/src/rsc/index.ts +2 -25
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +305 -0
- package/src/rsc/manifest-init.ts +77 -0
- package/src/rsc/nonce.ts +14 -0
- package/src/rsc/origin-guard.ts +155 -0
- package/src/rsc/progressive-enhancement.ts +502 -0
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +104 -0
- package/src/rsc/response-route-handler.ts +257 -0
- package/src/rsc/rsc-rendering.ts +527 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-capture.ts +897 -0
- package/src/rsc/shell-serve.ts +124 -0
- package/src/rsc/ssr-setup.ts +144 -0
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +95 -12
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +99 -82
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +149 -0
- package/src/segment-system.tsx +349 -134
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +459 -85
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +310 -0
- package/src/server/fetchable-loader-store.ts +11 -6
- package/src/server/handle-store.ts +123 -42
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +848 -157
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +443 -135
- package/src/ssr/ssr-root.tsx +228 -0
- package/src/static-handler.ts +45 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +46 -0
- package/src/testing/dispatch.ts +701 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +128 -0
- package/src/testing/e2e/matchers.ts +35 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +387 -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 +105 -0
- package/src/testing/internal/context.ts +371 -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 +357 -0
- package/src/testing/render-route.tsx +584 -0
- package/src/testing/run-loader.ts +385 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/run-transition-when.ts +164 -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 +76 -98
- package/src/theme/ThemeScript.tsx +12 -14
- package/src/theme/constants.ts +57 -15
- package/src/theme/index.ts +3 -20
- package/src/theme/theme-context.ts +5 -35
- package/src/theme/theme-script.ts +43 -39
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +123 -0
- package/src/types/cache-types.ts +207 -0
- package/src/types/error-types.ts +132 -0
- package/src/types/global-namespace.ts +113 -0
- package/src/types/handler-context.ts +839 -0
- package/src/types/index.ts +81 -0
- package/src/types/loader-types.ts +212 -0
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +138 -0
- package/src/types/route-entry.ts +114 -0
- package/src/types/segments.ts +271 -0
- package/src/types.ts +1 -1795
- package/src/urls/include-helper.ts +162 -0
- package/src/urls/include-provider.ts +71 -0
- package/src/urls/index.ts +44 -0
- package/src/urls/path-helper-types.ts +413 -0
- package/src/urls/path-helper.ts +280 -0
- package/src/urls/pattern-types.ts +160 -0
- package/src/urls/response-types.ts +109 -0
- package/src/urls/type-extraction.ts +316 -0
- package/src/urls/urls-function.ts +80 -0
- package/src/urls.ts +1 -1341
- package/src/use-loader.tsx +406 -141
- package/src/vercel/index.ts +11 -0
- package/src/vercel/tracing.ts +88 -0
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +182 -0
- package/src/vite/discovery/discover-routers.ts +389 -0
- 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 +467 -0
- package/src/vite/discovery/route-types-writer.ts +214 -0
- package/src/vite/discovery/self-gen-tracking.ts +73 -0
- package/src/vite/discovery/state.ts +161 -0
- package/src/vite/discovery/virtual-module-codegen.ts +183 -0
- package/src/vite/index.ts +23 -2255
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +303 -0
- package/src/vite/plugins/cjs-to-esm.ts +90 -0
- package/src/vite/plugins/client-ref-dedup.ts +120 -0
- package/src/vite/plugins/client-ref-hashing.ts +118 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +194 -0
- package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +88 -110
- package/src/vite/{expose-id-utils.ts → plugins/expose-id-utils.ts} +89 -79
- package/src/vite/plugins/expose-ids/export-analysis.ts +363 -0
- package/src/vite/plugins/expose-ids/handler-transform.ts +130 -0
- package/src/vite/plugins/expose-ids/loader-transform.ts +64 -0
- package/src/vite/plugins/expose-ids/router-transform.ts +199 -0
- package/src/vite/plugins/expose-ids/types.ts +45 -0
- package/src/vite/plugins/expose-internal-ids.ts +805 -0
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +127 -0
- package/src/vite/plugins/use-cache-transform.ts +313 -0
- package/src/vite/plugins/vercel-output.ts +384 -0
- package/src/vite/plugins/version-injector.ts +94 -0
- package/src/vite/plugins/version-plugin.ts +263 -0
- package/src/vite/plugins/virtual-entries.ts +234 -0
- package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
- package/src/vite/rango.ts +560 -0
- package/src/vite/router-discovery.ts +1638 -0
- package/src/vite/{ast-handler-extract.ts → utils/ast-handler-extract.ts} +200 -37
- package/src/vite/utils/banner.ts +36 -0
- package/src/vite/utils/bundle-analysis.ts +132 -0
- 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 +15 -0
- package/src/vite/utils/package-resolution.ts +89 -0
- package/src/vite/utils/prerender-utils.ts +249 -0
- package/src/vite/utils/shared-utils.ts +269 -0
- package/CLAUDE.md +0 -43
- package/dist/vite/index.named-routes.gen.ts +0 -103
- package/src/browser/lru-cache.ts +0 -69
- package/src/browser/react/use-client-cache.ts +0 -56
- package/src/browser/request-controller.ts +0 -164
- package/src/browser/shallow.ts +0 -35
- package/src/cache/memory-store.ts +0 -253
- package/src/handles/index.ts +0 -6
- package/src/href-context.ts +0 -33
- package/src/network-error-thrower.tsx +0 -21
- package/src/router.gen.ts +0 -6
- package/src/static-handler.gen.ts +0 -5
- package/src/urls.gen.ts +0 -8
- package/src/vite/expose-internal-ids.ts +0 -1167
- package/src/vite/package-resolution.ts +0 -125
- package/src/vite/virtual-entries.ts +0 -114
- /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cache Key Utilities
|
|
3
|
+
*
|
|
4
|
+
* Deterministic normalization of search params and route params
|
|
5
|
+
* for cache key generation. Used by cache-runtime, cache-scope,
|
|
6
|
+
* document-cache, and loader-cache.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { encodeKV } from "../encode-kv.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Reserved URL query params that the router owns and must never key the cache
|
|
13
|
+
* on. `_rsc*` is the router's internal navigation/action/loader prefix (matched
|
|
14
|
+
* by prefix). `__no_cache` is the single `__`-prefixed param the router reads
|
|
15
|
+
* (handler.ts / testing dispatch.ts use it to bypass the store); it and the
|
|
16
|
+
* other router-internal `__`-prefixed request params are matched by an EXACT
|
|
17
|
+
* allowlist, not a blanket `__` prefix. A blanket `__` filter would silently
|
|
18
|
+
* collapse consumer params like `__variant=a` vs `__variant=b` onto one cache
|
|
19
|
+
* slot; an allowlist keeps the router's own params out of the key while leaving
|
|
20
|
+
* consumer `__` params intact.
|
|
21
|
+
*/
|
|
22
|
+
const RESERVED_SEARCH_PARAMS = new Set([
|
|
23
|
+
"__no_cache",
|
|
24
|
+
"__rsc",
|
|
25
|
+
"__html",
|
|
26
|
+
"__debug_manifest",
|
|
27
|
+
"__prerender_collect",
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
function isReservedSearchParam(key: string): boolean {
|
|
31
|
+
return key.startsWith("_rsc") || RESERVED_SEARCH_PARAMS.has(key);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Build a sorted, deterministic query string from URLSearchParams,
|
|
36
|
+
* excluding the router's reserved params (see isReservedSearchParam).
|
|
37
|
+
*
|
|
38
|
+
* Returns empty string when no user-facing params exist.
|
|
39
|
+
*/
|
|
40
|
+
export function sortedSearchString(searchParams: URLSearchParams): string {
|
|
41
|
+
const pairs: [string, string][] = [];
|
|
42
|
+
for (const [k, v] of searchParams) {
|
|
43
|
+
if (!isReservedSearchParam(k)) {
|
|
44
|
+
pairs.push([k, v]);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return encodeKV(pairs, { sort: true });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Build a sorted, deterministic string from route params.
|
|
52
|
+
*
|
|
53
|
+
* Returns empty string when params is empty or undefined.
|
|
54
|
+
*/
|
|
55
|
+
export function sortedRouteParams(
|
|
56
|
+
params: Record<string, string> | undefined,
|
|
57
|
+
): string {
|
|
58
|
+
if (!params) return "";
|
|
59
|
+
return encodeKV(Object.entries(params), { sort: true });
|
|
60
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cache Policy Utilities
|
|
3
|
+
*
|
|
4
|
+
* Resolution cascades for TTL, SWR, cache key, and cache store.
|
|
5
|
+
* Consolidates the multi-tier resolution pattern:
|
|
6
|
+
* explicit option → store defaults → fallback constant
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { CacheDefaults, SegmentCacheStore } from "./types.js";
|
|
10
|
+
import { _getRequestContext } from "../server/request-context.js";
|
|
11
|
+
import type { RequestContext } from "../server/request-context.js";
|
|
12
|
+
import { normalizeTags } from "./cache-tag.js";
|
|
13
|
+
import { reportCacheError } from "./cache-error.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Default TTL for route-level cache() DSL and loader cache.
|
|
17
|
+
* Applied when neither the cache options nor the store defaults specify a TTL.
|
|
18
|
+
*/
|
|
19
|
+
export const DEFAULT_ROUTE_TTL = 60;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Default TTL for function-level "use cache" (setItem).
|
|
23
|
+
* Applied when neither the item options nor the store defaults specify a TTL.
|
|
24
|
+
*/
|
|
25
|
+
export const DEFAULT_FUNCTION_TTL = 900;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A finite, non-negative seconds value? A NaN/Infinity ttl/swr (from a bad
|
|
29
|
+
* cache() option or store defaults) flows into computeExpiration ->
|
|
30
|
+
* staleAt/expiresAt = NaN, where every `now > NaN` is false so the entry never
|
|
31
|
+
* evicts and is served fresh forever; a negative value makes every read a miss.
|
|
32
|
+
* Shared with cache-scope.ts (the segment getters) so every cache path validates
|
|
33
|
+
* the same way. profile-registry.ts uses the same predicate but fails fast at
|
|
34
|
+
* config time; the resolvers here degrade because they run on the live path.
|
|
35
|
+
*/
|
|
36
|
+
export function isFiniteNonNegativeSeconds(value: number): boolean {
|
|
37
|
+
return Number.isFinite(value) && value >= 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function warnInvalidSeconds(label: string, value: number): void {
|
|
41
|
+
if (process.env.NODE_ENV !== "production") {
|
|
42
|
+
console.warn(`[cache] Invalid ${label} ${value}; falling back to default`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Resolve effective TTL from the 3-tier cascade:
|
|
48
|
+
* explicit → store defaults → fallback. A non-finite/negative resolved value
|
|
49
|
+
* degrades to the fallback (loader cache and "use cache" setItem both resolve
|
|
50
|
+
* ttl here, so this is where those paths are guarded; the segment cache is
|
|
51
|
+
* guarded in cache-scope.ts).
|
|
52
|
+
*/
|
|
53
|
+
export function resolveTtl(
|
|
54
|
+
explicit: number | undefined,
|
|
55
|
+
defaults: CacheDefaults | undefined,
|
|
56
|
+
fallback: number,
|
|
57
|
+
): number {
|
|
58
|
+
let value: number;
|
|
59
|
+
if (explicit !== undefined) value = explicit;
|
|
60
|
+
else if (defaults?.ttl !== undefined) value = defaults.ttl;
|
|
61
|
+
else return fallback;
|
|
62
|
+
if (isFiniteNonNegativeSeconds(value)) return value;
|
|
63
|
+
warnInvalidSeconds("ttl", value);
|
|
64
|
+
return fallback;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Resolve effective SWR window from the 2-tier cascade:
|
|
69
|
+
* explicit → store defaults.
|
|
70
|
+
* Returns 0 when unset (no SWR window) or when the resolved value is
|
|
71
|
+
* non-finite/negative (degrade rather than feed bad math into expiry).
|
|
72
|
+
*/
|
|
73
|
+
export function resolveSwrWindow(
|
|
74
|
+
explicit: number | undefined,
|
|
75
|
+
defaults: CacheDefaults | undefined,
|
|
76
|
+
): number {
|
|
77
|
+
let value: number;
|
|
78
|
+
if (explicit !== undefined) value = explicit;
|
|
79
|
+
else if (defaults?.swr !== undefined) value = defaults.swr;
|
|
80
|
+
else return 0;
|
|
81
|
+
if (isFiniteNonNegativeSeconds(value)) return value;
|
|
82
|
+
warnInvalidSeconds("swr", value);
|
|
83
|
+
return 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Compute staleAt and expiresAt timestamps from TTL and SWR window.
|
|
88
|
+
*
|
|
89
|
+
* - staleAt: when the entry becomes stale (TTL boundary)
|
|
90
|
+
* - expiresAt: when the entry should be evicted (TTL + SWR)
|
|
91
|
+
*
|
|
92
|
+
* When swrWindow is 0, staleAt === expiresAt (no SWR).
|
|
93
|
+
*/
|
|
94
|
+
export function computeExpiration(
|
|
95
|
+
ttlSeconds: number,
|
|
96
|
+
swrSeconds: number = 0,
|
|
97
|
+
): { staleAt: number; expiresAt: number } {
|
|
98
|
+
const now = Date.now();
|
|
99
|
+
const staleAt = now + ttlSeconds * 1000;
|
|
100
|
+
const expiresAt = staleAt + swrSeconds * 1000;
|
|
101
|
+
return { staleAt, expiresAt };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export async function resolveCacheKey(
|
|
105
|
+
keyFn: ((ctx: RequestContext) => string | Promise<string>) | undefined,
|
|
106
|
+
store: SegmentCacheStore | null,
|
|
107
|
+
defaultKey: string,
|
|
108
|
+
_label: string,
|
|
109
|
+
): Promise<string> {
|
|
110
|
+
const requestCtx = _getRequestContext();
|
|
111
|
+
|
|
112
|
+
if (keyFn && requestCtx) {
|
|
113
|
+
return await keyFn(requestCtx);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (store?.keyGenerator && requestCtx) {
|
|
117
|
+
return await store.keyGenerator(requestCtx, defaultKey);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return defaultKey;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function resolveTagsOption<TEnv>(
|
|
124
|
+
tags: string[] | ((ctx: RequestContext<TEnv>) => string[]) | undefined,
|
|
125
|
+
ctx: RequestContext<TEnv> | undefined,
|
|
126
|
+
label: string,
|
|
127
|
+
): string[] | undefined {
|
|
128
|
+
if (!tags) return undefined;
|
|
129
|
+
if (typeof tags === "function") {
|
|
130
|
+
if (!ctx) {
|
|
131
|
+
console.warn(
|
|
132
|
+
`[${label}] Dynamic tags function present but no request context; ` +
|
|
133
|
+
`caching without tags (this entry will not be tag-invalidatable).`,
|
|
134
|
+
);
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
return normalizeTagList(tags(ctx));
|
|
139
|
+
} catch (error) {
|
|
140
|
+
reportCacheError(
|
|
141
|
+
error,
|
|
142
|
+
"cache-write",
|
|
143
|
+
`[${label}] Tags function failed, caching without tags`,
|
|
144
|
+
ctx,
|
|
145
|
+
);
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return normalizeTagList(tags);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Normalize a resolved tags array so the WRITE path matches the invalidate path:
|
|
154
|
+
* updateTag()/revalidateTag()/cacheTag() all drop empty/whitespace-only tags via
|
|
155
|
+
* normalizeTag(). Without this, an empty tag attached at write time would enter
|
|
156
|
+
* the store index but could never be invalidated (the verbs normalize it away),
|
|
157
|
+
* and on CFCacheStore would also cost a wasted KV marker read per request.
|
|
158
|
+
* Returns undefined when nothing usable remains, keeping the entry header-free.
|
|
159
|
+
*/
|
|
160
|
+
function normalizeTagList(tags: string[]): string[] | undefined {
|
|
161
|
+
const out = normalizeTags(tags);
|
|
162
|
+
return out.length > 0 ? out : undefined;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function resolveCacheStore(
|
|
166
|
+
explicitStore: SegmentCacheStore | undefined,
|
|
167
|
+
): SegmentCacheStore | null {
|
|
168
|
+
if (explicitStore) {
|
|
169
|
+
registerExplicitTaggedStore(explicitStore);
|
|
170
|
+
return explicitStore;
|
|
171
|
+
}
|
|
172
|
+
return _getRequestContext()?._cacheStore ?? null;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Upper bound on the per-handler explicit-store registry. A module-singleton
|
|
177
|
+
* store (the recommended pattern) dedupes to a single entry and never approaches
|
|
178
|
+
* this. The cap bounds the niche case of an explicit store constructed PER
|
|
179
|
+
* request/boundary (e.g. a ctx-bound CFCacheStore, which must take a per-request
|
|
180
|
+
* ctx): without it the registry - which intentionally persists across requests so
|
|
181
|
+
* a server action's updateTag() can reach stores a prior render registered -
|
|
182
|
+
* would accumulate one dead instance per request and fan invalidation out to
|
|
183
|
+
* finished execution contexts. LRU-touch on re-resolution keeps a live, re-used
|
|
184
|
+
* store from being evicted by that churn.
|
|
185
|
+
*/
|
|
186
|
+
const EXPLICIT_STORE_REGISTRY_CAP = 64;
|
|
187
|
+
|
|
188
|
+
function registerExplicitTaggedStore(store: SegmentCacheStore): void {
|
|
189
|
+
const set = _getRequestContext()?._explicitTaggedStores;
|
|
190
|
+
if (!set) return;
|
|
191
|
+
// LRU touch: move an already-present store to the most-recent position (Set
|
|
192
|
+
// preserves insertion order) so a store re-resolved every request stays live.
|
|
193
|
+
set.delete(store);
|
|
194
|
+
set.add(store);
|
|
195
|
+
if (set.size > EXPLICIT_STORE_REGISTRY_CAP) {
|
|
196
|
+
const oldest = set.values().next().value;
|
|
197
|
+
if (oldest !== undefined) set.delete(oldest);
|
|
198
|
+
}
|
|
199
|
+
}
|