@rangojs/router 0.0.0-experimental.32 → 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 +120 -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 +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 +190 -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 +63 -24
- 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 +338 -126
- 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
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rangojs/router/testing/flight
|
|
3
|
+
*
|
|
4
|
+
* Real React Server Component (Flight) rendering for unit tests. This entry is
|
|
5
|
+
* SEPARATE from the main ./testing barrel because its serializer (the vendored
|
|
6
|
+
* react-server-dom build) can only be imported under the `react-server` node
|
|
7
|
+
* condition; importing it elsewhere throws. Use it only from a Vitest project
|
|
8
|
+
* configured with that condition (see vitest.rsc.config.ts) — name those test
|
|
9
|
+
* files `*.rsc-test.{ts,tsx}` and run `pnpm test:unit:rsc`.
|
|
10
|
+
*
|
|
11
|
+
* This entry deliberately does NOT pull in Vitest. The `toMatchFlight` /
|
|
12
|
+
* `toMatchFlightSnapshot` matchers (which import `vitest`) live at the separate
|
|
13
|
+
* `@rangojs/router/testing/flight-matchers` subpath, so a consumer can import
|
|
14
|
+
* `renderToFlightString` without taking a hard dependency on Vitest.
|
|
15
|
+
*
|
|
16
|
+
* `renderToFlightString` returns the wire STRING (for `toMatchFlight`).
|
|
17
|
+
* `renderServerTree` additionally deserializes it back to an inspectable React
|
|
18
|
+
* element tree, so you can assert typed prop fidelity across the client boundary
|
|
19
|
+
* (a `Date` comes back a `Date`) and detect inlined-vs-island. Serialize +
|
|
20
|
+
* deserialize only — no hydration/interaction (that is the e2e tier).
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export {
|
|
24
|
+
renderToFlightString,
|
|
25
|
+
normalizeFlight,
|
|
26
|
+
assertFlightRuntimeAvailable,
|
|
27
|
+
} from "./flight.js";
|
|
28
|
+
export type { RenderToFlightStringOptions } from "./flight.js";
|
|
29
|
+
|
|
30
|
+
export {
|
|
31
|
+
renderServerTree,
|
|
32
|
+
findClientBoundaries,
|
|
33
|
+
findElements,
|
|
34
|
+
textContent,
|
|
35
|
+
assertFlightTreeRuntimeAvailable,
|
|
36
|
+
} from "./flight-tree.js";
|
|
37
|
+
export type {
|
|
38
|
+
RenderServerTreeOptions,
|
|
39
|
+
RenderServerTreeResult,
|
|
40
|
+
ClientBoundary,
|
|
41
|
+
BoundarySelector,
|
|
42
|
+
FoundElement,
|
|
43
|
+
ElementSelector,
|
|
44
|
+
} from "./flight-tree.js";
|
|
45
|
+
|
|
46
|
+
export { renderHandler } from "./render-handler.js";
|
|
47
|
+
export type {
|
|
48
|
+
TestableHandler,
|
|
49
|
+
RenderHandlerOptions,
|
|
50
|
+
RenderHandlerResult,
|
|
51
|
+
StateCookieSeed,
|
|
52
|
+
} from "./render-handler.js";
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/// <reference path="./flight-runtime.d.ts" />
|
|
2
|
+
/**
|
|
3
|
+
* renderToFlightString — REAL React Server Component (Flight) rendering for
|
|
4
|
+
* unit tests of @rangojs/router consumer apps.
|
|
5
|
+
*
|
|
6
|
+
* This module renders a server component tree to its Flight wire string using
|
|
7
|
+
* the same react-server-dom serializer the router uses at runtime. It runs in
|
|
8
|
+
* plain node (no Vite, no browser), but ONLY under the `react-server` export
|
|
9
|
+
* condition. The serializer is the VENDORED build shipped with
|
|
10
|
+
* @vitejs/plugin-rsc — the public `@vitejs/plugin-rsc/rsc` entry top-level
|
|
11
|
+
* imports Vite virtual modules and is not usable outside a Vite build.
|
|
12
|
+
*
|
|
13
|
+
* Run the example/tests for this module via the dedicated rsc vitest project
|
|
14
|
+
* (vitest.rsc.config.ts), which forces `--conditions=react-server` on the
|
|
15
|
+
* worker. The main vitest project must NOT use that condition (it would flip
|
|
16
|
+
* React to the no-hooks server build and break the ~50 tests that mock
|
|
17
|
+
* @vitejs/plugin-rsc/rsc).
|
|
18
|
+
*
|
|
19
|
+
* Scope / limitations (v1):
|
|
20
|
+
* - Server-only / leaf trees. A tree containing a CLIENT component emits an
|
|
21
|
+
* `I[...]` import row whose module id will not resolve against the empty `{}`
|
|
22
|
+
* client manifest used here — fine for snapshotting the SHAPE of the payload.
|
|
23
|
+
* To inspect a client boundary's deserialized props instead, use
|
|
24
|
+
* `renderServerTree` (flight-tree.ts). Interactive hydration stays at the e2e tier.
|
|
25
|
+
* - The vendored subpath is a private plugin-rsc path; a minor bump could move
|
|
26
|
+
* it. `assertFlightRuntimeAvailable()` provides a smoke check.
|
|
27
|
+
* - For stable snapshots, run under NODE_ENV=production: the production
|
|
28
|
+
* serializer drops the dev-only debug-info rows (the `N<timestamp>` reference
|
|
29
|
+
* row, the per-component `stack`/`env` rows, and `D{...}` timing rows),
|
|
30
|
+
* leaving just the rendered tree row(s).
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import type { ReactNode } from "react";
|
|
34
|
+
// Vendored react-server-dom serializer. Resolves via plugin-rsc's
|
|
35
|
+
// `"./*": "./dist/*.js"` export to
|
|
36
|
+
// dist/vendor/react-server-dom/server.edge.js. Only loadable under the
|
|
37
|
+
// `react-server` export condition.
|
|
38
|
+
import * as RSDServer from "@vitejs/plugin-rsc/vendor/react-server-dom/server.edge";
|
|
39
|
+
import {
|
|
40
|
+
createRequestContext,
|
|
41
|
+
runWithRequestContext,
|
|
42
|
+
setRequestContextParams,
|
|
43
|
+
} from "../server/request-context.js";
|
|
44
|
+
import { seedVariables, type VarsInit } from "./internal/seed-vars.js";
|
|
45
|
+
import { normalizeFlight } from "./flight-normalize.js";
|
|
46
|
+
import type { RscPayload } from "../rsc/types.js";
|
|
47
|
+
import type { ResolvedSegment } from "../types.js";
|
|
48
|
+
|
|
49
|
+
// Re-export from the serializer-free module so this entry's public surface is
|
|
50
|
+
// unchanged while flight-matchers can import normalizeFlight without pulling in
|
|
51
|
+
// the vendored serializer (which throws outside the react-server condition).
|
|
52
|
+
export { normalizeFlight };
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Options for {@link renderToFlightString}.
|
|
56
|
+
*/
|
|
57
|
+
export interface RenderToFlightStringOptions {
|
|
58
|
+
/**
|
|
59
|
+
* The request the render runs under: a `Request`, or a URL string (absolute or
|
|
60
|
+
* path). Defaults to `http://localhost/`. A server component reading
|
|
61
|
+
* `getRequestContext()` sees this request's url/cookies. When a `Request` is
|
|
62
|
+
* passed, its headers are used and `headers` below is ignored.
|
|
63
|
+
*/
|
|
64
|
+
request?: Request | string;
|
|
65
|
+
/** Request headers (e.g. Cookie) visible to the server tree (when `request` is a string). */
|
|
66
|
+
headers?: HeadersInit;
|
|
67
|
+
/** Env / bindings exposed as `ctx.env`. Defaults to `{}`. */
|
|
68
|
+
env?: unknown;
|
|
69
|
+
/** Route params exposed via `ctx.params` and loader contexts. */
|
|
70
|
+
params?: Record<string, string>;
|
|
71
|
+
/** Matched route name (drives `ctx.routeName` and scoped reverse). */
|
|
72
|
+
routeName?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Route name -> pattern map enabling a SCOPED `ctx.reverse()` (like
|
|
75
|
+
* `renderHandler`). Without it, a server component that reverses resolves
|
|
76
|
+
* against the GLOBAL route map and is order-dependent on whatever router
|
|
77
|
+
* registered last. Pass the router-under-test's map to make reversing
|
|
78
|
+
* deterministic.
|
|
79
|
+
*/
|
|
80
|
+
routeMap?: Record<string, string>;
|
|
81
|
+
/**
|
|
82
|
+
* Context variables visible to the rendered tree via `ctx.get(...)` — as a
|
|
83
|
+
* prior middleware would have set them. Seeds the SAME way the handler-test
|
|
84
|
+
* primitives (`runInRequestContext`/`runLoader`) do, so a server component
|
|
85
|
+
* that reads `getRequestContext().get(MyVar)` during render is testable.
|
|
86
|
+
* Object form (`{ user }`) or `[key, value]` tuples (`[[userVar, u]]`).
|
|
87
|
+
*/
|
|
88
|
+
vars?: VarsInit;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const DEFAULT_URL = "http://localhost/";
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* True when `error` is the out-of-react-server stub thrown by index.ts's
|
|
95
|
+
* server-only exports (getRequestContext/cookies/headers/...) — i.e. the bare
|
|
96
|
+
* `@rangojs/router` specifier resolved to index.ts, not index.rsc.ts, because
|
|
97
|
+
* the rsc Vitest project is missing the `rangoTestAliases` alias. Matches both
|
|
98
|
+
* substrings of `serverOnlyStubError` (index.ts) so a normal app error cannot
|
|
99
|
+
* over-match. Shared with render-handler.ts so the two Flight primitives report
|
|
100
|
+
* the same misconfiguration identically.
|
|
101
|
+
*/
|
|
102
|
+
export function isServerOnlyStubError(error: unknown): boolean {
|
|
103
|
+
return (
|
|
104
|
+
error instanceof Error &&
|
|
105
|
+
error.message.includes("is only available from") &&
|
|
106
|
+
error.message.includes("react-server")
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Rethrow a server tree render error. When it is the missing-rsc-alias stub
|
|
112
|
+
* (above), rethrow an actionable message naming `rangoTestAliases` instead of
|
|
113
|
+
* the opaque stub text; otherwise rethrow the original unchanged. Classify the
|
|
114
|
+
* ORIGINAL error before constructing the wrapper so the wrapper's `Original: ...`
|
|
115
|
+
* echo (which re-embeds the matched substrings) never re-triggers the predicate.
|
|
116
|
+
*/
|
|
117
|
+
function rethrowFlightRenderError(error: unknown): never {
|
|
118
|
+
if (isServerOnlyStubError(error)) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`The server component called a server-only API ` +
|
|
121
|
+
`(getRequestContext/cookies/headers/...) but "@rangojs/router" resolved to ` +
|
|
122
|
+
`the out-of-react-server stub. Add rangoTestAliases({ preset }) to your ` +
|
|
123
|
+
`vitest.rsc.config.ts \`resolve.alias\` so the bare specifier maps to ` +
|
|
124
|
+
`index.rsc.ts (the real react-server implementations). ` +
|
|
125
|
+
`Original: ${(error as Error).message}`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function assertNoLegacyUrlOption(opts: object, fnName: string): void {
|
|
132
|
+
if ("url" in opts) {
|
|
133
|
+
throw new Error(
|
|
134
|
+
`${fnName}: the \`url\` option was renamed to \`request\`. Pass ` +
|
|
135
|
+
`{ request: "<url-or-path>" } (or a Request) instead of { url }. ` +
|
|
136
|
+
`The legacy \`url\` key is ignored, so the render would silently use ` +
|
|
137
|
+
`the default origin.`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function wrapAsPayload(element: ReactNode, pathname: string): RscPayload {
|
|
143
|
+
const segment: ResolvedSegment = {
|
|
144
|
+
id: "test",
|
|
145
|
+
namespace: "",
|
|
146
|
+
type: "route",
|
|
147
|
+
index: 0,
|
|
148
|
+
component: element,
|
|
149
|
+
};
|
|
150
|
+
return {
|
|
151
|
+
metadata: {
|
|
152
|
+
pathname,
|
|
153
|
+
segments: [segment],
|
|
154
|
+
version: "test",
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Render a server component (or any ReactNode) to its Flight wire string.
|
|
161
|
+
*
|
|
162
|
+
* The element is wrapped in a minimal Rango segment + payload, then serialized
|
|
163
|
+
* with the vendored react-server-dom server. A request context is active for
|
|
164
|
+
* the duration of the render (drained INSIDE runWithRequestContext) so async
|
|
165
|
+
* server components can call getRequestContext(), read params, cookies, etc.
|
|
166
|
+
*
|
|
167
|
+
* Must run under the `react-server` export condition (see module header).
|
|
168
|
+
*/
|
|
169
|
+
export async function renderToFlightString(
|
|
170
|
+
element: ReactNode,
|
|
171
|
+
opts: RenderToFlightStringOptions = {},
|
|
172
|
+
): Promise<string> {
|
|
173
|
+
assertNoLegacyUrlOption(opts, "renderToFlightString");
|
|
174
|
+
return serializeToFlightString(element, opts, {});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export async function serializeToFlightString(
|
|
178
|
+
element: ReactNode,
|
|
179
|
+
opts: RenderToFlightStringOptions,
|
|
180
|
+
clientManifest: unknown,
|
|
181
|
+
): Promise<string> {
|
|
182
|
+
const request =
|
|
183
|
+
opts.request instanceof Request
|
|
184
|
+
? opts.request
|
|
185
|
+
: new Request(new URL(opts.request ?? DEFAULT_URL, DEFAULT_URL), {
|
|
186
|
+
headers: opts.headers,
|
|
187
|
+
});
|
|
188
|
+
const url = new URL(request.url);
|
|
189
|
+
const ctx = createRequestContext({
|
|
190
|
+
env: opts.env ?? {},
|
|
191
|
+
request,
|
|
192
|
+
url,
|
|
193
|
+
variables: seedVariables({}, opts.vars),
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
return runWithRequestContext(ctx, () => {
|
|
197
|
+
setRequestContextParams(opts.params ?? {}, opts.routeName, opts.routeMap);
|
|
198
|
+
return serializeNodeToFlight(element, clientManifest, url.pathname);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export async function serializeNodeToFlight(
|
|
203
|
+
node: ReactNode,
|
|
204
|
+
clientManifest: unknown,
|
|
205
|
+
pathname: string,
|
|
206
|
+
): Promise<string> {
|
|
207
|
+
const payload = wrapAsPayload(node, pathname);
|
|
208
|
+
let renderError: unknown;
|
|
209
|
+
let didError = false;
|
|
210
|
+
const stream = RSDServer.renderToReadableStream(payload, clientManifest, {
|
|
211
|
+
onError(error: unknown) {
|
|
212
|
+
if (!didError) {
|
|
213
|
+
didError = true;
|
|
214
|
+
renderError = error;
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
const text = await new Response(stream).text();
|
|
219
|
+
if (didError) rethrowFlightRenderError(renderError);
|
|
220
|
+
return text;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export function assertFlightRuntimeAvailable(): void {
|
|
224
|
+
if (typeof RSDServer.renderToReadableStream !== "function") {
|
|
225
|
+
throw new Error(
|
|
226
|
+
"Vendored react-server-dom serializer not available: " +
|
|
227
|
+
"@vitejs/plugin-rsc/vendor/react-server-dom/server.edge did not export " +
|
|
228
|
+
"renderToReadableStream. The private vendored subpath may have moved in " +
|
|
229
|
+
"a plugin-rsc upgrade.",
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* assertGeneratedRoutesMatch — pin the generated named-routes map against the
|
|
3
|
+
* router's runtime route map.
|
|
4
|
+
*
|
|
5
|
+
* The Vite plugin writes a `*.named-routes.gen.ts` file mapping route names to
|
|
6
|
+
* URL patterns; consumers import that map and pass it here. The check compares
|
|
7
|
+
* it to the router's runtime `routeMap`, catching drift when a route is added,
|
|
8
|
+
* removed, renamed, or its pattern changes without regenerating the file.
|
|
9
|
+
*
|
|
10
|
+
* Directionality (relative to the generated map):
|
|
11
|
+
* - missing: present in the generated map but NOT at runtime (stale entry).
|
|
12
|
+
* - extra: present at runtime but NOT in the generated map (ungenerated route).
|
|
13
|
+
* Auto-generated internal names (the "$path_" / "$prefix_" prefixes)
|
|
14
|
+
* are excluded — they live in the runtime map but are never written
|
|
15
|
+
* to the generated file, so they are not drift.
|
|
16
|
+
* - mismatch: present in both under the same name, but the patterns differ.
|
|
17
|
+
*
|
|
18
|
+
* When `generatedMap` is omitted, the global route map (getGlobalRouteMap()) is
|
|
19
|
+
* used as the generated side — useful when a single router has registered into
|
|
20
|
+
* the global map.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { getGlobalRouteMap } from "../route-map-builder.js";
|
|
24
|
+
import { isAutoGeneratedRouteName } from "../route-name.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Router shape this check depends on: a runtime route map, plus the optional
|
|
28
|
+
* `findMatch` used to force-expand lazy `include()`d routes (see below).
|
|
29
|
+
*/
|
|
30
|
+
interface RouterWithRouteMap {
|
|
31
|
+
routeMap: Record<string, unknown>;
|
|
32
|
+
findMatch?: (pathname: string) => unknown;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function concretePath(pattern: string): string {
|
|
36
|
+
return (
|
|
37
|
+
pattern
|
|
38
|
+
.replace(/:[A-Za-z0-9_]+\([^)]*\)\??/g, "x") // :p(constraint) / optional
|
|
39
|
+
.replace(/:[A-Za-z0-9_]+\??/g, "x") // :p or :p?
|
|
40
|
+
.replace(/\*/g, "x") // wildcard
|
|
41
|
+
.replace(/\/{2,}/g, "/") || "/"
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function expandLazyIncludes(
|
|
46
|
+
router: RouterWithRouteMap,
|
|
47
|
+
patterns: Iterable<string>,
|
|
48
|
+
): void {
|
|
49
|
+
const findMatch = router.findMatch;
|
|
50
|
+
if (typeof findMatch !== "function") return;
|
|
51
|
+
for (const pattern of patterns) {
|
|
52
|
+
try {
|
|
53
|
+
findMatch.call(router, concretePath(pattern));
|
|
54
|
+
} catch {}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* A single name/pattern mismatch: [routeName, generatedPattern, runtimePattern].
|
|
60
|
+
*/
|
|
61
|
+
export type GeneratedRouteMismatch = [
|
|
62
|
+
name: string,
|
|
63
|
+
generated: string,
|
|
64
|
+
runtime: string,
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Structured diff between the generated route map and the runtime route map.
|
|
69
|
+
*/
|
|
70
|
+
export interface GeneratedRoutesDiff {
|
|
71
|
+
/** Names in the generated map but absent at runtime. */
|
|
72
|
+
missing: string[];
|
|
73
|
+
/** Names at runtime but absent from the generated map. */
|
|
74
|
+
extra: string[];
|
|
75
|
+
/** Names in both with differing patterns. */
|
|
76
|
+
mismatch: GeneratedRouteMismatch[];
|
|
77
|
+
/** True when missing, extra, and mismatch are all empty. */
|
|
78
|
+
ok: boolean;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function patternOf(value: unknown): string {
|
|
82
|
+
if (typeof value === "string") return value;
|
|
83
|
+
if (
|
|
84
|
+
value &&
|
|
85
|
+
typeof value === "object" &&
|
|
86
|
+
"path" in value &&
|
|
87
|
+
typeof (value as { path: unknown }).path === "string"
|
|
88
|
+
) {
|
|
89
|
+
return (value as { path: string }).path;
|
|
90
|
+
}
|
|
91
|
+
return String(value);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function diffGeneratedRoutes(
|
|
95
|
+
router: RouterWithRouteMap,
|
|
96
|
+
generatedMap?: Record<string, unknown>,
|
|
97
|
+
): GeneratedRoutesDiff {
|
|
98
|
+
const generated = generatedMap ?? getGlobalRouteMap();
|
|
99
|
+
|
|
100
|
+
expandLazyIncludes(
|
|
101
|
+
router,
|
|
102
|
+
Object.values(generated).map((v) => patternOf(v)),
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const runtime = router.routeMap as Record<string, unknown>;
|
|
106
|
+
|
|
107
|
+
const missing: string[] = [];
|
|
108
|
+
const extra: string[] = [];
|
|
109
|
+
const mismatch: GeneratedRouteMismatch[] = [];
|
|
110
|
+
|
|
111
|
+
for (const name of Object.keys(generated)) {
|
|
112
|
+
if (!(name in runtime)) {
|
|
113
|
+
missing.push(name);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const gen = patternOf(generated[name]);
|
|
117
|
+
const run = patternOf(runtime[name]);
|
|
118
|
+
if (gen !== run) {
|
|
119
|
+
mismatch.push([name, gen, run]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
for (const name of Object.keys(runtime)) {
|
|
124
|
+
if (isAutoGeneratedRouteName(name)) continue;
|
|
125
|
+
if (!(name in generated)) {
|
|
126
|
+
extra.push(name);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
missing,
|
|
132
|
+
extra,
|
|
133
|
+
mismatch,
|
|
134
|
+
ok: missing.length === 0 && extra.length === 0 && mismatch.length === 0,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Assert the router's runtime route map matches the generated map. Throws a
|
|
140
|
+
* descriptive Error listing every missing, extra, and mismatched route when
|
|
141
|
+
* they diverge.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* import generated from "./router.named-routes.gen";
|
|
146
|
+
* import { router } from "./router";
|
|
147
|
+
*
|
|
148
|
+
* assertGeneratedRoutesMatch(router, generated);
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export function assertGeneratedRoutesMatch(
|
|
152
|
+
router: RouterWithRouteMap,
|
|
153
|
+
generatedMap?: Record<string, unknown>,
|
|
154
|
+
): void {
|
|
155
|
+
const diff = diffGeneratedRoutes(router, generatedMap);
|
|
156
|
+
if (diff.ok) return;
|
|
157
|
+
|
|
158
|
+
const lines: string[] = [
|
|
159
|
+
"Generated routes do not match the router's runtime route map.",
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
if (diff.missing.length > 0) {
|
|
163
|
+
lines.push(
|
|
164
|
+
` Missing (generated but not at runtime): ${diff.missing.join(", ")}`,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
if (diff.extra.length > 0) {
|
|
168
|
+
lines.push(
|
|
169
|
+
` Extra (at runtime but not generated): ${diff.extra.join(", ")}`,
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
if (diff.mismatch.length > 0) {
|
|
173
|
+
lines.push(" Pattern mismatches (name: generated -> runtime):");
|
|
174
|
+
for (const [name, gen, run] of diff.mismatch) {
|
|
175
|
+
lines.push(` ${name}: ${gen} -> ${run}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
lines.push(
|
|
179
|
+
"Re-run the build / `rango` route generation to regenerate the *.named-routes.gen.ts file.",
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
throw new Error(lines.join("\n"));
|
|
183
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rangojs/router/testing
|
|
3
|
+
*
|
|
4
|
+
* Consumer-facing testing primitives for apps built on @rangojs/router.
|
|
5
|
+
*
|
|
6
|
+
* This is the entry for UNIT and INTEGRATION tests, meant to run under a
|
|
7
|
+
* Vite-driven Vitest project (the rango Vite plugin must be active so the
|
|
8
|
+
* `@rangojs/router:version` and related virtual modules the router internals
|
|
9
|
+
* import can resolve; alternatively alias `@rangojs/router:version`). Importing
|
|
10
|
+
* this module references neither React, @testing-library/react, @playwright/test,
|
|
11
|
+
* nor the RSC runtime — a unit suite testing only loaders/middleware/dispatch
|
|
12
|
+
* pulls in none of them.
|
|
13
|
+
*
|
|
14
|
+
* The other surfaces are SEPARATE entries because each pulls a dependency or
|
|
15
|
+
* runtime this barrel deliberately keeps out:
|
|
16
|
+
* - `@rangojs/router/testing/dom` — `renderRoute` (the RTL component stub). Kept
|
|
17
|
+
* separate so this barrel never references React, the browser runtime, or
|
|
18
|
+
* `@testing-library/react` types — a unit suite testing only loaders/middleware
|
|
19
|
+
* needs none of them.
|
|
20
|
+
* - `@rangojs/router/testing/e2e` — the Playwright harness (createRangoE2E,
|
|
21
|
+
* useFixture, parityDescribe, expectParity, matchers). Kept separate so it is
|
|
22
|
+
* loadable in a plain (non-Vite) Playwright runner, which cannot resolve the
|
|
23
|
+
* router-manifest virtual modules this barrel pulls in.
|
|
24
|
+
* - `@rangojs/router/testing/flight` — real Flight rendering. Its serializer
|
|
25
|
+
* (vendored react-server-dom) loads only under the `react-server` node
|
|
26
|
+
* condition and would throw if pulled into this barrel.
|
|
27
|
+
*
|
|
28
|
+
* Layers:
|
|
29
|
+
* - Unit: runMiddleware, runLoader
|
|
30
|
+
* - Integration: dispatch (request -> Response)
|
|
31
|
+
* - Cross-cut: assertCacheStatus, assertGeneratedRoutesMatch
|
|
32
|
+
* - Component: see @rangojs/router/testing/dom (renderRoute)
|
|
33
|
+
* - E2E: see @rangojs/router/testing/e2e
|
|
34
|
+
* - RSC: see @rangojs/router/testing/flight
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
export { runMiddleware } from "./run-middleware.js";
|
|
38
|
+
export type {
|
|
39
|
+
RunMiddlewareOptions,
|
|
40
|
+
RunMiddlewareResult,
|
|
41
|
+
} from "./run-middleware.js";
|
|
42
|
+
export { runLoader, runLoaderResult } from "./run-loader.js";
|
|
43
|
+
export type {
|
|
44
|
+
RunLoaderOptions,
|
|
45
|
+
RunLoaderResult,
|
|
46
|
+
UseResolver,
|
|
47
|
+
TestLoaderContext,
|
|
48
|
+
} from "./run-loader.js";
|
|
49
|
+
|
|
50
|
+
export { dispatch } from "./dispatch.js";
|
|
51
|
+
export type { DispatchOptions } from "./dispatch.js";
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
assertCacheStatus,
|
|
55
|
+
assertCacheDecision,
|
|
56
|
+
parseCacheHeader,
|
|
57
|
+
createCacheSink,
|
|
58
|
+
filterCacheDecisions,
|
|
59
|
+
} from "./cache-status.js";
|
|
60
|
+
export type {
|
|
61
|
+
ExpectedCacheStatus,
|
|
62
|
+
CacheStatusTarget,
|
|
63
|
+
CacheSink,
|
|
64
|
+
} from "./cache-status.js";
|
|
65
|
+
export type {
|
|
66
|
+
TelemetryEvent,
|
|
67
|
+
TelemetrySink,
|
|
68
|
+
CacheDecisionEvent,
|
|
69
|
+
CacheSegmentSignal,
|
|
70
|
+
CacheSegmentStatus,
|
|
71
|
+
} from "../router/telemetry.js";
|
|
72
|
+
|
|
73
|
+
export { collectHandle } from "./collect-handle.js";
|
|
74
|
+
|
|
75
|
+
export {
|
|
76
|
+
diffGeneratedRoutes,
|
|
77
|
+
assertGeneratedRoutesMatch,
|
|
78
|
+
} from "./generated-routes.js";
|
|
79
|
+
export type {
|
|
80
|
+
GeneratedRoutesDiff,
|
|
81
|
+
GeneratedRouteMismatch,
|
|
82
|
+
} from "./generated-routes.js";
|
|
83
|
+
|
|
84
|
+
export {
|
|
85
|
+
createTestRequestContext,
|
|
86
|
+
runInRequestContext,
|
|
87
|
+
toRequest,
|
|
88
|
+
seedVariables,
|
|
89
|
+
} from "./internal/context.js";
|
|
90
|
+
export type {
|
|
91
|
+
CreateTestContextOptions,
|
|
92
|
+
TestRequestContext,
|
|
93
|
+
TestRequestContextObject,
|
|
94
|
+
RunInRequestContextResult,
|
|
95
|
+
VarsInit,
|
|
96
|
+
StateCookieSeed,
|
|
97
|
+
} from "./internal/context.js";
|
|
98
|
+
|
|
99
|
+
export { runWithRequestContext } from "../server/request-context.js";
|