@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,134 @@
|
|
|
1
|
+
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
2
|
+
import {
|
|
3
|
+
getRequestContext,
|
|
4
|
+
_getRequestContext,
|
|
5
|
+
} from "../server/request-context.js";
|
|
6
|
+
import { markExternalRedirect } from "../redirect-origin.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Create a soft redirect Response for middleware short-circuit
|
|
10
|
+
*
|
|
11
|
+
* Returns a Response that signals a client-side navigation to the target URL.
|
|
12
|
+
* Unlike Response.redirect() which causes a full page reload, this redirect
|
|
13
|
+
* is handled by the router for SPA-style navigation.
|
|
14
|
+
*
|
|
15
|
+
* Supports an optional state parameter to carry location state through the
|
|
16
|
+
* redirect. On the target page, state can be read via useLocationState()
|
|
17
|
+
* (use { flash: true } in createLocationState for read-once flash messages).
|
|
18
|
+
*
|
|
19
|
+
* @param url - The URL to redirect to
|
|
20
|
+
* @param statusOrOptions - HTTP status code (default: 302) or options object
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Simple redirect
|
|
25
|
+
* middleware((ctx, next) => {
|
|
26
|
+
* if (!ctx.get('user')) {
|
|
27
|
+
* return redirect('/login');
|
|
28
|
+
* }
|
|
29
|
+
* next();
|
|
30
|
+
* })
|
|
31
|
+
*
|
|
32
|
+
* // Redirect with state
|
|
33
|
+
* return redirect('/dashboard', {
|
|
34
|
+
* state: [Flash({ text: "Item saved!" })],
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // Redirect with custom status and state
|
|
38
|
+
* return redirect('/login', {
|
|
39
|
+
* status: 303,
|
|
40
|
+
* state: [Flash({ text: "Session expired" })],
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // Off-host redirect (opt out of the same-origin guard). Without
|
|
44
|
+
* // `external: true`, a cross-origin target is blocked and replaced with the
|
|
45
|
+
* // app root, matching the client's open-redirect protection.
|
|
46
|
+
* return redirect('https://accounts.example.com/oauth', { external: true });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export function redirect(url: string, status?: number): Response;
|
|
50
|
+
export function redirect(
|
|
51
|
+
url: string,
|
|
52
|
+
options: {
|
|
53
|
+
status?: number;
|
|
54
|
+
state?: LocationStateEntry | LocationStateEntry[];
|
|
55
|
+
external?: boolean;
|
|
56
|
+
},
|
|
57
|
+
): Response;
|
|
58
|
+
export function redirect(
|
|
59
|
+
url: string,
|
|
60
|
+
statusOrOptions?:
|
|
61
|
+
| number
|
|
62
|
+
| {
|
|
63
|
+
status?: number;
|
|
64
|
+
state?: LocationStateEntry | LocationStateEntry[];
|
|
65
|
+
external?: boolean;
|
|
66
|
+
},
|
|
67
|
+
): Response {
|
|
68
|
+
const status =
|
|
69
|
+
typeof statusOrOptions === "number"
|
|
70
|
+
? statusOrOptions
|
|
71
|
+
: (statusOrOptions?.status ?? 302);
|
|
72
|
+
const state =
|
|
73
|
+
typeof statusOrOptions === "object" ? statusOrOptions?.state : undefined;
|
|
74
|
+
const external =
|
|
75
|
+
typeof statusOrOptions === "object" ? statusOrOptions?.external : undefined;
|
|
76
|
+
|
|
77
|
+
if (state) {
|
|
78
|
+
const ctx = getRequestContext();
|
|
79
|
+
ctx.setLocationState(state);
|
|
80
|
+
|
|
81
|
+
if (process.env.NODE_ENV !== "production") {
|
|
82
|
+
const reqCtx = getRequestContext();
|
|
83
|
+
// Warn only on true full-page SSR loads. SPA partial requests and server
|
|
84
|
+
// actions both deliver state through Flight payloads, so suppress for those.
|
|
85
|
+
if (
|
|
86
|
+
reqCtx &&
|
|
87
|
+
!reqCtx.originalUrl.searchParams.has("_rsc_partial") &&
|
|
88
|
+
!reqCtx.request.headers.has("rsc-action") &&
|
|
89
|
+
!reqCtx.originalUrl.searchParams.has("_rsc_action")
|
|
90
|
+
) {
|
|
91
|
+
console.warn(
|
|
92
|
+
`[Router] redirect() with state during a full-page (SSR) request to "${url}". ` +
|
|
93
|
+
"Location state is only delivered during SPA navigations and will be lost on this request.",
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Auto-prefix root-relative URLs with basename for app-local redirects.
|
|
100
|
+
// Treat the URL as already-prefixed when the basename is followed by a path
|
|
101
|
+
// separator, a query, a fragment, or end-of-string, so "/admin?tab=x" and
|
|
102
|
+
// "/admin#frag" are not double-prefixed into "/admin/admin?tab=x".
|
|
103
|
+
const bn = _getRequestContext()?._basename;
|
|
104
|
+
let resolvedUrl = url;
|
|
105
|
+
if (
|
|
106
|
+
bn &&
|
|
107
|
+
url.startsWith("/") &&
|
|
108
|
+
url !== bn &&
|
|
109
|
+
!url.startsWith(bn + "/") &&
|
|
110
|
+
!url.startsWith(bn + "?") &&
|
|
111
|
+
!url.startsWith(bn + "#")
|
|
112
|
+
) {
|
|
113
|
+
resolvedUrl = url === "/" ? bn : bn + url;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const headers: Record<string, string> = {
|
|
117
|
+
Location: resolvedUrl,
|
|
118
|
+
"X-RSC-Redirect": "soft",
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const response = new Response(null, { status, headers });
|
|
122
|
+
|
|
123
|
+
// Mark an explicit off-host redirect with an out-of-band brand so the
|
|
124
|
+
// same-origin guard (rsc/redirect-guard.ts) lets it through. The brand is a
|
|
125
|
+
// WeakSet membership on this Response object -- NOT a wire header -- so the
|
|
126
|
+
// opt-in cannot be forged by an attacker-controlled upstream response a
|
|
127
|
+
// proxy-style response route might copy. The internal redirect-rebuild paths
|
|
128
|
+
// transfer the brand; the guard reads and clears it (see markExternalRedirect).
|
|
129
|
+
if (external) {
|
|
130
|
+
markExternalRedirect(response);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return response;
|
|
134
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import type { AllUseItems } from "../route-types.js";
|
|
2
|
+
import { isPrerenderHandler, isPassthroughHandler } from "../prerender.js";
|
|
3
|
+
import { isStaticHandler } from "../static-handler.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Extract the .use callback from any handler shape.
|
|
7
|
+
*
|
|
8
|
+
* Checks definition brands first (objects with __brand), then plain functions.
|
|
9
|
+
* ReactNode handlers return undefined (no .use possible).
|
|
10
|
+
*/
|
|
11
|
+
export function resolveHandlerUse(handler: unknown): (() => any[]) | undefined {
|
|
12
|
+
if (handler == null) return undefined;
|
|
13
|
+
|
|
14
|
+
// Check branded definitions first — they're objects but also have typeof "object"
|
|
15
|
+
if (isPassthroughHandler(handler)) {
|
|
16
|
+
return (handler as any).use;
|
|
17
|
+
}
|
|
18
|
+
if (isPrerenderHandler(handler)) {
|
|
19
|
+
return (handler as any).use;
|
|
20
|
+
}
|
|
21
|
+
if (isStaticHandler(handler)) {
|
|
22
|
+
return (handler as any).use;
|
|
23
|
+
}
|
|
24
|
+
// Loader definitions from createLoader() — branded objects with optional .use
|
|
25
|
+
if (typeof handler === "object" && (handler as any).__brand === "loader") {
|
|
26
|
+
return (handler as any).use;
|
|
27
|
+
}
|
|
28
|
+
// Plain handler function
|
|
29
|
+
if (typeof handler === "function") {
|
|
30
|
+
return (handler as any).use;
|
|
31
|
+
}
|
|
32
|
+
// ReactNode or other — no .use
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Allowed item types per mount site.
|
|
38
|
+
* Mirrors the RouteUseItem / ParallelUseItem / InterceptUseItem / LayoutUseItem unions
|
|
39
|
+
* from route-types.ts for runtime validation.
|
|
40
|
+
*/
|
|
41
|
+
const MOUNT_SITE_ALLOWED_TYPES: Record<string, Set<string>> = {
|
|
42
|
+
path: new Set([
|
|
43
|
+
"layout",
|
|
44
|
+
"parallel",
|
|
45
|
+
"intercept",
|
|
46
|
+
"middleware",
|
|
47
|
+
"revalidate",
|
|
48
|
+
"loader",
|
|
49
|
+
"loading",
|
|
50
|
+
"errorBoundary",
|
|
51
|
+
"notFoundBoundary",
|
|
52
|
+
"cache",
|
|
53
|
+
"transition",
|
|
54
|
+
]),
|
|
55
|
+
// Response routes (path.json, path.text, etc.) — mirrors ResponseRouteUseItem
|
|
56
|
+
response: new Set(["middleware", "cache"]),
|
|
57
|
+
route: new Set([
|
|
58
|
+
"layout",
|
|
59
|
+
"parallel",
|
|
60
|
+
"intercept",
|
|
61
|
+
"middleware",
|
|
62
|
+
"revalidate",
|
|
63
|
+
"loader",
|
|
64
|
+
"loading",
|
|
65
|
+
"errorBoundary",
|
|
66
|
+
"notFoundBoundary",
|
|
67
|
+
"cache",
|
|
68
|
+
"transition",
|
|
69
|
+
]),
|
|
70
|
+
// layout allows AllUseItems — no validation needed, but included for completeness
|
|
71
|
+
layout: new Set([
|
|
72
|
+
"layout",
|
|
73
|
+
"route",
|
|
74
|
+
"middleware",
|
|
75
|
+
"revalidate",
|
|
76
|
+
"parallel",
|
|
77
|
+
"intercept",
|
|
78
|
+
"loader",
|
|
79
|
+
"loading",
|
|
80
|
+
"errorBoundary",
|
|
81
|
+
"notFoundBoundary",
|
|
82
|
+
"cache",
|
|
83
|
+
"transition",
|
|
84
|
+
"include",
|
|
85
|
+
]),
|
|
86
|
+
parallel: new Set([
|
|
87
|
+
"revalidate",
|
|
88
|
+
"loader",
|
|
89
|
+
"loading",
|
|
90
|
+
"errorBoundary",
|
|
91
|
+
"notFoundBoundary",
|
|
92
|
+
"transition",
|
|
93
|
+
]),
|
|
94
|
+
intercept: new Set([
|
|
95
|
+
"middleware",
|
|
96
|
+
"revalidate",
|
|
97
|
+
"loader",
|
|
98
|
+
"loading",
|
|
99
|
+
"errorBoundary",
|
|
100
|
+
"notFoundBoundary",
|
|
101
|
+
"layout",
|
|
102
|
+
"route",
|
|
103
|
+
"transition",
|
|
104
|
+
]),
|
|
105
|
+
// LoaderUseItem — only revalidate + cache can attach to a loader entry
|
|
106
|
+
loader: new Set(["revalidate", "cache"]),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Validate that items from handler.use() are valid for the given mount site.
|
|
111
|
+
* Throws a descriptive error if any item is not allowed.
|
|
112
|
+
*/
|
|
113
|
+
export function validateHandlerUseItems(
|
|
114
|
+
items: AllUseItems[],
|
|
115
|
+
mountSite: string,
|
|
116
|
+
): void {
|
|
117
|
+
const allowed = MOUNT_SITE_ALLOWED_TYPES[mountSite];
|
|
118
|
+
if (!allowed) return;
|
|
119
|
+
for (const item of items) {
|
|
120
|
+
if (item == null) continue;
|
|
121
|
+
if (!allowed.has((item as any).type)) {
|
|
122
|
+
throw new Error(
|
|
123
|
+
`handler.use() returned ${(item as any).type}() which is not valid inside ${mountSite}(). ` +
|
|
124
|
+
`Allowed types: ${[...allowed].join(", ")}.`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Create a merged use callback from handler.use and explicit use.
|
|
132
|
+
* handler.use items come first (defaults), explicit items second (overrides).
|
|
133
|
+
* Returns undefined if both are absent.
|
|
134
|
+
*/
|
|
135
|
+
export function mergeHandlerUse(
|
|
136
|
+
handlerUse: (() => any[]) | undefined,
|
|
137
|
+
explicitUse: (() => any[]) | undefined,
|
|
138
|
+
mountSite: string,
|
|
139
|
+
): (() => any[]) | undefined {
|
|
140
|
+
if (!handlerUse && !explicitUse) return undefined;
|
|
141
|
+
// Validation asymmetry (intentional, pre-1.0): only handler.use() items are
|
|
142
|
+
// checked against the mount-site allow-list (validateHandlerUseItems below).
|
|
143
|
+
// Explicit use() items pass through unvalidated on both the explicit-only
|
|
144
|
+
// branch here and the merged branch, so a structurally-valid-but-prohibited
|
|
145
|
+
// item (e.g. middleware() inside a parallel slot) is not rejected at this seam.
|
|
146
|
+
// Documented rather than enforced for now; revisit before 1.0 (#569).
|
|
147
|
+
if (!handlerUse) return explicitUse;
|
|
148
|
+
if (!explicitUse) {
|
|
149
|
+
return () => {
|
|
150
|
+
const items = handlerUse().flat(3);
|
|
151
|
+
validateHandlerUseItems(items, mountSite);
|
|
152
|
+
return items;
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
return () => {
|
|
156
|
+
const hItems = handlerUse().flat(3);
|
|
157
|
+
validateHandlerUseItems(hItems, mountSite);
|
|
158
|
+
return [...hItems, ...explicitUse()];
|
|
159
|
+
};
|
|
160
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AllUseItems } from "../route-types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The set of valid use-item `type` discriminants — the single runtime source of
|
|
5
|
+
* truth for "is this a well-formed use item?" shape validation.
|
|
6
|
+
*
|
|
7
|
+
* Declared via a `Record<...>` so that adding a member to the union without
|
|
8
|
+
* updating this map is a compile error. This is shape validation only; per-mount-
|
|
9
|
+
* site rules remain the narrower hand-written tables in resolve-handler-use.ts.
|
|
10
|
+
*/
|
|
11
|
+
const USE_ITEM_TYPES: Record<AllUseItems["type"], true> = {
|
|
12
|
+
layout: true,
|
|
13
|
+
route: true,
|
|
14
|
+
middleware: true,
|
|
15
|
+
revalidate: true,
|
|
16
|
+
parallel: true,
|
|
17
|
+
intercept: true,
|
|
18
|
+
loader: true,
|
|
19
|
+
loading: true,
|
|
20
|
+
errorBoundary: true,
|
|
21
|
+
notFoundBoundary: true,
|
|
22
|
+
cache: true,
|
|
23
|
+
transition: true,
|
|
24
|
+
include: true,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const ALL_USE_ITEM_TYPES: ReadonlySet<string> = new Set(
|
|
28
|
+
Object.keys(USE_ITEM_TYPES),
|
|
29
|
+
);
|