@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.
Files changed (293) hide show
  1. package/README.md +3 -2
  2. package/dist/types/browser/cookie-name.d.ts +6 -0
  3. package/dist/types/browser/event-controller.d.ts +3 -3
  4. package/dist/types/browser/history-state.d.ts +18 -0
  5. package/dist/types/browser/navigation-transaction.d.ts +20 -2
  6. package/dist/types/browser/partial-update.d.ts +16 -1
  7. package/dist/types/browser/prefetch/cache.d.ts +6 -6
  8. package/dist/types/browser/react/Link.d.ts +19 -9
  9. package/dist/types/browser/react/context.d.ts +2 -2
  10. package/dist/types/browser/react/location-state-shared.d.ts +95 -56
  11. package/dist/types/browser/react/location-state.d.ts +1 -1
  12. package/dist/types/browser/transition-when.d.ts +80 -0
  13. package/dist/types/browser/types.d.ts +104 -9
  14. package/dist/types/build/generate-manifest.d.ts +8 -0
  15. package/dist/types/cache/background-task.d.ts +24 -2
  16. package/dist/types/cache/cache-exec-scope.d.ts +31 -0
  17. package/dist/types/cache/cache-key-utils.d.ts +48 -2
  18. package/dist/types/cache/cache-policy.d.ts +18 -1
  19. package/dist/types/cache/cache-runtime.d.ts +7 -0
  20. package/dist/types/cache/cache-scope.d.ts +192 -26
  21. package/dist/types/cache/cache-tag.d.ts +116 -11
  22. package/dist/types/cache/cf/cf-base64.d.ts +6 -0
  23. package/dist/types/cache/cf/cf-cache-constants.d.ts +11 -0
  24. package/dist/types/cache/cf/cf-cache-store.d.ts +224 -72
  25. package/dist/types/cache/cf/cf-cache-types.d.ts +31 -4
  26. package/dist/types/cache/cf/cf-shell-frame.d.ts +95 -0
  27. package/dist/types/cache/cf/cf-tag-marker-memo.d.ts +19 -0
  28. package/dist/types/cache/document-cache.d.ts +10 -0
  29. package/dist/types/cache/handle-snapshot.d.ts +41 -8
  30. package/dist/types/cache/index.d.ts +1 -0
  31. package/dist/types/cache/invalidation-order.d.ts +23 -0
  32. package/dist/types/cache/isolate-tag-memo.d.ts +149 -0
  33. package/dist/types/cache/request-tag-mask.d.ts +54 -0
  34. package/dist/types/cache/shell-memo.d.ts +178 -0
  35. package/dist/types/cache/shell-snapshot.d.ts +141 -105
  36. package/dist/types/cache/tag-invalidation.d.ts +54 -3
  37. package/dist/types/cache/types.d.ts +267 -96
  38. package/dist/types/cache/vercel/vercel-cache-store.d.ts +123 -18
  39. package/dist/types/client-urls/navigation.d.ts +28 -2
  40. package/dist/types/client-urls/server-projection.d.ts +5 -2
  41. package/dist/types/client-urls/types.d.ts +5 -5
  42. package/dist/types/client.d.ts +1 -1
  43. package/dist/types/index.d.ts +1 -1
  44. package/dist/types/index.rsc.d.ts +1 -1
  45. package/dist/types/prerender/build-shell-capture.d.ts +11 -4
  46. package/dist/types/route-definition/helpers-types.d.ts +11 -11
  47. package/dist/types/route-name.d.ts +7 -0
  48. package/dist/types/router/error-handling.d.ts +1 -1
  49. package/dist/types/router/instrument.d.ts +8 -0
  50. package/dist/types/router/intercept-resolution.d.ts +2 -0
  51. package/dist/types/router/match-context.d.ts +5 -0
  52. package/dist/types/router/match-middleware/background-revalidation.d.ts +0 -4
  53. package/dist/types/router/middleware-types.d.ts +6 -1
  54. package/dist/types/router/router-options.d.ts +4 -1
  55. package/dist/types/router/segment-resolution/loader-cache.d.ts +58 -12
  56. package/dist/types/router/segment-resolution/loader-mask.d.ts +3 -4
  57. package/dist/types/router/segment-resolution/loader-snapshot.d.ts +33 -48
  58. package/dist/types/router/segment-resolution/mask-nested.d.ts +73 -24
  59. package/dist/types/router/segment-resolution/view-transition-default.d.ts +7 -5
  60. package/dist/types/router/transition-when.d.ts +24 -10
  61. package/dist/types/rsc/attach-transition-when.d.ts +18 -0
  62. package/dist/types/rsc/full-payload.d.ts +21 -0
  63. package/dist/types/rsc/handler.d.ts +1 -1
  64. package/dist/types/rsc/response-cache-serve.d.ts +15 -12
  65. package/dist/types/rsc/shell-build-manifest.d.ts +12 -3
  66. package/dist/types/rsc/shell-capture-constants.d.ts +116 -12
  67. package/dist/types/rsc/shell-capture.d.ts +202 -74
  68. package/dist/types/rsc/shell-serve.d.ts +144 -50
  69. package/dist/types/rsc/types.d.ts +9 -0
  70. package/dist/types/segment-system.d.ts +7 -0
  71. package/dist/types/server/context.d.ts +155 -33
  72. package/dist/types/server/cookie-store.d.ts +33 -0
  73. package/dist/types/server/handle-store.d.ts +52 -1
  74. package/dist/types/server/request-context.d.ts +210 -63
  75. package/dist/types/server/request-headers.d.ts +44 -0
  76. package/dist/types/server.d.ts +1 -0
  77. package/dist/types/ssr/index.d.ts +9 -0
  78. package/dist/types/ssr/ssr-root.d.ts +9 -8
  79. package/dist/types/testing/e2e/index.d.ts +1 -1
  80. package/dist/types/testing/flight.entry.d.ts +7 -0
  81. package/dist/types/testing/index.d.ts +3 -2
  82. package/dist/types/testing/internal/action-id.d.ts +7 -0
  83. package/dist/types/testing/location-state-key.d.ts +24 -0
  84. package/dist/types/testing/render-route.d.ts +17 -1
  85. package/dist/types/testing/run-loader.d.ts +18 -3
  86. package/dist/types/testing/run-transition-when.d.ts +44 -69
  87. package/dist/types/testing/serve-shell-request.d.ts +133 -0
  88. package/dist/types/testing/shell-status.d.ts +44 -19
  89. package/dist/types/transition-when-ref.d.ts +79 -0
  90. package/dist/types/types/cache-types.d.ts +15 -3
  91. package/dist/types/types/handler-context.d.ts +14 -1
  92. package/dist/types/types/index.d.ts +1 -1
  93. package/dist/types/types/segments.d.ts +86 -71
  94. package/dist/types/urls/path-helper-types.d.ts +3 -4
  95. package/dist/types/urls/pattern-types.d.ts +21 -18
  96. package/dist/types/vite/plugins/transition-when-hoist.d.ts +45 -0
  97. package/dist/types/vite/router-discovery.d.ts +29 -2
  98. package/dist/vite/index.js +1005 -105
  99. package/package.json +1 -1
  100. package/skills/breadcrumbs/SKILL.md +17 -7
  101. package/skills/cache-guide/SKILL.md +175 -76
  102. package/skills/caching/SKILL.md +361 -33
  103. package/skills/catalog.json +1 -1
  104. package/skills/client-urls/SKILL.md +12 -7
  105. package/skills/cloudflare/SKILL.md +15 -0
  106. package/skills/comparison/references/framework-comparison.md +52 -37
  107. package/skills/defer-hydration/SKILL.md +50 -30
  108. package/skills/deployment-caching/SKILL.md +5 -2
  109. package/skills/document-cache/SKILL.md +32 -2
  110. package/skills/handler-use/SKILL.md +2 -0
  111. package/skills/hooks/SKILL.md +3 -1
  112. package/skills/hooks/handle-and-actions.md +3 -1
  113. package/skills/hooks/navigation.md +23 -2
  114. package/skills/hooks/state.md +101 -7
  115. package/skills/intercept/SKILL.md +29 -12
  116. package/skills/loader/SKILL.md +197 -44
  117. package/skills/middleware/SKILL.md +34 -9
  118. package/skills/migrate-nextjs/SKILL.md +68 -37
  119. package/skills/migrate-react-router/SKILL.md +2 -1
  120. package/skills/migrate-react-router/component-migration.md +3 -1
  121. package/skills/migrate-react-router/data-and-actions.md +3 -1
  122. package/skills/migrate-react-router/route-mapping.md +7 -4
  123. package/skills/observability/SKILL.md +65 -0
  124. package/skills/parallel/SKILL.md +13 -8
  125. package/skills/ppr/SKILL.md +715 -371
  126. package/skills/prerender/SKILL.md +30 -17
  127. package/skills/rango/SKILL.md +72 -34
  128. package/skills/route/SKILL.md +14 -7
  129. package/skills/router-setup/SKILL.md +4 -2
  130. package/skills/scripts/SKILL.md +8 -1
  131. package/skills/server-actions/SKILL.md +11 -0
  132. package/skills/shell-manifest/SKILL.md +21 -12
  133. package/skills/testing/SKILL.md +49 -43
  134. package/skills/testing/cache-prerender.md +15 -14
  135. package/skills/testing/client-components.md +45 -3
  136. package/skills/testing/loader.md +19 -1
  137. package/skills/testing/middleware.md +1 -0
  138. package/skills/testing/predicates.md +49 -49
  139. package/skills/testing/render-handler.md +1 -0
  140. package/skills/testing/serve-shell-request.md +202 -0
  141. package/skills/testing/server-actions.md +9 -3
  142. package/skills/theme/SKILL.md +56 -4
  143. package/skills/typesafety/env-and-bindings.md +18 -2
  144. package/skills/use-cache/SKILL.md +91 -23
  145. package/skills/vercel/SKILL.md +14 -2
  146. package/skills/view-transitions/SKILL.md +150 -29
  147. package/src/__augment-tests__/augmented.check.ts +23 -0
  148. package/src/browser/cookie-name.ts +23 -0
  149. package/src/browser/event-controller.ts +4 -4
  150. package/src/browser/history-state.ts +75 -1
  151. package/src/browser/link-interceptor.ts +4 -0
  152. package/src/browser/navigation-bridge.ts +77 -18
  153. package/src/browser/navigation-client.ts +4 -3
  154. package/src/browser/navigation-store.ts +43 -1
  155. package/src/browser/navigation-transaction.ts +31 -11
  156. package/src/browser/partial-update.ts +146 -35
  157. package/src/browser/prefetch/cache.ts +6 -6
  158. package/src/browser/prefetch/fetch.ts +2 -2
  159. package/src/browser/react/Link.tsx +38 -33
  160. package/src/browser/react/NavigationProvider.tsx +2 -2
  161. package/src/browser/react/context.ts +2 -2
  162. package/src/browser/react/location-state-shared.ts +241 -49
  163. package/src/browser/react/location-state.ts +5 -2
  164. package/src/browser/rsc-router.tsx +9 -0
  165. package/src/browser/server-action-bridge.ts +84 -15
  166. package/src/browser/transition-when.ts +205 -0
  167. package/src/browser/types.ts +124 -10
  168. package/src/build/generate-manifest.ts +77 -1
  169. package/src/cache/background-task.ts +55 -2
  170. package/src/cache/cache-exec-scope.ts +48 -1
  171. package/src/cache/cache-key-utils.ts +62 -2
  172. package/src/cache/cache-policy.ts +31 -4
  173. package/src/cache/cache-runtime.ts +209 -129
  174. package/src/cache/cache-scope.ts +573 -69
  175. package/src/cache/cache-tag.ts +475 -19
  176. package/src/cache/cf/cf-base64.ts +36 -4
  177. package/src/cache/cf/cf-cache-constants.ts +12 -0
  178. package/src/cache/cf/cf-cache-store.ts +1094 -376
  179. package/src/cache/cf/cf-cache-types.ts +32 -4
  180. package/src/cache/cf/cf-shell-frame.ts +258 -0
  181. package/src/cache/cf/cf-tag-marker-memo.ts +55 -40
  182. package/src/cache/document-cache.ts +53 -7
  183. package/src/cache/handle-snapshot.ts +53 -9
  184. package/src/cache/index.ts +2 -0
  185. package/src/cache/invalidation-order.ts +84 -0
  186. package/src/cache/isolate-tag-memo.ts +308 -0
  187. package/src/cache/request-tag-mask.ts +147 -0
  188. package/src/cache/shell-memo.ts +341 -0
  189. package/src/cache/shell-snapshot.ts +249 -277
  190. package/src/cache/tag-invalidation.ts +109 -18
  191. package/src/cache/types.ts +274 -102
  192. package/src/cache/vercel/vercel-cache-store.ts +561 -74
  193. package/src/client-urls/client-root.tsx +8 -4
  194. package/src/client-urls/client-urls.ts +8 -6
  195. package/src/client-urls/navigation.ts +55 -4
  196. package/src/client-urls/server-projection.ts +31 -10
  197. package/src/client-urls/types.ts +12 -5
  198. package/src/client.tsx +2 -0
  199. package/src/host/cookie-handler.ts +2 -1
  200. package/src/index.rsc.ts +3 -0
  201. package/src/index.ts +3 -0
  202. package/src/loader-redirect.tsx +7 -3
  203. package/src/prerender/build-shell-capture.ts +173 -110
  204. package/src/route-definition/dsl-helpers.ts +6 -3
  205. package/src/route-definition/helpers-types.ts +11 -11
  206. package/src/route-name.ts +12 -0
  207. package/src/router/content-negotiation.ts +4 -1
  208. package/src/router/error-handling.ts +5 -2
  209. package/src/router/handler-context.ts +42 -5
  210. package/src/router/instrument.ts +54 -2
  211. package/src/router/intercept-resolution.ts +30 -8
  212. package/src/router/loader-resolution.ts +89 -33
  213. package/src/router/logging.ts +5 -3
  214. package/src/router/match-api.ts +89 -42
  215. package/src/router/match-context.ts +5 -0
  216. package/src/router/match-handlers.ts +14 -29
  217. package/src/router/match-middleware/background-revalidation.ts +3 -5
  218. package/src/router/match-middleware/cache-lookup.ts +52 -19
  219. package/src/router/match-middleware/cache-store.ts +36 -10
  220. package/src/router/match-result.ts +1 -0
  221. package/src/router/middleware-types.ts +6 -1
  222. package/src/router/middleware.ts +20 -4
  223. package/src/router/navigation-snapshot.ts +6 -5
  224. package/src/router/prerender-match.ts +10 -0
  225. package/src/router/request-classification.ts +7 -4
  226. package/src/router/router-options.ts +4 -1
  227. package/src/router/segment-resolution/fresh.ts +18 -13
  228. package/src/router/segment-resolution/helpers.ts +4 -2
  229. package/src/router/segment-resolution/loader-cache.ts +366 -70
  230. package/src/router/segment-resolution/loader-mask.ts +3 -4
  231. package/src/router/segment-resolution/loader-snapshot.ts +215 -126
  232. package/src/router/segment-resolution/mask-nested.ts +161 -42
  233. package/src/router/segment-resolution/revalidation.ts +27 -13
  234. package/src/router/segment-resolution/view-transition-default.ts +6 -21
  235. package/src/router/telemetry.ts +6 -3
  236. package/src/router/transition-when.ts +34 -52
  237. package/src/router.ts +2 -1
  238. package/src/rsc/attach-transition-when.ts +47 -0
  239. package/src/rsc/full-payload.ts +47 -3
  240. package/src/rsc/handler.ts +24 -10
  241. package/src/rsc/loader-fetch.ts +2 -1
  242. package/src/rsc/manifest-init.ts +4 -0
  243. package/src/rsc/origin-guard.ts +8 -5
  244. package/src/rsc/progressive-enhancement.ts +10 -32
  245. package/src/rsc/response-cache-serve.ts +69 -78
  246. package/src/rsc/response-route-handler.ts +2 -2
  247. package/src/rsc/rsc-rendering.ts +712 -338
  248. package/src/rsc/server-action.ts +8 -20
  249. package/src/rsc/shell-build-manifest.ts +49 -29
  250. package/src/rsc/shell-capture-constants.ts +182 -12
  251. package/src/rsc/shell-capture.ts +1126 -612
  252. package/src/rsc/shell-serve.ts +331 -85
  253. package/src/rsc/ssr-setup.ts +3 -2
  254. package/src/rsc/types.ts +9 -0
  255. package/src/segment-system.tsx +40 -7
  256. package/src/server/context.ts +328 -72
  257. package/src/server/cookie-store.ts +184 -133
  258. package/src/server/handle-store.ts +245 -27
  259. package/src/server/request-context.ts +364 -100
  260. package/src/server/request-headers.ts +134 -0
  261. package/src/server.ts +4 -0
  262. package/src/ssr/index.tsx +96 -37
  263. package/src/ssr/ssr-root.tsx +9 -8
  264. package/src/testing/dispatch.ts +4 -7
  265. package/src/testing/e2e/index.ts +1 -0
  266. package/src/testing/flight.entry.ts +14 -0
  267. package/src/testing/index.ts +5 -0
  268. package/src/testing/internal/action-id.ts +25 -0
  269. package/src/testing/internal/context.ts +1 -1
  270. package/src/testing/location-state-key.ts +45 -0
  271. package/src/testing/render-handler.ts +1 -1
  272. package/src/testing/render-route.tsx +109 -16
  273. package/src/testing/run-client-revalidate.ts +3 -19
  274. package/src/testing/run-loader.ts +67 -5
  275. package/src/testing/run-transition-when.ts +109 -172
  276. package/src/testing/serve-shell-request.ts +381 -0
  277. package/src/testing/shell-status.ts +73 -47
  278. package/src/theme/ThemeProvider.tsx +7 -6
  279. package/src/transition-when-ref.ts +220 -0
  280. package/src/types/cache-types.ts +15 -3
  281. package/src/types/handler-context.ts +14 -1
  282. package/src/types/index.ts +3 -0
  283. package/src/types/segments.ts +94 -91
  284. package/src/urls/path-helper-types.ts +3 -4
  285. package/src/urls/pattern-types.ts +21 -18
  286. package/src/vite/discovery/discover-routers.ts +3 -0
  287. package/src/vite/discovery/shell-prerender-phase.ts +9 -2
  288. package/src/vite/discovery/virtual-module-codegen.ts +16 -6
  289. package/src/vite/plugins/transition-when-hoist.ts +1064 -0
  290. package/src/vite/rango.ts +2 -0
  291. package/src/vite/router-discovery.ts +89 -9
  292. package/dist/types/rsc/transition-gate.d.ts +0 -23
  293. 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
- * State value for navigate/Link
269
- * - LocationStateEntry[]: Type-safe state entries (recommended)
270
- * - unknown: Plain state format (object or getter function)
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 HistoryState = import("./react/location-state-shared.js").LocationStateEntry[] | unknown;
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
- * // Plain just-in-time state
320
- * navigate("/product", { state: () => ({ from: window.location.pathname }) });
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
- /** @internal Extended options used only within the navigation bridge */
326
- export interface NavigateOptionsInternal extends NavigateOptions {
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?: NavigateOptions): Promise<void>;
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
- * When waitUntil is unavailable, falls back to blocking or skipping.
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. Used by cache-runtime, cache-scope,
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, _label: string): Promise<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.