@rangojs/router 0.0.0-experimental.31 → 0.0.0-experimental.3232cd17
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 +4 -0
- package/README.md +198 -44
- package/dist/bin/rango.js +287 -105
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3248 -1117
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +73 -21
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +107 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +245 -21
- package/skills/caching/SKILL.md +302 -6
- package/skills/composability/SKILL.md +27 -2
- package/skills/css/SKILL.md +76 -0
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +270 -30
- package/skills/host-router/SKILL.md +82 -22
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +49 -5
- package/skills/layout/SKILL.md +35 -9
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +294 -30
- package/skills/middleware/SKILL.md +52 -13
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +203 -7
- package/skills/prerender/SKILL.md +123 -100
- package/skills/rango/SKILL.md +250 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +122 -47
- package/skills/route/SKILL.md +97 -5
- package/skills/router-setup/SKILL.md +90 -5
- package/skills/server-actions/SKILL.md +775 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/tailwind/SKILL.md +27 -3
- package/skills/testing/SKILL.md +129 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +124 -0
- package/skills/testing/client-components.md +122 -0
- package/skills/testing/e2e-parity.md +125 -0
- package/skills/testing/flight.md +92 -0
- package/skills/testing/handles.md +129 -0
- package/skills/testing/loader.md +128 -0
- package/skills/testing/middleware.md +99 -0
- package/skills/testing/render-handler.md +121 -0
- package/skills/testing/response-routes.md +95 -0
- package/skills/testing/reverse-and-types.md +84 -0
- package/skills/testing/server-actions.md +107 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/typesafety/SKILL.md +329 -27
- package/skills/use-cache/SKILL.md +36 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/__internal.ts +67 -40
- package/src/browser/action-coordinator.ts +53 -36
- 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/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +86 -147
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/invalidate-client-cache.ts +52 -0
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +148 -19
- package/src/browser/navigation-client.ts +187 -67
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +76 -67
- package/src/browser/navigation-transaction.ts +18 -66
- package/src/browser/partial-update.ts +123 -94
- package/src/browser/prefetch/cache.ts +214 -36
- package/src/browser/prefetch/fetch.ts +260 -38
- package/src/browser/prefetch/policy.ts +6 -0
- package/src/browser/prefetch/queue.ts +126 -20
- package/src/browser/prefetch/resource-ready.ts +77 -0
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +93 -11
- package/src/browser/react/NavigationProvider.tsx +115 -34
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/filter-segment-order.ts +49 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +166 -8
- package/src/browser/react/location-state.ts +39 -14
- package/src/browser/react/use-action.ts +6 -15
- package/src/browser/react/use-handle.ts +23 -69
- package/src/browser/react/use-link-status.ts +0 -4
- package/src/browser/react/use-navigation.ts +22 -5
- package/src/browser/react/use-params.ts +20 -10
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +46 -11
- package/src/browser/react/use-search-params.ts +0 -5
- package/src/browser/react/use-segments.ts +11 -21
- package/src/browser/response-adapter.ts +52 -1
- package/src/browser/rsc-router.tsx +215 -76
- package/src/browser/scroll-restoration.ts +46 -39
- package/src/browser/segment-reconciler.ts +36 -9
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +176 -50
- package/src/browser/types.ts +95 -11
- package/src/browser/validate-redirect-origin.ts +43 -16
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +65 -40
- package/src/build/generate-route-types.ts +5 -0
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +137 -32
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +9 -2
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +278 -96
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-policy.ts +68 -28
- package/src/cache/cache-runtime.ts +149 -43
- package/src/cache/cache-scope.ts +148 -81
- package/src/cache/cache-tag.ts +98 -0
- package/src/cache/cf/cf-cache-store.ts +2550 -93
- package/src/cache/cf/index.ts +11 -17
- package/src/cache/document-cache.ts +78 -27
- package/src/cache/handle-snapshot.ts +63 -0
- package/src/cache/index.ts +23 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +6 -30
- package/src/cache/read-through-swr.ts +41 -11
- package/src/cache/segment-codec.ts +0 -16
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/taint.ts +55 -0
- package/src/cache/types.ts +33 -100
- package/src/cache/vercel/index.ts +11 -0
- package/src/cache/vercel/vercel-cache-store.ts +799 -0
- package/src/client.rsc.tsx +6 -21
- package/src/client.tsx +108 -290
- package/src/component-utils.ts +19 -0
- package/src/context-var.ts +84 -2
- package/src/debug.ts +2 -2
- package/src/decode-loader-results.ts +36 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/errors.ts +30 -4
- package/src/handle.ts +70 -22
- package/src/handles/MetaTags.tsx +0 -14
- package/src/handles/breadcrumbs.ts +16 -5
- package/src/handles/meta.ts +0 -39
- package/src/host/cookie-handler.ts +0 -36
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +7 -50
- package/src/host/router.ts +107 -99
- package/src/host/testing.ts +40 -27
- package/src/host/types.ts +37 -4
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +137 -22
- package/src/index.rsc.ts +52 -26
- package/src/index.ts +100 -38
- package/src/internal-debug.ts +2 -4
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +20 -13
- package/src/loader.ts +12 -11
- package/src/missing-id-error.ts +68 -0
- package/src/network-error-thrower.tsx +1 -6
- package/src/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +10 -11
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +198 -82
- package/src/redirect-origin.ts +100 -0
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +7 -72
- package/src/route-definition/dsl-helpers.ts +437 -274
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +113 -37
- package/src/route-definition/index.ts +3 -0
- package/src/route-definition/redirect.ts +52 -10
- package/src/route-definition/resolve-handler-use.ts +161 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-map-builder.ts +7 -17
- package/src/route-types.ts +37 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +108 -9
- package/src/router/error-handling.ts +13 -17
- package/src/router/find-match.ts +45 -22
- package/src/router/handler-context.ts +83 -41
- package/src/router/intercept-resolution.ts +25 -23
- package/src/router/lazy-includes.ts +19 -53
- package/src/router/loader-resolution.ts +213 -30
- package/src/router/logging.ts +5 -8
- package/src/router/manifest.ts +49 -45
- package/src/router/match-api.ts +121 -205
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +27 -6
- package/src/router/match-middleware/cache-lookup.ts +205 -249
- package/src/router/match-middleware/cache-store.ts +45 -32
- package/src/router/match-middleware/intercept-resolution.ts +8 -28
- package/src/router/match-middleware/segment-resolution.ts +52 -18
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +104 -40
- package/src/router/metrics.ts +5 -34
- package/src/router/middleware-types.ts +13 -142
- package/src/router/middleware.ts +173 -143
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +109 -63
- package/src/router/prerender-match.ts +192 -54
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +63 -55
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +6 -28
- package/src/router/router-interfaces.ts +100 -35
- package/src/router/router-options.ts +91 -11
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +242 -75
- package/src/router/segment-resolution/helpers.ts +64 -25
- package/src/router/segment-resolution/loader-cache.ts +41 -37
- package/src/router/segment-resolution/revalidation.ts +456 -372
- package/src/router/segment-resolution/static-store.ts +19 -5
- package/src/router/segment-resolution/streamed-handler-telemetry.ts +52 -0
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/segment-resolution.ts +4 -1
- package/src/router/segment-wrappers.ts +2 -3
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +0 -20
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/trie-matching.ts +91 -46
- package/src/router/types.ts +10 -63
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +134 -43
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +492 -383
- package/src/rsc/helpers.ts +162 -46
- package/src/rsc/index.ts +1 -1
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +23 -3
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +30 -3
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +90 -63
- package/src/rsc/rsc-rendering.ts +56 -54
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +74 -67
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/types.ts +25 -6
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -20
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +134 -0
- package/src/segment-system.tsx +272 -129
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +309 -61
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +26 -24
- package/src/server/loader-registry.ts +10 -28
- package/src/server/request-context.ts +348 -128
- package/src/ssr/index.tsx +23 -15
- package/src/static-handler.ts +27 -18
- package/src/testing/cache-status.ts +162 -0
- package/src/testing/collect-handle.ts +40 -0
- package/src/testing/dispatch.ts +618 -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 +232 -0
- package/src/testing/generated-routes.ts +183 -0
- package/src/testing/index.ts +99 -0
- package/src/testing/internal/context.ts +348 -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 +330 -0
- package/src/testing/render-route.tsx +566 -0
- package/src/testing/run-loader.ts +378 -0
- package/src/testing/run-middleware.ts +205 -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 +0 -52
- package/src/theme/ThemeScript.tsx +0 -6
- package/src/theme/constants.ts +0 -12
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +0 -14
- package/src/theme/use-theme.ts +0 -3
- package/src/types/boundaries.ts +0 -35
- package/src/types/cache-types.ts +17 -8
- package/src/types/error-types.ts +30 -90
- package/src/types/global-namespace.ts +54 -41
- package/src/types/handler-context.ts +233 -81
- package/src/types/index.ts +1 -10
- package/src/types/loader-types.ts +44 -15
- package/src/types/request-scope.ts +107 -0
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +19 -7
- package/src/types/segments.ts +37 -14
- package/src/urls/include-helper.ts +33 -70
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +58 -11
- package/src/urls/path-helper.ts +57 -111
- package/src/urls/pattern-types.ts +48 -19
- package/src/urls/response-types.ts +25 -22
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -18
- package/src/use-loader.tsx +346 -89
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +36 -38
- package/src/vite/discovery/discover-routers.ts +130 -85
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +192 -99
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +51 -6
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +8 -0
- package/src/vite/plugin-types.ts +187 -69
- package/src/vite/plugins/cjs-to-esm.ts +8 -18
- package/src/vite/plugins/client-ref-dedup.ts +16 -11
- package/src/vite/plugins/client-ref-hashing.ts +28 -15
- 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/plugins/expose-action-id.ts +49 -98
- package/src/vite/plugins/expose-id-utils.ts +11 -50
- package/src/vite/plugins/expose-ids/export-analysis.ts +76 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +10 -48
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -20
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -16
- package/src/vite/plugins/expose-internal-ids.ts +554 -317
- package/src/vite/plugins/performance-tracks.ts +89 -0
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/vercel-output.ts +258 -0
- package/src/vite/plugins/version-injector.ts +21 -25
- package/src/vite/plugins/version-plugin.ts +41 -20
- package/src/vite/plugins/virtual-entries.ts +2 -17
- package/src/vite/rango.ts +257 -289
- package/src/vite/router-discovery.ts +930 -140
- package/src/vite/utils/ast-handler-extract.ts +15 -31
- package/src/vite/utils/banner.ts +4 -4
- package/src/vite/utils/bundle-analysis.ts +10 -15
- package/src/vite/utils/client-chunks.ts +184 -0
- package/src/vite/utils/forward-user-plugins.ts +171 -0
- package/src/vite/utils/manifest-utils.ts +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +27 -29
- package/src/vite/utils/shared-utils.ts +92 -42
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/react/use-client-cache.ts +0 -58
- package/src/browser/shallow.ts +0 -40
- package/src/handles/index.ts +0 -7
- package/src/router/middleware-cookies.ts +0 -55
package/src/href-client.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import type { GetRegisteredRoutes } from "./types.js";
|
|
18
|
-
import type {
|
|
18
|
+
import type { JsonSerialize } from "./serialize.js";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* Parse constraint values into a union type for paths
|
|
@@ -103,29 +103,75 @@ type NameForPattern<TPattern extends string, TRoutes = GetRegisteredRoutes> = {
|
|
|
103
103
|
}[keyof TRoutes];
|
|
104
104
|
|
|
105
105
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
106
|
+
* Strip a query (`?…`) and/or hash (`#…`) suffix before matching, so a concrete
|
|
107
|
+
* URL like `/api/health?ts=1` still resolves to its route's response. Removes
|
|
108
|
+
* from the earliest of `?`/`#`: a `#` before the first `?` (the query is part of
|
|
109
|
+
* a fragment, e.g. `/health#top?x=1`) is handled, as is a `/:` that only appears
|
|
110
|
+
* inside the query (e.g. `/health?next=/:id`).
|
|
111
|
+
*/
|
|
112
|
+
type StripPathSuffix<T extends string> = T extends `${infer Base}?${string}`
|
|
113
|
+
? Base extends `${infer Frag}#${string}`
|
|
114
|
+
? Frag
|
|
115
|
+
: Base
|
|
116
|
+
: T extends `${infer Base}#${string}`
|
|
117
|
+
? Base
|
|
118
|
+
: T;
|
|
119
|
+
|
|
120
|
+
/** Extract a route entry's response payload (or `never` for RSC routes). */
|
|
121
|
+
type ResponsePayloadOf<TRoutes, K extends keyof TRoutes> = TRoutes[K] extends {
|
|
122
|
+
readonly response: infer R;
|
|
123
|
+
}
|
|
124
|
+
? Exclude<R, Response>
|
|
125
|
+
: never;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Look up the response payload for a route, keyed by either a route pattern
|
|
129
|
+
* (`/api/products/:id`) or a concrete path (`/api/products/123`). The same type
|
|
130
|
+
* serves a pattern lookup and a typed `fetch` wrapper that forwards a concrete
|
|
131
|
+
* `Rango.Path`:
|
|
110
132
|
*
|
|
111
|
-
*
|
|
112
|
-
* PathResponse<"/api/
|
|
133
|
+
* PathResponse<"/api/products/:id"> → Product // by pattern
|
|
134
|
+
* PathResponse<"/api/products/123"> → Product // by concrete path
|
|
113
135
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
136
|
+
* The query/hash suffix is stripped first; the stripped key is then treated as a
|
|
137
|
+
* pattern when it contains a `/:param` segment and matched exactly (precise even
|
|
138
|
+
* for nested dynamic routes), otherwise as a concrete path matched against each
|
|
139
|
+
* route's `PatternToPath` template. Because those holes are `${string}`
|
|
140
|
+
* (slash-greedy), a concrete path under a *nested* dynamic route can match several
|
|
141
|
+
* patterns and union their responses — pattern lookups do not have this
|
|
142
|
+
* looseness. RSC routes (no response) and unmatched keys resolve to `never`.
|
|
143
|
+
*/
|
|
144
|
+
type ResponsePayloadFor<
|
|
145
|
+
TPath extends string,
|
|
146
|
+
TRoutes = GetRegisteredRoutes,
|
|
147
|
+
> = ResponsePayloadForKey<StripPathSuffix<TPath>, TRoutes>;
|
|
148
|
+
|
|
149
|
+
type ResponsePayloadForKey<
|
|
150
|
+
TKey extends string,
|
|
151
|
+
TRoutes,
|
|
152
|
+
> = TKey extends `${string}/:${string}`
|
|
153
|
+
? {
|
|
154
|
+
[K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TKey
|
|
155
|
+
? ResponsePayloadOf<TRoutes, K>
|
|
156
|
+
: never;
|
|
157
|
+
}[keyof TRoutes]
|
|
158
|
+
: {
|
|
159
|
+
[K in keyof TRoutes]: TKey extends PatternToPath<RoutePattern<TRoutes, K>>
|
|
160
|
+
? ResponsePayloadOf<TRoutes, K>
|
|
161
|
+
: never;
|
|
162
|
+
}[keyof TRoutes];
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Public response type for a route, keyed by pattern or concrete path. JSON
|
|
166
|
+
* response routes send the handler's return value verbatim (bare), so the
|
|
167
|
+
* payload is wrapped only in `JsonSerialize` to describe the JSON **wire** value
|
|
168
|
+
* a consumer receives from `fetch().then(r => r.json())` — e.g. a handler
|
|
169
|
+
* returning `{ createdAt: Date }` resolves here to `{ createdAt: string }`.
|
|
116
170
|
*/
|
|
117
171
|
export type PathResponse<
|
|
118
|
-
|
|
172
|
+
TPath extends string,
|
|
119
173
|
TRoutes = GetRegisteredRoutes,
|
|
120
|
-
> =
|
|
121
|
-
{
|
|
122
|
-
[K in keyof TRoutes]: RoutePattern<TRoutes, K> extends TPattern
|
|
123
|
-
? TRoutes[K] extends { readonly response: infer R }
|
|
124
|
-
? Exclude<R, Response>
|
|
125
|
-
: never
|
|
126
|
-
: never;
|
|
127
|
-
}[keyof TRoutes]
|
|
128
|
-
>;
|
|
174
|
+
> = JsonSerialize<ResponsePayloadFor<TPath, TRoutes>>;
|
|
129
175
|
|
|
130
176
|
/**
|
|
131
177
|
* Strip trailing slash from a path (e.g., "/blog/" -> "/blog" | "/blog/")
|
|
@@ -140,7 +186,7 @@ type OptionalTrailingSlash<T extends string> = T extends `${infer Base}/`
|
|
|
140
186
|
/**
|
|
141
187
|
* Union of all valid paths from registered routes
|
|
142
188
|
*
|
|
143
|
-
* Generated from
|
|
189
|
+
* Generated from Rango.RegisteredRoutes via module augmentation.
|
|
144
190
|
* Allows optional query strings and hash fragments.
|
|
145
191
|
*/
|
|
146
192
|
export type ValidPaths<TRoutes = GetRegisteredRoutes> =
|
|
@@ -154,6 +200,76 @@ export type ValidPaths<TRoutes = GetRegisteredRoutes> =
|
|
|
154
200
|
}[keyof TRoutes]
|
|
155
201
|
>;
|
|
156
202
|
|
|
203
|
+
// Module-scoped alias so the ambient `Rango.PathResponse` below can reference
|
|
204
|
+
// the module-level `PathResponse` without the global namespace shadowing the
|
|
205
|
+
// name when both are called `PathResponse`.
|
|
206
|
+
type GlobalPathResponse<
|
|
207
|
+
TPattern extends string,
|
|
208
|
+
TRoutes = GetRegisteredRoutes,
|
|
209
|
+
> = PathResponse<TPattern, TRoutes>;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Ambient path types on the `Rango` namespace.
|
|
213
|
+
*
|
|
214
|
+
* These live on the same global namespace consumers already augment for
|
|
215
|
+
* `Rango.Env` / `Rango.Vars`, so they are reachable with no import wherever the
|
|
216
|
+
* router's types are in scope. They are the public, recommended surface for
|
|
217
|
+
* typing anything that wraps `href()`. `ValidPaths` / `PathResponse` stay as the
|
|
218
|
+
* internal building blocks behind them.
|
|
219
|
+
*/
|
|
220
|
+
declare global {
|
|
221
|
+
namespace Rango {
|
|
222
|
+
/**
|
|
223
|
+
* Union of every valid route path accepted by `href()`.
|
|
224
|
+
*
|
|
225
|
+
* Type a wrapper's path parameter as `Rango.Path` so it shares `href()`'s
|
|
226
|
+
* compile-time validation against the registered routes:
|
|
227
|
+
*
|
|
228
|
+
* ```ts
|
|
229
|
+
* import { href } from "@rangojs/router/client";
|
|
230
|
+
*
|
|
231
|
+
* export const appHref = (path: Rango.Path) => href(path);
|
|
232
|
+
* ```
|
|
233
|
+
*
|
|
234
|
+
* Resolves from `Rango.RegisteredRoutes` when augmented, otherwise the
|
|
235
|
+
* auto-generated `Rango.GeneratedRouteMap`, otherwise a permissive
|
|
236
|
+
* `/${string}` fallback.
|
|
237
|
+
*/
|
|
238
|
+
type Path<TRoutes = GetRegisteredRoutes> = ValidPaths<TRoutes>;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Response payload for a route, looked up from the global route map by
|
|
242
|
+
* either a route pattern (`/api/products/:id`) or a concrete path
|
|
243
|
+
* (`/api/products/123`). Because it accepts a concrete `Rango.Path`, it
|
|
244
|
+
* doubles as the return type of a typed `fetch` wrapper:
|
|
245
|
+
*
|
|
246
|
+
* ```ts
|
|
247
|
+
* type Product = Rango.PathResponse<"/api/products/:id">; // by pattern
|
|
248
|
+
* type Same = Rango.PathResponse<"/api/products/42">; // by concrete path
|
|
249
|
+
*
|
|
250
|
+
* const get = async <T extends Rango.Path>(
|
|
251
|
+
* path: T,
|
|
252
|
+
* ): Promise<Rango.PathResponse<T>> =>
|
|
253
|
+
* fetch(href(path)).then((r) => r.json());
|
|
254
|
+
* ```
|
|
255
|
+
*
|
|
256
|
+
* The payload is the JSON **wire** shape (via `Rango.JsonSerialize`), not the
|
|
257
|
+
* handler's raw return — a handler returning `{ createdAt: Date }` resolves
|
|
258
|
+
* here to `{ createdAt: string }` (bare, no envelope), matching what
|
|
259
|
+
* `fetch().then(r => r.json())` actually yields.
|
|
260
|
+
*
|
|
261
|
+
* Only resolves once `Rango.RegisteredRoutes` carries response metadata (the
|
|
262
|
+
* generated map has paths and search but no payloads). Pass an explicit route
|
|
263
|
+
* map as the second argument to look up against a non-global map (rarely
|
|
264
|
+
* needed in app code).
|
|
265
|
+
*/
|
|
266
|
+
type PathResponse<
|
|
267
|
+
TPath extends string,
|
|
268
|
+
TRoutes = GetRegisteredRoutes,
|
|
269
|
+
> = GlobalPathResponse<TPath, TRoutes>;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
157
273
|
/**
|
|
158
274
|
* Type-safe href function for client-side use
|
|
159
275
|
*
|
|
@@ -182,11 +298,10 @@ export type ValidPaths<TRoutes = GetRegisteredRoutes> =
|
|
|
182
298
|
*/
|
|
183
299
|
export function href<T extends ValidPaths>(path: T, mount?: string): string {
|
|
184
300
|
if (mount && mount !== "/") {
|
|
185
|
-
// Strip trailing slash from mount to avoid double-slash when joining
|
|
186
301
|
const normalizedMount = mount.endsWith("/") ? mount.slice(0, -1) : mount;
|
|
187
302
|
return normalizedMount + path;
|
|
188
303
|
}
|
|
189
|
-
return path;
|
|
304
|
+
return path as string;
|
|
190
305
|
}
|
|
191
306
|
|
|
192
307
|
/**
|
package/src/index.rsc.ts
CHANGED
|
@@ -11,8 +11,6 @@
|
|
|
11
11
|
|
|
12
12
|
// Re-export all universal exports from index.ts
|
|
13
13
|
export {
|
|
14
|
-
// Universal rendering utilities
|
|
15
|
-
renderSegments,
|
|
16
14
|
// Error classes
|
|
17
15
|
RouteNotFoundError,
|
|
18
16
|
DataNotFoundError,
|
|
@@ -20,10 +18,8 @@ export {
|
|
|
20
18
|
MiddlewareError,
|
|
21
19
|
HandlerError,
|
|
22
20
|
BuildError,
|
|
21
|
+
DslContextError,
|
|
23
22
|
InvalidHandlerError,
|
|
24
|
-
NetworkError,
|
|
25
|
-
isNetworkError,
|
|
26
|
-
sanitizeError,
|
|
27
23
|
RouterError,
|
|
28
24
|
Skip,
|
|
29
25
|
isSkip,
|
|
@@ -40,7 +36,6 @@ export type {
|
|
|
40
36
|
TrailingSlashMode,
|
|
41
37
|
// Handler types
|
|
42
38
|
Handler,
|
|
43
|
-
ScopedRouteMap,
|
|
44
39
|
HandlerContext,
|
|
45
40
|
ExtractParams,
|
|
46
41
|
GenericParams,
|
|
@@ -49,6 +44,7 @@ export type {
|
|
|
49
44
|
// Revalidation types
|
|
50
45
|
RevalidateParams,
|
|
51
46
|
Revalidate,
|
|
47
|
+
ActionRef,
|
|
52
48
|
RouteKeys,
|
|
53
49
|
// Loader types
|
|
54
50
|
LoaderDefinition,
|
|
@@ -73,12 +69,19 @@ export type {
|
|
|
73
69
|
|
|
74
70
|
// Router options type (server-only, so import directly)
|
|
75
71
|
export type {
|
|
76
|
-
|
|
72
|
+
RangoOptions,
|
|
77
73
|
SSRStreamMode,
|
|
78
74
|
SSROptions,
|
|
79
75
|
ResolveStreamingContext,
|
|
80
76
|
} from "./router.js";
|
|
81
77
|
|
|
78
|
+
// Origin-check callback types (referenced by the RangoOptions.originCheck JSDoc)
|
|
79
|
+
export type {
|
|
80
|
+
OriginCheckConfig,
|
|
81
|
+
OriginCheckContext,
|
|
82
|
+
OriginCheckPhase,
|
|
83
|
+
} from "./rsc/origin-guard.js";
|
|
84
|
+
|
|
82
85
|
// Server-side createLoader and redirect
|
|
83
86
|
export {
|
|
84
87
|
createLoader,
|
|
@@ -106,10 +109,18 @@ export type {
|
|
|
106
109
|
LayoutUseItem,
|
|
107
110
|
AllUseItems,
|
|
108
111
|
UseItems,
|
|
112
|
+
HandlerUseItem,
|
|
109
113
|
} from "./route-types.js";
|
|
110
114
|
|
|
111
115
|
// Handle API
|
|
112
116
|
export { createHandle, isHandle, type Handle } from "./handle.js";
|
|
117
|
+
export {
|
|
118
|
+
DEFAULT_DEFER_TIMEOUT_MS,
|
|
119
|
+
type DeferOptions,
|
|
120
|
+
type DeferredHandleEntry,
|
|
121
|
+
type HandlePush,
|
|
122
|
+
type HandlePushFn,
|
|
123
|
+
} from "./defer.js";
|
|
113
124
|
|
|
114
125
|
// Context variable API (typed ctx.set/ctx.get tokens)
|
|
115
126
|
export { createVar, type ContextVar } from "./context-var.js";
|
|
@@ -120,34 +131,33 @@ export { nonce } from "./rsc/nonce.js";
|
|
|
120
131
|
// Pre-render handler API
|
|
121
132
|
export {
|
|
122
133
|
Prerender,
|
|
123
|
-
|
|
134
|
+
Passthrough,
|
|
124
135
|
type PrerenderHandlerDefinition,
|
|
125
|
-
type
|
|
136
|
+
type PassthroughHandlerDefinition,
|
|
126
137
|
type PrerenderOptions,
|
|
127
138
|
type BuildContext,
|
|
128
139
|
type StaticBuildContext,
|
|
129
140
|
type GetParamsContext,
|
|
141
|
+
type PrerenderPassthroughResult,
|
|
130
142
|
} from "./prerender.js";
|
|
131
143
|
|
|
132
144
|
// Static handler API
|
|
133
145
|
export {
|
|
134
146
|
Static,
|
|
135
|
-
isStaticHandler,
|
|
136
147
|
type StaticHandlerDefinition,
|
|
148
|
+
type StaticHandlerOptions,
|
|
137
149
|
} from "./static-handler.js";
|
|
138
150
|
|
|
139
151
|
// Django-style URL patterns (RSC/server context)
|
|
140
152
|
export {
|
|
141
153
|
urls,
|
|
142
|
-
RESPONSE_TYPE,
|
|
143
154
|
type PathHelpers,
|
|
144
155
|
type PathOptions,
|
|
145
156
|
type UrlPatterns,
|
|
146
157
|
type IncludeOptions,
|
|
147
158
|
type IncludeItem,
|
|
148
159
|
type RouteResponse,
|
|
149
|
-
type
|
|
150
|
-
type ResponseEnvelope,
|
|
160
|
+
type ProblemDetails,
|
|
151
161
|
type ResponseHandler,
|
|
152
162
|
type ResponseHandlerContext,
|
|
153
163
|
type JsonResponseHandler,
|
|
@@ -161,7 +171,7 @@ export {
|
|
|
161
171
|
// Core router (server-side)
|
|
162
172
|
export {
|
|
163
173
|
createRouter,
|
|
164
|
-
type
|
|
174
|
+
type Rango,
|
|
165
175
|
type RootLayoutProps,
|
|
166
176
|
type RouterRequestInput,
|
|
167
177
|
} from "./router.js";
|
|
@@ -182,6 +192,9 @@ export type { PublicRequestContext as RequestContext } from "./server/request-co
|
|
|
182
192
|
import type { PublicRequestContext } from "./server/request-context.js";
|
|
183
193
|
import type { DefaultEnv } from "./types/global-namespace.js";
|
|
184
194
|
|
|
195
|
+
// Shared base for every user-facing request context (mirrors index.ts).
|
|
196
|
+
export type { RequestScope, ExecutionContext } from "./types/request-scope.js";
|
|
197
|
+
|
|
185
198
|
export const getRequestContext: <
|
|
186
199
|
TEnv = DefaultEnv,
|
|
187
200
|
>() => PublicRequestContext<TEnv> = _getRequestContextInternal;
|
|
@@ -190,16 +203,31 @@ export const getRequestContext: <
|
|
|
190
203
|
export {
|
|
191
204
|
cookies,
|
|
192
205
|
headers,
|
|
206
|
+
invalidateClientCache,
|
|
207
|
+
keepClientCache,
|
|
193
208
|
type CookieStore,
|
|
194
209
|
type Cookie,
|
|
195
210
|
type ReadonlyHeaders,
|
|
196
211
|
} from "./server/cookie-store.js";
|
|
197
212
|
|
|
213
|
+
// Cache tag APIs (server-only)
|
|
214
|
+
// cacheTag: tag the current "use cache" entry at runtime.
|
|
215
|
+
// updateTag: read-your-own-writes invalidation (awaitable, for Server Actions).
|
|
216
|
+
// revalidateTag: background hard-purge invalidation (not awaited, for route handlers / webhooks).
|
|
217
|
+
export { cacheTag } from "./cache/cache-tag.js";
|
|
218
|
+
export { updateTag, revalidateTag } from "./cache/tag-invalidation.js";
|
|
219
|
+
|
|
198
220
|
// Meta types
|
|
199
221
|
export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
|
|
200
222
|
|
|
201
223
|
// Middleware context types
|
|
202
|
-
export type {
|
|
224
|
+
export type {
|
|
225
|
+
MiddlewareContext,
|
|
226
|
+
CookieOptions,
|
|
227
|
+
// The function type of a middleware. Public so the documented "extract the
|
|
228
|
+
// middleware and unit-test it with runMiddleware" pattern has a nameable type.
|
|
229
|
+
MiddlewareFn,
|
|
230
|
+
} from "./router/middleware.js";
|
|
203
231
|
|
|
204
232
|
// Reverse type utilities for type-safe URL generation (Django-style URL reversal)
|
|
205
233
|
export type {
|
|
@@ -207,8 +235,6 @@ export type {
|
|
|
207
235
|
ReverseFunction,
|
|
208
236
|
ExtractLocalRoutes,
|
|
209
237
|
ParamsFor,
|
|
210
|
-
SanitizePrefix,
|
|
211
|
-
MergeRoutes,
|
|
212
238
|
} from "./reverse.js";
|
|
213
239
|
export { scopedReverse, createReverse } from "./reverse.js";
|
|
214
240
|
|
|
@@ -221,12 +247,6 @@ export type {
|
|
|
221
247
|
RouteParams,
|
|
222
248
|
} from "./search-params.js";
|
|
223
249
|
|
|
224
|
-
// Debug utilities for route matching (development only)
|
|
225
|
-
export {
|
|
226
|
-
enableMatchDebug,
|
|
227
|
-
getMatchDebugStats,
|
|
228
|
-
} from "./router/pattern-matching.js";
|
|
229
|
-
|
|
230
250
|
// Location state (universal)
|
|
231
251
|
export {
|
|
232
252
|
createLocationState,
|
|
@@ -235,26 +255,32 @@ export {
|
|
|
235
255
|
type LocationStateOptions,
|
|
236
256
|
} from "./browser/react/location-state-shared.js";
|
|
237
257
|
|
|
238
|
-
// Path
|
|
239
|
-
|
|
258
|
+
// Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
|
|
259
|
+
// `Rango.PathResponse`, declared in href-client.ts) — no import needed.
|
|
240
260
|
|
|
241
261
|
// Telemetry sink
|
|
242
262
|
export { createConsoleSink } from "./router/telemetry.js";
|
|
243
263
|
export { createOTelSink } from "./router/telemetry-otel.js";
|
|
244
264
|
export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
|
|
265
|
+
// The full TelemetryEvent union PLUS its member types, so a consumer writing a
|
|
266
|
+
// TelemetrySink can annotate a per-`type` handler (or construct an event literal
|
|
267
|
+
// in a test) instead of only narrowing the opaque union.
|
|
245
268
|
export type {
|
|
246
269
|
TelemetrySink,
|
|
247
270
|
TelemetryEvent,
|
|
248
271
|
RequestStartEvent,
|
|
249
272
|
RequestEndEvent,
|
|
250
273
|
RequestErrorEvent,
|
|
251
|
-
RequestTimeoutEvent,
|
|
252
274
|
LoaderStartEvent,
|
|
253
275
|
LoaderEndEvent,
|
|
254
276
|
LoaderErrorEvent,
|
|
255
277
|
HandlerErrorEvent,
|
|
278
|
+
CacheSegmentStatus,
|
|
279
|
+
CacheSegmentSignal,
|
|
256
280
|
CacheDecisionEvent,
|
|
257
281
|
RevalidationDecisionEvent,
|
|
282
|
+
RequestTimeoutEvent,
|
|
283
|
+
OriginCheckRejectedEvent,
|
|
258
284
|
} from "./router/telemetry.js";
|
|
259
285
|
|
|
260
286
|
// Timeout types and error class
|
package/src/index.ts
CHANGED
|
@@ -10,9 +10,6 @@
|
|
|
10
10
|
* import from "@rangojs/router/client"
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
// Universal rendering utilities (work on both server and client)
|
|
14
|
-
export { renderSegments } from "./segment-system.js";
|
|
15
|
-
|
|
16
13
|
// Error classes (can be used on both server and client)
|
|
17
14
|
export {
|
|
18
15
|
RouteNotFoundError,
|
|
@@ -21,10 +18,8 @@ export {
|
|
|
21
18
|
MiddlewareError,
|
|
22
19
|
HandlerError,
|
|
23
20
|
BuildError,
|
|
21
|
+
DslContextError,
|
|
24
22
|
InvalidHandlerError,
|
|
25
|
-
NetworkError,
|
|
26
|
-
isNetworkError,
|
|
27
|
-
sanitizeError,
|
|
28
23
|
RouterError,
|
|
29
24
|
Skip,
|
|
30
25
|
isSkip,
|
|
@@ -41,7 +36,6 @@ export type {
|
|
|
41
36
|
TrailingSlashMode,
|
|
42
37
|
// Handler types
|
|
43
38
|
Handler, // Supports params object, path pattern, or route name
|
|
44
|
-
ScopedRouteMap, // Scoped view of GeneratedRouteMap for Handler<"localName", ScopedRouteMap<"prefix">>
|
|
45
39
|
HandlerContext,
|
|
46
40
|
ExtractParams,
|
|
47
41
|
GenericParams,
|
|
@@ -50,6 +44,7 @@ export type {
|
|
|
50
44
|
// Revalidation types
|
|
51
45
|
RevalidateParams,
|
|
52
46
|
Revalidate,
|
|
47
|
+
ActionRef,
|
|
53
48
|
RouteKeys,
|
|
54
49
|
// Loader types
|
|
55
50
|
LoaderDefinition,
|
|
@@ -95,6 +90,7 @@ export type {
|
|
|
95
90
|
LayoutUseItem,
|
|
96
91
|
AllUseItems,
|
|
97
92
|
UseItems,
|
|
93
|
+
HandlerUseItem,
|
|
98
94
|
} from "./route-types.js";
|
|
99
95
|
|
|
100
96
|
// Response route types (usable in both server and client contexts)
|
|
@@ -108,8 +104,7 @@ export type {
|
|
|
108
104
|
JsonResponsePathFn,
|
|
109
105
|
TextResponsePathFn,
|
|
110
106
|
RouteResponse,
|
|
111
|
-
|
|
112
|
-
ResponseEnvelope,
|
|
107
|
+
ProblemDetails,
|
|
113
108
|
} from "./urls.js";
|
|
114
109
|
|
|
115
110
|
// Middleware context types
|
|
@@ -145,6 +140,13 @@ export function redirect(): never {
|
|
|
145
140
|
|
|
146
141
|
// Handle API (universal - works on both server and client)
|
|
147
142
|
export { createHandle, isHandle, type Handle } from "./handle.js";
|
|
143
|
+
export {
|
|
144
|
+
DEFAULT_DEFER_TIMEOUT_MS,
|
|
145
|
+
type DeferOptions,
|
|
146
|
+
type DeferredHandleEntry,
|
|
147
|
+
type HandlePush,
|
|
148
|
+
type HandlePushFn,
|
|
149
|
+
} from "./defer.js";
|
|
148
150
|
|
|
149
151
|
// Context variable API (typed ctx.set/ctx.get tokens)
|
|
150
152
|
export { createVar, type ContextVar } from "./context-var.js";
|
|
@@ -153,17 +155,52 @@ export { createVar, type ContextVar } from "./context-var.js";
|
|
|
153
155
|
export { nonce } from "./rsc/nonce.js";
|
|
154
156
|
|
|
155
157
|
/**
|
|
156
|
-
*
|
|
158
|
+
* SSR/client stub for server-only `Prerender` function.
|
|
159
|
+
*
|
|
160
|
+
* Returns a lightweight stub object instead of throwing so that the
|
|
161
|
+
* production SSR build can safely bundle the RSC entry chunk — the SSR
|
|
162
|
+
* bundler resolves `@rangojs/router` to this (SSR) entry, so Prerender
|
|
163
|
+
* calls in RSC code must not crash at module-evaluation time.
|
|
164
|
+
*/
|
|
165
|
+
export function Prerender(
|
|
166
|
+
_handler?: any,
|
|
167
|
+
_optionsOrId?: any,
|
|
168
|
+
__injectedId?: string,
|
|
169
|
+
): any {
|
|
170
|
+
const id =
|
|
171
|
+
typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
|
|
172
|
+
return { __brand: "prerenderHandler" as const, $$id: id };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* SSR/client stub for server-only `Passthrough` function.
|
|
157
177
|
*/
|
|
158
|
-
export function
|
|
159
|
-
|
|
178
|
+
export function Passthrough(
|
|
179
|
+
_handler?: any,
|
|
180
|
+
_optionsOrId?: any,
|
|
181
|
+
__injectedId?: string,
|
|
182
|
+
): any {
|
|
183
|
+
const id =
|
|
184
|
+
typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
|
|
185
|
+
return { __brand: "passthroughHandler" as const, $$id: id };
|
|
160
186
|
}
|
|
161
187
|
|
|
162
188
|
/**
|
|
163
|
-
*
|
|
189
|
+
* SSR/client stub for server-only `Static` function.
|
|
190
|
+
*
|
|
191
|
+
* Returns a lightweight stub object instead of throwing so that the
|
|
192
|
+
* production SSR build can safely bundle the RSC entry chunk — the SSR
|
|
193
|
+
* bundler resolves `@rangojs/router` to this (SSR) entry, so Static
|
|
194
|
+
* calls in RSC code must not crash at module-evaluation time.
|
|
164
195
|
*/
|
|
165
|
-
export function Static(
|
|
166
|
-
|
|
196
|
+
export function Static(
|
|
197
|
+
_handler?: any,
|
|
198
|
+
_optionsOrId?: any,
|
|
199
|
+
__injectedId?: string,
|
|
200
|
+
): any {
|
|
201
|
+
const id =
|
|
202
|
+
typeof _optionsOrId === "string" ? _optionsOrId : __injectedId || "";
|
|
203
|
+
return { __brand: "staticHandler" as const, $$id: id };
|
|
167
204
|
}
|
|
168
205
|
|
|
169
206
|
/**
|
|
@@ -188,24 +225,21 @@ export function headers(): never {
|
|
|
188
225
|
}
|
|
189
226
|
|
|
190
227
|
/**
|
|
191
|
-
*
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Error-throwing stub for server-only `enableMatchDebug` function.
|
|
228
|
+
* Client implementation of `invalidateClientCache()`. Unlike the server-only
|
|
229
|
+
* stubs above this is a REAL function under the `default` condition (it marks
|
|
230
|
+
* the client's caches stale); the `react-server` condition (index.rsc.ts)
|
|
231
|
+
* selects the server implementation that writes a rotated `Set-Cookie`.
|
|
199
232
|
*/
|
|
200
|
-
export
|
|
201
|
-
|
|
202
|
-
|
|
233
|
+
export {
|
|
234
|
+
invalidateClientCache,
|
|
235
|
+
keepClientCache,
|
|
236
|
+
} from "./browser/invalidate-client-cache.js";
|
|
203
237
|
|
|
204
238
|
/**
|
|
205
|
-
* Error-throwing stub for server-only `
|
|
239
|
+
* Error-throwing stub for server-only `createReverse` function.
|
|
206
240
|
*/
|
|
207
|
-
export function
|
|
208
|
-
throw serverOnlyStubError("
|
|
241
|
+
export function createReverse(): never {
|
|
242
|
+
throw serverOnlyStubError("createReverse");
|
|
209
243
|
}
|
|
210
244
|
|
|
211
245
|
// Error-throwing stubs for server-only route helpers
|
|
@@ -221,6 +255,18 @@ export function middleware(): never {
|
|
|
221
255
|
export function revalidate(): never {
|
|
222
256
|
throw serverOnlyStubError("revalidate");
|
|
223
257
|
}
|
|
258
|
+
// Cache tag APIs are server-only (real implementations in index.rsc.ts). These
|
|
259
|
+
// stubs keep the named-export shape identical under the default/non-react-server
|
|
260
|
+
// condition so SSR/client/default bundles that encounter the import link cleanly.
|
|
261
|
+
export function cacheTag(): never {
|
|
262
|
+
throw serverOnlyStubError("cacheTag");
|
|
263
|
+
}
|
|
264
|
+
export function updateTag(): never {
|
|
265
|
+
throw serverOnlyStubError("updateTag");
|
|
266
|
+
}
|
|
267
|
+
export function revalidateTag(): never {
|
|
268
|
+
throw serverOnlyStubError("revalidateTag");
|
|
269
|
+
}
|
|
224
270
|
export function loader(): never {
|
|
225
271
|
throw serverOnlyStubError("loader");
|
|
226
272
|
}
|
|
@@ -249,6 +295,9 @@ export function transition(): never {
|
|
|
249
295
|
// Request context type (safe for client)
|
|
250
296
|
export type { PublicRequestContext as RequestContext } from "./server/request-context.js";
|
|
251
297
|
|
|
298
|
+
// Shared base for every user-facing request context.
|
|
299
|
+
export type { RequestScope, ExecutionContext } from "./types/request-scope.js";
|
|
300
|
+
|
|
252
301
|
// Cookie store types (safe for client)
|
|
253
302
|
export type {
|
|
254
303
|
CookieStore,
|
|
@@ -256,6 +305,10 @@ export type {
|
|
|
256
305
|
ReadonlyHeaders,
|
|
257
306
|
} from "./server/cookie-store.js";
|
|
258
307
|
|
|
308
|
+
// Built-in handles (universal — work on both server and client)
|
|
309
|
+
export { Meta } from "./handles/meta.js";
|
|
310
|
+
export { Breadcrumbs } from "./handles/breadcrumbs.js";
|
|
311
|
+
|
|
259
312
|
// Meta types
|
|
260
313
|
export type { MetaDescriptor, MetaDescriptorBase } from "./router/types.js";
|
|
261
314
|
|
|
@@ -268,8 +321,6 @@ export type {
|
|
|
268
321
|
ReverseFunction,
|
|
269
322
|
ExtractLocalRoutes,
|
|
270
323
|
ParamsFor,
|
|
271
|
-
SanitizePrefix,
|
|
272
|
-
MergeRoutes,
|
|
273
324
|
} from "./reverse.js";
|
|
274
325
|
// scopedReverse() helper for handlers to get locally-typed reverse
|
|
275
326
|
export { scopedReverse } from "./reverse.js";
|
|
@@ -282,26 +333,37 @@ export {
|
|
|
282
333
|
type LocationStateOptions,
|
|
283
334
|
} from "./browser/react/location-state-shared.js";
|
|
284
335
|
|
|
285
|
-
// Path
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
// Telemetry
|
|
289
|
-
|
|
290
|
-
|
|
336
|
+
// Path and response types are ambient on the `Rango` namespace (`Rango.Path`,
|
|
337
|
+
// `Rango.PathResponse`, declared in href-client.ts) — no import needed.
|
|
338
|
+
|
|
339
|
+
// Telemetry types only — the createConsoleSink/createOTelSink values are
|
|
340
|
+
// server-only and live in index.rsc.ts (the `react-server` condition of the
|
|
341
|
+
// bare `@rangojs/router` import). Re-exporting them as values from this
|
|
342
|
+
// (default/client) entry would pull telemetry.ts and telemetry-otel.ts into
|
|
343
|
+
// the client module graph; both tree-shake to zero bytes but still appear in
|
|
344
|
+
// bundle analysis output and slow build-time module resolution. Consumers
|
|
345
|
+
// who need the values in non-RSC contexts can import from
|
|
346
|
+
// `@rangojs/router/server`.
|
|
291
347
|
export type { OTelTracer, OTelSpan } from "./router/telemetry-otel.js";
|
|
348
|
+
// The full TelemetryEvent union PLUS its member types, so a consumer writing a
|
|
349
|
+
// TelemetrySink can annotate a per-`type` handler (or construct an event literal
|
|
350
|
+
// in a test) instead of only narrowing the opaque union.
|
|
292
351
|
export type {
|
|
293
352
|
TelemetrySink,
|
|
294
353
|
TelemetryEvent,
|
|
295
354
|
RequestStartEvent,
|
|
296
355
|
RequestEndEvent,
|
|
297
356
|
RequestErrorEvent,
|
|
298
|
-
RequestTimeoutEvent,
|
|
299
357
|
LoaderStartEvent,
|
|
300
358
|
LoaderEndEvent,
|
|
301
359
|
LoaderErrorEvent,
|
|
302
360
|
HandlerErrorEvent,
|
|
361
|
+
CacheSegmentStatus,
|
|
362
|
+
CacheSegmentSignal,
|
|
303
363
|
CacheDecisionEvent,
|
|
304
364
|
RevalidationDecisionEvent,
|
|
365
|
+
RequestTimeoutEvent,
|
|
366
|
+
OriginCheckRejectedEvent,
|
|
305
367
|
} from "./router/telemetry.js";
|
|
306
368
|
|
|
307
369
|
// Timeout types and error class
|
package/src/internal-debug.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// in all runtimes including Cloudflare Workers where process.env is unavailable.
|
|
4
|
-
// Falls back to process.env for non-Vite contexts (tests, direct Node usage).
|
|
1
|
+
// Vite define for compile-time injection; falls back to process.env (tests, Node).
|
|
2
|
+
// Works in all runtimes including Cloudflare Workers where process.env is unavailable.
|
|
5
3
|
export const INTERNAL_RANGO_DEBUG: boolean =
|
|
6
4
|
typeof __RANGO_DEBUG__ !== "undefined"
|
|
7
5
|
? __RANGO_DEBUG__
|