@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,247 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
NavigateOptions,
|
|
3
|
+
NavigationStore,
|
|
4
|
+
ResolvedSegment,
|
|
5
|
+
StreamingToken,
|
|
6
|
+
} from "./types.js";
|
|
7
|
+
import { generateHistoryKey } from "./navigation-store.js";
|
|
8
|
+
import {
|
|
9
|
+
handleNavigationStart,
|
|
10
|
+
ensureHistoryKey,
|
|
11
|
+
} from "./scroll-restoration.js";
|
|
12
|
+
import type { EventController, NavigationHandle } from "./event-controller.js";
|
|
13
|
+
import { debugLog } from "./logging.js";
|
|
14
|
+
import { buildHistoryState, pushHistoryWithIdx } from "./history-state.js";
|
|
15
|
+
|
|
16
|
+
export { resolveNavigationState } from "./history-state.js";
|
|
17
|
+
|
|
18
|
+
/** Check if a history state object contains location state keys. */
|
|
19
|
+
function hasLocationState(state: unknown): boolean {
|
|
20
|
+
if (!state || typeof state !== "object") return false;
|
|
21
|
+
return (
|
|
22
|
+
"state" in state ||
|
|
23
|
+
Object.keys(state).some((k) => k.startsWith("__rsc_ls_"))
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof Symbol.dispose === "undefined") {
|
|
28
|
+
(Symbol as any).dispose = Symbol("Symbol.dispose");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Options for committing a navigation transaction
|
|
33
|
+
*/
|
|
34
|
+
interface CommitOptions {
|
|
35
|
+
url: string;
|
|
36
|
+
segmentIds: string[];
|
|
37
|
+
segments: ResolvedSegment[];
|
|
38
|
+
replace?: boolean;
|
|
39
|
+
scroll?: boolean;
|
|
40
|
+
/** User-provided state to store in history.state */
|
|
41
|
+
state?: unknown;
|
|
42
|
+
/** If true, only update store without changing URL/history (for server actions) */
|
|
43
|
+
storeOnly?: boolean;
|
|
44
|
+
/** If true, this is an intercept route - store in history.state for popstate handling */
|
|
45
|
+
intercept?: boolean;
|
|
46
|
+
/** Source URL where the intercept was triggered from (stored in history.state) */
|
|
47
|
+
interceptSourceUrl?: string;
|
|
48
|
+
/** If true, only update cache without touching store or history (for background stale revalidation) */
|
|
49
|
+
cacheOnly?: boolean;
|
|
50
|
+
/** Server-set location state to merge into history.pushState */
|
|
51
|
+
serverState?: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Options that can override the pre-configured commit settings
|
|
56
|
+
*/
|
|
57
|
+
interface BoundCommitOverrides {
|
|
58
|
+
/** Override scroll behavior (e.g., disable for intercepts) */
|
|
59
|
+
scroll?: boolean;
|
|
60
|
+
/** Override replace behavior (e.g., force replace for intercepts) */
|
|
61
|
+
replace?: boolean;
|
|
62
|
+
/** Override user-provided state */
|
|
63
|
+
state?: unknown;
|
|
64
|
+
/** Mark this as an intercept route */
|
|
65
|
+
intercept?: boolean;
|
|
66
|
+
/** Source URL where intercept was triggered from */
|
|
67
|
+
interceptSourceUrl?: string;
|
|
68
|
+
/** If true, only update cache (for stale revalidation) */
|
|
69
|
+
cacheOnly?: boolean;
|
|
70
|
+
/** Server-set location state to merge into history.pushState */
|
|
71
|
+
serverState?: Record<string, unknown>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Bound transaction with pre-configured commit options (without segmentIds/segments)
|
|
76
|
+
*/
|
|
77
|
+
export interface BoundTransaction {
|
|
78
|
+
readonly currentUrl: string;
|
|
79
|
+
/** Start streaming and get a token to end it when the stream completes */
|
|
80
|
+
startStreaming(): StreamingToken;
|
|
81
|
+
/** Commit the navigation. Returns the effective scroll option for the caller to handle. */
|
|
82
|
+
commit(
|
|
83
|
+
segmentIds: string[],
|
|
84
|
+
segments: ResolvedSegment[],
|
|
85
|
+
overrides?: BoundCommitOverrides,
|
|
86
|
+
): { scroll?: boolean };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Navigation transaction for managing state during navigation
|
|
91
|
+
* Uses the event controller handle for lifecycle management
|
|
92
|
+
*/
|
|
93
|
+
interface NavigationTransaction extends Disposable {
|
|
94
|
+
commit(options: CommitOptions): { scroll?: boolean };
|
|
95
|
+
with(
|
|
96
|
+
options: Omit<CommitOptions, "segmentIds" | "segments">,
|
|
97
|
+
): BoundTransaction;
|
|
98
|
+
/** The navigation handle from the event controller */
|
|
99
|
+
handle: NavigationHandle;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Creates a navigation transaction that coordinates with the event controller.
|
|
104
|
+
* Handles loading state transitions and cleanup on completion/abort.
|
|
105
|
+
*/
|
|
106
|
+
export function createNavigationTransaction(
|
|
107
|
+
store: NavigationStore,
|
|
108
|
+
eventController: EventController,
|
|
109
|
+
url: string,
|
|
110
|
+
options?: NavigateOptions & { skipLoadingState?: boolean },
|
|
111
|
+
): NavigationTransaction {
|
|
112
|
+
let committed = false;
|
|
113
|
+
const currentUrl = window.location.href;
|
|
114
|
+
|
|
115
|
+
const handle = eventController.startNavigation(url, options);
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Commit the navigation - updates store and URL atomically
|
|
119
|
+
*/
|
|
120
|
+
function commit(opts: CommitOptions): { scroll?: boolean } {
|
|
121
|
+
committed = true;
|
|
122
|
+
|
|
123
|
+
const {
|
|
124
|
+
url,
|
|
125
|
+
segmentIds,
|
|
126
|
+
segments,
|
|
127
|
+
replace,
|
|
128
|
+
scroll,
|
|
129
|
+
storeOnly,
|
|
130
|
+
intercept,
|
|
131
|
+
interceptSourceUrl,
|
|
132
|
+
cacheOnly,
|
|
133
|
+
serverState,
|
|
134
|
+
} = opts;
|
|
135
|
+
|
|
136
|
+
const parsedUrl = new URL(url, window.location.origin);
|
|
137
|
+
|
|
138
|
+
const historyKey = generateHistoryKey(url, { intercept });
|
|
139
|
+
|
|
140
|
+
if (cacheOnly) {
|
|
141
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
142
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
143
|
+
handle.complete(parsedUrl);
|
|
144
|
+
debugLog("[Browser] Cache-only commit, historyKey:", historyKey);
|
|
145
|
+
return { scroll: false };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
handleNavigationStart();
|
|
149
|
+
|
|
150
|
+
store.setSegmentIds(segmentIds);
|
|
151
|
+
store.setCurrentUrl(url);
|
|
152
|
+
store.setPath(parsedUrl.pathname);
|
|
153
|
+
|
|
154
|
+
store.setHistoryKey(historyKey);
|
|
155
|
+
|
|
156
|
+
const currentHandleData = eventController.getHandleState().data;
|
|
157
|
+
store.cacheSegmentsForHistory(historyKey, segments, currentHandleData);
|
|
158
|
+
|
|
159
|
+
if (storeOnly) {
|
|
160
|
+
debugLog("[Browser] Store updated (action)");
|
|
161
|
+
handle.complete(parsedUrl);
|
|
162
|
+
return { scroll: false };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const historyState = buildHistoryState(
|
|
166
|
+
opts.state,
|
|
167
|
+
{ intercept, sourceUrl: interceptSourceUrl },
|
|
168
|
+
serverState,
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const oldState = window.history.state;
|
|
172
|
+
|
|
173
|
+
pushHistoryWithIdx(historyState, url, replace ?? false);
|
|
174
|
+
ensureHistoryKey();
|
|
175
|
+
|
|
176
|
+
if (hasLocationState(oldState) || hasLocationState(historyState)) {
|
|
177
|
+
window.dispatchEvent(new Event("__rsc_locationstate"));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
handle.complete(parsedUrl);
|
|
181
|
+
|
|
182
|
+
debugLog(
|
|
183
|
+
"[Browser] Navigation committed, historyKey:",
|
|
184
|
+
historyKey,
|
|
185
|
+
intercept ? "(intercept)" : "",
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
return { scroll };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
handle,
|
|
193
|
+
commit,
|
|
194
|
+
|
|
195
|
+
with(
|
|
196
|
+
opts: Omit<CommitOptions, "segmentIds" | "segments">,
|
|
197
|
+
): BoundTransaction {
|
|
198
|
+
return {
|
|
199
|
+
get currentUrl() {
|
|
200
|
+
return currentUrl;
|
|
201
|
+
},
|
|
202
|
+
startStreaming() {
|
|
203
|
+
return handle.startStreaming();
|
|
204
|
+
},
|
|
205
|
+
commit: (
|
|
206
|
+
segmentIds: string[],
|
|
207
|
+
segments: ResolvedSegment[],
|
|
208
|
+
overrides?: BoundCommitOverrides,
|
|
209
|
+
) => {
|
|
210
|
+
const finalScroll = overrides?.scroll ?? opts.scroll;
|
|
211
|
+
const finalReplace = overrides?.replace ?? opts.replace;
|
|
212
|
+
const intercept = overrides?.intercept ?? opts.intercept;
|
|
213
|
+
const interceptSourceUrl =
|
|
214
|
+
overrides?.interceptSourceUrl ?? opts.interceptSourceUrl;
|
|
215
|
+
const cacheOnly = overrides?.cacheOnly ?? opts.cacheOnly;
|
|
216
|
+
// state is `unknown` (null is meaningful) so `??` would wrongly drop a
|
|
217
|
+
// null override; serverState always comes from overrides, never opts.
|
|
218
|
+
const state =
|
|
219
|
+
overrides?.state !== undefined ? overrides.state : opts.state;
|
|
220
|
+
const serverState = overrides?.serverState;
|
|
221
|
+
return commit({
|
|
222
|
+
...opts,
|
|
223
|
+
segmentIds,
|
|
224
|
+
segments,
|
|
225
|
+
scroll: finalScroll,
|
|
226
|
+
replace: finalReplace,
|
|
227
|
+
state,
|
|
228
|
+
intercept,
|
|
229
|
+
interceptSourceUrl,
|
|
230
|
+
cacheOnly,
|
|
231
|
+
serverState,
|
|
232
|
+
});
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
[Symbol.dispose]() {
|
|
238
|
+
if (handle.signal.aborted) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!committed) {
|
|
243
|
+
handle[Symbol.dispose]();
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { NetworkError, isNetworkError } from "../errors.js";
|
|
2
|
+
import { RenderErrorThrower } from "../render-error-thrower.js";
|
|
3
|
+
import type { UpdateSubscriber } from "./types.js";
|
|
4
|
+
import { createElement, startTransition } from "react";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Convert an unknown error to a NetworkError, or return null if not network-related.
|
|
8
|
+
*
|
|
9
|
+
* Pure function: extracts the "is this a network error?" decision from
|
|
10
|
+
* navigation-bridge and server-action-bridge so it can be unit tested.
|
|
11
|
+
*/
|
|
12
|
+
export function toNetworkError(
|
|
13
|
+
error: unknown,
|
|
14
|
+
context: { url: string; operation: "action" | "navigation" | "revalidation" },
|
|
15
|
+
): NetworkError | null {
|
|
16
|
+
if (error instanceof NetworkError) return error;
|
|
17
|
+
if (isNetworkError(error)) {
|
|
18
|
+
return new NetworkError(
|
|
19
|
+
"Unable to connect to server. Please check your connection.",
|
|
20
|
+
{ cause: error, url: context.url, operation: context.operation },
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Render an error into the segment tree via the onUpdate subscriber so the
|
|
28
|
+
* nearest error boundary catches it. Wrapped in startTransition; RenderErrorThrower
|
|
29
|
+
* throws during render (async rejections do not reach boundaries on their own).
|
|
30
|
+
*/
|
|
31
|
+
function emitErrorToBoundary(
|
|
32
|
+
onUpdate: UpdateSubscriber,
|
|
33
|
+
error: unknown,
|
|
34
|
+
pathname: string,
|
|
35
|
+
): void {
|
|
36
|
+
startTransition(() => {
|
|
37
|
+
onUpdate({
|
|
38
|
+
root: createElement(RenderErrorThrower, { error }),
|
|
39
|
+
metadata: {
|
|
40
|
+
pathname,
|
|
41
|
+
segments: [],
|
|
42
|
+
isError: true,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Emit a NetworkError to the nearest error boundary (offline, failed fetch).
|
|
50
|
+
*/
|
|
51
|
+
export function emitNetworkError(
|
|
52
|
+
onUpdate: UpdateSubscriber,
|
|
53
|
+
error: NetworkError,
|
|
54
|
+
pathname: string,
|
|
55
|
+
): void {
|
|
56
|
+
emitErrorToBoundary(onUpdate, error, pathname);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Emit a navigation processing error to the nearest error boundary. Used when a
|
|
61
|
+
* navigation response cannot be processed (an undecodable Flight body, or any
|
|
62
|
+
* unanticipated failure while building the response) -- for both fresh and
|
|
63
|
+
* prefetched responses, since both funnel through the navigation catch. Without
|
|
64
|
+
* this, such a failure becomes an uncaught rejection that silently aborts the
|
|
65
|
+
* navigation instead of surfacing the route's error boundary.
|
|
66
|
+
*/
|
|
67
|
+
export function emitNavigationError(
|
|
68
|
+
onUpdate: UpdateSubscriber,
|
|
69
|
+
error: unknown,
|
|
70
|
+
pathname: string,
|
|
71
|
+
): void {
|
|
72
|
+
emitErrorToBoundary(onUpdate, error, pathname);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Check if an error is safe to suppress in background operations.
|
|
77
|
+
*
|
|
78
|
+
* Background revalidation (SWR, navigated-away refetch) should silently
|
|
79
|
+
* swallow AbortErrors and network errors since the user has already moved
|
|
80
|
+
* on and showing an error would be disruptive.
|
|
81
|
+
*
|
|
82
|
+
* Pure function, easily unit tested.
|
|
83
|
+
*/
|
|
84
|
+
export function isBackgroundSuppressible(error: unknown): boolean {
|
|
85
|
+
if (error instanceof DOMException && error.name === "AbortError") return true;
|
|
86
|
+
if (error instanceof NetworkError || isNetworkError(error)) return true;
|
|
87
|
+
return false;
|
|
88
|
+
}
|