@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,316 @@
|
|
|
1
|
+
import type { JsonSerialize } from "../serialize.js";
|
|
2
|
+
import type {
|
|
3
|
+
TypedRouteItem,
|
|
4
|
+
TypedIncludeItem,
|
|
5
|
+
TypedLayoutItem,
|
|
6
|
+
TypedCacheItem,
|
|
7
|
+
TypedTransitionItem,
|
|
8
|
+
} from "../route-types.js";
|
|
9
|
+
import type { LocalOnlyInclude, UnnamedRoute } from "./pattern-types.js";
|
|
10
|
+
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Route Type Extraction Utilities
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Prefix route names with a given prefix (e.g., "blog" + "post" = "blog.post")
|
|
17
|
+
*
|
|
18
|
+
* Filters out plain `string` index signatures to prevent dynamically-generated
|
|
19
|
+
* routes from poisoning the route map. When TypeScript encounters very large
|
|
20
|
+
* route sets (5000+ routes via Array.from), it may give up computing specific
|
|
21
|
+
* types and fall back to Record<string, string>. Without filtering, PrefixRoutes
|
|
22
|
+
* would map `string` to `${prefix}.${string}`, creating an index signature that
|
|
23
|
+
* accepts ANY prefixed name and defeats type-safe route checking.
|
|
24
|
+
*
|
|
25
|
+
* Uses `string extends K` (conservative filter):
|
|
26
|
+
* - Drops `string` keys (TypeScript fallback) -> prevents `[x: `site.${string}`]`
|
|
27
|
+
* - Keeps template literal patterns like `item${number}` from Array.from loops,
|
|
28
|
+
* which are imprecise but still allow writing paths like `/shop/product/1`
|
|
29
|
+
*
|
|
30
|
+
* A more aggressive alternative (`{} extends Record<K, 1>`) would also drop
|
|
31
|
+
* template literal patterns. We chose conservative because loop-generated routes
|
|
32
|
+
* with `${number}` patterns still provide some value: they don't appear in
|
|
33
|
+
* named-routes.gen.ts or IDE autocomplete, but they do let you manually write
|
|
34
|
+
* valid paths without type errors.
|
|
35
|
+
*/
|
|
36
|
+
type PrefixRoutes<
|
|
37
|
+
TRoutes extends Record<string, any>,
|
|
38
|
+
TPrefix extends string,
|
|
39
|
+
> = TPrefix extends ""
|
|
40
|
+
? TRoutes
|
|
41
|
+
: {
|
|
42
|
+
[K in keyof TRoutes as K extends string
|
|
43
|
+
? string extends K
|
|
44
|
+
? never
|
|
45
|
+
: `${TPrefix}.${K}`
|
|
46
|
+
: never]: TRoutes[K];
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Prefix route patterns with a URL prefix (e.g., "/blog" + "/:slug" = "/blog/:slug")
|
|
51
|
+
*/
|
|
52
|
+
type PrefixPatterns<
|
|
53
|
+
TRoutes extends Record<string, any>,
|
|
54
|
+
TUrlPrefix extends string,
|
|
55
|
+
> = {
|
|
56
|
+
[K in keyof TRoutes]: TRoutes[K] extends string
|
|
57
|
+
? `${TUrlPrefix}${TRoutes[K]}`
|
|
58
|
+
: TRoutes[K] extends {
|
|
59
|
+
readonly path: infer P extends string;
|
|
60
|
+
readonly search: infer S;
|
|
61
|
+
}
|
|
62
|
+
? { readonly path: `${TUrlPrefix}${P}`; readonly search: S }
|
|
63
|
+
: TRoutes[K];
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Convert a union type to an intersection type.
|
|
68
|
+
* Used to combine route maps from multiple siblings without recursive tuple processing.
|
|
69
|
+
*/
|
|
70
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
71
|
+
k: infer I,
|
|
72
|
+
) => void
|
|
73
|
+
? I
|
|
74
|
+
: never;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Extract routes from a single item (path, include, layout, cache with children)
|
|
78
|
+
*/
|
|
79
|
+
type ExtractRoutesFromItem<T> =
|
|
80
|
+
// TypedRouteItem: extract name -> pattern (exclude unnamed routes)
|
|
81
|
+
// When search schema is non-empty, value becomes { path, search } object
|
|
82
|
+
T extends TypedRouteItem<infer TName, infer TPattern, any, infer TSearch>
|
|
83
|
+
? TName extends string
|
|
84
|
+
? // Widened-name guard (#642): some name-less call forms — notably the
|
|
85
|
+
// 3-arg children-fn overload path(pattern, component, () => [...]) —
|
|
86
|
+
// let TName infer to the bare `string` constraint instead of the
|
|
87
|
+
// UnnamedRoute sentinel, because the children-fn argument structurally
|
|
88
|
+
// satisfies the all-optional PathOptions<TName> union member. Mapping
|
|
89
|
+
// over a bare `string` key would emit `{ [K in string]: TPattern }`, an
|
|
90
|
+
// index signature that poisons the whole sibling map (Rango.Path
|
|
91
|
+
// collapses to never). Treat an unresolved name as unnamed.
|
|
92
|
+
string extends TName
|
|
93
|
+
? {}
|
|
94
|
+
: TName extends UnnamedRoute
|
|
95
|
+
? {} // Exclude unnamed routes from type map
|
|
96
|
+
: {} extends TSearch
|
|
97
|
+
? { [K in TName]: TPattern }
|
|
98
|
+
: {
|
|
99
|
+
[K in TName]: {
|
|
100
|
+
readonly path: TPattern;
|
|
101
|
+
readonly search: TSearch;
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
: {}
|
|
105
|
+
: // TypedIncludeItem: extract prefixed routes (both name and URL prefix)
|
|
106
|
+
T extends TypedIncludeItem<
|
|
107
|
+
infer TRoutes,
|
|
108
|
+
infer TNamePrefix,
|
|
109
|
+
infer TUrlPrefix
|
|
110
|
+
>
|
|
111
|
+
? TNamePrefix extends LocalOnlyInclude
|
|
112
|
+
? {}
|
|
113
|
+
: TNamePrefix extends string
|
|
114
|
+
? TUrlPrefix extends string
|
|
115
|
+
? PrefixRoutes<PrefixPatterns<TRoutes, TUrlPrefix>, TNamePrefix>
|
|
116
|
+
: PrefixRoutes<TRoutes, TNamePrefix>
|
|
117
|
+
: TUrlPrefix extends string
|
|
118
|
+
? PrefixPatterns<TRoutes, TUrlPrefix>
|
|
119
|
+
: TRoutes
|
|
120
|
+
: // TypedLayoutItem: extract child routes from phantom type
|
|
121
|
+
T extends TypedLayoutItem<infer TChildRoutes>
|
|
122
|
+
? TChildRoutes
|
|
123
|
+
: // TypedCacheItem: extract child routes from phantom type
|
|
124
|
+
T extends TypedCacheItem<infer TChildRoutes>
|
|
125
|
+
? TChildRoutes
|
|
126
|
+
: // TypedTransitionItem: extract child routes from phantom type
|
|
127
|
+
T extends TypedTransitionItem<infer TChildRoutes>
|
|
128
|
+
? TChildRoutes
|
|
129
|
+
: // Fallback (won't extract routes)
|
|
130
|
+
{};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Extract routes from an array of items using mapped types.
|
|
134
|
+
* Uses UnionToIntersection to combine routes without recursive tuple processing,
|
|
135
|
+
* removing the sibling limit that was caused by TypeScript recursion limits.
|
|
136
|
+
*/
|
|
137
|
+
type ExtractRoutesFromItems<T extends readonly any[]> = T extends readonly any[]
|
|
138
|
+
? UnionToIntersection<
|
|
139
|
+
{ [K in keyof T]: ExtractRoutesFromItem<T[K]> }[number]
|
|
140
|
+
> extends infer R
|
|
141
|
+
? // Blast-radius guard: never let a single malformed item collapse the
|
|
142
|
+
// whole map. A `never` intersection satisfies `extends Record<string,any>`
|
|
143
|
+
// (never extends everything), so check it explicitly first and fall back
|
|
144
|
+
// to `{}` rather than propagating `never`. See #642.
|
|
145
|
+
[R] extends [never]
|
|
146
|
+
? {}
|
|
147
|
+
: R extends Record<string, any>
|
|
148
|
+
? R
|
|
149
|
+
: {}
|
|
150
|
+
: {}
|
|
151
|
+
: {};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Main utility: extract route map from urls() callback return type
|
|
155
|
+
* Uses mapped types for sibling processing (no sibling limit).
|
|
156
|
+
*/
|
|
157
|
+
export type ExtractRoutes<T extends readonly any[]> = ExtractRoutesFromItems<T>;
|
|
158
|
+
|
|
159
|
+
// ============================================================================
|
|
160
|
+
// Response Type Extraction Utilities
|
|
161
|
+
// ============================================================================
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Prefix keys of a Record<string, unknown> with a dot-separated prefix.
|
|
165
|
+
* Used for response type maps through include().
|
|
166
|
+
* Same index signature filter as PrefixRoutes (see comment there).
|
|
167
|
+
*/
|
|
168
|
+
type PrefixKeys<
|
|
169
|
+
T extends Record<string, unknown>,
|
|
170
|
+
TPrefix extends string,
|
|
171
|
+
> = TPrefix extends ""
|
|
172
|
+
? T
|
|
173
|
+
: {
|
|
174
|
+
[K in keyof T as K extends string
|
|
175
|
+
? string extends K
|
|
176
|
+
? never
|
|
177
|
+
: `${TPrefix}.${K}`
|
|
178
|
+
: never]: T[K];
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Extract response data types from a single item.
|
|
183
|
+
* Parallel to ExtractRoutesFromItem but extracts name -> TData mapping.
|
|
184
|
+
*/
|
|
185
|
+
type ExtractResponsesFromItem<T> =
|
|
186
|
+
T extends TypedRouteItem<infer TName, any, infer TData>
|
|
187
|
+
? TName extends string
|
|
188
|
+
? // Widened-name guard (#642), parallels ExtractRoutesFromItem. A name-less
|
|
189
|
+
// children-fn path.json(pattern, handler, () => [...]) infers TName as
|
|
190
|
+
// bare `string`; without this the response map picks up an index
|
|
191
|
+
// signature { [K in string]: TData } that wipes named siblings.
|
|
192
|
+
string extends TName
|
|
193
|
+
? {}
|
|
194
|
+
: TName extends UnnamedRoute
|
|
195
|
+
? {}
|
|
196
|
+
: { [K in TName]: TData }
|
|
197
|
+
: {}
|
|
198
|
+
: T extends TypedIncludeItem<any, infer TNamePrefix, any, infer TResponses>
|
|
199
|
+
? TNamePrefix extends LocalOnlyInclude
|
|
200
|
+
? {}
|
|
201
|
+
: TNamePrefix extends string
|
|
202
|
+
? TResponses extends Record<string, unknown>
|
|
203
|
+
? PrefixKeys<TResponses, TNamePrefix>
|
|
204
|
+
: {}
|
|
205
|
+
: TResponses extends Record<string, unknown>
|
|
206
|
+
? TResponses
|
|
207
|
+
: {}
|
|
208
|
+
: T extends TypedLayoutItem<any, infer TChildResponses>
|
|
209
|
+
? TChildResponses extends Record<string, unknown>
|
|
210
|
+
? TChildResponses
|
|
211
|
+
: {}
|
|
212
|
+
: T extends TypedCacheItem<any, infer TChildResponses>
|
|
213
|
+
? TChildResponses extends Record<string, unknown>
|
|
214
|
+
? TChildResponses
|
|
215
|
+
: {}
|
|
216
|
+
: T extends TypedTransitionItem<any, infer TChildResponses>
|
|
217
|
+
? TChildResponses extends Record<string, unknown>
|
|
218
|
+
? TChildResponses
|
|
219
|
+
: {}
|
|
220
|
+
: {};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Extract responses from an array of items using mapped types.
|
|
224
|
+
* Parallel to ExtractRoutesFromItems.
|
|
225
|
+
*/
|
|
226
|
+
type ExtractResponsesFromItems<T extends readonly any[]> =
|
|
227
|
+
T extends readonly any[]
|
|
228
|
+
? UnionToIntersection<
|
|
229
|
+
{ [K in keyof T]: ExtractResponsesFromItem<T[K]> }[number]
|
|
230
|
+
> extends infer R
|
|
231
|
+
? // Blast-radius guard (parallels ExtractRoutesFromItems). See #642.
|
|
232
|
+
[R] extends [never]
|
|
233
|
+
? {}
|
|
234
|
+
: R extends Record<string, unknown>
|
|
235
|
+
? R
|
|
236
|
+
: {}
|
|
237
|
+
: {}
|
|
238
|
+
: {};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Main utility: extract response data type map from urls() callback return type.
|
|
242
|
+
* Parallel to ExtractRoutes.
|
|
243
|
+
*/
|
|
244
|
+
export type ExtractResponses<T extends readonly any[]> =
|
|
245
|
+
ExtractResponsesFromItems<T>;
|
|
246
|
+
|
|
247
|
+
// ============================================================================
|
|
248
|
+
// Response Error (RFC 9457 problem+json) Type
|
|
249
|
+
// ============================================================================
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* RFC 9457 (problem+json) error body returned by JSON response routes on a
|
|
253
|
+
* non-2xx status. Sent verbatim as the response body (not wrapped) with
|
|
254
|
+
* content-type `application/problem+json`.
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* const res = await fetch(url);
|
|
259
|
+
* if (!res.ok) {
|
|
260
|
+
* const problem: ProblemDetails = await res.json();
|
|
261
|
+
* console.log(problem.code, problem.detail); // "NOT_FOUND", "Product not found"
|
|
262
|
+
* return;
|
|
263
|
+
* }
|
|
264
|
+
* const product = await res.json(); // bare value, no envelope
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
export interface ProblemDetails {
|
|
268
|
+
/**
|
|
269
|
+
* URI reference identifying the problem type. Omitted in this phase (per RFC
|
|
270
|
+
* 9457 an absent `type` is treated as `"about:blank"` — no semantics beyond
|
|
271
|
+
* the HTTP status); per-route problem-type URIs arrive with the
|
|
272
|
+
* declared-errors map later.
|
|
273
|
+
*/
|
|
274
|
+
type?: string;
|
|
275
|
+
/** Short, human-readable summary (the HTTP status reason phrase). */
|
|
276
|
+
title: string;
|
|
277
|
+
/** The HTTP status code. */
|
|
278
|
+
status: number;
|
|
279
|
+
/** Human-readable explanation specific to this occurrence (the error message). */
|
|
280
|
+
detail: string;
|
|
281
|
+
/** Stable machine-readable error code (`RouterError.code`, else `"INTERNAL"`). */
|
|
282
|
+
code: string;
|
|
283
|
+
/** Stack trace, included in development only. */
|
|
284
|
+
stack?: string;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ============================================================================
|
|
288
|
+
// Response Type Consumer Utilities
|
|
289
|
+
// ============================================================================
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Extract the JSON response payload type for a named route from a UrlPatterns
|
|
293
|
+
* instance. JSON response routes send the handler's return value verbatim
|
|
294
|
+
* (bare), so this resolves to the wire value a consumer receives — no envelope.
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* const apiPatterns = urls(({ path }) => [
|
|
299
|
+
* path.json("/health", (ctx) => ({ status: "ok", timestamp: Date.now() }), { name: "health" }),
|
|
300
|
+
* ]);
|
|
301
|
+
*
|
|
302
|
+
* type HealthData = RouteResponse<typeof apiPatterns, "health">;
|
|
303
|
+
* // { status: string; timestamp: number }
|
|
304
|
+
* ```
|
|
305
|
+
*
|
|
306
|
+
* The payload is the JSON wire shape (via `Rango.JsonSerialize`), matching
|
|
307
|
+
* `Rango.PathResponse` and what `fetch().then(r => r.json())` actually yields —
|
|
308
|
+
* e.g. a `Date` field resolves as `string`.
|
|
309
|
+
*/
|
|
310
|
+
export type RouteResponse<TPatterns, TName extends string> = TPatterns extends {
|
|
311
|
+
readonly _responses?: infer R;
|
|
312
|
+
}
|
|
313
|
+
? TName extends keyof R
|
|
314
|
+
? JsonSerialize<Exclude<R[TName], Response>>
|
|
315
|
+
: never
|
|
316
|
+
: never;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { DefaultEnv } from "../types.js";
|
|
2
|
+
import type { AllUseItems } from "../route-types.js";
|
|
3
|
+
import { getContext } from "../server/context";
|
|
4
|
+
import { invariant } from "../errors";
|
|
5
|
+
import { createRouteHelpers } from "../route-definition.js";
|
|
6
|
+
import type { UrlPatterns } from "./pattern-types.js";
|
|
7
|
+
import type { PathHelpers } from "./path-helper-types.js";
|
|
8
|
+
import type { ExtractRoutes, ExtractResponses } from "./type-extraction.js";
|
|
9
|
+
import { createPathHelper, attachPathResponseTags } from "./path-helper.js";
|
|
10
|
+
import { createIncludeHelper, processItems } from "./include-helper.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Define URL patterns with Django-inspired syntax
|
|
14
|
+
*
|
|
15
|
+
* Replaces map() as the entry point for route definitions.
|
|
16
|
+
* URL patterns are now visible at the definition site via path().
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* export const blogPatterns = urls(({ path, layout, loader }) => [
|
|
21
|
+
* layout(BlogLayout, () => [
|
|
22
|
+
* path("/", BlogIndex, { name: "index" }),
|
|
23
|
+
* path("/:slug", BlogPost, { name: "post" }, () => [
|
|
24
|
+
* loader(PostLoader),
|
|
25
|
+
* ]),
|
|
26
|
+
* ]),
|
|
27
|
+
* ]);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export function urls<
|
|
31
|
+
TEnv = DefaultEnv,
|
|
32
|
+
const TItems extends readonly (AllUseItems | readonly AllUseItems[])[] =
|
|
33
|
+
readonly AllUseItems[],
|
|
34
|
+
>(
|
|
35
|
+
builder: (helpers: PathHelpers<TEnv>) => TItems,
|
|
36
|
+
): UrlPatterns<TEnv, ExtractRoutes<TItems>, ExtractResponses<TItems>> {
|
|
37
|
+
const handler = () => {
|
|
38
|
+
invariant(
|
|
39
|
+
typeof builder === "function",
|
|
40
|
+
"urls() expects a builder function as its argument",
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
const baseHelpers = createRouteHelpers<any, TEnv>();
|
|
44
|
+
|
|
45
|
+
const pathHelper = attachPathResponseTags(createPathHelper<TEnv>());
|
|
46
|
+
|
|
47
|
+
const includeHelper = createIncludeHelper<TEnv>();
|
|
48
|
+
|
|
49
|
+
const helpers: PathHelpers<TEnv> = {
|
|
50
|
+
path: pathHelper as any,
|
|
51
|
+
include: includeHelper as any,
|
|
52
|
+
layout: baseHelpers.layout as PathHelpers<TEnv>["layout"],
|
|
53
|
+
parallel: baseHelpers.parallel as PathHelpers<TEnv>["parallel"],
|
|
54
|
+
intercept: baseHelpers.intercept as PathHelpers<TEnv>["intercept"],
|
|
55
|
+
middleware: baseHelpers.middleware,
|
|
56
|
+
revalidate: baseHelpers.revalidate,
|
|
57
|
+
loader: baseHelpers.loader,
|
|
58
|
+
loading: baseHelpers.loading,
|
|
59
|
+
errorBoundary: baseHelpers.errorBoundary,
|
|
60
|
+
notFoundBoundary: baseHelpers.notFoundBoundary,
|
|
61
|
+
cache: baseHelpers.cache as PathHelpers<TEnv>["cache"],
|
|
62
|
+
transition: baseHelpers.transition as PathHelpers<TEnv>["transition"],
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const builderResult = builder(helpers).flat(3) as AllUseItems[];
|
|
66
|
+
return processItems(builderResult);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
handler,
|
|
71
|
+
get trailingSlash() {
|
|
72
|
+
const store = getContext();
|
|
73
|
+
const ctx = store.context.getStore();
|
|
74
|
+
if (!ctx?.trailingSlash) {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
return Object.fromEntries(ctx.trailingSlash);
|
|
78
|
+
},
|
|
79
|
+
} as UrlPatterns<TEnv, ExtractRoutes<TItems>, ExtractResponses<TItems>>;
|
|
80
|
+
}
|