@rangojs/router 0.17.0 → 0.19.0
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/README.md +3 -2
- package/dist/types/browser/cookie-name.d.ts +6 -0
- package/dist/types/browser/event-controller.d.ts +3 -3
- package/dist/types/browser/history-state.d.ts +18 -0
- package/dist/types/browser/navigation-transaction.d.ts +20 -2
- package/dist/types/browser/partial-update.d.ts +16 -1
- package/dist/types/browser/prefetch/cache.d.ts +6 -6
- package/dist/types/browser/react/Link.d.ts +19 -9
- package/dist/types/browser/react/context.d.ts +2 -2
- package/dist/types/browser/react/location-state-shared.d.ts +95 -56
- package/dist/types/browser/react/location-state.d.ts +1 -1
- package/dist/types/browser/transition-when.d.ts +80 -0
- package/dist/types/browser/types.d.ts +104 -9
- package/dist/types/build/generate-manifest.d.ts +8 -0
- package/dist/types/cache/background-task.d.ts +24 -2
- package/dist/types/cache/cache-exec-scope.d.ts +31 -0
- package/dist/types/cache/cache-key-utils.d.ts +48 -2
- package/dist/types/cache/cache-policy.d.ts +18 -1
- package/dist/types/cache/cache-runtime.d.ts +7 -0
- package/dist/types/cache/cache-scope.d.ts +192 -26
- package/dist/types/cache/cache-tag.d.ts +116 -11
- package/dist/types/cache/cf/cf-base64.d.ts +6 -0
- package/dist/types/cache/cf/cf-cache-constants.d.ts +11 -0
- package/dist/types/cache/cf/cf-cache-store.d.ts +224 -72
- package/dist/types/cache/cf/cf-cache-types.d.ts +31 -4
- package/dist/types/cache/cf/cf-shell-frame.d.ts +95 -0
- package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +19 -0
- package/dist/types/cache/document-cache.d.ts +10 -0
- package/dist/types/cache/handle-snapshot.d.ts +41 -8
- package/dist/types/cache/index.d.ts +1 -0
- package/dist/types/cache/invalidation-order.d.ts +23 -0
- package/dist/types/cache/isolate-tag-memo.d.ts +149 -0
- package/dist/types/cache/request-tag-mask.d.ts +54 -0
- package/dist/types/cache/shell-memo.d.ts +178 -0
- package/dist/types/cache/shell-snapshot.d.ts +141 -105
- package/dist/types/cache/tag-invalidation.d.ts +54 -3
- package/dist/types/cache/types.d.ts +267 -96
- package/dist/types/cache/vercel/vercel-cache-store.d.ts +123 -18
- package/dist/types/client-urls/navigation.d.ts +28 -2
- package/dist/types/client-urls/server-projection.d.ts +5 -2
- package/dist/types/client-urls/types.d.ts +5 -5
- package/dist/types/client.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.rsc.d.ts +1 -1
- package/dist/types/prerender/build-shell-capture.d.ts +11 -4
- package/dist/types/route-definition/helpers-types.d.ts +11 -11
- package/dist/types/route-name.d.ts +7 -0
- package/dist/types/router/error-handling.d.ts +1 -1
- package/dist/types/router/instrument.d.ts +8 -0
- package/dist/types/router/intercept-resolution.d.ts +2 -0
- package/dist/types/router/match-context.d.ts +5 -0
- package/dist/types/router/match-middleware/background-revalidation.d.ts +0 -4
- package/dist/types/router/middleware-types.d.ts +6 -1
- package/dist/types/router/router-options.d.ts +4 -1
- package/dist/types/router/segment-resolution/loader-cache.d.ts +58 -12
- package/dist/types/router/segment-resolution/loader-mask.d.ts +3 -4
- package/dist/types/router/segment-resolution/loader-snapshot.d.ts +33 -48
- package/dist/types/router/segment-resolution/mask-nested.d.ts +73 -24
- package/dist/types/router/segment-resolution/view-transition-default.d.ts +7 -5
- package/dist/types/router/transition-when.d.ts +24 -10
- package/dist/types/rsc/attach-transition-when.d.ts +18 -0
- package/dist/types/rsc/full-payload.d.ts +21 -0
- package/dist/types/rsc/handler.d.ts +1 -1
- package/dist/types/rsc/response-cache-serve.d.ts +15 -12
- package/dist/types/rsc/shell-build-manifest.d.ts +12 -3
- package/dist/types/rsc/shell-capture-constants.d.ts +116 -12
- package/dist/types/rsc/shell-capture.d.ts +202 -74
- package/dist/types/rsc/shell-serve.d.ts +144 -50
- package/dist/types/rsc/types.d.ts +9 -0
- package/dist/types/segment-system.d.ts +7 -0
- package/dist/types/server/context.d.ts +155 -33
- package/dist/types/server/cookie-store.d.ts +33 -0
- package/dist/types/server/handle-store.d.ts +52 -1
- package/dist/types/server/request-context.d.ts +210 -63
- package/dist/types/server/request-headers.d.ts +44 -0
- package/dist/types/server.d.ts +1 -0
- package/dist/types/ssr/index.d.ts +9 -0
- package/dist/types/ssr/ssr-root.d.ts +9 -8
- package/dist/types/testing/e2e/index.d.ts +1 -1
- package/dist/types/testing/flight.entry.d.ts +7 -0
- package/dist/types/testing/index.d.ts +3 -2
- package/dist/types/testing/internal/action-id.d.ts +7 -0
- package/dist/types/testing/location-state-key.d.ts +24 -0
- package/dist/types/testing/render-route.d.ts +17 -1
- package/dist/types/testing/run-loader.d.ts +18 -3
- package/dist/types/testing/run-transition-when.d.ts +44 -69
- package/dist/types/testing/serve-shell-request.d.ts +133 -0
- package/dist/types/testing/shell-status.d.ts +44 -19
- package/dist/types/transition-when-ref.d.ts +79 -0
- package/dist/types/types/cache-types.d.ts +15 -3
- package/dist/types/types/handler-context.d.ts +14 -1
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/segments.d.ts +86 -71
- package/dist/types/urls/path-helper-types.d.ts +3 -4
- package/dist/types/urls/pattern-types.d.ts +21 -18
- package/dist/types/vite/plugins/transition-when-hoist.d.ts +45 -0
- package/dist/types/vite/router-discovery.d.ts +29 -2
- package/dist/vite/index.js +1005 -105
- package/package.json +1 -1
- package/skills/breadcrumbs/SKILL.md +17 -7
- package/skills/cache-guide/SKILL.md +175 -76
- package/skills/caching/SKILL.md +361 -33
- package/skills/catalog.json +1 -1
- package/skills/client-urls/SKILL.md +12 -7
- package/skills/cloudflare/SKILL.md +15 -0
- package/skills/comparison/references/framework-comparison.md +52 -37
- package/skills/defer-hydration/SKILL.md +50 -30
- package/skills/deployment-caching/SKILL.md +5 -2
- package/skills/document-cache/SKILL.md +32 -2
- package/skills/handler-use/SKILL.md +2 -0
- package/skills/hooks/SKILL.md +3 -1
- package/skills/hooks/handle-and-actions.md +3 -1
- package/skills/hooks/navigation.md +23 -2
- package/skills/hooks/state.md +101 -7
- package/skills/intercept/SKILL.md +29 -12
- package/skills/loader/SKILL.md +197 -44
- package/skills/middleware/SKILL.md +34 -9
- package/skills/migrate-nextjs/SKILL.md +68 -37
- package/skills/migrate-react-router/SKILL.md +2 -1
- package/skills/migrate-react-router/component-migration.md +3 -1
- package/skills/migrate-react-router/data-and-actions.md +3 -1
- package/skills/migrate-react-router/route-mapping.md +7 -4
- package/skills/observability/SKILL.md +65 -0
- package/skills/parallel/SKILL.md +13 -8
- package/skills/ppr/SKILL.md +715 -371
- package/skills/prerender/SKILL.md +30 -17
- package/skills/rango/SKILL.md +72 -34
- package/skills/route/SKILL.md +14 -7
- package/skills/router-setup/SKILL.md +4 -2
- package/skills/scripts/SKILL.md +8 -1
- package/skills/server-actions/SKILL.md +11 -0
- package/skills/shell-manifest/SKILL.md +21 -12
- package/skills/testing/SKILL.md +49 -43
- package/skills/testing/cache-prerender.md +15 -14
- package/skills/testing/client-components.md +45 -3
- package/skills/testing/loader.md +19 -1
- package/skills/testing/middleware.md +1 -0
- package/skills/testing/predicates.md +49 -49
- package/skills/testing/render-handler.md +1 -0
- package/skills/testing/serve-shell-request.md +202 -0
- package/skills/testing/server-actions.md +9 -3
- package/skills/theme/SKILL.md +56 -4
- package/skills/typesafety/env-and-bindings.md +18 -2
- package/skills/use-cache/SKILL.md +91 -23
- package/skills/vercel/SKILL.md +14 -2
- package/skills/view-transitions/SKILL.md +150 -29
- package/src/__augment-tests__/augmented.check.ts +23 -0
- package/src/browser/cookie-name.ts +23 -0
- package/src/browser/event-controller.ts +4 -4
- package/src/browser/history-state.ts +75 -1
- package/src/browser/link-interceptor.ts +4 -0
- package/src/browser/navigation-bridge.ts +77 -18
- package/src/browser/navigation-client.ts +4 -3
- package/src/browser/navigation-store.ts +43 -1
- package/src/browser/navigation-transaction.ts +31 -11
- package/src/browser/partial-update.ts +146 -35
- package/src/browser/prefetch/cache.ts +6 -6
- package/src/browser/prefetch/fetch.ts +2 -2
- package/src/browser/react/Link.tsx +38 -33
- package/src/browser/react/NavigationProvider.tsx +2 -2
- package/src/browser/react/context.ts +2 -2
- package/src/browser/react/location-state-shared.ts +241 -49
- package/src/browser/react/location-state.ts +5 -2
- package/src/browser/rsc-router.tsx +9 -0
- package/src/browser/server-action-bridge.ts +84 -15
- package/src/browser/transition-when.ts +205 -0
- package/src/browser/types.ts +124 -10
- package/src/build/generate-manifest.ts +77 -1
- package/src/cache/background-task.ts +55 -2
- package/src/cache/cache-exec-scope.ts +48 -1
- package/src/cache/cache-key-utils.ts +62 -2
- package/src/cache/cache-policy.ts +31 -4
- package/src/cache/cache-runtime.ts +209 -129
- package/src/cache/cache-scope.ts +573 -69
- package/src/cache/cache-tag.ts +475 -19
- package/src/cache/cf/cf-base64.ts +36 -4
- package/src/cache/cf/cf-cache-constants.ts +12 -0
- package/src/cache/cf/cf-cache-store.ts +1094 -376
- package/src/cache/cf/cf-cache-types.ts +32 -4
- package/src/cache/cf/cf-shell-frame.ts +258 -0
- package/src/cache/cf/cf-tag-marker-memo.ts +55 -40
- package/src/cache/document-cache.ts +53 -7
- package/src/cache/handle-snapshot.ts +53 -9
- package/src/cache/index.ts +2 -0
- package/src/cache/invalidation-order.ts +84 -0
- package/src/cache/isolate-tag-memo.ts +308 -0
- package/src/cache/request-tag-mask.ts +147 -0
- package/src/cache/shell-memo.ts +341 -0
- package/src/cache/shell-snapshot.ts +249 -277
- package/src/cache/tag-invalidation.ts +109 -18
- package/src/cache/types.ts +274 -102
- package/src/cache/vercel/vercel-cache-store.ts +561 -74
- package/src/client-urls/client-root.tsx +8 -4
- package/src/client-urls/client-urls.ts +8 -6
- package/src/client-urls/navigation.ts +55 -4
- package/src/client-urls/server-projection.ts +31 -10
- package/src/client-urls/types.ts +12 -5
- package/src/client.tsx +2 -0
- package/src/host/cookie-handler.ts +2 -1
- package/src/index.rsc.ts +3 -0
- package/src/index.ts +3 -0
- package/src/loader-redirect.tsx +7 -3
- package/src/prerender/build-shell-capture.ts +173 -110
- package/src/route-definition/dsl-helpers.ts +6 -3
- package/src/route-definition/helpers-types.ts +11 -11
- package/src/route-name.ts +12 -0
- package/src/router/content-negotiation.ts +4 -1
- package/src/router/error-handling.ts +5 -2
- package/src/router/handler-context.ts +42 -5
- package/src/router/instrument.ts +54 -2
- package/src/router/intercept-resolution.ts +30 -8
- package/src/router/loader-resolution.ts +89 -33
- package/src/router/logging.ts +5 -3
- package/src/router/match-api.ts +89 -42
- package/src/router/match-context.ts +5 -0
- package/src/router/match-handlers.ts +14 -29
- package/src/router/match-middleware/background-revalidation.ts +3 -5
- package/src/router/match-middleware/cache-lookup.ts +52 -19
- package/src/router/match-middleware/cache-store.ts +36 -10
- package/src/router/match-result.ts +1 -0
- package/src/router/middleware-types.ts +6 -1
- package/src/router/middleware.ts +20 -4
- package/src/router/navigation-snapshot.ts +6 -5
- package/src/router/prerender-match.ts +10 -0
- package/src/router/request-classification.ts +7 -4
- package/src/router/router-options.ts +4 -1
- package/src/router/segment-resolution/fresh.ts +18 -13
- package/src/router/segment-resolution/helpers.ts +4 -2
- package/src/router/segment-resolution/loader-cache.ts +366 -70
- package/src/router/segment-resolution/loader-mask.ts +3 -4
- package/src/router/segment-resolution/loader-snapshot.ts +215 -126
- package/src/router/segment-resolution/mask-nested.ts +161 -42
- package/src/router/segment-resolution/revalidation.ts +27 -13
- package/src/router/segment-resolution/view-transition-default.ts +6 -21
- package/src/router/telemetry.ts +6 -3
- package/src/router/transition-when.ts +34 -52
- package/src/router.ts +2 -1
- package/src/rsc/attach-transition-when.ts +47 -0
- package/src/rsc/full-payload.ts +47 -3
- package/src/rsc/handler.ts +24 -10
- package/src/rsc/loader-fetch.ts +2 -1
- package/src/rsc/manifest-init.ts +4 -0
- package/src/rsc/origin-guard.ts +8 -5
- package/src/rsc/progressive-enhancement.ts +10 -32
- package/src/rsc/response-cache-serve.ts +69 -78
- package/src/rsc/response-route-handler.ts +2 -2
- package/src/rsc/rsc-rendering.ts +712 -338
- package/src/rsc/server-action.ts +8 -20
- package/src/rsc/shell-build-manifest.ts +49 -29
- package/src/rsc/shell-capture-constants.ts +182 -12
- package/src/rsc/shell-capture.ts +1126 -612
- package/src/rsc/shell-serve.ts +331 -85
- package/src/rsc/ssr-setup.ts +3 -2
- package/src/rsc/types.ts +9 -0
- package/src/segment-system.tsx +40 -7
- package/src/server/context.ts +328 -72
- package/src/server/cookie-store.ts +184 -133
- package/src/server/handle-store.ts +245 -27
- package/src/server/request-context.ts +364 -100
- package/src/server/request-headers.ts +134 -0
- package/src/server.ts +4 -0
- package/src/ssr/index.tsx +96 -37
- package/src/ssr/ssr-root.tsx +9 -8
- package/src/testing/dispatch.ts +4 -7
- package/src/testing/e2e/index.ts +1 -0
- package/src/testing/flight.entry.ts +14 -0
- package/src/testing/index.ts +5 -0
- package/src/testing/internal/action-id.ts +25 -0
- package/src/testing/internal/context.ts +1 -1
- package/src/testing/location-state-key.ts +45 -0
- package/src/testing/render-handler.ts +1 -1
- package/src/testing/render-route.tsx +109 -16
- package/src/testing/run-client-revalidate.ts +3 -19
- package/src/testing/run-loader.ts +67 -5
- package/src/testing/run-transition-when.ts +109 -172
- package/src/testing/serve-shell-request.ts +381 -0
- package/src/testing/shell-status.ts +73 -47
- package/src/theme/ThemeProvider.tsx +7 -6
- package/src/transition-when-ref.ts +220 -0
- package/src/types/cache-types.ts +15 -3
- package/src/types/handler-context.ts +14 -1
- package/src/types/index.ts +3 -0
- package/src/types/segments.ts +94 -91
- package/src/urls/path-helper-types.ts +3 -4
- package/src/urls/pattern-types.ts +21 -18
- package/src/vite/discovery/discover-routers.ts +3 -0
- package/src/vite/discovery/shell-prerender-phase.ts +9 -2
- package/src/vite/discovery/virtual-module-codegen.ts +16 -6
- package/src/vite/plugins/transition-when-hoist.ts +1064 -0
- package/src/vite/rango.ts +2 -0
- package/src/vite/router-discovery.ts +89 -9
- package/dist/types/rsc/transition-gate.d.ts +0 -23
- package/src/rsc/transition-gate.ts +0 -86
|
@@ -1,195 +1,132 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* runTransitionWhen — unit-test a transition({ when }) predicate
|
|
2
|
+
* runTransitionWhen — unit-test a transition({ when }) browser predicate.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* (
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* assembled `whenContext` so tests can assert the exact fields without reaching
|
|
12
|
-
* into private request-context state.
|
|
4
|
+
* Builds the context and evaluates the predicate through the SAME browser
|
|
5
|
+
* functions the router uses at navigation time (browser/transition-when.ts):
|
|
6
|
+
* a throw counts as false and is logged. `from`/`to` take a URL string or a
|
|
7
|
+
* partial RouteLocation; a `state` given as location-state entries
|
|
8
|
+
* (`[Def(value)]`, what Link/push take) is stored the way a push stores it,
|
|
9
|
+
* so `Def.read(ctx.to)` reads it back. Accepts the predicate or a whole
|
|
10
|
+
* TransitionConfig.
|
|
13
11
|
*
|
|
14
|
-
*
|
|
15
|
-
* match -> render pipeline that wires these together only runs under real RSC
|
|
16
|
-
* rendering (which the Flight primitives do not drive), so without this primitive
|
|
17
|
-
* a consumer could not test their predicate through @rangojs/router/testing.
|
|
18
|
-
*
|
|
19
|
-
* Synchronous: a transition predicate returns a boolean and the gate has no I/O.
|
|
12
|
+
* Synchronous: a transition predicate returns a boolean and has no I/O.
|
|
20
13
|
*/
|
|
21
14
|
|
|
22
15
|
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
import {
|
|
28
|
-
|
|
16
|
+
createTransitionWhenContext,
|
|
17
|
+
evaluateTransitionWhen,
|
|
18
|
+
type RouteLocationInput,
|
|
19
|
+
} from "../browser/transition-when.js";
|
|
20
|
+
import {
|
|
21
|
+
buildHistoryState,
|
|
22
|
+
resolveNavigationState,
|
|
23
|
+
} from "../browser/history-state.js";
|
|
24
|
+
import { isLocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
25
|
+
import { resolveTestActionId } from "./internal/action-id.js";
|
|
29
26
|
import type {
|
|
30
|
-
|
|
27
|
+
RouteLocation,
|
|
31
28
|
TransitionConfig,
|
|
32
29
|
TransitionWhenContext,
|
|
30
|
+
TransitionWhenFn,
|
|
31
|
+
TransitionWhenKind,
|
|
33
32
|
} from "../types/segments.js";
|
|
34
|
-
import type { OnErrorCallback } from "../types/error-types.js";
|
|
35
|
-
import type { EntryData } from "../server/context.js";
|
|
36
|
-
import { evaluatePprTransitionWhen } from "../router/transition-when.js";
|
|
37
|
-
import { invokeOnError } from "../router/error-handling.js";
|
|
38
|
-
import { toURL } from "./to-url.js";
|
|
39
33
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
/** Target route name (`toRouteName`). */
|
|
53
|
-
toRouteName?: string;
|
|
54
|
-
/** Environment bindings surfaced as `env` (and `ctx.env`). */
|
|
55
|
-
env?: TEnv;
|
|
56
|
-
/** Variables readable via the predicate's `get()`. With `ppr`, these model pre-handler middleware/input state. */
|
|
57
|
-
vars?: VarsInit;
|
|
58
|
-
/** Navigation SOURCE url (`currentUrl`): a URL or path string. */
|
|
59
|
-
currentUrl?: string | URL;
|
|
60
|
-
/** Source route params (`currentParams`). */
|
|
61
|
-
currentParams?: Record<string, string>;
|
|
62
|
-
/** Source route name (`fromRouteName`). */
|
|
63
|
-
fromRouteName?: string;
|
|
64
|
-
/** Id of the action that triggered a revalidation (`actionId`). */
|
|
65
|
-
actionId?: string;
|
|
66
|
-
/** Url the action was submitted from (`actionUrl`). */
|
|
67
|
-
actionUrl?: string | URL;
|
|
68
|
-
/** The action's return value (`actionResult`). */
|
|
69
|
-
actionResult?: unknown;
|
|
70
|
-
/** FormData from a form action (`formData`). */
|
|
34
|
+
type ImportedAction = (...args: never[]) => unknown;
|
|
35
|
+
|
|
36
|
+
/** A navigation side: a URL, or a partial RouteLocation. */
|
|
37
|
+
export type RunTransitionWhenLocation =
|
|
38
|
+
| string
|
|
39
|
+
| URL
|
|
40
|
+
| (Partial<Omit<RouteLocation, "url">> & { url?: string | URL });
|
|
41
|
+
|
|
42
|
+
/** The action fields of a `kind: "action"` context. */
|
|
43
|
+
export interface RunTransitionWhenAction {
|
|
44
|
+
/** The triggering action: an imported server action or its actionId. */
|
|
45
|
+
ref?: ImportedAction | string;
|
|
71
46
|
formData?: FormData;
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
|
|
47
|
+
/** The action's return value on success. */
|
|
48
|
+
result?: unknown;
|
|
49
|
+
/** What a failed action threw (the error lane). */
|
|
50
|
+
error?: unknown;
|
|
76
51
|
}
|
|
77
52
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
dropped: boolean;
|
|
53
|
+
export interface RunTransitionWhenOptions {
|
|
54
|
+
/** Defaults to `"action"` when `action` is given, `"push"` otherwise. */
|
|
55
|
+
kind?: TransitionWhenKind;
|
|
56
|
+
/** The committed location being left. Defaults to `http://localhost/`. */
|
|
57
|
+
from?: RunTransitionWhenLocation;
|
|
58
|
+
/** The destination. Defaults to `from`; always `from` for "action" and "revalidate". */
|
|
59
|
+
to?: RunTransitionWhenLocation;
|
|
86
60
|
/**
|
|
87
|
-
* The
|
|
88
|
-
*
|
|
61
|
+
* The triggering action (like runClientRevalidate's): an imported server
|
|
62
|
+
* action (id via `$id ?? $$id`), an actionId string, or
|
|
63
|
+
* `{ ref, formData, result, error }`.
|
|
89
64
|
*/
|
|
90
|
-
|
|
91
|
-
/** The underlying RequestContext, for additional assertions (`ctx.get(...)`, etc.). */
|
|
92
|
-
ctx: RequestContext<TEnv>;
|
|
65
|
+
action?: ImportedAction | string | RunTransitionWhenAction;
|
|
93
66
|
}
|
|
94
67
|
|
|
95
|
-
export
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
params: opts.params,
|
|
104
|
-
});
|
|
105
|
-
const reqCtx = ctx as unknown as RequestContext<TEnv>;
|
|
68
|
+
export interface RunTransitionWhenResult {
|
|
69
|
+
/** True when the navigation holds (the predicate did not return false or throw, or there is none). */
|
|
70
|
+
applied: boolean;
|
|
71
|
+
/** Inverse of `applied`. */
|
|
72
|
+
gatedOff: boolean;
|
|
73
|
+
/** The context the predicate received. */
|
|
74
|
+
context: TransitionWhenContext;
|
|
75
|
+
}
|
|
106
76
|
|
|
107
|
-
|
|
108
|
-
if (opts.toRouteName !== undefined)
|
|
109
|
-
reqCtx.routeName = opts.toRouteName as RequestContext<TEnv>["routeName"];
|
|
110
|
-
// Source (match-time) data the gate reads for currentUrl/currentParams/fromRouteName.
|
|
111
|
-
if (opts.currentUrl !== undefined)
|
|
112
|
-
reqCtx._gateCurrentUrl = toURL(opts.currentUrl, reqCtx.url);
|
|
113
|
-
if (opts.currentParams !== undefined)
|
|
114
|
-
reqCtx._gateCurrentParams = opts.currentParams;
|
|
115
|
-
if (opts.fromRouteName !== undefined)
|
|
116
|
-
reqCtx._prevRouteKey = opts.fromRouteName;
|
|
117
|
-
// Action data the gate reads at the action-bearing call sites.
|
|
118
|
-
if (opts.actionId !== undefined) reqCtx._gateActionId = opts.actionId;
|
|
119
|
-
if (opts.actionUrl !== undefined)
|
|
120
|
-
reqCtx._gateActionUrl = toURL(opts.actionUrl, reqCtx.url);
|
|
121
|
-
if (opts.actionResult !== undefined)
|
|
122
|
-
reqCtx._gateActionResult = opts.actionResult;
|
|
123
|
-
if (opts.formData !== undefined) reqCtx._gateFormData = opts.formData;
|
|
77
|
+
const DEFAULT_URL = "http://localhost/";
|
|
124
78
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
79
|
+
function toStoredState(state: unknown): unknown {
|
|
80
|
+
if (
|
|
81
|
+
Array.isArray(state) &&
|
|
82
|
+
state.length > 0 &&
|
|
83
|
+
isLocationStateEntry(state[0])
|
|
84
|
+
) {
|
|
85
|
+
return buildHistoryState(resolveNavigationState(state));
|
|
86
|
+
}
|
|
87
|
+
return state;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function toLocation(
|
|
91
|
+
value: RunTransitionWhenLocation | undefined,
|
|
92
|
+
fallback: string | URL,
|
|
93
|
+
): RouteLocationInput {
|
|
94
|
+
if (value === undefined) return { url: fallback };
|
|
95
|
+
if (typeof value === "string" || value instanceof URL) return { url: value };
|
|
96
|
+
return {
|
|
97
|
+
url: value.url ?? fallback,
|
|
98
|
+
params: value.params,
|
|
99
|
+
routeName: value.routeName,
|
|
100
|
+
state: toStoredState(value.state),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
141
103
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
params: reqCtx.params,
|
|
166
|
-
segmentId,
|
|
167
|
-
},
|
|
168
|
-
"RSC",
|
|
169
|
-
),
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
// Ordinary predicates are collected here and evaluated by the gate. PPR
|
|
173
|
-
// predicates keep the decision already evaluated before this step.
|
|
174
|
-
const serialized = applyViewTransitionDefault(
|
|
175
|
-
configForGate,
|
|
176
|
-
undefined,
|
|
177
|
-
"tx-when-seg",
|
|
178
|
-
);
|
|
179
|
-
const segment = {
|
|
180
|
-
id: "tx-when-seg",
|
|
181
|
-
namespace: "r",
|
|
182
|
-
type: "route",
|
|
183
|
-
index: 0,
|
|
184
|
-
component: null,
|
|
185
|
-
transition: serialized,
|
|
186
|
-
} as ResolvedSegment;
|
|
187
|
-
const [gatedSegment] = gateTransitions(
|
|
188
|
-
[segment],
|
|
189
|
-
reqCtx as Parameters<typeof gateTransitions>[1],
|
|
190
|
-
opts.onError,
|
|
191
|
-
);
|
|
192
|
-
const kept = gatedSegment.transition !== undefined;
|
|
193
|
-
return { kept, dropped: !kept, whenContext, ctx: reqCtx };
|
|
104
|
+
export function runTransitionWhen(
|
|
105
|
+
whenOrConfig: TransitionWhenFn | TransitionConfig,
|
|
106
|
+
opts: RunTransitionWhenOptions = {},
|
|
107
|
+
): RunTransitionWhenResult {
|
|
108
|
+
const actionOption =
|
|
109
|
+
typeof opts.action === "function" || typeof opts.action === "string"
|
|
110
|
+
? { ref: opts.action }
|
|
111
|
+
: opts.action;
|
|
112
|
+
const from = toLocation(opts.from, DEFAULT_URL);
|
|
113
|
+
const context = createTransitionWhenContext({
|
|
114
|
+
kind: opts.kind ?? (actionOption ? "action" : "push"),
|
|
115
|
+
from,
|
|
116
|
+
to: opts.to === undefined ? undefined : toLocation(opts.to, from.url),
|
|
117
|
+
...(actionOption
|
|
118
|
+
? {
|
|
119
|
+
action: {
|
|
120
|
+
id: resolveTestActionId(actionOption.ref, "runTransitionWhen"),
|
|
121
|
+
formData: actionOption.formData,
|
|
122
|
+
result: actionOption.result,
|
|
123
|
+
error: actionOption.error,
|
|
124
|
+
},
|
|
125
|
+
}
|
|
126
|
+
: {}),
|
|
194
127
|
});
|
|
128
|
+
const when =
|
|
129
|
+
typeof whenOrConfig === "function" ? whenOrConfig : whenOrConfig.when;
|
|
130
|
+
const applied = when ? evaluateTransitionWhen(when, context) : true;
|
|
131
|
+
return { applied, gatedOff: !applied, context };
|
|
195
132
|
}
|