@rangojs/router 0.0.0-experimental.9c9afef3 → 0.0.0-experimental.a014d2b7
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 +8 -0
- package/README.md +245 -49
- package/dist/bin/rango.js +440 -133
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +3373 -1176
- package/dist/vite/index.js.bak +5448 -0
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +68 -14
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +64 -2
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +224 -32
- package/skills/caching/SKILL.md +279 -17
- package/skills/composability/SKILL.md +27 -3
- package/skills/css/SKILL.md +76 -0
- package/skills/debug-manifest/SKILL.md +4 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +250 -30
- package/skills/host-router/SKILL.md +83 -23
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +87 -18
- package/skills/layout/SKILL.md +35 -9
- package/skills/links/SKILL.md +249 -17
- package/skills/loader/SKILL.md +235 -9
- package/skills/middleware/SKILL.md +52 -13
- package/skills/migrate-nextjs/SKILL.md +584 -0
- package/skills/migrate-react-router/SKILL.md +771 -0
- package/skills/mime-routes/SKILL.md +28 -1
- package/skills/observability/SKILL.md +172 -0
- package/skills/parallel/SKILL.md +77 -7
- package/skills/prerender/SKILL.md +172 -125
- package/skills/rango/SKILL.md +251 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +123 -48
- package/skills/route/SKILL.md +70 -5
- package/skills/router-setup/SKILL.md +65 -8
- package/skills/scripts/SKILL.md +179 -0
- 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 +130 -0
- 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 +129 -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 +84 -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/typesafety/SKILL.md +322 -29
- package/skills/use-cache/SKILL.md +57 -14
- 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 +1 -66
- 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/connection-warmup.ts +134 -0
- package/src/browser/cookie-name.ts +140 -0
- package/src/browser/event-controller.ts +192 -150
- 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/navigation-bridge.ts +131 -30
- package/src/browser/navigation-client.ts +186 -100
- package/src/browser/navigation-store-handle.ts +38 -0
- package/src/browser/navigation-store.ts +157 -74
- package/src/browser/navigation-transaction.ts +9 -59
- package/src/browser/network-error-handler.ts +34 -7
- package/src/browser/partial-update.ts +165 -112
- package/src/browser/prefetch/cache.ts +205 -62
- package/src/browser/prefetch/fetch.ts +347 -39
- package/src/browser/prefetch/queue.ts +42 -8
- package/src/browser/rango-state.ts +158 -76
- package/src/browser/react/Link.tsx +102 -15
- package/src/browser/react/NavigationProvider.tsx +295 -119
- package/src/browser/react/ScrollRestoration.tsx +10 -6
- package/src/browser/react/context.ts +7 -2
- package/src/browser/react/deferred-handle-resolution.ts +75 -0
- package/src/browser/react/filter-segment-order.ts +66 -7
- package/src/browser/react/index.ts +0 -48
- package/src/browser/react/location-state-shared.ts +178 -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-href.tsx +8 -1
- package/src/browser/react/use-link-status.ts +33 -8
- package/src/browser/react/use-navigation.ts +32 -7
- 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 +99 -8
- package/src/browser/rsc-router.tsx +114 -24
- package/src/browser/scroll-restoration.ts +37 -22
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +222 -72
- package/src/browser/types.ts +102 -12
- 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 -1
- package/src/build/index.ts +8 -2
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +165 -36
- package/src/build/route-types/ast-route-extraction.ts +15 -8
- package/src/build/route-types/codegen.ts +16 -5
- package/src/build/route-types/include-resolution.ts +125 -24
- package/src/build/route-types/param-extraction.ts +6 -3
- package/src/build/route-types/per-module-writer.ts +22 -6
- package/src/build/route-types/router-processing.ts +260 -94
- package/src/build/route-types/scan-filter.ts +9 -2
- package/src/build/route-types/source-scan.ts +216 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-error.ts +104 -0
- package/src/cache/cache-key-utils.ts +29 -13
- package/src/cache/cache-policy.ts +108 -34
- package/src/cache/cache-runtime.ts +224 -41
- package/src/cache/cache-scope.ts +188 -82
- 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 +1989 -378
- 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 +6 -16
- package/src/cache/document-cache.ts +89 -21
- package/src/cache/handle-snapshot.ts +70 -0
- package/src/cache/index.ts +10 -20
- package/src/cache/memory-segment-store.ts +136 -37
- package/src/cache/profile-registry.ts +46 -31
- package/src/cache/read-through-swr.ts +56 -12
- package/src/cache/segment-codec.ts +9 -17
- package/src/cache/tag-invalidation.ts +230 -0
- package/src/cache/types.ts +37 -100
- package/src/client.rsc.tsx +44 -21
- package/src/client.tsx +119 -290
- package/src/cloudflare/index.ts +11 -0
- package/src/cloudflare/tracing.ts +109 -0
- package/src/component-utils.ts +19 -0
- package/src/components/DefaultDocument.tsx +8 -2
- package/src/context-var.ts +18 -6
- package/src/decode-loader-results.ts +52 -0
- package/src/defer.ts +196 -0
- package/src/deps/ssr.ts +0 -1
- package/src/encode-kv.ts +49 -0
- package/src/errors.ts +30 -4
- package/src/escape-script.ts +52 -0
- package/src/handle.ts +70 -22
- package/src/handles/MetaTags.tsx +62 -19
- package/src/handles/Scripts.tsx +183 -0
- package/src/handles/breadcrumbs.ts +37 -8
- package/src/handles/is-thenable.ts +19 -0
- package/src/handles/meta.ts +51 -40
- package/src/handles/script.ts +244 -0
- package/src/host/cookie-handler.ts +9 -60
- package/src/host/errors.ts +0 -24
- package/src/host/index.ts +8 -2
- package/src/host/pattern-matcher.ts +23 -52
- 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 +99 -13
- package/src/index.ts +139 -19
- package/src/internal-debug.ts +11 -10
- 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/outlet-context.ts +1 -1
- package/src/outlet-provider.tsx +1 -5
- package/src/prerender/param-hash.ts +16 -16
- package/src/prerender/store.ts +37 -41
- package/src/prerender.ts +198 -82
- 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 +65 -15
- package/src/root-error-boundary.tsx +1 -19
- package/src/route-content-wrapper.tsx +19 -77
- package/src/route-definition/dsl-helpers.ts +461 -304
- package/src/route-definition/helper-factories.ts +28 -140
- package/src/route-definition/helpers-types.ts +143 -69
- package/src/route-definition/index.ts +4 -2
- package/src/route-definition/redirect.ts +51 -10
- package/src/route-definition/resolve-handler-use.ts +160 -0
- package/src/route-definition/use-item-types.ts +29 -0
- package/src/route-map-builder.ts +0 -16
- package/src/route-types.ts +37 -46
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +164 -17
- package/src/router/error-handling.ts +45 -18
- package/src/router/find-match.ts +44 -23
- package/src/router/handler-context.ts +52 -31
- package/src/router/instrument.ts +350 -0
- package/src/router/intercept-resolution.ts +48 -24
- package/src/router/lazy-includes.ts +15 -52
- package/src/router/loader-resolution.ts +268 -56
- package/src/router/logging.ts +0 -6
- package/src/router/manifest.ts +40 -42
- package/src/router/match-api.ts +124 -204
- package/src/router/match-context.ts +0 -22
- package/src/router/match-handlers.ts +58 -58
- package/src/router/match-middleware/background-revalidation.ts +40 -24
- package/src/router/match-middleware/cache-lookup.ts +170 -276
- package/src/router/match-middleware/cache-store.ts +64 -52
- package/src/router/match-middleware/intercept-resolution.ts +0 -22
- package/src/router/match-middleware/segment-resolution.ts +45 -14
- package/src/router/match-pipelines.ts +1 -42
- package/src/router/match-result.ts +87 -39
- package/src/router/metrics.ts +0 -34
- package/src/router/middleware-types.ts +7 -140
- package/src/router/middleware.ts +266 -169
- package/src/router/navigation-snapshot.ts +131 -0
- package/src/router/params-util.ts +23 -0
- package/src/router/pattern-matching.ts +132 -90
- package/src/router/prefetch-cache-ttl.ts +51 -0
- package/src/router/prerender-match.ts +195 -56
- package/src/router/preview-match.ts +32 -102
- package/src/router/request-classification.ts +276 -0
- package/src/router/revalidation.ts +123 -73
- package/src/router/route-snapshot.ts +244 -0
- package/src/router/router-context.ts +3 -28
- package/src/router/router-interfaces.ts +115 -35
- package/src/router/router-options.ts +172 -15
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +162 -84
- package/src/router/segment-resolution/helpers.ts +86 -6
- package/src/router/segment-resolution/loader-cache.ts +76 -39
- package/src/router/segment-resolution/revalidation.ts +351 -321
- 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 +56 -0
- package/src/router/segment-resolution.ts +5 -1
- package/src/router/segment-wrappers.ts +6 -5
- package/src/router/state-cookie-name.ts +33 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry-otel.ts +161 -199
- package/src/router/telemetry.ts +96 -19
- package/src/router/timeout.ts +0 -20
- package/src/router/tracing.ts +206 -0
- package/src/router/trie-matching.ts +163 -59
- package/src/router/types.ts +9 -63
- package/src/router/url-params.ts +44 -0
- package/src/router.ts +157 -54
- package/src/rsc/handler-context.ts +3 -2
- package/src/rsc/handler.ts +655 -529
- package/src/rsc/helpers.ts +168 -46
- package/src/rsc/index.ts +2 -5
- package/src/rsc/json-route-result.ts +38 -0
- package/src/rsc/loader-fetch.ts +122 -31
- package/src/rsc/manifest-init.ts +33 -42
- package/src/rsc/origin-guard.ts +39 -25
- package/src/rsc/progressive-enhancement.ts +131 -14
- package/src/rsc/redirect-guard.ts +99 -0
- package/src/rsc/response-cache-serve.ts +238 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +99 -189
- package/src/rsc/rsc-rendering.ts +109 -74
- package/src/rsc/runtime-warnings.ts +23 -10
- package/src/rsc/server-action.ts +287 -115
- package/src/rsc/ssr-setup.ts +18 -2
- package/src/rsc/transition-gate.ts +89 -0
- package/src/rsc/types.ts +29 -9
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +35 -30
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +149 -0
- package/src/segment-system.tsx +236 -202
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +224 -52
- package/src/server/cookie-parse.ts +32 -0
- package/src/server/cookie-store.ts +80 -5
- package/src/server/handle-store.ts +40 -38
- package/src/server/loader-registry.ts +38 -46
- package/src/server/request-context.ts +401 -173
- package/src/ssr/index.tsx +24 -16
- 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 +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 +183 -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 +581 -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 +20 -58
- package/src/theme/ThemeScript.tsx +7 -9
- package/src/theme/constants.ts +52 -13
- package/src/theme/index.ts +0 -7
- package/src/theme/theme-context.ts +1 -5
- package/src/theme/theme-script.ts +22 -21
- 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 +125 -71
- package/src/types/index.ts +3 -10
- package/src/types/loader-types.ts +40 -11
- package/src/types/request-scope.ts +112 -0
- package/src/types/route-config.ts +6 -50
- package/src/types/route-entry.ts +12 -7
- package/src/types/segments.ts +136 -15
- package/src/urls/include-helper.ts +33 -70
- package/src/urls/index.ts +1 -11
- package/src/urls/path-helper-types.ts +68 -18
- 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 -19
- 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 +214 -132
- 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 +57 -4
- package/src/vite/discovery/virtual-module-codegen.ts +14 -34
- package/src/vite/index.ts +6 -0
- package/src/vite/inject-client-debug.ts +36 -0
- package/src/vite/plugin-types.ts +178 -5
- package/src/vite/plugins/cjs-to-esm.ts +16 -19
- 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 +48 -95
- package/src/vite/plugins/expose-id-utils.ts +96 -51
- package/src/vite/plugins/expose-ids/export-analysis.ts +101 -34
- package/src/vite/plugins/expose-ids/handler-transform.ts +15 -64
- package/src/vite/plugins/expose-ids/loader-transform.ts +14 -24
- package/src/vite/plugins/expose-ids/router-transform.ts +118 -29
- package/src/vite/plugins/expose-internal-ids.ts +553 -317
- package/src/vite/plugins/performance-tracks.ts +64 -170
- package/src/vite/plugins/refresh-cmd.ts +89 -27
- package/src/vite/plugins/use-cache-transform.ts +73 -83
- package/src/vite/plugins/version-injector.ts +40 -29
- package/src/vite/plugins/version-plugin.ts +37 -40
- package/src/vite/plugins/virtual-entries.ts +39 -25
- package/src/vite/rango.ts +118 -114
- package/src/vite/router-discovery.ts +941 -142
- package/src/vite/utils/ast-handler-extract.ts +26 -35
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +10 -15
- 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 +4 -59
- package/src/vite/utils/package-resolution.ts +20 -52
- package/src/vite/utils/prerender-utils.ts +81 -34
- package/src/vite/utils/shared-utils.ts +92 -42
- package/src/browser/action-response-classifier.ts +0 -99
- package/src/browser/debug-channel.ts +0 -93
- 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/network-error-thrower.tsx +0 -23
- package/src/router/middleware-cookies.ts +0 -55
package/src/router/metrics.ts
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Router Metrics Utilities
|
|
3
|
-
*
|
|
4
|
-
* Performance metrics collection and reporting for RSC Router.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
1
|
import type { MetricsStore, PerformanceMetric } from "../server/context";
|
|
8
2
|
|
|
9
3
|
const BASE_INDENT = 2;
|
|
@@ -16,7 +10,6 @@ function formatMs(value: number): string {
|
|
|
16
10
|
|
|
17
11
|
function sortMetrics(metrics: PerformanceMetric[]): PerformanceMetric[] {
|
|
18
12
|
return [...metrics].sort((a, b) => {
|
|
19
|
-
// handler:total always goes last (it wraps everything)
|
|
20
13
|
if (a.label === "handler:total") return 1;
|
|
21
14
|
if (b.label === "handler:total") return -1;
|
|
22
15
|
return a.startTime - b.startTime;
|
|
@@ -68,11 +61,6 @@ function createTimelineAxis(total: number): string {
|
|
|
68
61
|
)}${totalLabel}`;
|
|
69
62
|
}
|
|
70
63
|
|
|
71
|
-
/**
|
|
72
|
-
* Create a metrics store for the request if debugPerformance is enabled.
|
|
73
|
-
* An optional `requestStart` timestamp can anchor the store to an earlier
|
|
74
|
-
* point (e.g. handler start) so that handler:total has startTime=0.
|
|
75
|
-
*/
|
|
76
64
|
export function createMetricsStore(
|
|
77
65
|
debugPerformance: boolean,
|
|
78
66
|
requestStart?: number,
|
|
@@ -85,9 +73,6 @@ export function createMetricsStore(
|
|
|
85
73
|
};
|
|
86
74
|
}
|
|
87
75
|
|
|
88
|
-
/**
|
|
89
|
-
* Append a metric to the request store using an absolute start timestamp.
|
|
90
|
-
*/
|
|
91
76
|
export function appendMetric(
|
|
92
77
|
metricsStore: MetricsStore | undefined,
|
|
93
78
|
label: string,
|
|
@@ -104,9 +89,6 @@ export function appendMetric(
|
|
|
104
89
|
});
|
|
105
90
|
}
|
|
106
91
|
|
|
107
|
-
/**
|
|
108
|
-
* Log the current request metrics and return the corresponding Server-Timing value.
|
|
109
|
-
*/
|
|
110
92
|
export function buildMetricsTiming(
|
|
111
93
|
method: string,
|
|
112
94
|
pathname: string,
|
|
@@ -117,7 +99,6 @@ export function buildMetricsTiming(
|
|
|
117
99
|
return generateServerTiming(metricsStore) || undefined;
|
|
118
100
|
}
|
|
119
101
|
|
|
120
|
-
/** Display row produced by merging :pre/:post metric pairs. */
|
|
121
102
|
interface DisplayRow {
|
|
122
103
|
label: string;
|
|
123
104
|
startTime: number;
|
|
@@ -126,12 +107,7 @@ interface DisplayRow {
|
|
|
126
107
|
spans: Span[];
|
|
127
108
|
}
|
|
128
109
|
|
|
129
|
-
/**
|
|
130
|
-
* Build display rows from sorted metrics, merging :pre/:post pairs into
|
|
131
|
-
* a single row with disjoint timeline segments.
|
|
132
|
-
*/
|
|
133
110
|
function buildDisplayRows(sorted: PerformanceMetric[]): DisplayRow[] {
|
|
134
|
-
// Index :pre and :post metrics by their base label
|
|
135
111
|
const preMap = new Map<string, PerformanceMetric>();
|
|
136
112
|
const postMap = new Map<string, PerformanceMetric>();
|
|
137
113
|
const consumed = new Set<PerformanceMetric>();
|
|
@@ -211,11 +187,6 @@ function buildDisplayRows(sorted: PerformanceMetric[]): DisplayRow[] {
|
|
|
211
187
|
return rows;
|
|
212
188
|
}
|
|
213
189
|
|
|
214
|
-
/**
|
|
215
|
-
* Log metrics to console in a formatted way.
|
|
216
|
-
* Uses a shared-axis timeline so overlapping work stays visible.
|
|
217
|
-
* Merges :pre/:post pairs onto one row with disjoint timeline segments.
|
|
218
|
-
*/
|
|
219
190
|
export function logMetrics(
|
|
220
191
|
method: string,
|
|
221
192
|
pathname: string,
|
|
@@ -267,11 +238,6 @@ export function logMetrics(
|
|
|
267
238
|
}
|
|
268
239
|
}
|
|
269
240
|
|
|
270
|
-
/**
|
|
271
|
-
* Generate Server-Timing header value from metrics
|
|
272
|
-
* Format: metric-name;dur=X.XX
|
|
273
|
-
* Depth is encoded as a "d{N}-" prefix for nested metrics.
|
|
274
|
-
*/
|
|
275
241
|
export function generateServerTiming(metricsStore: MetricsStore): string {
|
|
276
242
|
return metricsStore.metrics
|
|
277
243
|
.map((m) => {
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Middleware Types
|
|
3
|
-
*
|
|
4
|
-
* Type definitions and interfaces for the middleware system.
|
|
5
|
-
* Separated from execution logic for cleaner imports.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
1
|
import type { ContextVar } from "../context-var.js";
|
|
9
2
|
import type {
|
|
10
3
|
DefaultReverseRouteMap,
|
|
@@ -14,18 +7,13 @@ import type {
|
|
|
14
7
|
import type { ScopedReverseFunction } from "../reverse.js";
|
|
15
8
|
import type { Theme } from "../theme/types.js";
|
|
16
9
|
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
10
|
+
import type { RequestScope } from "../types/request-scope.js";
|
|
17
11
|
|
|
18
|
-
/**
|
|
19
|
-
* Get variable function type
|
|
20
|
-
*/
|
|
21
12
|
type GetVariableFn = {
|
|
22
13
|
<T>(contextVar: ContextVar<T>): T | undefined;
|
|
23
14
|
<K extends keyof DefaultVars>(key: K): DefaultVars[K];
|
|
24
15
|
};
|
|
25
16
|
|
|
26
|
-
/**
|
|
27
|
-
* Set variable function type
|
|
28
|
-
*/
|
|
29
17
|
type SetVariableFn = {
|
|
30
18
|
<T>(contextVar: ContextVar<T>, value: T, options?: { cache?: boolean }): void;
|
|
31
19
|
<K extends keyof DefaultVars>(
|
|
@@ -35,9 +23,6 @@ type SetVariableFn = {
|
|
|
35
23
|
): void;
|
|
36
24
|
};
|
|
37
25
|
|
|
38
|
-
/**
|
|
39
|
-
* Cookie options for setting cookies
|
|
40
|
-
*/
|
|
41
26
|
export interface CookieOptions {
|
|
42
27
|
domain?: string;
|
|
43
28
|
path?: string;
|
|
@@ -48,178 +33,60 @@ export interface CookieOptions {
|
|
|
48
33
|
sameSite?: "strict" | "lax" | "none";
|
|
49
34
|
}
|
|
50
35
|
|
|
51
|
-
/**
|
|
52
|
-
* Context passed to middleware
|
|
53
|
-
*
|
|
54
|
-
* @template TEnv - Environment type (bindings, variables) - defaults to any for internal flexibility
|
|
55
|
-
* @template TParams - URL params type (typed for route middleware, Record<string, string> for global middleware)
|
|
56
|
-
*/
|
|
57
36
|
export interface MiddlewareContext<
|
|
58
37
|
TEnv = any,
|
|
59
|
-
TParams = Record<string, string>,
|
|
60
|
-
> {
|
|
61
|
-
/** Original request */
|
|
62
|
-
request: Request;
|
|
63
|
-
|
|
64
|
-
/** Parsed URL (with internal `_rsc*` params stripped) */
|
|
65
|
-
url: URL;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* The original request URL with all parameters intact, including
|
|
69
|
-
* internal `_rsc*` transport params.
|
|
70
|
-
*/
|
|
71
|
-
originalUrl: URL;
|
|
72
|
-
|
|
73
|
-
/** URL pathname */
|
|
74
|
-
pathname: string;
|
|
75
|
-
|
|
76
|
-
/** URL search params */
|
|
77
|
-
searchParams: URLSearchParams;
|
|
78
|
-
|
|
79
|
-
/** Platform bindings (Cloudflare, etc.) */
|
|
80
|
-
env: TEnv;
|
|
81
|
-
|
|
82
|
-
/** URL params extracted from route/middleware pattern */
|
|
38
|
+
TParams = Record<string, string | undefined>,
|
|
39
|
+
> extends RequestScope<TEnv> {
|
|
83
40
|
params: TParams;
|
|
84
41
|
|
|
85
|
-
/**
|
|
86
|
-
* Response headers.
|
|
87
|
-
* Before `next()`, returns headers from the shared response stub.
|
|
88
|
-
* After `next()`, returns headers from the downstream response.
|
|
89
|
-
*/
|
|
90
42
|
readonly headers: Headers;
|
|
91
43
|
|
|
92
|
-
/** Get a context variable (shared with route handlers) */
|
|
93
44
|
get: GetVariableFn;
|
|
94
45
|
|
|
95
|
-
/** Set a context variable (shared with route handlers) */
|
|
96
46
|
set: SetVariableFn;
|
|
97
47
|
|
|
98
|
-
/**
|
|
99
|
-
* Middleware-injected variables.
|
|
100
|
-
* Same shared dictionary as `ctx.get()`/`ctx.set()`.
|
|
101
|
-
*/
|
|
102
|
-
var: DefaultVars;
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Set a response header - can be called before or after `next()`.
|
|
106
|
-
*
|
|
107
|
-
* When called before `next()`, headers are queued and merged into the final response.
|
|
108
|
-
* When called after `next()`, headers are set directly on the response.
|
|
109
|
-
*/
|
|
110
48
|
header(name: string, value: string): void;
|
|
111
49
|
|
|
112
|
-
/**
|
|
113
|
-
* The matched route name, if available and the route has an explicit name.
|
|
114
|
-
* Undefined for global middleware (runs before route matching) or unnamed routes.
|
|
115
|
-
*/
|
|
116
50
|
routeName?: DefaultRouteName;
|
|
117
51
|
|
|
118
|
-
/**
|
|
119
|
-
* Enable performance metrics for this request.
|
|
120
|
-
* When called, granular timing breakdown is logged to console and
|
|
121
|
-
* included in the Server-Timing response header, regardless of the
|
|
122
|
-
* router-level `debugPerformance` option.
|
|
123
|
-
*
|
|
124
|
-
* Call **before** `await next()` so the metrics store exists when
|
|
125
|
-
* downstream phases (route matching, rendering, SSR) record their
|
|
126
|
-
* spans. Calling after `next()` returns still emits `handler:total`
|
|
127
|
-
* but misses all upstream metrics.
|
|
128
|
-
*/
|
|
129
52
|
debugPerformance(): void;
|
|
130
53
|
|
|
131
|
-
/**
|
|
132
|
-
* Current theme (from cookie or default).
|
|
133
|
-
* Only available when theme is enabled in router config.
|
|
134
|
-
*/
|
|
135
54
|
theme?: Theme;
|
|
136
55
|
|
|
137
|
-
/**
|
|
138
|
-
* Set the theme (only available when theme is enabled in router config).
|
|
139
|
-
* Sets a cookie with the new theme value.
|
|
140
|
-
*/
|
|
141
56
|
setTheme?: (theme: Theme) => void;
|
|
142
57
|
|
|
143
|
-
/**
|
|
144
|
-
* Attach location state entries to this response.
|
|
145
|
-
* State is delivered to the client via history.pushState and accessible
|
|
146
|
-
* through the useLocationState() hook.
|
|
147
|
-
*/
|
|
148
58
|
setLocationState(entries: LocationStateEntry | LocationStateEntry[]): void;
|
|
149
59
|
|
|
150
|
-
/**
|
|
151
|
-
* Generate URLs from route names.
|
|
152
|
-
* - `name` — global route, from the named-routes definition
|
|
153
|
-
*/
|
|
154
60
|
reverse: ScopedReverseFunction<
|
|
155
61
|
Record<string, string>,
|
|
156
62
|
DefaultReverseRouteMap
|
|
157
63
|
>;
|
|
158
64
|
}
|
|
159
65
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
* @template TParams - URL params type (typed for route middleware)
|
|
165
|
-
*
|
|
166
|
-
* When using middleware with global augmentation (RSCRouter.Env), explicitly
|
|
167
|
-
* annotate your middleware functions, or the types will be inferred from context:
|
|
168
|
-
*
|
|
169
|
-
* @example
|
|
170
|
-
* ```typescript
|
|
171
|
-
* // With explicit annotation (recommended for reusable middleware)
|
|
172
|
-
* const authMiddleware: MiddlewareFn<AppEnv> = async (ctx, next) => {...}
|
|
173
|
-
*
|
|
174
|
-
* // Types inferred from router.use() call
|
|
175
|
-
* router.use((ctx, next) => {...}) // ctx is typed from router's TEnv
|
|
176
|
-
* ```
|
|
177
|
-
*/
|
|
178
|
-
export type MiddlewareFn<TEnv = any, TParams = Record<string, string>> = (
|
|
66
|
+
export type MiddlewareFn<
|
|
67
|
+
TEnv = any,
|
|
68
|
+
TParams = Record<string, string | undefined>,
|
|
69
|
+
> = (
|
|
179
70
|
ctx: MiddlewareContext<TEnv, TParams>,
|
|
180
71
|
next: () => Promise<Response>,
|
|
181
72
|
) => Response | void | Promise<Response | void>;
|
|
182
73
|
|
|
183
|
-
/**
|
|
184
|
-
* Stored middleware entry with pattern matching info
|
|
185
|
-
* @internal - uses any for internal flexibility
|
|
186
|
-
*/
|
|
187
74
|
export interface MiddlewareEntry<TEnv = any> {
|
|
188
|
-
/** Original pattern string */
|
|
189
75
|
pattern: string | null;
|
|
190
|
-
|
|
191
|
-
/** Compiled regex for matching */
|
|
192
76
|
regex: RegExp | null;
|
|
193
|
-
|
|
194
|
-
/** Param names extracted from pattern */
|
|
195
77
|
paramNames: string[];
|
|
196
|
-
|
|
197
|
-
/** The middleware function */
|
|
198
78
|
handler: MiddlewareFn<TEnv>;
|
|
199
|
-
|
|
200
|
-
/** Mount prefix this middleware is scoped to (null = global) */
|
|
201
|
-
mountPrefix: string | null;
|
|
202
79
|
}
|
|
203
80
|
|
|
204
|
-
/**
|
|
205
|
-
* Mutable response holder - tracks the current response through the middleware chain.
|
|
206
|
-
*/
|
|
207
81
|
export interface ResponseHolder {
|
|
208
82
|
response: Response | null;
|
|
209
83
|
}
|
|
210
84
|
|
|
211
|
-
/**
|
|
212
|
-
* Entry type for middleware collection
|
|
213
|
-
* Matches the shape of EntryData used in router.ts
|
|
214
|
-
*/
|
|
215
85
|
export interface MiddlewareCollectableEntry {
|
|
216
86
|
middleware?: MiddlewareFn<any, any>[];
|
|
217
87
|
layout?: MiddlewareCollectableEntry[];
|
|
218
88
|
}
|
|
219
89
|
|
|
220
|
-
/**
|
|
221
|
-
* Collected route middleware with params
|
|
222
|
-
*/
|
|
223
90
|
export interface CollectedMiddleware {
|
|
224
91
|
handler: MiddlewareFn<any, any>;
|
|
225
92
|
params: Record<string, string>;
|