@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,275 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { Handler } from "../types.js";
|
|
3
|
+
import type { RouteItem, RouteUseItem, UseItems } from "../route-types.js";
|
|
4
|
+
import {
|
|
5
|
+
getUrlPrefix,
|
|
6
|
+
getNamePrefix,
|
|
7
|
+
getRootScoped,
|
|
8
|
+
requireDslContext,
|
|
9
|
+
} from "../server/context";
|
|
10
|
+
import { invariant, DataNotFoundError } from "../errors";
|
|
11
|
+
import { validateUserRouteName } from "../route-name.js";
|
|
12
|
+
import {
|
|
13
|
+
isPrerenderHandler,
|
|
14
|
+
isPassthroughHandler,
|
|
15
|
+
type PrerenderHandlerDefinition,
|
|
16
|
+
} from "../prerender.js";
|
|
17
|
+
import {
|
|
18
|
+
isStaticHandler,
|
|
19
|
+
type StaticHandlerDefinition,
|
|
20
|
+
} from "../static-handler.js";
|
|
21
|
+
import {
|
|
22
|
+
registerSearchSchema,
|
|
23
|
+
registerRouteRootScope,
|
|
24
|
+
} from "../route-map-builder.js";
|
|
25
|
+
import { RESPONSE_TYPE } from "./response-types.js";
|
|
26
|
+
import type { PathOptions } from "./pattern-types.js";
|
|
27
|
+
import type {
|
|
28
|
+
PathFn,
|
|
29
|
+
ResponsePathFn,
|
|
30
|
+
JsonResponsePathFn,
|
|
31
|
+
TextResponsePathFn,
|
|
32
|
+
} from "./path-helper-types.js";
|
|
33
|
+
import {
|
|
34
|
+
resolveHandlerUse,
|
|
35
|
+
mergeHandlerUse,
|
|
36
|
+
} from "../route-definition/resolve-handler-use.js";
|
|
37
|
+
import {
|
|
38
|
+
emptySegmentBase,
|
|
39
|
+
runAndValidateUseItems,
|
|
40
|
+
} from "../route-definition/dsl-helpers.js";
|
|
41
|
+
|
|
42
|
+
function applyUrlPrefix(prefix: string, pattern: string): string {
|
|
43
|
+
if (!prefix) return pattern;
|
|
44
|
+
if (pattern === "/") return prefix;
|
|
45
|
+
if (prefix.endsWith("/") && pattern.startsWith("/")) {
|
|
46
|
+
return prefix + pattern.slice(1);
|
|
47
|
+
}
|
|
48
|
+
return prefix + pattern;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function applyNamePrefix(prefix: string | undefined, name: string): string {
|
|
52
|
+
if (!prefix) return name;
|
|
53
|
+
return `${prefix}.${name}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function resolveResponseType(
|
|
57
|
+
options: PathOptions | undefined,
|
|
58
|
+
): string | undefined {
|
|
59
|
+
return options?.[RESPONSE_TYPE];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function createPathHelper<TEnv>(): PathFn<TEnv> {
|
|
63
|
+
return ((
|
|
64
|
+
pattern: string,
|
|
65
|
+
handler: ReactNode | Handler<any, any, TEnv>,
|
|
66
|
+
optionsOrUse?: PathOptions | (() => UseItems<RouteUseItem>),
|
|
67
|
+
maybeUse?: () => UseItems<RouteUseItem>,
|
|
68
|
+
): RouteItem => {
|
|
69
|
+
const { store, ctx } = requireDslContext(
|
|
70
|
+
"path() must be called inside urls()",
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
invariant(
|
|
74
|
+
!ctx.parent || ctx.parent.type !== "parallel",
|
|
75
|
+
"path() cannot be used inside parallel()",
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
{
|
|
79
|
+
let ancestor = ctx.parent;
|
|
80
|
+
while (ancestor) {
|
|
81
|
+
invariant(
|
|
82
|
+
ancestor.type !== "route",
|
|
83
|
+
"path() cannot be nested inside another path()",
|
|
84
|
+
);
|
|
85
|
+
ancestor = ancestor.parent;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let options: PathOptions | undefined;
|
|
90
|
+
let use: (() => UseItems<RouteUseItem>) | undefined;
|
|
91
|
+
|
|
92
|
+
if (typeof optionsOrUse === "function") {
|
|
93
|
+
// path(pattern, handler, use)
|
|
94
|
+
use = optionsOrUse as () => UseItems<RouteUseItem>;
|
|
95
|
+
} else if (typeof optionsOrUse === "object") {
|
|
96
|
+
// path(pattern, handler, options) or path(pattern, handler, options, use)
|
|
97
|
+
options = optionsOrUse as PathOptions;
|
|
98
|
+
use = maybeUse;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const handlerUseFn = resolveHandlerUse(handler);
|
|
102
|
+
const mountSite = resolveResponseType(options) ? "response" : "path";
|
|
103
|
+
const mergedUse = mergeHandlerUse(handlerUseFn, use, mountSite);
|
|
104
|
+
|
|
105
|
+
const urlPrefix = getUrlPrefix();
|
|
106
|
+
const namePrefix = getNamePrefix();
|
|
107
|
+
|
|
108
|
+
const prefixedPattern = applyUrlPrefix(urlPrefix, pattern);
|
|
109
|
+
|
|
110
|
+
const localName =
|
|
111
|
+
options?.name || `$path_${pattern.replace(/[/:*?]/g, "_")}`;
|
|
112
|
+
if (options?.name) {
|
|
113
|
+
validateUserRouteName(options.name);
|
|
114
|
+
}
|
|
115
|
+
const routeName = applyNamePrefix(namePrefix, localName);
|
|
116
|
+
|
|
117
|
+
const namespace = `${ctx.namespace}.${store.getNextIndex("route")}.${routeName}`;
|
|
118
|
+
|
|
119
|
+
if (ctx.forRoute && routeName !== ctx.forRoute) {
|
|
120
|
+
store.getShortCode("route");
|
|
121
|
+
return { type: "route" } as RouteItem;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const wrappedHandler: Handler<any, any, TEnv> =
|
|
125
|
+
typeof handler === "function"
|
|
126
|
+
? (handler as Handler<any, any, TEnv>)
|
|
127
|
+
: isPassthroughHandler(handler)
|
|
128
|
+
? typeof handler.prerenderDef.handler === "function"
|
|
129
|
+
? (handler.prerenderDef.handler as Handler<any, any, TEnv>)
|
|
130
|
+
: () => {
|
|
131
|
+
throw new DataNotFoundError(
|
|
132
|
+
"No prerender data found for this route",
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
: isPrerenderHandler(handler)
|
|
136
|
+
? typeof handler.handler === "function"
|
|
137
|
+
? (handler.handler as Handler<any, any, TEnv>)
|
|
138
|
+
: () => {
|
|
139
|
+
throw new DataNotFoundError(
|
|
140
|
+
"No prerender data found for this route",
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
: isStaticHandler(handler)
|
|
144
|
+
? (handler.handler as Handler<any, any, TEnv>)
|
|
145
|
+
: () => handler;
|
|
146
|
+
|
|
147
|
+
const entry = {
|
|
148
|
+
...emptySegmentBase(),
|
|
149
|
+
id: namespace,
|
|
150
|
+
shortCode: store.getShortCode("route"),
|
|
151
|
+
type: "route" as const,
|
|
152
|
+
parent: ctx.parent,
|
|
153
|
+
handler: wrappedHandler,
|
|
154
|
+
pattern: prefixedPattern,
|
|
155
|
+
...(urlPrefix ? { mountPath: urlPrefix } : {}),
|
|
156
|
+
...(isPassthroughHandler(handler)
|
|
157
|
+
? {
|
|
158
|
+
isPrerender: true as const,
|
|
159
|
+
prerenderDef: handler.prerenderDef as PrerenderHandlerDefinition,
|
|
160
|
+
isPassthrough: true as const,
|
|
161
|
+
liveHandler: handler.liveHandler as Handler<any, any, TEnv>,
|
|
162
|
+
}
|
|
163
|
+
: isPrerenderHandler(handler)
|
|
164
|
+
? {
|
|
165
|
+
isPrerender: true as const,
|
|
166
|
+
prerenderDef: handler as PrerenderHandlerDefinition,
|
|
167
|
+
}
|
|
168
|
+
: {}),
|
|
169
|
+
...(isStaticHandler(handler)
|
|
170
|
+
? {
|
|
171
|
+
isStaticPrerender: true as const,
|
|
172
|
+
...(handler.$$id ? { staticHandlerId: handler.$$id } : {}),
|
|
173
|
+
}
|
|
174
|
+
: {}),
|
|
175
|
+
...(resolveResponseType(options)
|
|
176
|
+
? { responseType: resolveResponseType(options) }
|
|
177
|
+
: {}),
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
if (isStaticHandler(handler) && handler.$$id && ctx.namePrefix) {
|
|
181
|
+
(handler as any).$$routePrefix = ctx.namePrefix;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
invariant(
|
|
185
|
+
ctx.manifest.get(routeName) === undefined,
|
|
186
|
+
`Duplicate route name: ${routeName} at ${namespace}`,
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
ctx.manifest.set(routeName, entry);
|
|
190
|
+
|
|
191
|
+
registerRouteRootScope(routeName, getRootScoped());
|
|
192
|
+
|
|
193
|
+
if (ctx.patterns) {
|
|
194
|
+
ctx.patterns.set(routeName, prefixedPattern);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (ctx.patternsByPrefix) {
|
|
198
|
+
const urlPrefix = getUrlPrefix() || "";
|
|
199
|
+
if (!ctx.patternsByPrefix.has(urlPrefix)) {
|
|
200
|
+
ctx.patternsByPrefix.set(urlPrefix, new Map());
|
|
201
|
+
}
|
|
202
|
+
ctx.patternsByPrefix.get(urlPrefix)!.set(routeName, prefixedPattern);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (options?.trailingSlash && ctx.trailingSlash) {
|
|
206
|
+
ctx.trailingSlash.set(routeName, options.trailingSlash);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (options?.search) {
|
|
210
|
+
if (ctx.searchSchemas) {
|
|
211
|
+
ctx.searchSchemas.set(routeName, options.search);
|
|
212
|
+
}
|
|
213
|
+
registerSearchSchema(routeName, options.search);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (mergedUse) {
|
|
217
|
+
const result = runAndValidateUseItems(
|
|
218
|
+
store,
|
|
219
|
+
namespace,
|
|
220
|
+
entry,
|
|
221
|
+
mergedUse,
|
|
222
|
+
"path",
|
|
223
|
+
"use",
|
|
224
|
+
);
|
|
225
|
+
return { name: namespace, type: "route", uses: result } as RouteItem;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return { name: namespace, type: "route" } as RouteItem;
|
|
229
|
+
}) as PathFn<TEnv>;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function attachPathResponseTags<TEnv>(
|
|
233
|
+
pathFn: PathFn<TEnv>,
|
|
234
|
+
): PathFn<TEnv> & {
|
|
235
|
+
json: JsonResponsePathFn<TEnv>;
|
|
236
|
+
text: TextResponsePathFn<TEnv>;
|
|
237
|
+
html: TextResponsePathFn<TEnv>;
|
|
238
|
+
xml: TextResponsePathFn<TEnv>;
|
|
239
|
+
md: TextResponsePathFn<TEnv>;
|
|
240
|
+
image: ResponsePathFn<TEnv>;
|
|
241
|
+
stream: ResponsePathFn<TEnv>;
|
|
242
|
+
any: ResponsePathFn<TEnv>;
|
|
243
|
+
} {
|
|
244
|
+
function createTagged(responseType: string): ResponsePathFn<TEnv> {
|
|
245
|
+
return ((
|
|
246
|
+
pattern: string,
|
|
247
|
+
handler: any,
|
|
248
|
+
optionsOrUse?: any,
|
|
249
|
+
maybeUse?: any,
|
|
250
|
+
) => {
|
|
251
|
+
let options: PathOptions;
|
|
252
|
+
let use: (() => any[]) | undefined;
|
|
253
|
+
if (typeof optionsOrUse === "function") {
|
|
254
|
+
options = { [RESPONSE_TYPE]: responseType };
|
|
255
|
+
use = optionsOrUse;
|
|
256
|
+
} else {
|
|
257
|
+
options = { ...optionsOrUse, [RESPONSE_TYPE]: responseType };
|
|
258
|
+
use = maybeUse;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return pathFn(pattern, handler, options, use);
|
|
262
|
+
}) as ResponsePathFn<TEnv>;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const extended = pathFn as any;
|
|
266
|
+
extended.json = createTagged("json");
|
|
267
|
+
extended.text = createTagged("text");
|
|
268
|
+
extended.html = createTagged("html");
|
|
269
|
+
extended.xml = createTagged("xml");
|
|
270
|
+
extended.md = createTagged("md");
|
|
271
|
+
extended.image = createTagged("image");
|
|
272
|
+
extended.stream = createTagged("stream");
|
|
273
|
+
extended.any = createTagged("any");
|
|
274
|
+
return extended;
|
|
275
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { TrailingSlashMode } from "../types.js";
|
|
2
|
+
import type { AllUseItems, UrlPatternsBrand } from "../route-types.js";
|
|
3
|
+
import type { SearchSchema } from "../search-params.js";
|
|
4
|
+
import { RESPONSE_TYPE } from "./response-types.js";
|
|
5
|
+
import type { DefaultEnv } from "../types.js";
|
|
6
|
+
import type { PathHelpers } from "./path-helper-types.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Builder function accepted by urls() and as a shorthand for routes()/urls option.
|
|
10
|
+
* When passed directly to routes() or createRouter({ urls }), it is wrapped in urls() automatically.
|
|
11
|
+
*/
|
|
12
|
+
export type UrlBuilder<
|
|
13
|
+
TEnv = DefaultEnv,
|
|
14
|
+
TItems extends readonly (AllUseItems | readonly AllUseItems[])[] =
|
|
15
|
+
readonly AllUseItems[],
|
|
16
|
+
> = (helpers: PathHelpers<TEnv>) => TItems;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Sentinel type for unnamed routes.
|
|
20
|
+
* Using a branded string instead of `never` prevents TypeScript from
|
|
21
|
+
* widening array type inference when mixing named and unnamed routes.
|
|
22
|
+
*/
|
|
23
|
+
export type UnnamedRoute = "$unnamed";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Sentinel type for include() mounts that stay local to the mounted module.
|
|
27
|
+
* This keeps child route names out of the parent/global type map while still
|
|
28
|
+
* allowing the mounted module to use its own local route names internally.
|
|
29
|
+
*
|
|
30
|
+
* Branded with a symbol key so it cannot be accidentally produced by user code.
|
|
31
|
+
*/
|
|
32
|
+
declare const LOCAL_ONLY_BRAND: unique symbol;
|
|
33
|
+
export type LocalOnlyInclude = string & { [LOCAL_ONLY_BRAND]: void };
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Options for path() function
|
|
37
|
+
*/
|
|
38
|
+
export interface PathOptions<
|
|
39
|
+
TName extends string = string,
|
|
40
|
+
TSearch extends SearchSchema = {},
|
|
41
|
+
> {
|
|
42
|
+
/** Route name for href() lookups */
|
|
43
|
+
name?: TName;
|
|
44
|
+
/** Search param schema for typed query parameters */
|
|
45
|
+
search?: TSearch;
|
|
46
|
+
/** Trailing slash behavior: "never" (redirect /path/ to /path), "always" (redirect /path to /path/), "ignore" (match both) */
|
|
47
|
+
trailingSlash?: TrailingSlashMode;
|
|
48
|
+
/** Response type marker (set by path.json(), etc.) */
|
|
49
|
+
[RESPONSE_TYPE]?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Result of urls() - contains the route definitions
|
|
54
|
+
*/
|
|
55
|
+
export interface UrlPatterns<
|
|
56
|
+
TEnv = any,
|
|
57
|
+
TRoutes extends Record<string, any> = Record<string, string>,
|
|
58
|
+
TResponses extends Record<string, unknown> = Record<string, unknown>,
|
|
59
|
+
> {
|
|
60
|
+
/** Internal: compiled handler function */
|
|
61
|
+
readonly handler: () => AllUseItems[];
|
|
62
|
+
/** Internal: trailing slash config per route name */
|
|
63
|
+
readonly trailingSlash: Record<string, TrailingSlashMode>;
|
|
64
|
+
/** Brand for type checking */
|
|
65
|
+
readonly [UrlPatternsBrand]: void;
|
|
66
|
+
/** Environment type brand (phantom) */
|
|
67
|
+
readonly _env?: TEnv;
|
|
68
|
+
/** Routes type brand (phantom) - carries route name -> pattern mapping */
|
|
69
|
+
readonly _routes?: TRoutes;
|
|
70
|
+
/** Responses type brand (phantom) - carries route name -> response data type mapping */
|
|
71
|
+
readonly _responses?: TResponses;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Extract the phantom env type carried by a UrlPatterns value.
|
|
76
|
+
*/
|
|
77
|
+
export type UrlPatternsEnv<T> =
|
|
78
|
+
T extends UrlPatterns<infer TEnv, any, any> ? TEnv : never;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Guards `routes()` env compatibility without over-constraining.
|
|
82
|
+
*
|
|
83
|
+
* - An env-agnostic block (its env is `unknown` — e.g. a shared urls() module,
|
|
84
|
+
* or an app that does not augment `Rango.Env`) attaches to any router.
|
|
85
|
+
* - A block carrying a concrete env is accepted only when the router env
|
|
86
|
+
* (`TRouterEnv`) satisfies it; resolves to `never` otherwise, so a
|
|
87
|
+
* `urls<{ DB: D1Database }>()` cannot be mounted on a `createRouter<{}>()`.
|
|
88
|
+
*
|
|
89
|
+
* Use as `patterns: T & EnvCompatible<T, TEnv>` so `T` still infers from the
|
|
90
|
+
* argument — a bare `EnvCompatible<T, TEnv>` parameter sits in a non-inferrable
|
|
91
|
+
* conditional position and would collapse `T` to its constraint.
|
|
92
|
+
*
|
|
93
|
+
* Known limitation: `TRouterEnv extends ...` distributes over a union router env,
|
|
94
|
+
* so a `urls<A>()` block is accepted on `createRouter<A | B>()` even though the
|
|
95
|
+
* `B` arm cannot supply `A`'s env. Suppressing distribution with
|
|
96
|
+
* `[TRouterEnv] extends [...]` would close that edge but breaks the common
|
|
97
|
+
* generic-`TEnv` call sites (a deferred type parameter can't resolve the tuple
|
|
98
|
+
* conditional, so the intersection stops reducing to `T`). A router has one env,
|
|
99
|
+
* so a union env is not a supported pattern; the distributive form is kept.
|
|
100
|
+
*/
|
|
101
|
+
export type EnvCompatible<TPatterns, TRouterEnv> =
|
|
102
|
+
unknown extends UrlPatternsEnv<TPatterns>
|
|
103
|
+
? TPatterns
|
|
104
|
+
: TRouterEnv extends UrlPatternsEnv<TPatterns>
|
|
105
|
+
? TPatterns
|
|
106
|
+
: never;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Options for include()
|
|
110
|
+
*/
|
|
111
|
+
export interface IncludeOptions<TNamePrefix extends string = string> {
|
|
112
|
+
/**
|
|
113
|
+
* Name prefix for all routes in this pattern set.
|
|
114
|
+
*
|
|
115
|
+
* - `{ name: "blog" }` — children become `blog.index`, `blog.detail`, etc.
|
|
116
|
+
* Visible in generated route types and resolvable globally via `reverse("blog.index")`.
|
|
117
|
+
* - `{ name: "" }` — children merge into the parent namespace with no prefix.
|
|
118
|
+
* Equivalent to defining the routes inline at the include site.
|
|
119
|
+
* - Omitted — children live in a private local scope, hidden from the
|
|
120
|
+
* generated route map and global reverse resolution. Only dot-local
|
|
121
|
+
* reverse (e.g. `reverse(".child")`) works from inside the module.
|
|
122
|
+
*/
|
|
123
|
+
name?: TNamePrefix;
|
|
124
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { ContextVar } from "../context-var.js";
|
|
2
|
+
import type { ReverseFunction } from "../reverse.js";
|
|
3
|
+
import type {
|
|
4
|
+
DefaultReverseRouteMap,
|
|
5
|
+
DefaultVars,
|
|
6
|
+
} from "../types/global-namespace.js";
|
|
7
|
+
import type { UseItems, ResponseRouteUseItem } from "../route-types.js";
|
|
8
|
+
import type { RequestScope } from "../types/request-scope.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Reverse function for response handler contexts.
|
|
12
|
+
* Global names get autocomplete and param validation from the generated route map.
|
|
13
|
+
* Local `.name` calls are accepted but not validated (scope unknown at type level).
|
|
14
|
+
*/
|
|
15
|
+
type ResponseReverseFunction = [DefaultReverseRouteMap] extends [
|
|
16
|
+
Record<string, string>,
|
|
17
|
+
]
|
|
18
|
+
? (
|
|
19
|
+
name: string,
|
|
20
|
+
params?: Record<string, string>,
|
|
21
|
+
search?: Record<string, unknown>,
|
|
22
|
+
) => string
|
|
23
|
+
: ReverseFunction<DefaultReverseRouteMap> & {
|
|
24
|
+
(
|
|
25
|
+
name: `.${string}`,
|
|
26
|
+
params?: Record<string, string>,
|
|
27
|
+
search?: Record<string, unknown>,
|
|
28
|
+
): string;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Symbol marking a route as a response route (non-RSC).
|
|
33
|
+
* Stored on PathOptions and UrlPatterns to signal the trie to short-circuit.
|
|
34
|
+
*/
|
|
35
|
+
export const RESPONSE_TYPE: unique symbol = Symbol.for("rangojs.responseType");
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Shared shape of a response-route handler: a function returning TReturn (or a
|
|
39
|
+
* promise of it), plus an optional composable `use` thunk merged at mount time.
|
|
40
|
+
*/
|
|
41
|
+
type ResponseHandlerOf<
|
|
42
|
+
TReturn,
|
|
43
|
+
TParams = Record<string, string>,
|
|
44
|
+
TEnv = any,
|
|
45
|
+
> = ((
|
|
46
|
+
ctx: ResponseHandlerContext<TParams, TEnv>,
|
|
47
|
+
) => TReturn | Promise<TReturn>) & {
|
|
48
|
+
/** Composable default DSL items merged when the handler is mounted. */
|
|
49
|
+
use?: () => UseItems<ResponseRouteUseItem>;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Handler that must return Response (not ReactNode).
|
|
54
|
+
* Used by path.image(), path.stream(), path.any() (binary/streaming data).
|
|
55
|
+
*/
|
|
56
|
+
export type ResponseHandler<
|
|
57
|
+
TParams = Record<string, string>,
|
|
58
|
+
TEnv = any,
|
|
59
|
+
> = ResponseHandlerOf<Response, TParams, TEnv>;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* JSON-serializable value type for auto-wrap support.
|
|
63
|
+
*/
|
|
64
|
+
export type JsonValue =
|
|
65
|
+
| string
|
|
66
|
+
| number
|
|
67
|
+
| boolean
|
|
68
|
+
| null
|
|
69
|
+
| JsonValue[]
|
|
70
|
+
| { [key: string]: JsonValue };
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Handler for JSON response routes.
|
|
74
|
+
* Can return a plain JSON-serializable value (auto-wrapped) or Response (pass-through).
|
|
75
|
+
*/
|
|
76
|
+
export type JsonResponseHandler<
|
|
77
|
+
TParams = Record<string, string>,
|
|
78
|
+
TEnv = any,
|
|
79
|
+
> = ResponseHandlerOf<JsonValue | Response, TParams, TEnv>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Handler for text-based response routes (text, html, xml).
|
|
83
|
+
* Can return a string (auto-wrapped) or Response (pass-through).
|
|
84
|
+
*/
|
|
85
|
+
export type TextResponseHandler<
|
|
86
|
+
TParams = Record<string, string>,
|
|
87
|
+
TEnv = any,
|
|
88
|
+
> = ResponseHandlerOf<string | Response, TParams, TEnv>;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Lighter handler context for response routes.
|
|
92
|
+
* No ctx.use() (no loaders). Supports setting response headers via ctx.header().
|
|
93
|
+
* Use the standalone cookies() function for cookie mutations.
|
|
94
|
+
*/
|
|
95
|
+
export interface ResponseHandlerContext<
|
|
96
|
+
TParams = Record<string, string>,
|
|
97
|
+
TEnv = any,
|
|
98
|
+
> extends RequestScope<TEnv> {
|
|
99
|
+
params: TParams;
|
|
100
|
+
/** @internal Phantom property for params type invariance. Prevents mounting handlers on wrong routes. */
|
|
101
|
+
readonly _paramCheck?: (params: TParams) => TParams;
|
|
102
|
+
reverse: ResponseReverseFunction;
|
|
103
|
+
/** Read a variable set by middleware via ctx.set(key, value) or ctx.set(ContextVar, value). */
|
|
104
|
+
get: {
|
|
105
|
+
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
106
|
+
} & (<K extends keyof DefaultVars>(key: K) => DefaultVars[K]);
|
|
107
|
+
/** Set a response header. Merged into the auto-wrapped or pass-through Response. */
|
|
108
|
+
header: (name: string, value: string) => void;
|
|
109
|
+
}
|