@rangojs/router 0.0.0-experimental.14 → 0.0.0-experimental.140
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 +426 -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 +2500 -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 +29 -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-cache.ts +386 -0
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +153 -0
- package/src/cache/types.ts +156 -211
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +1102 -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 +177 -35
- package/src/index.ts +255 -71
- 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 +337 -0
- package/src/rsc/runtime-warnings.ts +55 -0
- package/src/rsc/server-action.ts +522 -0
- package/src/rsc/shell-capture.ts +439 -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 +452 -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/live.ts +130 -0
- package/src/server/loader-registry.ts +51 -100
- package/src/server/request-context.ts +842 -157
- package/src/server.ts +15 -8
- package/src/ssr/index.tsx +412 -136
- 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 +40 -72
- 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 +43 -0
- package/src/urls/path-helper-types.ts +413 -0
- package/src/urls/path-helper.ts +275 -0
- package/src/urls/pattern-types.ts +124 -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,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWR Read-Through Engine
|
|
3
|
+
*
|
|
4
|
+
* Generic read-through cache with stale-while-revalidate support
|
|
5
|
+
* for item-level caching (getItem/setItem).
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Lookup cached item by key
|
|
9
|
+
* 2. Fresh hit → deserialize, return
|
|
10
|
+
* 3. Stale hit → deserialize, return, revalidate in background
|
|
11
|
+
* 4. Miss → execute, cache write (blocking when no waitUntil), return
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { CacheItemResult, CacheItemOptions } from "./types.js";
|
|
15
|
+
import { runBackground } from "./background-task.js";
|
|
16
|
+
import { reportCacheError } from "./cache-error.js";
|
|
17
|
+
import type { CacheErrorReporter } from "./cache-error.js";
|
|
18
|
+
|
|
19
|
+
// The host carries both the optional waitUntil (for background scheduling) and
|
|
20
|
+
// the CacheErrorReporter seam (for routing degradation errors through onError).
|
|
21
|
+
// loader-cache.ts passes the request context, which provides both.
|
|
22
|
+
type WaitUntilHost = {
|
|
23
|
+
waitUntil?: (fn: () => Promise<void>) => void;
|
|
24
|
+
} & CacheErrorReporter;
|
|
25
|
+
|
|
26
|
+
export interface ReadThroughItemConfig<T> {
|
|
27
|
+
/** Retrieve a cached item by key */
|
|
28
|
+
getItem: (key: string) => Promise<CacheItemResult | null>;
|
|
29
|
+
/** Store a serialized item by key */
|
|
30
|
+
setItem: (
|
|
31
|
+
key: string,
|
|
32
|
+
value: string,
|
|
33
|
+
options?: CacheItemOptions,
|
|
34
|
+
) => Promise<void>;
|
|
35
|
+
/** Cache key */
|
|
36
|
+
key: string;
|
|
37
|
+
/** Execute the underlying function/loader on miss or revalidation */
|
|
38
|
+
execute: () => Promise<T>;
|
|
39
|
+
/**
|
|
40
|
+
* Optional wrapper applied to execute() ONLY on the background
|
|
41
|
+
* stale-revalidation path (not the foreground miss, where the caller's context
|
|
42
|
+
* is already established). Used to re-establish the request-context ALS, which
|
|
43
|
+
* a detached waitUntil task loses on workerd. Defaults to calling execute()
|
|
44
|
+
* directly.
|
|
45
|
+
*/
|
|
46
|
+
wrapBackground?: (run: () => Promise<T>) => Promise<T>;
|
|
47
|
+
/** Serialize result for storage. Return null to skip caching. */
|
|
48
|
+
serialize: (data: T) => Promise<string | null>;
|
|
49
|
+
/** Deserialize cached value back to the original type */
|
|
50
|
+
deserialize: (value: string) => Promise<T>;
|
|
51
|
+
/** Options passed to setItem on cache write */
|
|
52
|
+
storeOptions: CacheItemOptions;
|
|
53
|
+
/** Called on fresh cache hit (before returning data) */
|
|
54
|
+
onHit?: (cached: CacheItemResult) => void;
|
|
55
|
+
/** Called on stale cache hit (before scheduling background revalidation) */
|
|
56
|
+
onStale?: (cached: CacheItemResult) => void;
|
|
57
|
+
/** Called on cache miss (before executing) */
|
|
58
|
+
onMiss?: () => void;
|
|
59
|
+
/** Called after successful cache write */
|
|
60
|
+
onCached?: () => void;
|
|
61
|
+
/** Host with optional waitUntil for background tasks */
|
|
62
|
+
host?: WaitUntilHost | null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Read-through cache with SWR support for item-level caching.
|
|
67
|
+
*
|
|
68
|
+
* On fresh hit: returns deserialized cached data.
|
|
69
|
+
* On stale hit: returns stale data, schedules background revalidation.
|
|
70
|
+
* On miss: executes, writes to cache (blocking when no waitUntil), returns.
|
|
71
|
+
*/
|
|
72
|
+
export async function readThroughItem<T>(
|
|
73
|
+
config: ReadThroughItemConfig<T>,
|
|
74
|
+
): Promise<T> {
|
|
75
|
+
const {
|
|
76
|
+
getItem,
|
|
77
|
+
setItem,
|
|
78
|
+
key,
|
|
79
|
+
execute,
|
|
80
|
+
serialize,
|
|
81
|
+
deserialize,
|
|
82
|
+
storeOptions,
|
|
83
|
+
onHit,
|
|
84
|
+
onStale,
|
|
85
|
+
onMiss,
|
|
86
|
+
onCached,
|
|
87
|
+
host,
|
|
88
|
+
wrapBackground,
|
|
89
|
+
} = config;
|
|
90
|
+
|
|
91
|
+
// Cache lookup. An infra read failure (getItem) is reported by the store
|
|
92
|
+
// itself, so here we just degrade to a miss. A deserialize failure is a
|
|
93
|
+
// corrupt/truncated stored entry, which this layer owns: report it LOUD as
|
|
94
|
+
// cache-corrupt, then fall through to a fresh execution (the miss-path write
|
|
95
|
+
// self-heals the bad entry).
|
|
96
|
+
let cached: CacheItemResult | null = null;
|
|
97
|
+
try {
|
|
98
|
+
cached = await getItem(key);
|
|
99
|
+
} catch {
|
|
100
|
+
cached = null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (cached) {
|
|
104
|
+
try {
|
|
105
|
+
const data = await deserialize(cached.value);
|
|
106
|
+
|
|
107
|
+
if (!cached.shouldRevalidate) {
|
|
108
|
+
onHit?.(cached);
|
|
109
|
+
return data;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Stale hit — return stale data, revalidate in background
|
|
113
|
+
onStale?.(cached);
|
|
114
|
+
runBackground(
|
|
115
|
+
host,
|
|
116
|
+
async () => {
|
|
117
|
+
try {
|
|
118
|
+
// Re-establish the caller's context (request-context ALS) for the
|
|
119
|
+
// detached background execution; the foreground miss below calls
|
|
120
|
+
// execute() directly since its context is already established.
|
|
121
|
+
const fresh = await (wrapBackground
|
|
122
|
+
? wrapBackground(execute)
|
|
123
|
+
: execute());
|
|
124
|
+
const serialized = await serialize(fresh);
|
|
125
|
+
if (serialized !== null) {
|
|
126
|
+
await setItem(key, serialized, storeOptions);
|
|
127
|
+
}
|
|
128
|
+
} catch (error) {
|
|
129
|
+
reportCacheError(
|
|
130
|
+
error,
|
|
131
|
+
"stale-revalidation",
|
|
132
|
+
"[read-through] background revalidation",
|
|
133
|
+
host ?? undefined,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
true,
|
|
138
|
+
);
|
|
139
|
+
return data;
|
|
140
|
+
} catch (error) {
|
|
141
|
+
reportCacheError(
|
|
142
|
+
error,
|
|
143
|
+
"cache-corrupt",
|
|
144
|
+
"[read-through] deserialize stored entry",
|
|
145
|
+
host ?? undefined,
|
|
146
|
+
);
|
|
147
|
+
// fall through to fresh execution
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Cache miss
|
|
152
|
+
onMiss?.();
|
|
153
|
+
const data = await execute();
|
|
154
|
+
|
|
155
|
+
// Non-blocking cache write (blocks when no waitUntil)
|
|
156
|
+
await runBackground(
|
|
157
|
+
host,
|
|
158
|
+
async () => {
|
|
159
|
+
try {
|
|
160
|
+
const serialized = await serialize(data);
|
|
161
|
+
if (serialized !== null) {
|
|
162
|
+
await setItem(key, serialized, storeOptions);
|
|
163
|
+
onCached?.();
|
|
164
|
+
}
|
|
165
|
+
} catch (error) {
|
|
166
|
+
reportCacheError(
|
|
167
|
+
error,
|
|
168
|
+
"cache-write",
|
|
169
|
+
"[read-through] cache write",
|
|
170
|
+
host ?? undefined,
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
true,
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
return data;
|
|
178
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Segment Codec
|
|
3
|
+
*
|
|
4
|
+
* RSC serialization/deserialization for cached segments.
|
|
5
|
+
* Handles the Flight protocol stream <-> string conversion
|
|
6
|
+
* and the segment-level encode/decode lifecycle.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/// <reference types="@vitejs/plugin-rsc/types" />
|
|
10
|
+
|
|
11
|
+
import type { ResolvedSegment } from "../types.js";
|
|
12
|
+
import type { SerializedSegmentData } from "./types.js";
|
|
13
|
+
import { INTERNAL_RANGO_DEBUG } from "../internal-debug.js";
|
|
14
|
+
import {
|
|
15
|
+
renderToReadableStream,
|
|
16
|
+
createTemporaryReferenceSet,
|
|
17
|
+
} from "@vitejs/plugin-rsc/rsc";
|
|
18
|
+
import { createFromReadableStream } from "@vitejs/plugin-rsc/rsc";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Convert a ReadableStream to a string.
|
|
22
|
+
*/
|
|
23
|
+
export async function streamToString(
|
|
24
|
+
stream: ReadableStream<Uint8Array>,
|
|
25
|
+
): Promise<string> {
|
|
26
|
+
const reader = stream.getReader();
|
|
27
|
+
const decoder = new TextDecoder();
|
|
28
|
+
let result = "";
|
|
29
|
+
|
|
30
|
+
while (true) {
|
|
31
|
+
const { done, value } = await reader.read();
|
|
32
|
+
if (done) break;
|
|
33
|
+
result += decoder.decode(value, { stream: true });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
result += decoder.decode(); // flush
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Convert a string to a ReadableStream.
|
|
42
|
+
*/
|
|
43
|
+
export function stringToStream(str: string): ReadableStream<Uint8Array> {
|
|
44
|
+
const encoder = new TextEncoder();
|
|
45
|
+
const uint8 = encoder.encode(str);
|
|
46
|
+
|
|
47
|
+
return new ReadableStream({
|
|
48
|
+
start(controller) {
|
|
49
|
+
controller.enqueue(uint8);
|
|
50
|
+
controller.close();
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* RSC-serialize a value using React Server Components stream.
|
|
57
|
+
* Used for serializing loaderData, layout, loading components etc.
|
|
58
|
+
*
|
|
59
|
+
* Returns undefined for null/undefined inputs (component fields that are absent).
|
|
60
|
+
* For contexts where null is a valid result (loader caching, "use cache"),
|
|
61
|
+
* use serializeResult() instead which preserves null through RSC Flight.
|
|
62
|
+
*/
|
|
63
|
+
export async function rscSerialize(
|
|
64
|
+
value: unknown,
|
|
65
|
+
): Promise<string | undefined> {
|
|
66
|
+
if (value === undefined || value === null) return undefined;
|
|
67
|
+
|
|
68
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
69
|
+
const stream = renderToReadableStream(value, { temporaryReferences });
|
|
70
|
+
return streamToString(stream);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* RSC-deserialize a value from a stored string.
|
|
75
|
+
*/
|
|
76
|
+
export async function rscDeserialize<T>(
|
|
77
|
+
encoded: string | undefined,
|
|
78
|
+
): Promise<T | undefined> {
|
|
79
|
+
if (!encoded) return undefined;
|
|
80
|
+
|
|
81
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
82
|
+
const stream = stringToStream(encoded);
|
|
83
|
+
return createFromReadableStream<T>(stream, { temporaryReferences });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* RSC-serialize any value including null.
|
|
88
|
+
* Unlike rscSerialize(), this does NOT skip null — it serializes it through
|
|
89
|
+
* RSC Flight so that a loader returning null produces a valid cached entry
|
|
90
|
+
* rather than a permanent cache miss.
|
|
91
|
+
*
|
|
92
|
+
* Returns null only on serialization failure.
|
|
93
|
+
*/
|
|
94
|
+
export async function serializeResult(value: unknown): Promise<string | null> {
|
|
95
|
+
try {
|
|
96
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
97
|
+
const stream = renderToReadableStream(value, { temporaryReferences });
|
|
98
|
+
return await streamToString(stream);
|
|
99
|
+
} catch (error) {
|
|
100
|
+
// Returning null silently turns a non-serializable cache value into a
|
|
101
|
+
// permanent miss with no trace. Surface it on the internal debug channel so
|
|
102
|
+
// a failed serialize is diagnosable on wrangler tail, but keep returning
|
|
103
|
+
// null so the caller falls through to an uncached render rather than throws.
|
|
104
|
+
if (INTERNAL_RANGO_DEBUG) {
|
|
105
|
+
console.warn("[segment-codec] serializeResult failed:", error);
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* RSC-deserialize a cached result string.
|
|
113
|
+
* Counterpart to serializeResult() — always receives a non-empty string.
|
|
114
|
+
*/
|
|
115
|
+
export async function deserializeResult<T>(encoded: string): Promise<T> {
|
|
116
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
117
|
+
const stream = stringToStream(encoded);
|
|
118
|
+
return createFromReadableStream<T>(stream, { temporaryReferences });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* RSC-deserialize a single encoded component string back to a React element.
|
|
123
|
+
* Used by the static handler runtime to revive pre-rendered components.
|
|
124
|
+
* Identical to deserializeResult<unknown>.
|
|
125
|
+
*/
|
|
126
|
+
export const deserializeComponent: (encoded: string) => Promise<unknown> =
|
|
127
|
+
deserializeResult;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Serialize segments for storage.
|
|
131
|
+
* Each segment's component, layout, loading, and loaderData are RSC-serialized.
|
|
132
|
+
* Metadata is preserved as-is.
|
|
133
|
+
*/
|
|
134
|
+
export async function serializeSegments(
|
|
135
|
+
segments: ResolvedSegment[],
|
|
136
|
+
): Promise<SerializedSegmentData[]> {
|
|
137
|
+
return Promise.all(
|
|
138
|
+
segments.map(async (segment): Promise<SerializedSegmentData> => {
|
|
139
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
140
|
+
|
|
141
|
+
// Await component if it's a Promise (intercepts with loading keep component as Promise)
|
|
142
|
+
const componentResolved =
|
|
143
|
+
segment.component instanceof Promise
|
|
144
|
+
? await segment.component
|
|
145
|
+
: segment.component;
|
|
146
|
+
|
|
147
|
+
// Serialize the component to RSC stream
|
|
148
|
+
const stream = renderToReadableStream(componentResolved, {
|
|
149
|
+
temporaryReferences,
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// RSC-serialize loading: "null" string distinguishes explicit null from undefined
|
|
153
|
+
const encodedLoading =
|
|
154
|
+
segment.loading !== undefined
|
|
155
|
+
? segment.loading === null
|
|
156
|
+
? "null"
|
|
157
|
+
: await rscSerialize(segment.loading)
|
|
158
|
+
: undefined;
|
|
159
|
+
|
|
160
|
+
// Await loaderData / loaderDataPromise if they're Promises
|
|
161
|
+
const loaderDataResolved =
|
|
162
|
+
segment.loaderData instanceof Promise
|
|
163
|
+
? await segment.loaderData
|
|
164
|
+
: segment.loaderData;
|
|
165
|
+
const loaderDataPromiseResolved =
|
|
166
|
+
segment.loaderDataPromise instanceof Promise
|
|
167
|
+
? await segment.loaderDataPromise
|
|
168
|
+
: segment.loaderDataPromise;
|
|
169
|
+
|
|
170
|
+
// Parallelize stream-to-string and RSC serialization of sub-fields
|
|
171
|
+
const [
|
|
172
|
+
encoded,
|
|
173
|
+
encodedLayout,
|
|
174
|
+
encodedLoaderData,
|
|
175
|
+
encodedLoaderDataPromise,
|
|
176
|
+
] = await Promise.all([
|
|
177
|
+
streamToString(stream),
|
|
178
|
+
segment.layout ? rscSerialize(segment.layout) : undefined,
|
|
179
|
+
rscSerialize(loaderDataResolved),
|
|
180
|
+
rscSerialize(loaderDataPromiseResolved),
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
encoded,
|
|
185
|
+
encodedLayout,
|
|
186
|
+
encodedLoading,
|
|
187
|
+
encodedLoaderData,
|
|
188
|
+
encodedLoaderDataPromise,
|
|
189
|
+
metadata: {
|
|
190
|
+
id: segment.id,
|
|
191
|
+
type: segment.type,
|
|
192
|
+
namespace: segment.namespace,
|
|
193
|
+
index: segment.index,
|
|
194
|
+
params: segment.params,
|
|
195
|
+
slot: segment.slot,
|
|
196
|
+
belongsToRoute: segment.belongsToRoute,
|
|
197
|
+
layoutName: segment.layoutName,
|
|
198
|
+
parallelName: segment.parallelName,
|
|
199
|
+
loaderId: segment.loaderId,
|
|
200
|
+
loaderIds: segment.loaderIds,
|
|
201
|
+
transition: segment.transition,
|
|
202
|
+
mountPath: segment.mountPath,
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}),
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Deserialize segments from storage.
|
|
211
|
+
* Reconstructs ResolvedSegment objects from RSC-serialized data.
|
|
212
|
+
*/
|
|
213
|
+
export async function deserializeSegments(
|
|
214
|
+
data: SerializedSegmentData[],
|
|
215
|
+
): Promise<ResolvedSegment[]> {
|
|
216
|
+
return Promise.all(
|
|
217
|
+
data.map(async (item): Promise<ResolvedSegment> => {
|
|
218
|
+
const temporaryReferences = createTemporaryReferenceSet();
|
|
219
|
+
|
|
220
|
+
// Handle the "null" sentinel for loading before RSC deserialization.
|
|
221
|
+
// During serialization, loading: null is stored as the string "null" to
|
|
222
|
+
// distinguish it from undefined.
|
|
223
|
+
const loadingIsNullSentinel = item.encodedLoading === "null";
|
|
224
|
+
|
|
225
|
+
const [component, layout, loaderData, loaderDataPromise, loadingData] =
|
|
226
|
+
await Promise.all([
|
|
227
|
+
createFromReadableStream(stringToStream(item.encoded), {
|
|
228
|
+
temporaryReferences,
|
|
229
|
+
}),
|
|
230
|
+
rscDeserialize(item.encodedLayout),
|
|
231
|
+
rscDeserialize(item.encodedLoaderData),
|
|
232
|
+
rscDeserialize(item.encodedLoaderDataPromise),
|
|
233
|
+
loadingIsNullSentinel
|
|
234
|
+
? (null as any)
|
|
235
|
+
: rscDeserialize(item.encodedLoading),
|
|
236
|
+
]);
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
...item.metadata,
|
|
240
|
+
component,
|
|
241
|
+
layout,
|
|
242
|
+
loading: loadingData,
|
|
243
|
+
loaderData,
|
|
244
|
+
loaderDataPromise,
|
|
245
|
+
} as ResolvedSegment;
|
|
246
|
+
}),
|
|
247
|
+
);
|
|
248
|
+
}
|