@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
|
@@ -41,6 +41,12 @@ export interface RscMetadata {
|
|
|
41
41
|
resolvedIds?: string[];
|
|
42
42
|
/** Merged route params from the matched route */
|
|
43
43
|
params?: Record<string, string>;
|
|
44
|
+
/**
|
|
45
|
+
* The matched route's name (include name prefix applied), when the route is
|
|
46
|
+
* named. The browser keeps it per history entry for transition({ when })'s
|
|
47
|
+
* `from.routeName` / `to.routeName` (browser/transition-when.ts).
|
|
48
|
+
*/
|
|
49
|
+
routeName?: string;
|
|
44
50
|
/**
|
|
45
51
|
* State of named slots for this route match
|
|
46
52
|
* Key is slot name (e.g., "@modal"), value is slot state
|
|
@@ -246,6 +252,17 @@ export interface SegmentState {
|
|
|
246
252
|
currentUrl: string;
|
|
247
253
|
currentSegmentIds: string[];
|
|
248
254
|
}
|
|
255
|
+
/**
|
|
256
|
+
* What the router remembers about one history entry for transition({ when })
|
|
257
|
+
* (NavigationStore.rememberDisplayedEntry).
|
|
258
|
+
*
|
|
259
|
+
* @internal This type is an implementation detail and may change without notice.
|
|
260
|
+
*/
|
|
261
|
+
export interface HistoryEntryMemory {
|
|
262
|
+
readonly routeName: string | undefined;
|
|
263
|
+
/** The entry's `history.state` as last recorded. */
|
|
264
|
+
readonly state: unknown;
|
|
265
|
+
}
|
|
249
266
|
/**
|
|
250
267
|
* Navigation update emitted when UI should re-render
|
|
251
268
|
*
|
|
@@ -265,11 +282,51 @@ export interface NavigationUpdate {
|
|
|
265
282
|
};
|
|
266
283
|
}
|
|
267
284
|
/**
|
|
268
|
-
*
|
|
269
|
-
* -
|
|
270
|
-
*
|
|
285
|
+
* Plain object accepted as {@link PlainHistoryState}. The `any` string index
|
|
286
|
+
* admits interface-typed values (an `unknown` index would reject interfaces,
|
|
287
|
+
* which carry no implicit index signature). The `never` members reject:
|
|
288
|
+
* - a single typed entry (`GridState(value)` without the array) — its
|
|
289
|
+
* `__rsc_ls_*` fields would be spread onto history.state and
|
|
290
|
+
* `useLocationState(GridState)` would read `undefined`;
|
|
291
|
+
* - functions, including a location-state definition passed uncalled
|
|
292
|
+
* (`Symbol.hasInstance` comes from `Function.prototype`), which throw
|
|
293
|
+
* `DataCloneError`;
|
|
294
|
+
* - arrays and other iterables (`Symbol.iterator`), so an array must match the
|
|
295
|
+
* typed-entry or plain-array member instead;
|
|
296
|
+
* - built-ins tagged with `Symbol.toStringTag` (`Promise`, `WeakMap`,
|
|
297
|
+
* `WeakSet`), which throw `DataCloneError`. The cloneable tagged ones
|
|
298
|
+
* (`Map`, `Set`, `ArrayBuffer`, typed arrays) have their own members.
|
|
299
|
+
*
|
|
300
|
+
* Members are not checked: a function, symbol, or React element inside a
|
|
301
|
+
* plain object still compiles, as does a top-level `ReactElement` or DOM node
|
|
302
|
+
* (an object with none of the keys above).
|
|
303
|
+
*/
|
|
304
|
+
export interface PlainHistoryObject {
|
|
305
|
+
readonly [key: string]: any;
|
|
306
|
+
readonly __rsc_ls_key?: never;
|
|
307
|
+
readonly __rsc_ls_value?: never;
|
|
308
|
+
readonly __rsc_ls_lazy?: never;
|
|
309
|
+
readonly [Symbol.iterator]?: never;
|
|
310
|
+
readonly [Symbol.hasInstance]?: never;
|
|
311
|
+
readonly [Symbol.toStringTag]?: never;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Plain (untyped) navigation state, stored under `history.state.state` and
|
|
315
|
+
* read with `useLocationState<T>()`. A structured-clone-safe value: primitives,
|
|
316
|
+
* arrays, `Map`/`Set`, `ArrayBuffer`, typed arrays, and plain objects. Excludes
|
|
317
|
+
* functions, symbols, `Promise`/`WeakMap`/`WeakSet`, and objects carrying
|
|
318
|
+
* `__rsc_ls_*` keys (a typed entry passed without its array). Arrays, `Map`,
|
|
319
|
+
* and `Set` are checked element by element; plain object members are not
|
|
320
|
+
* checked (see {@link PlainHistoryObject}).
|
|
271
321
|
*/
|
|
272
|
-
export type
|
|
322
|
+
export type PlainHistoryState = string | number | boolean | bigint | null | undefined | readonly PlainHistoryState[] | ReadonlyMap<PlainHistoryState, PlainHistoryState> | ReadonlySet<PlainHistoryState> | ArrayBuffer | ArrayBufferView | PlainHistoryObject;
|
|
323
|
+
/**
|
|
324
|
+
* State value for `router.push()` / `router.replace()` / `<Link state>`.
|
|
325
|
+
* - `readonly LocationStateEntry[]`: typed entries from `createLocationState()`
|
|
326
|
+
* definitions, e.g. `[GridState({ count: 3 })]` (recommended)
|
|
327
|
+
* - {@link PlainHistoryState}: plain structured-clone-safe state
|
|
328
|
+
*/
|
|
329
|
+
export type HistoryState = readonly import("./react/location-state-shared.js").LocationStateEntry[] | PlainHistoryState;
|
|
273
330
|
/**
|
|
274
331
|
* Options for navigation operations
|
|
275
332
|
*/
|
|
@@ -295,6 +352,22 @@ export interface NavigateOptions {
|
|
|
295
352
|
* ```
|
|
296
353
|
*/
|
|
297
354
|
revalidate?: boolean;
|
|
355
|
+
/**
|
|
356
|
+
* Set to `false` to present this navigation without a transition: the
|
|
357
|
+
* commit is urgent and every `<ViewTransition>` class resolves to `"none"`,
|
|
358
|
+
* the same result as a `transition({ when })` predicate returning `false`.
|
|
359
|
+
* No `when` predicate is called. Back/forward, action and revalidation
|
|
360
|
+
* commits are unaffected (they are not started by this call).
|
|
361
|
+
*
|
|
362
|
+
* @default true (the route's transition config applies)
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
* ```tsx
|
|
366
|
+
* router.push("/photos/2", { transition: false });
|
|
367
|
+
* <Link to="/photos/2" transition={false}>Next</Link>
|
|
368
|
+
* ```
|
|
369
|
+
*/
|
|
370
|
+
transition?: boolean;
|
|
298
371
|
/**
|
|
299
372
|
* State to pass to history.pushState/replaceState
|
|
300
373
|
* Accessible via useLocationState() hook.
|
|
@@ -316,14 +389,21 @@ export interface NavigateOptions {
|
|
|
316
389
|
* // Plain static state
|
|
317
390
|
* navigate("/product", { state: { from: "list" } });
|
|
318
391
|
*
|
|
319
|
-
* //
|
|
320
|
-
* navigate("/product", { state: ()
|
|
392
|
+
* // Compile errors (and a dev-mode runtime error for untyped callers):
|
|
393
|
+
* navigate("/product", { state: ProductState(p) }); // entry without the array
|
|
394
|
+
* navigate("/product", { state: [ProductState] }); // definition not called
|
|
321
395
|
* ```
|
|
322
396
|
*/
|
|
323
397
|
state?: HistoryState;
|
|
324
398
|
}
|
|
325
|
-
/**
|
|
326
|
-
|
|
399
|
+
/**
|
|
400
|
+
* @internal Extended options used only within the navigation bridge. `state`
|
|
401
|
+
* is widened to `unknown`: the redirect lanes pass state already resolved to
|
|
402
|
+
* a flat `history.state` record, and in dev Link passes an uncalled
|
|
403
|
+
* definition through to resolveNavigationState's check.
|
|
404
|
+
*/
|
|
405
|
+
export interface NavigateOptionsInternal extends Omit<NavigateOptions, "state"> {
|
|
406
|
+
state?: unknown;
|
|
327
407
|
/** Skip segment cache (used by redirect-with-state to force re-render) */
|
|
328
408
|
_skipCache?: boolean;
|
|
329
409
|
}
|
|
@@ -402,6 +482,21 @@ export interface NavigationStore {
|
|
|
402
482
|
setSegmentIds(ids: string[]): void;
|
|
403
483
|
getHistoryKey(): string;
|
|
404
484
|
setHistoryKey(key: string): void;
|
|
485
|
+
/**
|
|
486
|
+
* Per-history-entry memory for transition({ when }) sources: record the
|
|
487
|
+
* entry on screen (keyed by its `history.state.key`) with its current
|
|
488
|
+
* `history.state` and, when given, its route name (kept from the last
|
|
489
|
+
* record otherwise; every push/replace creates a new key, so a stale name
|
|
490
|
+
* never carries to another entry). Called after every commit, restore and
|
|
491
|
+
* state merge.
|
|
492
|
+
*/
|
|
493
|
+
rememberDisplayedEntry(routeName?: string): void;
|
|
494
|
+
/**
|
|
495
|
+
* The memory of the entry on screen, or of `entryKey`. At popstate
|
|
496
|
+
* history.state already belongs to the destination, so back/forward reads
|
|
497
|
+
* the entry being LEFT from here. In-memory only: empty after a reload.
|
|
498
|
+
*/
|
|
499
|
+
getHistoryEntryMemory(entryKey?: string): HistoryEntryMemory | undefined;
|
|
405
500
|
/** Monotonic token of the most recently committed navigation. */
|
|
406
501
|
getNavInstance(): number;
|
|
407
502
|
cacheSegmentsForHistory(historyKey: string, segments: ResolvedSegment[], handleData?: HandleData): void;
|
|
@@ -517,7 +612,7 @@ export interface ServerActionBridgeConfig {
|
|
|
517
612
|
* Navigation bridge for handling client-side navigation
|
|
518
613
|
*/
|
|
519
614
|
export interface NavigationBridge {
|
|
520
|
-
navigate(url: string, options?:
|
|
615
|
+
navigate(url: string, options?: NavigateOptionsInternal): Promise<void>;
|
|
521
616
|
refresh(): Promise<void>;
|
|
522
617
|
handlePopstate(): Promise<void>;
|
|
523
618
|
registerLinkInterception(): () => void;
|
|
@@ -93,6 +93,14 @@ export declare function generateManifestFull<TEnv>(urlpatterns: UrlPatterns<TEnv
|
|
|
93
93
|
* EntryData map built below is local; this is the only seam that surfaces it.
|
|
94
94
|
*/
|
|
95
95
|
collectClientFallbackRef?: (refKey: string) => void;
|
|
96
|
+
/**
|
|
97
|
+
* Fail on an invalid transition({ when }): a non-function, or a plain
|
|
98
|
+
* (server) function where a client reference is required. Only the Vite
|
|
99
|
+
* plugin's discovery passes it: it evaluates the tree in the react-server
|
|
100
|
+
* graph, the one place a "use client" import is told apart from a server
|
|
101
|
+
* function (transition-when-ref.ts).
|
|
102
|
+
*/
|
|
103
|
+
validateTransitionWhen?: boolean;
|
|
96
104
|
}): Promise<FullManifest>;
|
|
97
105
|
/**
|
|
98
106
|
* Generate TypeScript code for the manifest
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Background Task Runner
|
|
3
3
|
*
|
|
4
|
-
* Unified helper for scheduling async work via waitUntil
|
|
5
|
-
*
|
|
4
|
+
* Unified helper for scheduling async work via waitUntil, and the two bounded
|
|
5
|
+
* waits the PPR shell capture puts on background work (raceDeadline,
|
|
6
|
+
* settleGrowing). When waitUntil is unavailable, falls back to blocking or
|
|
7
|
+
* skipping.
|
|
6
8
|
*/
|
|
7
9
|
interface WaitUntilHost {
|
|
8
10
|
waitUntil?: (fn: () => Promise<void>) => void;
|
|
@@ -18,4 +20,24 @@ interface WaitUntilHost {
|
|
|
18
20
|
* @returns A promise when blocking fallback is used, void otherwise.
|
|
19
21
|
*/
|
|
20
22
|
export declare function runBackground(host: WaitUntilHost | null | undefined, task: () => Promise<void>, blockWhenNoWaitUntil?: boolean): Promise<void> | void;
|
|
23
|
+
/**
|
|
24
|
+
* Race `work` against an absolute deadline (epoch ms), keeping its value. The
|
|
25
|
+
* losing work is not cancelled (a router match has no abort signal) and its
|
|
26
|
+
* late rejection is swallowed. The timer is unref'd, so a pending deadline
|
|
27
|
+
* never keeps a Node dev process alive.
|
|
28
|
+
*/
|
|
29
|
+
export declare function raceDeadline<T>(work: Promise<T>, deadline: number): Promise<{
|
|
30
|
+
done: true;
|
|
31
|
+
value: T;
|
|
32
|
+
} | {
|
|
33
|
+
done: false;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Wait until every promise in `list` has settled, including ones appended
|
|
37
|
+
* while waiting (a settled write can schedule a nested one: cacheRoute
|
|
38
|
+
* schedules its store.set in a second waitUntil), or until `deadline` (epoch
|
|
39
|
+
* ms). Resolves true when the list drained, false at the deadline. Never
|
|
40
|
+
* mutates `list`: a later call waits for what is still pending.
|
|
41
|
+
*/
|
|
42
|
+
export declare function settleGrowing(list: readonly Promise<unknown>[], deadline: number): Promise<boolean>;
|
|
21
43
|
export {};
|
|
@@ -31,6 +31,37 @@
|
|
|
31
31
|
export interface CacheExecScope {
|
|
32
32
|
readonly parent?: CacheExecScope;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Run a callback whose identity reads never reach a shared entry, so
|
|
36
|
+
* guardIdentityRead (server/context.ts) lets them through and records
|
|
37
|
+
* nothing (#976):
|
|
38
|
+
*
|
|
39
|
+
* - a cache's own decisions and metadata: a `key()`, a store `keyGenerator`
|
|
40
|
+
* (cache-policy.ts resolveCacheKey), a `condition()` (cache-scope.ts
|
|
41
|
+
* conditionAllows, loader-cache.ts) and a `tags()` function
|
|
42
|
+
* (cache-policy.ts resolveTagsOption). The value picks the entry, whether
|
|
43
|
+
* one is used, or how it is invalidated; it is never rendered. Reading the
|
|
44
|
+
* request there is the documented way to partition an entry;
|
|
45
|
+
* - the router's `onError` (router/error-handling.ts invokeOnError): it
|
|
46
|
+
* observes, and a render error can reach it inside a capture or a cached
|
|
47
|
+
* scope.
|
|
48
|
+
*
|
|
49
|
+
* Scar: a ppr capture resolves its doc record key, and the record's tags,
|
|
50
|
+
* again under the capture context; once `ctx.request.headers` was guarded, a
|
|
51
|
+
* keyGenerator or tags() reading it refused every capture of the route.
|
|
52
|
+
*
|
|
53
|
+
* The exemption is async-local, so it would follow everything the callback
|
|
54
|
+
* starts. A "use cache" body (runWithCacheExecScope), a loader body
|
|
55
|
+
* (server/context.ts runInsideLoaderBodyScope) and a segment funnel
|
|
56
|
+
* (getContext().runWithStore) end it on entry (endIdentityExempt). Scar: a
|
|
57
|
+
* key() that awaited a "use cache" function reading cookies() stored the
|
|
58
|
+
* first visitor's cookie and served it to the next.
|
|
59
|
+
*/
|
|
60
|
+
export declare function runIdentityExempt<T>(fn: () => T): T;
|
|
61
|
+
/** True inside runIdentityExempt, and not in a scope started from it. */
|
|
62
|
+
export declare function isInsideIdentityExempt(): boolean;
|
|
63
|
+
/** Run `fn` with the identity exemption ended (see runIdentityExempt). */
|
|
64
|
+
export declare function endIdentityExempt<T>(fn: () => T): T;
|
|
34
65
|
/**
|
|
35
66
|
* Run fn with the "use cache" execution scope active. Continuations spawned
|
|
36
67
|
* from fn's synchronous kickoff inherit the scope; parallel chains do not.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Shared Cache Key Utilities
|
|
3
3
|
*
|
|
4
4
|
* Deterministic normalization of search params and route params
|
|
5
|
-
* for cache key generation
|
|
6
|
-
* document-cache, and loader-cache.
|
|
5
|
+
* for cache key generation, and the composition of nested cache() keys.
|
|
6
|
+
* Used by cache-runtime, cache-scope, document-cache, and loader-cache.
|
|
7
7
|
*/
|
|
8
8
|
import type { SearchParamsFilter } from "./search-params-filter.js";
|
|
9
9
|
/**
|
|
@@ -41,3 +41,49 @@ export declare function sortedRouteParams(params: Record<string, string> | undef
|
|
|
41
41
|
* tier-specific suffixes (`:rsc`/`:html`, segment hash) after this base.
|
|
42
42
|
*/
|
|
43
43
|
export declare function cacheKeyBase(host: string, pathname: string, searchParams?: URLSearchParams, params?: Record<string, string>, filter?: SearchParamsFilter): string;
|
|
44
|
+
/**
|
|
45
|
+
* The prefix of a `key()` result's part in a record key (#975), and of a
|
|
46
|
+
* loader's own `key()` result after its `loader:<id>:` namespace (#1009,
|
|
47
|
+
* loader-cache.ts loaderKeyFromResult).
|
|
48
|
+
*/
|
|
49
|
+
export declare const KEY_PART_PREFIX = "key:";
|
|
50
|
+
/**
|
|
51
|
+
* A cache() record key, or ppr shell partition, from its parts
|
|
52
|
+
* (CacheScope.resolveKeyFrom, CacheScope.resolvePartition): the `key()`
|
|
53
|
+
* results of the scope's cache() chain, outermost first, then its default
|
|
54
|
+
* parts: the keyGenerator results of enclosing scopes on another store
|
|
55
|
+
* (#974) and, for a record key under a scope without its own `key()`, its
|
|
56
|
+
* default key (or its store's keyGenerator result, #970).
|
|
57
|
+
*
|
|
58
|
+
* Key scheme invariant (#975). A `key()` result is often request input,
|
|
59
|
+
* and a record key has no route or scope discriminator (the store reads
|
|
60
|
+
* `store.get(key)`), so a result that equals another record's key writes
|
|
61
|
+
* one route's content under the other's entry. Before #975 a single
|
|
62
|
+
* `key()` result was stored raw: the header value `doc:localhost/pricing`
|
|
63
|
+
* named /pricing's default-keyed record, and `gold|doc%3Alocalhost%2Fpricing`
|
|
64
|
+
* named gold's nested /pricing record (#970). So every part is encoded:
|
|
65
|
+
*
|
|
66
|
+
* - a `key()` part is `key:` plus `encodeURIComponent(result)`: it starts
|
|
67
|
+
* with `key:` and holds no `|` and no other `:`;
|
|
68
|
+
* - a default part is `encodeURIComponent(value)`: it holds no `:` or `|`;
|
|
69
|
+
* an enclosing store's keyGenerator result equal to the default key is an
|
|
70
|
+
* empty part, so each store keeps its position (CacheScope
|
|
71
|
+
* positionalParts);
|
|
72
|
+
* - one `key()` part is the key; two or more parts are joined by `|`,
|
|
73
|
+
* `key()` parts first;
|
|
74
|
+
* - a lone default part stays raw: with no `key()` on the chain the record
|
|
75
|
+
* key is the default key or the store's keyGenerator result, unchanged.
|
|
76
|
+
*
|
|
77
|
+
* Why nothing collides: the router's default keys (`doc:`, `partial:`,
|
|
78
|
+
* `intercept:`, `response:<type>:`) never start with `key:` and hold a `:`.
|
|
79
|
+
* A namespaced `key()` result starts with `key:` and holds no `|`. A
|
|
80
|
+
* composed key holds a `|` and either starts with `key:` or holds no `:`.
|
|
81
|
+
* Among composed keys, splitting on `|` recovers each part, a part's kind
|
|
82
|
+
* (a `key:` prefix, or no `:` at all) and its value. Pinned by the collision
|
|
83
|
+
* probe in src/cache/__tests__/cache-scope-chain.test.ts. A keyGenerator
|
|
84
|
+
* result is the store's own namespace, as before.
|
|
85
|
+
*
|
|
86
|
+
* Shared with the testing helper `shellCacheKey`, so a test builds the
|
|
87
|
+
* production partition.
|
|
88
|
+
*/
|
|
89
|
+
export declare function composeCacheKeys(keyResults: readonly string[], defaultParts?: readonly string[]): string;
|
|
@@ -42,6 +42,23 @@ export declare function resolveTtl(explicit: number | undefined, defaults: Cache
|
|
|
42
42
|
* non-finite/negative (degrade rather than feed bad math into expiry).
|
|
43
43
|
*/
|
|
44
44
|
export declare function resolveSwrWindow(explicit: number | undefined, defaults: CacheDefaults | undefined): number;
|
|
45
|
+
/**
|
|
46
|
+
* Minimum age (ms) of a stale PPR shell before a HIT schedules its recapture.
|
|
47
|
+
* A shell capped to a route cache() record inside its swr window is stale
|
|
48
|
+
* from the start (rsc/shell-capture.ts capShellWindow), so without a floor
|
|
49
|
+
* every HIT of it recaptured, and a capture's store write is one KV write per
|
|
50
|
+
* key: Cloudflare KV accepts one per second per key. Inside the floor the
|
|
51
|
+
* stale shell is still served. Per isolate: each isolate's stale HIT past the
|
|
52
|
+
* floor can schedule one (stampede-guarded per isolate).
|
|
53
|
+
*/
|
|
54
|
+
export declare const SHELL_MIN_RECAPTURE_INTERVAL_MS = 1000;
|
|
55
|
+
/**
|
|
56
|
+
* Whether a stale shell HIT schedules its recapture (see the floor above).
|
|
57
|
+
* Fails open: an entry without a numeric `createdAt` recaptures.
|
|
58
|
+
*/
|
|
59
|
+
export declare function staleShellRecaptureDue(entry: {
|
|
60
|
+
readonly createdAt?: number;
|
|
61
|
+
}, now: number): boolean;
|
|
45
62
|
/**
|
|
46
63
|
* Compute staleAt and expiresAt timestamps from TTL and SWR window.
|
|
47
64
|
*
|
|
@@ -54,6 +71,6 @@ export declare function computeExpiration(ttlSeconds: number, swrSeconds?: numbe
|
|
|
54
71
|
staleAt: number;
|
|
55
72
|
expiresAt: number;
|
|
56
73
|
};
|
|
57
|
-
export declare function resolveCacheKey(keyFn: ((ctx: RequestContext) => string | Promise<string>) | undefined, store: SegmentCacheStore | null, defaultKey: string
|
|
74
|
+
export declare function resolveCacheKey(keyFn: ((ctx: RequestContext) => string | Promise<string>) | undefined, store: SegmentCacheStore | null, defaultKey: string): Promise<string>;
|
|
58
75
|
export declare function resolveTagsOption<TEnv>(tags: string[] | ((ctx: RequestContext<TEnv>) => string[]) | undefined, ctx: RequestContext<TEnv> | undefined, label: string): string[] | undefined;
|
|
59
76
|
export declare function resolveCacheStore(explicitStore: SegmentCacheStore | undefined): SegmentCacheStore | null;
|
|
@@ -40,6 +40,13 @@ export { isCachedFunction };
|
|
|
40
40
|
* identical arg sets.
|
|
41
41
|
*/
|
|
42
42
|
export declare function replyToCacheKey(encoded: string | FormData): Promise<string>;
|
|
43
|
+
/**
|
|
44
|
+
* @internal Reset this module's per-isolate state: the in-flight leaders a
|
|
45
|
+
* follower would join for up to IN_FLIGHT_LEADER_MAX_WAIT_MS, and the
|
|
46
|
+
* once-per-function warnings. Tests only (testing/serve-shell-request.ts
|
|
47
|
+
* resetShellTestState), never while a request is in flight.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resetCacheRuntimeForTests(): void;
|
|
43
50
|
/**
|
|
44
51
|
* Register a function as a cached function.
|
|
45
52
|
* Called by the Vite transform for each "use cache" function.
|