@rangojs/router 0.24.3 → 0.25.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 +1 -0
- package/dist/bin/rango.js +363 -39
- package/dist/testing/vitest.js +37 -4
- package/dist/types/browser/event-controller.d.ts +24 -5
- package/dist/types/browser/intercept-utils.d.ts +5 -2
- package/dist/types/browser/merge-segment-loaders.d.ts +0 -23
- package/dist/types/browser/navigation-transaction.d.ts +5 -5
- package/dist/types/browser/partial-update.d.ts +21 -13
- package/dist/types/browser/prefetch/cache.d.ts +8 -0
- package/dist/types/browser/rango-marker.d.ts +7 -0
- package/dist/types/browser/react/filter-segment-order.d.ts +10 -0
- package/dist/types/browser/react/use-handle.d.ts +20 -0
- package/dist/types/browser/react/use-href.d.ts +6 -0
- package/dist/types/browser/react/use-router.d.ts +6 -1
- package/dist/types/browser/response-adapter.d.ts +5 -3
- package/dist/types/browser/scroll-restoration.d.ts +9 -3
- package/dist/types/browser/segment-reconciler.d.ts +10 -13
- package/dist/types/browser/types.d.ts +38 -8
- package/dist/types/build/route-types/per-module-writer.d.ts +12 -0
- package/dist/types/cache/cf/cf-shell-frame.d.ts +2 -0
- package/dist/types/cache/types.d.ts +8 -0
- package/dist/types/client-urls/client-root.d.ts +4 -1
- package/dist/types/client-urls/client-urls.d.ts +28 -2
- package/dist/types/client-urls/navigation.d.ts +6 -8
- package/dist/types/client-urls/revalidate-registry.d.ts +1 -1
- package/dist/types/client-urls/server-projection.d.ts +20 -5
- package/dist/types/client-urls/types.d.ts +35 -17
- package/dist/types/client.d.ts +2 -2
- package/dist/types/client.rsc.d.ts +2 -2
- package/dist/types/decode-loader-results.d.ts +28 -7
- package/dist/types/href-client.d.ts +3 -1
- package/dist/types/index.rsc.d.ts +1 -1
- package/dist/types/loader-redirect.d.ts +2 -3
- package/dist/types/outlet-context.d.ts +7 -6
- package/dist/types/prefetch-markers.d.ts +14 -5
- package/dist/types/route-content-wrapper.d.ts +17 -14
- package/dist/types/route-definition/helpers-types.d.ts +7 -2
- package/dist/types/route-definition/resolve-handler-use.d.ts +6 -1
- package/dist/types/route-definition/rewrite.d.ts +48 -5
- package/dist/types/route-types.d.ts +2 -2
- package/dist/types/router/handler-context.d.ts +14 -2
- package/dist/types/router/intercept-resolution.d.ts +19 -46
- package/dist/types/router/lazy-includes.d.ts +7 -0
- package/dist/types/router/match-middleware/intercept-resolution.d.ts +2 -2
- package/dist/types/router/middleware.d.ts +0 -16
- package/dist/types/router/navigation-snapshot.d.ts +2 -0
- package/dist/types/router/prefetch-cache-ttl.d.ts +8 -11
- package/dist/types/router/revalidation.d.ts +8 -1
- package/dist/types/router/router-context.d.ts +4 -16
- package/dist/types/router/router-interfaces.d.ts +0 -6
- package/dist/types/router/router-options.d.ts +4 -7
- package/dist/types/router/segment-resolution/prefetch-deferral.d.ts +31 -8
- package/dist/types/router/segment-resolution/revalidation.d.ts +38 -4
- package/dist/types/router/segment-resolution.d.ts +1 -1
- package/dist/types/router/segment-wrappers.d.ts +3 -5
- package/dist/types/router/substitute-pattern-params.d.ts +19 -2
- package/dist/types/router/tracing.d.ts +2 -2
- package/dist/types/rsc/full-payload.d.ts +14 -2
- package/dist/types/rsc/helpers.d.ts +8 -0
- package/dist/types/rsc/manifest-init.d.ts +20 -0
- package/dist/types/rsc/prefetch-render-error.d.ts +22 -0
- package/dist/types/rsc/progressive-enhancement.d.ts +20 -0
- package/dist/types/rsc/rewrite-passes.d.ts +12 -2
- package/dist/types/rsc/server-action.d.ts +6 -0
- package/dist/types/rsc/shell-capture-constants.d.ts +10 -1
- package/dist/types/rsc/shell-capture.d.ts +7 -0
- package/dist/types/rsc/types.d.ts +5 -0
- package/dist/types/segment-system.d.ts +15 -0
- package/dist/types/server/context.d.ts +64 -4
- package/dist/types/server/request-context.d.ts +41 -4
- package/dist/types/server/request-headers.d.ts +12 -0
- package/dist/types/server/rewrite-trail.d.ts +8 -1
- package/dist/types/testing/e2e/index.d.ts +1 -1
- package/dist/types/testing/flight.entry.d.ts +1 -1
- package/dist/types/testing/index.d.ts +1 -1
- package/dist/types/testing/internal/client-urls-projection.d.ts +4 -3
- package/dist/types/testing/render-route.d.ts +21 -11
- package/dist/types/testing/run-loader.d.ts +7 -0
- package/dist/types/testing/run-middleware.d.ts +7 -0
- package/dist/types/testing/run-revalidate.d.ts +5 -4
- package/dist/types/testing/serve-shell-request.d.ts +41 -4
- package/dist/types/testing/shell-status.d.ts +17 -0
- package/dist/types/testing/vitest-stubs/version.d.ts +1 -0
- package/dist/types/testing/vitest.d.ts +10 -1
- package/dist/types/thenable-status.d.ts +0 -6
- package/dist/types/types/handler-context.d.ts +12 -1
- package/dist/types/types/loader-types.d.ts +4 -3
- package/dist/types/types/route-entry.d.ts +2 -1
- package/dist/types/urls/path-helper-types.d.ts +4 -2
- package/dist/types/urls/path-helper.d.ts +5 -0
- package/dist/types/vite/discovery/client-urls-projection.d.ts +55 -5
- package/dist/types/vite/discovery/state.d.ts +20 -0
- package/dist/types/vite/plugins/client-urls-revalidate-hoist.d.ts +28 -16
- package/dist/types/vite/plugins/hoist/source.d.ts +8 -7
- package/dist/types/vite/plugins/virtual-entries.d.ts +6 -0
- package/dist/types/vite/utils/prerender-utils.d.ts +7 -0
- package/dist/vite/index.js +6816 -6547
- package/package.json +1 -1
- package/skills/app-structure/SKILL.md +255 -0
- package/skills/app-structure/content-site.md +333 -0
- package/skills/app-structure/e-commerce.md +435 -0
- package/skills/app-structure/large-app.md +885 -0
- package/skills/app-structure/multi-app.md +280 -0
- package/skills/breadcrumbs/SKILL.md +6 -1
- package/skills/caching/SKILL.md +3 -1
- package/skills/catalog.json +12 -0
- package/skills/client-urls/SKILL.md +195 -32
- package/skills/composability/SKILL.md +10 -8
- package/skills/handler-use/SKILL.md +48 -9
- package/skills/hooks/handle-and-actions.md +104 -0
- package/skills/hooks/navigation.md +24 -10
- package/skills/hooks/urls.md +1 -1
- package/skills/i18n/SKILL.md +2 -1
- package/skills/intercept/SKILL.md +60 -29
- package/skills/layout/SKILL.md +6 -3
- package/skills/links/SKILL.md +151 -17
- package/skills/loader/SKILL.md +32 -10
- package/skills/middleware/SKILL.md +111 -15
- package/skills/observability/SKILL.md +11 -0
- package/skills/parallel/SKILL.md +5 -5
- package/skills/ppr/SKILL.md +43 -8
- package/skills/prerender/SKILL.md +1 -2
- package/skills/rango/SKILL.md +3 -0
- package/skills/response-routes/SKILL.md +4 -1
- package/skills/scripts/SKILL.md +12 -1
- package/skills/server-actions/SKILL.md +60 -20
- package/skills/testing/SKILL.md +1 -0
- package/skills/testing/client-components.md +13 -10
- package/skills/testing/loader.md +25 -24
- package/skills/testing/middleware.md +11 -11
- package/skills/testing/response-routes.md +4 -1
- package/skills/testing/serve-shell-request.md +85 -21
- package/skills/ux-architecture/SKILL.md +980 -0
- package/skills/view-transitions/SKILL.md +43 -10
- package/src/__augment-tests__/augmented.check.ts +28 -0
- package/src/browser/event-controller.ts +44 -18
- package/src/browser/intercept-utils.ts +3 -2
- package/src/browser/merge-segment-loaders.ts +0 -85
- package/src/browser/navigation-bridge.ts +119 -98
- package/src/browser/navigation-client.ts +20 -15
- package/src/browser/navigation-store.ts +4 -2
- package/src/browser/navigation-transaction.ts +9 -8
- package/src/browser/partial-update.ts +90 -32
- package/src/browser/prefetch/cache.ts +8 -0
- package/src/browser/prefetch/fetch.ts +13 -3
- package/src/browser/rango-marker.ts +13 -0
- package/src/browser/react/NavigationProvider.tsx +25 -7
- package/src/browser/react/filter-segment-order.ts +13 -0
- package/src/browser/react/use-action.ts +9 -15
- package/src/browser/react/use-handle.ts +63 -71
- package/src/browser/react/use-href.tsx +24 -5
- package/src/browser/react/use-link-status.ts +1 -1
- package/src/browser/react/use-navigation.ts +30 -40
- package/src/browser/react/use-reverse.ts +4 -17
- package/src/browser/react/use-router.ts +37 -6
- package/src/browser/react/use-segments.ts +8 -12
- package/src/browser/response-adapter.ts +11 -5
- package/src/browser/rsc-router.tsx +3 -1
- package/src/browser/scroll-restoration.ts +34 -20
- package/src/browser/segment-reconciler.ts +11 -29
- package/src/browser/server-action-bridge.ts +52 -16
- package/src/browser/types.ts +40 -8
- package/src/build/generate-manifest.ts +12 -1
- package/src/build/route-types/codegen.ts +6 -2
- package/src/build/route-types/per-module-writer.ts +94 -61
- package/src/cache/cache-runtime.ts +9 -0
- package/src/cache/cache-scope.ts +2 -1
- package/src/cache/cf/cf-cache-store.ts +2 -0
- package/src/cache/cf/cf-shell-frame.ts +3 -0
- package/src/cache/types.ts +8 -0
- package/src/cache/vercel/vercel-cache-store.ts +6 -1
- package/src/client-urls/client-root.tsx +10 -5
- package/src/client-urls/client-urls.ts +246 -166
- package/src/client-urls/navigation.ts +45 -38
- package/src/client-urls/revalidate-registry.ts +12 -3
- package/src/client-urls/server-projection.ts +286 -75
- package/src/client-urls/types.ts +40 -16
- package/src/client.rsc.tsx +11 -1
- package/src/client.tsx +9 -1
- package/src/decode-loader-results.ts +64 -31
- package/src/href-client.ts +3 -1
- package/src/index.rsc.ts +1 -0
- package/src/index.ts +12 -4
- package/src/loader-redirect.tsx +2 -3
- package/src/outlet-context.ts +7 -6
- package/src/prefetch-markers.ts +15 -5
- package/src/reverse.ts +3 -3
- package/src/route-content-wrapper.tsx +19 -17
- package/src/route-definition/dsl-helpers.ts +27 -7
- package/src/route-definition/helpers-types.ts +7 -2
- package/src/route-definition/resolve-handler-use.ts +23 -10
- package/src/route-definition/rewrite.ts +86 -19
- package/src/route-types.ts +1 -2
- package/src/router/find-match.ts +37 -1
- package/src/router/handler-context.ts +85 -40
- package/src/router/intercept-resolution.ts +161 -307
- package/src/router/lazy-includes.ts +43 -27
- package/src/router/loader-resolution.ts +21 -1
- package/src/router/manifest.ts +6 -8
- package/src/router/match-api.ts +11 -1
- package/src/router/match-middleware/background-revalidation.ts +2 -4
- package/src/router/match-middleware/cache-lookup.ts +16 -20
- package/src/router/match-middleware/intercept-resolution.ts +41 -60
- package/src/router/match-result.ts +31 -2
- package/src/router/middleware.ts +6 -147
- package/src/router/navigation-snapshot.ts +38 -2
- package/src/router/prefetch-cache-ttl.ts +10 -18
- package/src/router/prerender-match.ts +2 -1
- package/src/router/revalidation.ts +24 -3
- package/src/router/router-context.ts +5 -18
- package/src/router/router-interfaces.ts +0 -7
- package/src/router/router-options.ts +4 -7
- package/src/router/segment-resolution/fresh.ts +6 -2
- package/src/router/segment-resolution/helpers.ts +7 -1
- package/src/router/segment-resolution/prefetch-deferral.ts +62 -12
- package/src/router/segment-resolution/revalidation.ts +75 -35
- package/src/router/segment-resolution.ts +0 -1
- package/src/router/segment-wrappers.ts +8 -13
- package/src/router/substitute-pattern-params.ts +37 -2
- package/src/router/tracing.ts +2 -2
- package/src/router.ts +2 -9
- package/src/rsc/full-payload.ts +26 -4
- package/src/rsc/handler.ts +83 -41
- package/src/rsc/helpers.ts +13 -0
- package/src/rsc/manifest-init.ts +56 -3
- package/src/rsc/prefetch-render-error.ts +38 -0
- package/src/rsc/progressive-enhancement.ts +161 -211
- package/src/rsc/rewrite-passes.ts +56 -9
- package/src/rsc/rsc-rendering.ts +79 -23
- package/src/rsc/server-action.ts +25 -2
- package/src/rsc/shell-capture-constants.ts +22 -0
- package/src/rsc/shell-capture.ts +11 -0
- package/src/rsc/types.ts +5 -0
- package/src/segment-system.tsx +125 -119
- package/src/server/context.ts +96 -5
- package/src/server/handle-store.ts +3 -2
- package/src/server/request-context.ts +42 -3
- package/src/server/request-headers.ts +32 -0
- package/src/server/rewrite-trail.ts +55 -9
- package/src/ssr/ssr-root.tsx +6 -10
- package/src/testing/dispatch.ts +4 -5
- package/src/testing/e2e/index.ts +1 -0
- package/src/testing/flight.entry.ts +1 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/internal/client-urls-projection.ts +31 -11
- package/src/testing/render-route.tsx +83 -40
- package/src/testing/run-loader.ts +26 -2
- package/src/testing/run-middleware.ts +10 -0
- package/src/testing/run-revalidate.ts +13 -6
- package/src/testing/serve-shell-request.ts +77 -4
- package/src/testing/shell-status.ts +40 -0
- package/src/testing/vitest-stubs/version.ts +1 -0
- package/src/testing/vitest.ts +74 -7
- package/src/thenable-status.ts +0 -11
- package/src/types/handler-context.ts +12 -1
- package/src/types/loader-types.ts +4 -3
- package/src/types/route-entry.ts +2 -1
- package/src/urls/include-helper.ts +38 -11
- package/src/urls/path-helper-types.ts +4 -2
- package/src/urls/path-helper.ts +16 -3
- package/src/vite/discovery/client-urls-projection.ts +205 -16
- package/src/vite/discovery/discover-routers.ts +2 -2
- package/src/vite/discovery/prerender-collection.ts +2 -6
- package/src/vite/discovery/state.ts +26 -0
- package/src/vite/plugins/client-urls-revalidate-hoist.ts +190 -77
- package/src/vite/plugins/expose-internal-ids.ts +46 -40
- package/src/vite/plugins/hoist/source.ts +8 -7
- package/src/vite/plugins/transition-when-hoist.ts +1 -0
- package/src/vite/plugins/version-plugin.ts +7 -0
- package/src/vite/plugins/version.d.ts +7 -0
- package/src/vite/plugins/virtual-entries.ts +20 -0
- package/src/vite/rango.ts +4 -1
- package/src/vite/router-discovery.ts +39 -7
- package/src/vite/utils/prerender-utils.ts +17 -0
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { type ReactNode, type ComponentType } from "react";
|
|
2
2
|
import type { ResolvedSegment, RootLayoutProps } from "./types.js";
|
|
3
3
|
export declare function restoreParallelLoaderMarkers(segments: ResolvedSegment[]): ResolvedSegment[];
|
|
4
|
+
/**
|
|
5
|
+
* An intercept's loaders arrive as loader segments of its slot
|
|
6
|
+
* (`${slot.id}D${i}.${$$id}`, router/intercept-resolution.ts). Folded back
|
|
7
|
+
* onto the slot before the tree walk, as one aggregate the slot's
|
|
8
|
+
* LoaderBoundary reads (client.tsx renderSlotContent): walked as loaders they
|
|
9
|
+
* would attach to the slot's parent, whose subtree (the page under the modal)
|
|
10
|
+
* would change shape and remount. Any other loader segment passes through; a
|
|
11
|
+
* list with nothing to fold is returned as it is, synchronously.
|
|
12
|
+
* The slot is a new object (rule 6, suspense-contract.md); its aggregate is
|
|
13
|
+
* memoized on the loaders' data (rule 1). Settled before the commit when
|
|
14
|
+
* nothing in it is deferred and the slot has no loading() or the lane settles
|
|
15
|
+
* loaders (forceAwait, action): a modal with no loading() commits whole, as
|
|
16
|
+
* when the server awaited its loaders.
|
|
17
|
+
*/
|
|
18
|
+
export declare function foldInterceptLoaders(segments: ResolvedSegment[], settleLoaders: boolean): ResolvedSegment[] | Promise<ResolvedSegment[]>;
|
|
4
19
|
/**
|
|
5
20
|
* Options for renderSegments
|
|
6
21
|
*/
|
|
@@ -61,6 +61,12 @@ export type EntryPropCommon = {
|
|
|
61
61
|
cache?: EntryCacheConfig;
|
|
62
62
|
/** URL prefix from include() scope, used for MountContext on client */
|
|
63
63
|
mountPath?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Include scope the entry's handler and loaders resolve `ctx.reverse(".name")`
|
|
66
|
+
* in. Structural entries only (layout, cache, parallel, wrapping
|
|
67
|
+
* middleware); a route resolves from its own name. See ReverseScope.
|
|
68
|
+
*/
|
|
69
|
+
reverseScope?: ReverseScope;
|
|
64
70
|
/** clientUrls() group key (PathOptions.clientGroup); route entries only. */
|
|
65
71
|
clientGroup?: string;
|
|
66
72
|
};
|
|
@@ -129,6 +135,13 @@ export type LoaderEntry = {
|
|
|
129
135
|
* (router/segment-resolution/prefetch-deferral.ts).
|
|
130
136
|
*/
|
|
131
137
|
prefetch?: false;
|
|
138
|
+
/**
|
|
139
|
+
* The declaring layout's / parallel's / cache()'s include scope, for the
|
|
140
|
+
* loader body's `ctx.reverse(".name")` (its DSL kickoff carries it,
|
|
141
|
+
* runInsideLoaderScope). Unset on a route's loaders: they resolve from the
|
|
142
|
+
* route's name.
|
|
143
|
+
*/
|
|
144
|
+
reverseScope?: ReverseScope;
|
|
132
145
|
};
|
|
133
146
|
/**
|
|
134
147
|
* Segments state for intercept context
|
|
@@ -192,7 +205,6 @@ export type InterceptEntry = {
|
|
|
192
205
|
slotName: `@${string}`;
|
|
193
206
|
routeName: string;
|
|
194
207
|
handler: ReactNode | Handler<any, any, any>;
|
|
195
|
-
middleware: MiddlewareFn<any, any>[];
|
|
196
208
|
loader: LoaderEntry[];
|
|
197
209
|
loading?: ReactNode | false;
|
|
198
210
|
transition?: TransitionConfig;
|
|
@@ -267,10 +279,21 @@ export type EntryData = ({
|
|
|
267
279
|
/** Cache entries create cache boundaries and render like layouts (with Outlet) */
|
|
268
280
|
handler: ReactNode | Handler<any, any, any>;
|
|
269
281
|
} & EntryPropCommon & EntryPropDatas & EntryPropSegments & EntryPropRender);
|
|
282
|
+
/**
|
|
283
|
+
* Where an include()'s handler runs in the route tree. Hidden include-scope
|
|
284
|
+
* names (`$prefix_*`) derive from it, never from counter state, so build
|
|
285
|
+
* discovery and runtime expansion name every include the same (#1104).
|
|
286
|
+
*/
|
|
287
|
+
export interface IncludeScopePosition {
|
|
288
|
+
/** Sibling indexes of the enclosing includes, "_"-joined ("" at a mount root). */
|
|
289
|
+
scopePath?: string;
|
|
290
|
+
/** The scopePath tail since the nearest include that added a name segment. */
|
|
291
|
+
hiddenScopePath?: string;
|
|
292
|
+
}
|
|
270
293
|
/**
|
|
271
294
|
* Tracked include info for build-time manifest generation
|
|
272
295
|
*/
|
|
273
|
-
export interface TrackedInclude {
|
|
296
|
+
export interface TrackedInclude extends IncludeScopePosition {
|
|
274
297
|
prefix: string;
|
|
275
298
|
fullPrefix: string;
|
|
276
299
|
namePrefix?: string;
|
|
@@ -290,7 +313,7 @@ export type CachedHeaderScope = {
|
|
|
290
313
|
/**
|
|
291
314
|
* Context stored in AsyncLocalStorage
|
|
292
315
|
*/
|
|
293
|
-
interface HelperContext {
|
|
316
|
+
interface HelperContext extends IncludeScopePosition {
|
|
294
317
|
manifest: Map<string, EntryData>;
|
|
295
318
|
namespace: string;
|
|
296
319
|
parent: EntryData | null;
|
|
@@ -399,6 +422,37 @@ export declare function getNamePrefix(): string | undefined;
|
|
|
399
422
|
* Returns true at root or inside { name: "" } includes, false inside named includes.
|
|
400
423
|
*/
|
|
401
424
|
export declare function getRootScoped(): boolean;
|
|
425
|
+
/**
|
|
426
|
+
* The include scope a segment's dot-local `ctx.reverse(".name")` resolves in.
|
|
427
|
+
*
|
|
428
|
+
* One handler ctx serves every segment of a request and is built from the
|
|
429
|
+
* matched route's name (match-api.ts), so a parent module's layout resolved
|
|
430
|
+
* `.settings` from the matched CHILD module's prefix first: on
|
|
431
|
+
* `/acme/web/issues` the account layout's `.settings` hit the project
|
|
432
|
+
* module's route. Structural entries (layout, cache, parallel, wrapping
|
|
433
|
+
* middleware) and the loaders they declare capture the scope where the DSL
|
|
434
|
+
* defined them. Their handler gets a ctx whose `reverse` carries it
|
|
435
|
+
* (withReverseScope, router/handler-context.ts), and their loaders' DSL
|
|
436
|
+
* kickoff carries it in the loader scope (runInsideLoaderScope) for the
|
|
437
|
+
* loader ctx the executor builds. Global names and mount-param autofill do
|
|
438
|
+
* not change.
|
|
439
|
+
*/
|
|
440
|
+
export interface ReverseScope {
|
|
441
|
+
/** Include name prefix ("account.project"); undefined outside named includes. */
|
|
442
|
+
readonly prefix: string | undefined;
|
|
443
|
+
/** getRootScoped() where the segment was defined: bare-name fallback allowed. */
|
|
444
|
+
readonly rootScoped: boolean;
|
|
445
|
+
}
|
|
446
|
+
/** The ReverseScope of the DSL position being evaluated. */
|
|
447
|
+
export declare function getReverseScope(): ReverseScope;
|
|
448
|
+
/**
|
|
449
|
+
* A createReverseFunction result (router/handler-context.ts). The internal
|
|
450
|
+
* 4th argument resolves dot names in a segment's ReverseScope instead of the
|
|
451
|
+
* route's name.
|
|
452
|
+
*/
|
|
453
|
+
export type ScopableReverse = (name: string, hrefParams?: Record<string, string>, search?: Record<string, unknown>, segmentScope?: ReverseScope) => string;
|
|
454
|
+
/** `reverse` with dot names resolved in `scope`, if any. */
|
|
455
|
+
export declare function scopeReverse(reverse: ScopableReverse, scope: ReverseScope | undefined): ScopableReverse;
|
|
402
456
|
/**
|
|
403
457
|
* Stamp build-time scope identity onto a Static() definition at mount time.
|
|
404
458
|
* The bake collector (prerender-collection.ts) renders defs OUTSIDE any
|
|
@@ -689,7 +743,13 @@ export declare function assertCachedHeaderWriteAllowed(surface: string, surfaceP
|
|
|
689
743
|
* are bypassed because loaders are always fresh (never cached) and
|
|
690
744
|
* their side effects (setCookie, header, etc.) are safe.
|
|
691
745
|
*/
|
|
692
|
-
export declare function runInsideLoaderScope<T>(fn: () => T, loaderId?: string): T;
|
|
746
|
+
export declare function runInsideLoaderScope<T>(fn: () => T, loaderId?: string, reverseScope?: ReverseScope): T;
|
|
747
|
+
/**
|
|
748
|
+
* The ReverseScope of the DSL loader kickoff around this call: a loader the
|
|
749
|
+
* kickoff starts, and one its body starts with ctx.use(), resolve dot names
|
|
750
|
+
* in it. A handler's ctx.use(Loader) runs outside any kickoff: none.
|
|
751
|
+
*/
|
|
752
|
+
export declare function getLoaderReverseScope(): ReverseScope | undefined;
|
|
693
753
|
/**
|
|
694
754
|
* The loader whose run a handle push here belongs to, for the browser's
|
|
695
755
|
* merge of a partial response (handles/pushed-by.ts): the DSL loader
|
|
@@ -13,7 +13,7 @@ import { parseCookiesFromHeader } from "./cookie-parse.js";
|
|
|
13
13
|
import type { CacheErrorCategory } from "../cache/cache-error.js";
|
|
14
14
|
import type { CookieOptions } from "../router/middleware.js";
|
|
15
15
|
import type { LoaderDefinition } from "../types.js";
|
|
16
|
-
import type {
|
|
16
|
+
import type { AutofillAwareReverseFunction } from "../types/handler-context.js";
|
|
17
17
|
import type { DefaultEnv, DefaultReverseRouteMap, DefaultRouteName } from "../types/global-namespace.js";
|
|
18
18
|
import type { Handle } from "../handle.js";
|
|
19
19
|
import { type ContextVar } from "../context-var.js";
|
|
@@ -28,6 +28,8 @@ import type { ResolvedTracing } from "../router/tracing.js";
|
|
|
28
28
|
import type { RenderMode, RenderPhase } from "../router/timeout.js";
|
|
29
29
|
import type { LocationStateEntry } from "../browser/react/location-state-shared.js";
|
|
30
30
|
import type { RoutineTrace } from "../rsc/routine-plan.js";
|
|
31
|
+
import type { ActionContinuation } from "../rsc/server-action.js";
|
|
32
|
+
import type { FormActionOutcome } from "../rsc/progressive-enhancement.js";
|
|
31
33
|
import { type ExecutionStart } from "../cache/invalidation-order.js";
|
|
32
34
|
export interface RenderForegroundCursor {
|
|
33
35
|
mode: RenderMode;
|
|
@@ -243,6 +245,12 @@ export interface RequestContext<TEnv = DefaultEnv, TParams = Record<string, stri
|
|
|
243
245
|
* locally and passes it to scheduleShellCapture directly.
|
|
244
246
|
*/
|
|
245
247
|
_shellCaptureRun?: boolean;
|
|
248
|
+
/**
|
|
249
|
+
* @internal Set beside `_shellCaptureRun` when the shell is keyed by the
|
|
250
|
+
* visitor's URL (`rewrite(...).shell("visitor")`): the capture renders the
|
|
251
|
+
* visitor's location and `ctx.rewrittenFrom`; the theme stays the default.
|
|
252
|
+
*/
|
|
253
|
+
_shellCaptureForVisitor?: boolean;
|
|
246
254
|
/**
|
|
247
255
|
* @internal Bake-lane loader containers collected DURING a shell capture:
|
|
248
256
|
* segment-key -> the loader's (pre-wrap) result promise. Populated by
|
|
@@ -635,12 +643,25 @@ export interface RequestContext<TEnv = DefaultEnv, TParams = Record<string, stri
|
|
|
635
643
|
* Generate URLs from route names.
|
|
636
644
|
* Uses the global route map. After route matching, scoped (`.name`) resolution
|
|
637
645
|
* works within the matched include() scope.
|
|
638
|
-
|
|
639
|
-
|
|
646
|
+
*
|
|
647
|
+
* Params are optional in the type because the fill depends on the phase.
|
|
648
|
+
* After the route match (route middleware, handlers, loaders, server actions)
|
|
649
|
+
* missing params come from the matched route's params; explicit params win.
|
|
650
|
+
* In global middleware before `next()` nothing is matched and the fill is
|
|
651
|
+
* empty, so a route with a required param throws `Missing param "<name>" for
|
|
652
|
+
* route "<route>"` at runtime (a param-less route still resolves).
|
|
653
|
+
*/
|
|
654
|
+
reverse: AutofillAwareReverseFunction<Record<string, string>, DefaultReverseRouteMap>;
|
|
640
655
|
/** @internal Route name from route matching, used for scoped reverse resolution */
|
|
641
656
|
_routeName?: string;
|
|
642
657
|
/** @internal Previous route key (from the navigation source), used for revalidation */
|
|
643
658
|
_prevRouteKey?: string;
|
|
659
|
+
/**
|
|
660
|
+
* @internal Leaving a rewritten page, the visitor's URL moved
|
|
661
|
+
* (router/match-api.ts): the default revalidation counts it as a search
|
|
662
|
+
* change, since the render may read `ctx.rewrittenFrom`.
|
|
663
|
+
*/
|
|
664
|
+
_visitorMoved?: boolean;
|
|
644
665
|
/**
|
|
645
666
|
* @internal True while the post-action revalidation render is running (set by
|
|
646
667
|
* revalidateAfterAction). The "use cache" runtime reads this to prefer
|
|
@@ -650,6 +671,22 @@ export interface RequestContext<TEnv = DefaultEnv, TParams = Record<string, stri
|
|
|
650
671
|
* revalidating in the background. A plain navigation (flag unset) keeps SWR.
|
|
651
672
|
*/
|
|
652
673
|
_inActionRevalidation?: boolean;
|
|
674
|
+
/**
|
|
675
|
+
* @internal The outcome of the action this request ran (a JS server
|
|
676
|
+
* action's continuation, a no-JS form post's form state), set before route
|
|
677
|
+
* middleware wraps the re-render. While it is unset, applyRewrite
|
|
678
|
+
* (rsc/rewrite-passes.ts) moves a mutation with its body, so the action
|
|
679
|
+
* runs on the target's pass, or refuses it (`disallowMutations()`, or a
|
|
680
|
+
* body middleware read); once set, the request moves to the target, whose
|
|
681
|
+
* pass re-renders from it instead of running the action again (#1145).
|
|
682
|
+
*/
|
|
683
|
+
_actionRan?: {
|
|
684
|
+
kind: "action";
|
|
685
|
+
continuation: ActionContinuation;
|
|
686
|
+
} | {
|
|
687
|
+
kind: "form";
|
|
688
|
+
outcome: FormActionOutcome;
|
|
689
|
+
};
|
|
653
690
|
/**
|
|
654
691
|
* @internal Render barrier for experimental `rendered()` API.
|
|
655
692
|
* Resolves when all non-loader segments have settled and handle data
|
|
@@ -823,7 +860,7 @@ export interface RouteRecordWindow {
|
|
|
823
860
|
* This is the type exported to library consumers. Internal code should
|
|
824
861
|
* use the full RequestContext interface directly.
|
|
825
862
|
*/
|
|
826
|
-
export type PublicRequestContext<TEnv = DefaultEnv, TParams = Record<string, string>> = Omit<RequestContext<TEnv, TParams>, "cookie" | "cookies" | "_readCookie" | "_readCookies" | "setCookie" | "deleteCookie" | "_handleStore" | "_transitionWhenRefs" | "_pprReplayPostMatchReason" | "_cacheStore" | "_prerender" | "_onDemandProducer" | "_searchParamsFilter" | "_shellCaptureRun" | "_shellImplicitCache" | "_shellLoaderSeed" | "_shellCaptureLoaderRecords" | "_shellCaptureUnrecordedLoaderPush" | "_shellCaptureLoaderLanes" | "_resolvedCacheKeys" | "_shellKey" | "_shellForcedMiss" | "_prerenderWarm" | "_runAtRequestEntry" | "_routeRecordWindow" | "_shellFragmentPayload" | "_shellCaptureGuardTripped" | "_shellCaptureGuardTrippedLoaderId" | "_explicitTaggedStores" | "_requestTags" | "_recordTagOwners" | "_recordLoaderTags" | "_cacheProfiles" | "_onResponseCallbacks" | "_pendingBackgroundTasks" | "_themeConfig" | "_readTheme" | "_documentCacheRender" | "_payloadVisitorTheme" | "_payloadDeferred" | "_requestKind" | "_payloadVisitorLocation" | "_locationState" | "_routeName" | "_prevRouteKey" | "_inActionRevalidation" | "_reportedErrors" | "_renderErrors" | "_recoveredHandlerErrors" | "_renderBarrier" | "_resolveRenderBarrier" | "_renderBarrierSegmentOrder" | "_treeHasStreaming" | "_renderBarrierWaiters" | "_handlerLoaderDeps" | "_awaitBeforeFlushLoaderIds" | "_renderBarrierHandleSnapshot" | "_renderBarrierGuardClosed" | "_reportBackgroundError" | "_debugPerformance" | "_metricsStore" | "_renderForeground" | "_activeRoutine" | "_renderDiagnosticsEnabled" | "_handlerStart" | "_tracing" | "_basename" | "_routerId" | "_versions" | "_setStatus" | "_rotateStateCookie" | "_setKeepCacheDirective" | "_freshReads" | "_setFreshReadsCookie" | "_requestRoot" | "_requestStart" | "_responseSent" | "_variables" | "_classifiedRoute" | "_requestMode" | "_cacheSignal" | "_dynamic" | "res">;
|
|
863
|
+
export type PublicRequestContext<TEnv = DefaultEnv, TParams = Record<string, string>> = Omit<RequestContext<TEnv, TParams>, "cookie" | "cookies" | "_readCookie" | "_readCookies" | "setCookie" | "deleteCookie" | "_handleStore" | "_transitionWhenRefs" | "_pprReplayPostMatchReason" | "_cacheStore" | "_prerender" | "_onDemandProducer" | "_searchParamsFilter" | "_shellCaptureRun" | "_shellCaptureForVisitor" | "_shellImplicitCache" | "_shellLoaderSeed" | "_shellCaptureLoaderRecords" | "_shellCaptureUnrecordedLoaderPush" | "_shellCaptureLoaderLanes" | "_resolvedCacheKeys" | "_shellKey" | "_shellForcedMiss" | "_prerenderWarm" | "_runAtRequestEntry" | "_routeRecordWindow" | "_shellFragmentPayload" | "_shellCaptureGuardTripped" | "_shellCaptureGuardTrippedLoaderId" | "_explicitTaggedStores" | "_requestTags" | "_recordTagOwners" | "_recordLoaderTags" | "_cacheProfiles" | "_onResponseCallbacks" | "_pendingBackgroundTasks" | "_themeConfig" | "_readTheme" | "_documentCacheRender" | "_payloadVisitorTheme" | "_payloadDeferred" | "_requestKind" | "_payloadVisitorLocation" | "_locationState" | "_routeName" | "_prevRouteKey" | "_visitorMoved" | "_inActionRevalidation" | "_actionRan" | "_reportedErrors" | "_renderErrors" | "_recoveredHandlerErrors" | "_renderBarrier" | "_resolveRenderBarrier" | "_renderBarrierSegmentOrder" | "_treeHasStreaming" | "_renderBarrierWaiters" | "_handlerLoaderDeps" | "_awaitBeforeFlushLoaderIds" | "_renderBarrierHandleSnapshot" | "_renderBarrierGuardClosed" | "_reportBackgroundError" | "_debugPerformance" | "_metricsStore" | "_renderForeground" | "_activeRoutine" | "_renderDiagnosticsEnabled" | "_handlerStart" | "_tracing" | "_basename" | "_routerId" | "_versions" | "_setStatus" | "_rotateStateCookie" | "_setKeepCacheDirective" | "_freshReads" | "_setFreshReadsCookie" | "_requestRoot" | "_requestStart" | "_responseSent" | "_variables" | "_classifiedRoute" | "_requestMode" | "_cacheSignal" | "_dynamic" | "res">;
|
|
827
864
|
/**
|
|
828
865
|
* Marker for a waitUntil-scheduled fn whose task promise must NOT enter
|
|
829
866
|
* _pendingBackgroundTasks. Used by the PPR shell capture for its own task:
|
|
@@ -18,6 +18,18 @@
|
|
|
18
18
|
* fill); the rest follow the rule so a new call site cannot drift into one.
|
|
19
19
|
*/
|
|
20
20
|
export declare function requestHeaders(request: Request): Headers;
|
|
21
|
+
/**
|
|
22
|
+
* A copy of `request`'s headers for a bodyless mirror of it (the PE
|
|
23
|
+
* re-render, route middleware around it, a rewrite pass after an action),
|
|
24
|
+
* without the body-framing ones and `content-type`, so a body check gated on
|
|
25
|
+
* the content-type passes over a request that has no body.
|
|
26
|
+
*/
|
|
27
|
+
export declare function bodylessHeaders(request: Request): Headers;
|
|
28
|
+
/**
|
|
29
|
+
* A bodyless mirror of `request` at `url`: `method`, its
|
|
30
|
+
* {@link bodylessHeaders}, the signal and workerd's `cf`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function bodylessRequest(url: string | URL, request: Request, method: string): Request;
|
|
21
33
|
/**
|
|
22
34
|
* Shadow `request.headers` with an own, non-enumerable getter that calls
|
|
23
35
|
* `beforeRead` and returns the request's own Headers (stable per request, so
|
|
@@ -7,10 +7,13 @@
|
|
|
7
7
|
* visitor's URL is its first entry (`ctx.rewrittenFrom`); the hops are its
|
|
8
8
|
* length minus one.
|
|
9
9
|
*/
|
|
10
|
+
import type { RewriteShell } from "../route-definition/rewrite.js";
|
|
10
11
|
import type { RequestContext } from "./request-context.js";
|
|
11
12
|
/** Most rewrites one request may take; the next one is a RewriteLoopError. */
|
|
12
13
|
export declare const MAX_REWRITE_HOPS = 5;
|
|
13
14
|
type TrailContext = Pick<RequestContext<any>, "_variables">;
|
|
15
|
+
/** A URL's path and search: what a rewrite hop, a target and a visitor's move compare. */
|
|
16
|
+
export declare function pathKey(url: URL): string;
|
|
14
17
|
/** The trail of a rewritten request; undefined when nothing rewrote. */
|
|
15
18
|
export declare function rewriteTrail(reqCtx: TrailContext | undefined): readonly string[] | undefined;
|
|
16
19
|
/**
|
|
@@ -19,11 +22,15 @@ export declare function rewriteTrail(reqCtx: TrailContext | undefined): readonly
|
|
|
19
22
|
* URL the request is on (pathname and search).
|
|
20
23
|
*/
|
|
21
24
|
export declare function recordRewriteHop(reqCtx: TrailContext, from: URL, to: URL): number;
|
|
25
|
+
export declare function recordRewriteShell(reqCtx: TrailContext, audience: RewriteShell | undefined): void;
|
|
26
|
+
/** The last hop's `rewrite(...).shell()` choice; undefined: none. */
|
|
27
|
+
export declare function rewriteShellAudience(reqCtx: TrailContext | undefined): RewriteShell | undefined;
|
|
22
28
|
type AudienceContext = Pick<RequestContext<any>, "_shellCaptureRun" | "_documentCacheRender" | "res">;
|
|
23
29
|
/**
|
|
24
30
|
* A render other visitors may be served: a PPR shell capture, or a render
|
|
25
31
|
* the document cache stores (its response opted in before next()). It shows
|
|
26
|
-
*
|
|
32
|
+
* no visitor theme, and no visitor URL unless it is a visitor-keyed shell
|
|
33
|
+
* capture (`_shellCaptureForVisitor`).
|
|
27
34
|
*/
|
|
28
35
|
export declare function rendersForSharedAudience(reqCtx: AudienceContext): boolean;
|
|
29
36
|
/**
|
|
@@ -4,7 +4,7 @@ import { blockPrefetch, unblockPrefetch, createPageHelpers, createStopwatch, get
|
|
|
4
4
|
import { createParity, type ExpectParityOptions, type Parity, type ParityDescribeOptions, type ParityIntent } from "./parity.js";
|
|
5
5
|
import { createRangoMatchers, type RangoMatchers } from "./matchers.js";
|
|
6
6
|
export { assertCacheStatus, assertCacheDecision, parseCacheHeader, createCacheSink, filterCacheDecisions, type CacheSink, type ExpectedCacheStatus, type CacheStatusTarget, } from "../cache-status.js";
|
|
7
|
-
export { assertPprReplayStatus, assertShellStatus, parsePprReplayStatus, parseShellStatus, PPR_REPLAY_STATUS_HEADER, shellCacheKey, SHELL_STATUS_HEADER, type PprReplayBypassReason, type PprReplayStatus, type ShellCachePartition, type ShellStatus, type ShellStatusTarget, } from "../shell-status.js";
|
|
7
|
+
export { assertPprReplayStatus, assertShellStatus, parsePprReplayStatus, parseShellStatus, PPR_REPLAY_STATUS_HEADER, shellCacheKey, SHELL_STATUS_HEADER, visitorShellCacheKey, type PprReplayBypassReason, type PprReplayStatus, type ShellCachePartition, type ShellStatus, type ShellStatusTarget, } from "../shell-status.js";
|
|
8
8
|
export { testId, waitForHydration, waitForNavigation, goBack, goForward, getHistoryState, waitForElement, isVisibleInViewport, isPrefetchRequest, blockPrefetch, unblockPrefetch, parseNumber, getNumericContent, createStopwatch, measureTime, createPageHelpers, createUseFixture, createParity, createRangoMatchers, };
|
|
9
9
|
export type { Fixture, FixtureOptions, PageHelpers, Stopwatch, Parity, ParityIntent, ParityDescribeOptions, ExpectParityOptions, RangoMatchers, };
|
|
10
10
|
export interface RangoE2E extends PageHelpers, Parity {
|
|
@@ -33,4 +33,4 @@ export type { TestableHandler, RenderHandlerOptions, RenderHandlerResult, StateC
|
|
|
33
33
|
export { createActionForm } from "./action-form.js";
|
|
34
34
|
export type { CreateActionFormOptions } from "./action-form.js";
|
|
35
35
|
export { serveShellRequest, resetShellTestState, } from "./serve-shell-request.js";
|
|
36
|
-
export type { ServeShellRequestAction, ServeShellRequestOptions, ServeShellRequestResult, ShellRequestHandles, } from "./serve-shell-request.js";
|
|
36
|
+
export type { ServeShellRequestAction, ServeShellRequestOptions, ServeShellRequestResult, ShellRequestAction, ShellRequestHandles, } from "./serve-shell-request.js";
|
|
@@ -50,7 +50,7 @@ export type { PrerenderConfig, PrerenderResult, PrerenderWarmCaches, } from "../
|
|
|
50
50
|
export { assertCacheStatus, assertCacheDecision, parseCacheHeader, createCacheSink, filterCacheDecisions, } from "./cache-status.js";
|
|
51
51
|
export type { ExpectedCacheStatus, CacheStatusTarget, CacheSink, } from "./cache-status.js";
|
|
52
52
|
export type { TelemetryEvent, TelemetrySink, CacheDecisionEvent, CacheSegmentSignal, CacheSegmentStatus, } from "../router/telemetry.js";
|
|
53
|
-
export { assertPprReplayStatus, assertShellStatus, parsePprReplayStatus, parseShellStatus, PPR_REPLAY_STATUS_HEADER, shellCacheKey, SHELL_STATUS_HEADER, } from "./shell-status.js";
|
|
53
|
+
export { assertPprReplayStatus, assertShellStatus, parsePprReplayStatus, parseShellStatus, PPR_REPLAY_STATUS_HEADER, shellCacheKey, SHELL_STATUS_HEADER, visitorShellCacheKey, } from "./shell-status.js";
|
|
54
54
|
export type { PprReplayBypassReason, PprReplayStatus, ShellCachePartition, ShellStatus, ShellStatusTarget, } from "./shell-status.js";
|
|
55
55
|
export { setBuildVersions } from "./build-versions.js";
|
|
56
56
|
export type { BuildVersions, RouterVersions } from "./build-versions.js";
|
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
*
|
|
10
10
|
* A Vitest project runs no hoist plugin, so the source's revalidate()
|
|
11
11
|
* predicates are plain functions. Each is registered under a key named for
|
|
12
|
-
* its reference, route and loader, as the plugin's generated
|
|
13
|
-
* its own, and the projection carries the keys:
|
|
14
|
-
* and the server runs them, as in an app.
|
|
12
|
+
* its reference, route or intercept, and loader, as the plugin's generated
|
|
13
|
+
* module registers its own, and the projection carries the keys:
|
|
14
|
+
* materialization attaches them and the server runs them, as in an app. A
|
|
15
|
+
* boolean rides in the projection as itself, as the plugin leaves a literal.
|
|
15
16
|
*/
|
|
16
17
|
export declare function installClientUrlsProjection(referenceId: string, source: Readonly<Record<string, unknown>>): void;
|
|
@@ -23,13 +23,16 @@
|
|
|
23
23
|
* SEEDED directly into client context (see the `loaders` / `locationState` /
|
|
24
24
|
* `handles` / `outletPending` options) — nothing is executed on the server.
|
|
25
25
|
* This exercises the context read path, not the run path.
|
|
26
|
-
* - navigate()
|
|
27
|
-
*
|
|
28
|
-
* pending
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
26
|
+
* - navigate() drives the navigation lifecycle as a click does:
|
|
27
|
+
* useNavigation() reads loading from the call and idle with the commit,
|
|
28
|
+
* and useLinkStatus().pending is true for a link to the destination until
|
|
29
|
+
* the commit is handed to React. A `transition` spec plus a pending
|
|
30
|
+
* Promise seeded via navigate(url, { loaders }) commits through
|
|
31
|
+
* production's commitInTransition (browser/partial-update.ts), which React
|
|
32
|
+
* holds: useNavigation() stays loading and the held reader's
|
|
33
|
+
* useLoader().isLoading reads true until the data lands. Without
|
|
34
|
+
* `transition` the commit is urgent (production's same-structure hold is
|
|
35
|
+
* not modeled). useAction().state stays idle: no action runs.
|
|
33
36
|
* - A spec's transition({ when }) decides every commit with production's
|
|
34
37
|
* browser decision: navigate() and useRouter().push model kind "push",
|
|
35
38
|
* useRouter().replace kind "replace", refresh() kind "revalidate".
|
|
@@ -324,9 +327,10 @@ export interface TestRouterHandle {
|
|
|
324
327
|
* pending Promise suspends the read like a streaming Flight chunk. When a
|
|
325
328
|
* spec in the chain has `transition`, the commit goes through production's
|
|
326
329
|
* commitInTransition: the reader stays on screen with
|
|
327
|
-
* `useLoader().isLoading === true
|
|
328
|
-
* inside RTL's `act()` to
|
|
329
|
-
*
|
|
330
|
+
* `useLoader().isLoading === true`, and `useNavigation().state` reads
|
|
331
|
+
* "loading", until the promise settles. Settle it inside RTL's `act()` to
|
|
332
|
+
* flush the commit. Without `transition` the commit is urgent and the read
|
|
333
|
+
* suspends to the nearest Suspense boundary.
|
|
330
334
|
*
|
|
331
335
|
* @example
|
|
332
336
|
* await router.navigate("/products/2", { loaders: [[ProductLoader, next]] });
|
|
@@ -346,8 +350,14 @@ export interface TestRouterHandle {
|
|
|
346
350
|
* location state as a production replace does). With neither, history is
|
|
347
351
|
* left alone and readers keep the state they have: `navigate(url)` and
|
|
348
352
|
* `navigate(url, { replace: false })` are the same call.
|
|
353
|
+
*
|
|
354
|
+
* `options.handles` are the destination's handle pushes (`[handle,
|
|
355
|
+
* values]`, attached to its leaf route as in `renderRoute`'s own
|
|
356
|
+
* `handles`). They arrive on the response's handle stream, so `useHandle`
|
|
357
|
+
* readers take them with the page's commit: while React holds the page,
|
|
358
|
+
* readers keep the values of the page being left.
|
|
349
359
|
*/
|
|
350
|
-
navigate(url: string, options?: Pick<RenderRouteOptions, "loaders"> & Pick<NavigateOptions, "state" | "replace" | "transition">): Promise<void>;
|
|
360
|
+
navigate(url: string, options?: Pick<RenderRouteOptions, "loaders" | "handles"> & Pick<NavigateOptions, "state" | "replace" | "transition">): Promise<void>;
|
|
351
361
|
/**
|
|
352
362
|
* Re-render the current location, as router.refresh() does: a spec's
|
|
353
363
|
* transition({ when }) decides it with kind "revalidate" (`to` is `from`).
|
|
@@ -100,6 +100,13 @@ export interface RunLoaderOptions<TEnv = any> {
|
|
|
100
100
|
routeMap?: Record<string, string>;
|
|
101
101
|
/** Matched route name for scoped `.name` reverse resolution. */
|
|
102
102
|
routeName?: string;
|
|
103
|
+
/**
|
|
104
|
+
* Include name prefix of the module whose `layout()` / `parallel()` /
|
|
105
|
+
* `cache()` declares the loader (`"account"`, or `""` for the root module).
|
|
106
|
+
* `ctx.reverse(".name")` then resolves in that module, as such a loader's
|
|
107
|
+
* does in production, instead of from `routeName`.
|
|
108
|
+
*/
|
|
109
|
+
declaredIn?: string;
|
|
103
110
|
/** HTTP method surfaced as `ctx.method`. Defaults to "GET". */
|
|
104
111
|
method?: string;
|
|
105
112
|
/** Request body surfaced as `ctx.body`. */
|
|
@@ -88,6 +88,13 @@ export interface RunMiddlewareRewrite {
|
|
|
88
88
|
pathname: string;
|
|
89
89
|
search: string;
|
|
90
90
|
routeName?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Present, `true`, only when the rewrite was thrown with
|
|
93
|
+
* `.disallowMutations()`: production refuses it for a non-GET, non-HEAD
|
|
94
|
+
* request in global middleware, before the action runs, instead of moving
|
|
95
|
+
* the mutation to the target.
|
|
96
|
+
*/
|
|
97
|
+
mutationsDisallowed?: true;
|
|
91
98
|
}
|
|
92
99
|
/**
|
|
93
100
|
* Result of runMiddleware.
|
|
@@ -66,9 +66,10 @@ export interface RunRevalidateOptions<TEnv = any> {
|
|
|
66
66
|
context?: RevalidateArgs["context"];
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
-
* Run one revalidate()
|
|
70
|
-
* the router does for a request
|
|
71
|
-
*
|
|
69
|
+
* Run one revalidate() argument, or a chain in declaration order, the way
|
|
70
|
+
* the router does for a request: a predicate, or `true` / `false` as
|
|
71
|
+
* `revalidate()` takes them. Resolves to the final decision: true re-runs
|
|
72
|
+
* the segment, false keeps the client's copy.
|
|
72
73
|
*/
|
|
73
|
-
export declare function runRevalidate<TEnv = any>(fn: ShouldRevalidateFn<any, TEnv> | readonly ShouldRevalidateFn<any, TEnv>[], opts?: RunRevalidateOptions<TEnv>): Promise<boolean>;
|
|
74
|
+
export declare function runRevalidate<TEnv = any>(fn: ShouldRevalidateFn<any, TEnv> | boolean | readonly (ShouldRevalidateFn<any, TEnv> | boolean)[], opts?: RunRevalidateOptions<TEnv>): Promise<boolean>;
|
|
74
75
|
export {};
|
|
@@ -70,13 +70,20 @@ export interface ServeShellRequestOptions<TEnv = any> {
|
|
|
70
70
|
* entries are deferred: `result.readDeferred()` lists them. `fill: true`
|
|
71
71
|
* sends the request the browser follows an adopted prefetch with
|
|
72
72
|
* (`_rsc_fill`): pass the ids the prefetch delivered, without the deferred
|
|
73
|
-
* ones, as `segments`, and the same URL as `from`.
|
|
73
|
+
* ones, as `segments`, and the same URL as `from`. `interceptSource` sends
|
|
74
|
+
* the intercept source (`X-RSC-Router-Intercept-Source`) the browser sends
|
|
75
|
+
* from an open modal and with the fill of an intercept, whose `from` is
|
|
76
|
+
* that source. `rewriteTarget` sends the `metadata.rewriteTarget` the page at
|
|
77
|
+
* `from` carried when middleware rewrote it (`_rsc_rt`), as the browser
|
|
78
|
+
* does: the server then diffs against the route that rendered that page.
|
|
74
79
|
*/
|
|
75
80
|
partial?: true | {
|
|
76
81
|
from?: string;
|
|
82
|
+
rewriteTarget?: string;
|
|
77
83
|
segments?: readonly string[];
|
|
78
84
|
prefetch?: boolean;
|
|
79
85
|
fill?: boolean;
|
|
86
|
+
interceptSource?: string;
|
|
80
87
|
};
|
|
81
88
|
/**
|
|
82
89
|
* POST this form as a submit before hydration: the no-JS request the
|
|
@@ -109,6 +116,8 @@ export interface ServeShellRequestAction {
|
|
|
109
116
|
args?: readonly unknown[];
|
|
110
117
|
/** The segment ids the page holds (`_rsc_segments`). */
|
|
111
118
|
segments?: readonly string[];
|
|
119
|
+
/** The page's payload `metadata.rewriteTarget`, as for `partial`. */
|
|
120
|
+
rewriteTarget?: string;
|
|
112
121
|
}
|
|
113
122
|
/** A response's handle data, as the browser consumes it. */
|
|
114
123
|
export interface ShellRequestHandles {
|
|
@@ -125,6 +134,24 @@ export interface ShellRequestHandles {
|
|
|
125
134
|
*/
|
|
126
135
|
late: HandleData[];
|
|
127
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* An `action` request's answer, as browser/server-action-bridge.ts reads it.
|
|
139
|
+
*/
|
|
140
|
+
export interface ShellRequestAction {
|
|
141
|
+
/** False when the action threw: the call rejects with `result`. */
|
|
142
|
+
ok: boolean;
|
|
143
|
+
/** What the call resolves (or rejects) with. */
|
|
144
|
+
result: unknown;
|
|
145
|
+
/**
|
|
146
|
+
* The error of the first loader that threw while it re-ran in the action's
|
|
147
|
+
* revalidation, the value `useAction(action).revalidationError` reports.
|
|
148
|
+
* That loader throws at its `useLoader` read, where the nearest boundary
|
|
149
|
+
* catches it, and the call still resolves. `null` when every loader
|
|
150
|
+
* answered (a `notFound()` or `redirect()` is not an error), or `ok` is
|
|
151
|
+
* false, as `useAction` reports it.
|
|
152
|
+
*/
|
|
153
|
+
revalidationError: Error | null;
|
|
154
|
+
}
|
|
128
155
|
/** Result of {@link serveShellRequest}. */
|
|
129
156
|
export interface ServeShellRequestResult {
|
|
130
157
|
/** The handler's Response. Its body is already read: see `body`. */
|
|
@@ -150,9 +177,12 @@ export interface ServeShellRequestResult {
|
|
|
150
177
|
* The shell key production resolved for this request: for a document the
|
|
151
178
|
* serve path read and captured (a MISS or a HIT), the key it used, request
|
|
152
179
|
* partition included (a route partitioned by `cache({ key })` or the
|
|
153
|
-
* store's `keyGenerator`)
|
|
154
|
-
*
|
|
155
|
-
*
|
|
180
|
+
* store's `keyGenerator`), and for a request middleware rewrote with
|
|
181
|
+
* `rewrite(...).shell("visitor")` the visitor's key, as
|
|
182
|
+
* `visitorShellCacheKey` builds it. Otherwise (a route without `ppr`, a
|
|
183
|
+
* request passed to axis 1 before its key was resolved, a rewritten
|
|
184
|
+
* request whose rewrite chose no shell, a partial request) the document
|
|
185
|
+
* URL's key without a partition, as `shellCacheKey` builds it.
|
|
156
186
|
*/
|
|
157
187
|
key: string;
|
|
158
188
|
/**
|
|
@@ -185,6 +215,13 @@ export interface ServeShellRequestResult {
|
|
|
185
215
|
* hydrates without it.
|
|
186
216
|
*/
|
|
187
217
|
readPayloadFormState(): Promise<unknown>;
|
|
218
|
+
/**
|
|
219
|
+
* For an `action` request, the call's answer as the browser reads it: its
|
|
220
|
+
* result and the `revalidationError` its loaders' reruns report.
|
|
221
|
+
* Undefined when no Flight was rendered or the payload carries no action
|
|
222
|
+
* result.
|
|
223
|
+
*/
|
|
224
|
+
readAction(): Promise<ShellRequestAction | undefined>;
|
|
188
225
|
}
|
|
189
226
|
/**
|
|
190
227
|
* Reset the per-isolate PPR state requests leave behind, so the next test
|
|
@@ -95,6 +95,23 @@ export interface ShellCachePartition {
|
|
|
95
95
|
export declare function shellCacheKey(router: {
|
|
96
96
|
readonly id: string;
|
|
97
97
|
}, url: URL | string, searchParams?: CacheSearchParams, partition?: string | readonly string[] | ShellCachePartition): string;
|
|
98
|
+
/**
|
|
99
|
+
* Shell store key of a request middleware rewrote with
|
|
100
|
+
* `throw rewrite(...).shell("visitor")`: the visitor's `url`, partitioned by
|
|
101
|
+
* the rewrite's `target` (its path and search), as production builds it
|
|
102
|
+
* (`visitorShellKey`, `rsc/shell-capture-constants.ts`). `searchParams` is
|
|
103
|
+
* the target route's `cache.searchParams` config, applied to the visitor's
|
|
104
|
+
* search; `partition` is the target route's own, as for
|
|
105
|
+
* {@link shellCacheKey}, composed after the target's.
|
|
106
|
+
*
|
|
107
|
+
* ```ts
|
|
108
|
+
* const hit = await serveShellRequest(router, "/summer", { cacheStore });
|
|
109
|
+
* expect(hit.key).toBe(visitorShellCacheKey(router, "/summer", "/item/1"));
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export declare function visitorShellCacheKey(router: {
|
|
113
|
+
readonly id: string;
|
|
114
|
+
}, url: URL | string, target: URL | string, searchParams?: CacheSearchParams, partition?: string | readonly string[] | ShellCachePartition): string;
|
|
98
115
|
/**
|
|
99
116
|
* Read `x-rango-shell` from a response. Returns `null` when the header is
|
|
100
117
|
* absent (axis-1 / non-ppr / ineligible request).
|
|
@@ -144,11 +144,20 @@ export interface RangoTestConfig {
|
|
|
144
144
|
*/
|
|
145
145
|
export declare function rangoTestConfig(opts?: RangoTestAliasOptions): RangoTestConfig;
|
|
146
146
|
/** A minimal Vite plugin shape (avoids a hard dependency on Vite's types). */
|
|
147
|
+
/** The part of a Vite plugin context {@link rangoUseClientTransform} resolves with. */
|
|
148
|
+
interface SourceResolveContext {
|
|
149
|
+
resolve(source: string, importer?: string, options?: {
|
|
150
|
+
skipSelf?: boolean;
|
|
151
|
+
}): Promise<{
|
|
152
|
+
id: string;
|
|
153
|
+
external?: boolean | string;
|
|
154
|
+
} | null>;
|
|
155
|
+
}
|
|
147
156
|
interface FlightTransformPlugin {
|
|
148
157
|
name: string;
|
|
149
158
|
resolveId: {
|
|
150
159
|
order: "pre";
|
|
151
|
-
handler(source: string, importer: string | undefined): string | undefined
|
|
160
|
+
handler(this: SourceResolveContext, source: string, importer: string | undefined): Promise<string | undefined>;
|
|
152
161
|
};
|
|
153
162
|
transform(code: string, id: string): Promise<{
|
|
154
163
|
code: string;
|
|
@@ -13,9 +13,3 @@ export declare function unwrapsSynchronously(stream: Promise<unknown>): boolean;
|
|
|
13
13
|
* listing a 0 ms promise on every reader that calls it.
|
|
14
14
|
*/
|
|
15
15
|
export declare const SETTLED_THENABLE: Promise<undefined>;
|
|
16
|
-
/**
|
|
17
|
-
* The value React reads from `value` without suspending: `value` itself when
|
|
18
|
-
* it is not a promise, a promise's `value` once it carries React's or Flight's
|
|
19
|
-
* `status: "fulfilled"`. Undefined while it is pending or rejected.
|
|
20
|
-
*/
|
|
21
|
-
export declare function settledValue<T>(value: T | Promise<T>): T | undefined;
|
|
@@ -53,7 +53,13 @@ type AutofillParamsFromEntry<TEntry> = TEntry extends string ? string extends TE
|
|
|
53
53
|
type AutofillSearchFromEntry<TMap, TKey> = TKey extends keyof TMap ? TMap[TKey] extends {
|
|
54
54
|
readonly search: infer S extends SearchSchema;
|
|
55
55
|
} ? ResolveSearchSchema<S> : Record<string, unknown> : Record<string, unknown>;
|
|
56
|
-
|
|
56
|
+
/**
|
|
57
|
+
* `ScopedReverseFunction` whose global-name params are optional: the runtime
|
|
58
|
+
* fills missing ones from the matched route's params (`createReverseFunction`
|
|
59
|
+
* in `router/handler-context.ts`, explicit params win). Shared by handler,
|
|
60
|
+
* loader and request-context `reverse`.
|
|
61
|
+
*/
|
|
62
|
+
export type AutofillAwareReverseFunction<TLocalRoutes, TGlobalRoutes> = ScopedReverseFunction<TLocalRoutes, TGlobalRoutes> & {
|
|
57
63
|
<TName extends keyof TGlobalRoutes & string>(name: TName, params?: AutofillParamsFromEntry<TGlobalRoutes[TName]>, search?: AutofillSearchFromEntry<TGlobalRoutes, TName>): string;
|
|
58
64
|
<TName extends keyof TLocalRoutes & string>(name: `.${TName}`, params?: AutofillParamsFromEntry<TLocalRoutes[TName]>, search?: AutofillSearchFromEntry<TLocalRoutes, TName>): string;
|
|
59
65
|
};
|
|
@@ -329,6 +335,11 @@ export type InternalHandlerContext<TParams = {}, TEnv = DefaultEnv, TSearch exte
|
|
|
329
335
|
_responseType?: string;
|
|
330
336
|
/** Route name for cache key scoping (prevents cross-route collisions). */
|
|
331
337
|
_routeName?: string;
|
|
338
|
+
/**
|
|
339
|
+
* The segment's ReverseScope on a layout's / parallel's ctx and its
|
|
340
|
+
* loaders' (withReverseScope): keys a "use cache" call taking the ctx.
|
|
341
|
+
*/
|
|
342
|
+
_reverseScope?: import("../server/context.js").ReverseScope;
|
|
332
343
|
/**
|
|
333
344
|
* @internal The on-demand overlay holds a "removed" marker for this request
|
|
334
345
|
* (tryPrerenderLookup, cache-lookup.ts); gateOnDemandProducer reads it. On
|