@rangojs/router 0.27.0 → 0.28.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 (212) hide show
  1. package/dist/bin/rango.js +1 -1
  2. package/dist/types/__internal.d.ts +7 -1
  3. package/dist/types/browser/event-controller.d.ts +2 -1
  4. package/dist/types/browser/history-state.d.ts +3 -9
  5. package/dist/types/browser/navigation-store.d.ts +8 -6
  6. package/dist/types/browser/react/filter-segment-order.d.ts +2 -2
  7. package/dist/types/browser/segment-reconciler.d.ts +6 -4
  8. package/dist/types/browser/types.d.ts +2 -1
  9. package/dist/types/browser/wire-protocol.d.ts +25 -0
  10. package/dist/types/cache/cache-key-utils.d.ts +11 -5
  11. package/dist/types/cache/cache-scope.d.ts +34 -22
  12. package/dist/types/cache/cf/cf-cache-constants.d.ts +2 -2
  13. package/dist/types/cache/cf/cf-cache-store.d.ts +47 -65
  14. package/dist/types/cache/cf/cf-kv-utils.d.ts +1 -1
  15. package/dist/types/cache/handle-snapshot.d.ts +9 -4
  16. package/dist/types/cache/segment-codec.d.ts +14 -0
  17. package/dist/types/cache/shell-snapshot.d.ts +1 -1
  18. package/dist/types/cache/tag-invalidation.d.ts +10 -0
  19. package/dist/types/cache/taint.d.ts +5 -3
  20. package/dist/types/cache/types.d.ts +7 -3
  21. package/dist/types/cache/vercel/vercel-cache-store.d.ts +8 -6
  22. package/dist/types/prefetch-markers.d.ts +5 -14
  23. package/dist/types/prerender/store.d.ts +31 -0
  24. package/dist/types/prerender/warm-request.d.ts +3 -3
  25. package/dist/types/prerender.d.ts +2 -2
  26. package/dist/types/route-name.d.ts +5 -0
  27. package/dist/types/router/error-handling.d.ts +4 -4
  28. package/dist/types/router/instrument.d.ts +4 -3
  29. package/dist/types/router/intercept-resolution.d.ts +25 -9
  30. package/dist/types/router/match-context.d.ts +4 -11
  31. package/dist/types/router/match-handlers.d.ts +2 -6
  32. package/dist/types/router/match-middleware/background-revalidation.d.ts +10 -20
  33. package/dist/types/router/match-middleware/cache-lookup.d.ts +34 -86
  34. package/dist/types/router/match-middleware/segment-resolution.d.ts +8 -6
  35. package/dist/types/router/prerender-match.d.ts +21 -6
  36. package/dist/types/router/preview-match.d.ts +2 -7
  37. package/dist/types/router/request-classification.d.ts +5 -0
  38. package/dist/types/router/router-context.d.ts +7 -46
  39. package/dist/types/router/router-interfaces.d.ts +8 -14
  40. package/dist/types/router/segment-resolution/loader-cache.d.ts +3 -3
  41. package/dist/types/router/segment-resolution/loader-mask.d.ts +4 -4
  42. package/dist/types/router/segment-resolution/prefetch-deferral.d.ts +20 -18
  43. package/dist/types/router/segment-resolution/resolution-pass.d.ts +93 -0
  44. package/dist/types/router/segment-resolution/revalidation.d.ts +82 -31
  45. package/dist/types/router/segment-resolution.d.ts +1 -2
  46. package/dist/types/router/segment-wrappers.d.ts +11 -48
  47. package/dist/types/router/telemetry.d.ts +2 -0
  48. package/dist/types/router/types.d.ts +10 -0
  49. package/dist/types/rsc/full-payload.d.ts +2 -2
  50. package/dist/types/rsc/handler-context.d.ts +6 -6
  51. package/dist/types/rsc/json-route-result.d.ts +5 -9
  52. package/dist/types/rsc/request-stages.d.ts +203 -0
  53. package/dist/types/rsc/response-cache-serve.d.ts +7 -12
  54. package/dist/types/rsc/response-route-handler.d.ts +2 -2
  55. package/dist/types/rsc/routine-plan.d.ts +1 -1
  56. package/dist/types/rsc/server-action.d.ts +2 -2
  57. package/dist/types/rsc/shell-capture-constants.d.ts +1 -1
  58. package/dist/types/rsc/shell-capture.d.ts +132 -15
  59. package/dist/types/rsc/shell-serve.d.ts +37 -12
  60. package/dist/types/server/context.d.ts +9 -8
  61. package/dist/types/server/handle-store.d.ts +16 -0
  62. package/dist/types/server/render-pass.d.ts +72 -0
  63. package/dist/types/server/request-context.d.ts +24 -104
  64. package/dist/types/server/rewrite-trail.d.ts +2 -2
  65. package/dist/types/testing/dispatch.d.ts +35 -18
  66. package/dist/types/types/cache-types.d.ts +6 -3
  67. package/dist/types/types/error-types.d.ts +9 -1
  68. package/dist/types/types/handler-context.d.ts +9 -1
  69. package/dist/types/types/segments.d.ts +1 -1
  70. package/dist/types/vite/discovery/build-discovery-phase.d.ts +40 -0
  71. package/dist/types/vite/discovery/build-env.d.ts +22 -0
  72. package/dist/types/vite/discovery/bundle-scan-phase.d.ts +12 -0
  73. package/dist/types/vite/discovery/dev-prerender-cache.d.ts +3 -2
  74. package/dist/types/vite/discovery/dev-server-phase.d.ts +26 -0
  75. package/dist/types/vite/discovery/discovery-errors.d.ts +1 -1
  76. package/dist/types/vite/discovery/state.d.ts +12 -0
  77. package/dist/types/vite/plugins/version-plugin.d.ts +1 -1
  78. package/dist/types/vite/plugins/virtual-entries.d.ts +1 -1
  79. package/dist/types/vite/router-discovery.d.ts +8 -47
  80. package/dist/types/vite/temp-rsc-server.d.ts +39 -0
  81. package/dist/types/vite/utils/prerender-utils.d.ts +9 -0
  82. package/dist/types/wire-params.d.ts +34 -0
  83. package/dist/vite/index.js +3809 -3710
  84. package/package.json +1 -1
  85. package/skills/cache-guide/SKILL.md +8 -5
  86. package/skills/caching/SKILL.md +37 -18
  87. package/skills/document-cache/SKILL.md +13 -1
  88. package/skills/handler-use/SKILL.md +1 -1
  89. package/skills/intercept/SKILL.md +17 -7
  90. package/skills/middleware/SKILL.md +18 -0
  91. package/skills/ppr/SKILL.md +18 -3
  92. package/skills/prerender/SKILL.md +39 -15
  93. package/skills/rango/SKILL.md +5 -1
  94. package/skills/server-actions/SKILL.md +8 -1
  95. package/skills/testing/response-routes.md +6 -4
  96. package/skills/use-cache/SKILL.md +46 -8
  97. package/src/__internal.ts +7 -1
  98. package/src/browser/connection-warmup.ts +3 -1
  99. package/src/browser/event-controller.ts +5 -3
  100. package/src/browser/history-state.ts +6 -12
  101. package/src/browser/navigation-bridge.ts +14 -13
  102. package/src/browser/navigation-client.ts +18 -25
  103. package/src/browser/navigation-store.ts +25 -27
  104. package/src/browser/navigation-transaction.ts +4 -1
  105. package/src/browser/prefetch/cache.ts +2 -1
  106. package/src/browser/prefetch/fetch.ts +8 -16
  107. package/src/browser/prefetch/queue.ts +4 -4
  108. package/src/browser/react/NavigationProvider.tsx +2 -1
  109. package/src/browser/react/filter-segment-order.ts +2 -2
  110. package/src/browser/rsc-router.tsx +1 -0
  111. package/src/browser/segment-reconciler.ts +66 -53
  112. package/src/browser/server-action-bridge.ts +50 -57
  113. package/src/browser/types.ts +2 -1
  114. package/src/browser/wire-protocol.ts +41 -0
  115. package/src/cache/cache-key-utils.ts +11 -5
  116. package/src/cache/cache-runtime.ts +110 -50
  117. package/src/cache/cache-scope.ts +110 -64
  118. package/src/cache/cf/cf-cache-constants.ts +2 -2
  119. package/src/cache/cf/cf-cache-store.ts +486 -874
  120. package/src/cache/cf/cf-kv-utils.ts +1 -1
  121. package/src/cache/document-cache.ts +34 -13
  122. package/src/cache/handle-snapshot.ts +19 -7
  123. package/src/cache/segment-codec.ts +55 -0
  124. package/src/cache/shell-snapshot.ts +2 -2
  125. package/src/cache/tag-invalidation.ts +21 -2
  126. package/src/cache/taint.ts +5 -3
  127. package/src/cache/types.ts +7 -3
  128. package/src/cache/vercel/vercel-cache-store.ts +243 -310
  129. package/src/handles/pushed-by.ts +1 -1
  130. package/src/prefetch-markers.ts +5 -16
  131. package/src/prerender/store.ts +76 -0
  132. package/src/prerender/warm-request.ts +8 -4
  133. package/src/prerender.ts +2 -2
  134. package/src/route-name.ts +8 -0
  135. package/src/router/error-handling.ts +4 -4
  136. package/src/router/instrument.ts +4 -3
  137. package/src/router/intercept-resolution.ts +77 -75
  138. package/src/router/loader-resolution.ts +5 -4
  139. package/src/router/match-api.ts +4 -5
  140. package/src/router/match-context.ts +20 -12
  141. package/src/router/match-handlers.ts +8 -20
  142. package/src/router/match-middleware/background-revalidation.ts +41 -53
  143. package/src/router/match-middleware/cache-lookup.ts +675 -726
  144. package/src/router/match-middleware/cache-store.ts +4 -8
  145. package/src/router/match-middleware/intercept-resolution.ts +3 -23
  146. package/src/router/match-middleware/segment-resolution.ts +34 -61
  147. package/src/router/middleware.ts +69 -11
  148. package/src/router/navigation-snapshot.ts +4 -4
  149. package/src/router/prerender-match.ts +100 -44
  150. package/src/router/preview-match.ts +6 -41
  151. package/src/router/request-classification.ts +13 -7
  152. package/src/router/route-snapshot.ts +2 -5
  153. package/src/router/router-context.ts +10 -95
  154. package/src/router/router-interfaces.ts +8 -14
  155. package/src/router/segment-resolution/loader-cache.ts +14 -9
  156. package/src/router/segment-resolution/loader-mask.ts +5 -5
  157. package/src/router/segment-resolution/prefetch-deferral.ts +30 -27
  158. package/src/router/segment-resolution/resolution-pass.ts +137 -0
  159. package/src/router/segment-resolution/revalidation.ts +897 -776
  160. package/src/router/segment-resolution.ts +4 -13
  161. package/src/router/segment-wrappers.ts +51 -269
  162. package/src/router/telemetry.ts +5 -0
  163. package/src/router/types.ts +10 -0
  164. package/src/router.ts +12 -13
  165. package/src/rsc/full-payload.ts +6 -5
  166. package/src/rsc/handler-context.ts +8 -14
  167. package/src/rsc/handler.ts +126 -507
  168. package/src/rsc/json-route-result.ts +5 -9
  169. package/src/rsc/loader-fetch.ts +6 -5
  170. package/src/rsc/progressive-enhancement.ts +5 -0
  171. package/src/rsc/request-stages.ts +757 -0
  172. package/src/rsc/response-cache-serve.ts +10 -14
  173. package/src/rsc/response-route-handler.ts +13 -5
  174. package/src/rsc/rewrite-passes.ts +2 -1
  175. package/src/rsc/routine-plan.ts +1 -1
  176. package/src/rsc/rsc-rendering.ts +164 -349
  177. package/src/rsc/server-action.ts +87 -113
  178. package/src/rsc/shell-capture-constants.ts +1 -1
  179. package/src/rsc/shell-capture.ts +212 -169
  180. package/src/rsc/shell-serve.ts +121 -18
  181. package/src/rsc/ssr-setup.ts +5 -4
  182. package/src/segment-system.tsx +3 -3
  183. package/src/server/context.ts +22 -25
  184. package/src/server/handle-store.ts +55 -0
  185. package/src/server/render-pass.ts +291 -0
  186. package/src/server/request-context.ts +26 -115
  187. package/src/server/rewrite-trail.ts +6 -4
  188. package/src/ssr/index.tsx +1 -1
  189. package/src/testing/dispatch.ts +223 -710
  190. package/src/testing/e2e/page-helpers.ts +2 -2
  191. package/src/testing/serve-shell-request.ts +23 -36
  192. package/src/types/cache-types.ts +6 -3
  193. package/src/types/error-types.ts +9 -1
  194. package/src/types/handler-context.ts +12 -1
  195. package/src/types/segments.ts +1 -1
  196. package/src/vite/discovery/build-discovery-phase.ts +204 -0
  197. package/src/vite/discovery/build-env.ts +148 -0
  198. package/src/vite/discovery/bundle-scan-phase.ts +128 -0
  199. package/src/vite/discovery/dev-prerender-cache.ts +8 -3
  200. package/src/vite/discovery/dev-server-phase.ts +1776 -0
  201. package/src/vite/discovery/discover-routers.ts +1 -1
  202. package/src/vite/discovery/discovery-errors.ts +1 -1
  203. package/src/vite/discovery/prerender-collection.ts +24 -39
  204. package/src/vite/discovery/state.ts +15 -0
  205. package/src/vite/plugins/version-plugin.ts +1 -1
  206. package/src/vite/plugins/virtual-entries.ts +1 -1
  207. package/src/vite/router-discovery.ts +29 -2428
  208. package/src/vite/temp-rsc-server.ts +223 -0
  209. package/src/vite/utils/prerender-utils.ts +47 -0
  210. package/src/wire-params.ts +35 -0
  211. package/dist/types/router/segment-resolution/fresh.d.ts +0 -72
  212. package/src/router/segment-resolution/fresh.ts +0 -945
@@ -437,7 +437,7 @@ async function discoverRoutersPass(
437
437
  // while runtime (trie-ranked: wildcard last) matches the real route and
438
438
  // misses the manifest — wrong-content bake for plain Prerender routes, a
439
439
  // guaranteed 404 once handler eviction runs. Dev never hits this because
440
- // propagateDiscoveryState (router-discovery.ts) pushes the same setters on
440
+ // propagateDiscoveryState (dev-server-phase.ts) pushes the same setters on
441
441
  // every discovery/HMR pass; configureServer early-returns in build mode, so
442
442
  // collection was the one findMatch consumer running trieless. Mirrors the
443
443
  // dev perRouterSetters loop; deliberately does NOT markRouterTrieAuthoritative
@@ -209,7 +209,7 @@ export interface DiscoveryFailureReport {
209
209
  * - a transient artifact of a Vite dependency re-optimization racing with boot
210
210
  * discovery (a module read before the entry import resolves to the
211
211
  * pre-optimize copy of the runner graph while createRouter() populated the
212
- * post-optimize copy — see router-discovery.ts).
212
+ * post-optimize copy — see dev-server-phase.ts).
213
213
  *
214
214
  * We can only tell them apart when the caller observed the dep optimizer's
215
215
  * `browserHash` change across the discovery attempt (`reoptimizeObserved`): a
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { contextSet, hasContextVars } from "../../context-var.js";
10
+ import { prerenderManifestEntries } from "../../prerender/store.js";
10
11
  import { sha256 } from "./build-versions.js";
11
12
  import {
12
13
  createGetParamsReverse,
@@ -17,6 +18,7 @@ import {
17
18
  notifyOnError,
18
19
  resolvePrerenderError,
19
20
  stageBuildAssetModule,
21
+ warnLiveIntercepts,
20
22
  } from "../utils/prerender-utils.js";
21
23
  import type { DiscoveryState } from "./state.js";
22
24
  import { createRangoDebugger, NS } from "../debug.js";
@@ -250,6 +252,7 @@ export async function expandPrerenderRoutes(
250
252
  const manifestEntries: Record<string, string> = {};
251
253
  let doneCount = 0;
252
254
  let skipCount = 0;
255
+ const warnedLiveIntercepts = new Set<string>();
253
256
  // #587: a render error reaches here (matchForPrerender now re-throws it rather
254
257
  // than baking the error boundary). Default "fail" fails the build; "warn" logs
255
258
  // and skips baking the URL.
@@ -288,20 +291,20 @@ export async function expandPrerenderRoutes(
288
291
  break;
289
292
  }
290
293
 
294
+ const stage = ([key, value]: [string, string]): void => {
295
+ manifestEntries[key] = stageBuildAssetModule(
296
+ state.projectRoot,
297
+ "__pr",
298
+ value,
299
+ );
300
+ recordBuildData(state, "prerender", key, value, { routerId });
301
+ };
291
302
  const paramHash = hashParams(result.params || {});
292
- const mainKey = `${result.routeName}/${paramHash}`;
293
- const mainValue = JSON.stringify({
294
- segments: result.segments,
295
- handles: result.handles,
296
- });
297
- manifestEntries[mainKey] = stageBuildAssetModule(
298
- state.projectRoot,
299
- "__pr",
300
- mainValue,
303
+ const [main, intercept] = prerenderManifestEntries(
304
+ result,
305
+ paramHash,
301
306
  );
302
- recordBuildData(state, "prerender", mainKey, mainValue, {
303
- routerId,
304
- });
307
+ stage(main);
305
308
  // Prerender + ppr composition: flag the URL as a build-time shell
306
309
  // candidate for the post-build capture phase (producer B, #699).
307
310
  // The payload JSON is retained in memory so that phase can seed an
@@ -313,38 +316,20 @@ export async function expandPrerenderRoutes(
313
316
  paramHash,
314
317
  ppr: result.ppr === true ? true : result.ppr,
315
318
  });
316
- (state.prerenderPayloadValues ??= new Map()).set(
317
- mainKey,
318
- mainValue,
319
- );
320
- }
321
- if (result.interceptSegments?.length) {
322
- const interceptKey = `${result.routeName}/${paramHash}/i`;
323
- const interceptValue = JSON.stringify({
324
- segments: [...result.segments, ...result.interceptSegments],
325
- // interceptHandles is the pre-encoded MERGED (main + intercept)
326
- // handle string (the producer merged before encoding).
327
- handles: result.interceptHandles ?? "",
328
- });
329
- manifestEntries[interceptKey] = stageBuildAssetModule(
330
- state.projectRoot,
331
- "__pr",
332
- interceptValue,
333
- );
334
- recordBuildData(
335
- state,
336
- "prerender",
337
- interceptKey,
338
- interceptValue,
339
- {
340
- routerId,
341
- },
342
- );
319
+ (state.prerenderPayloadValues ??= new Map()).set(...main);
343
320
  }
321
+ if (intercept) stage(intercept);
344
322
  const elapsed = (performance.now() - startUrl).toFixed(0);
345
323
  console.log(
346
324
  `[rango] OK ${entry.urlPath.padEnd(40)} (${elapsed}ms)`,
347
325
  );
326
+ warnLiveIntercepts(
327
+ warnedLiveIntercepts,
328
+ routerId,
329
+ result.routeName,
330
+ entry.urlPath,
331
+ result.liveIntercepts,
332
+ );
348
333
  doneCount++;
349
334
  break;
350
335
  } catch (err: any) {
@@ -124,6 +124,9 @@ export interface DiscoveryState {
124
124
  resolvedEntryPath: string | undefined;
125
125
  projectRoot: string;
126
126
  isBuildMode: boolean;
127
+ /** Vite's resolved command and mode (configResolved), for resolveBuildEnv. */
128
+ viteCommand: "serve" | "build";
129
+ viteMode: string;
127
130
  userResolveAlias: any;
128
131
  /**
129
132
  * Data-only slice of the user's resolved config (resolve.* incl. native
@@ -212,6 +215,15 @@ export interface DiscoveryState {
212
215
  devDiscoveryEpoch?: number;
213
216
  devServerOrigin: string | null;
214
217
  devServer: any;
218
+ /**
219
+ * Dev: the pending transition({ when }) definition error, re-sent as the
220
+ * Vite error overlay until a discovery succeeds (dev-server-phase.ts).
221
+ */
222
+ transitionWhenOverlay: {
223
+ message: string;
224
+ stack: string;
225
+ plugin: string;
226
+ } | null;
215
227
  selfWrittenGenFiles: Map<string, { at: number; hash: string }>;
216
228
  SELF_WRITE_WINDOW_MS: number;
217
229
 
@@ -261,6 +273,8 @@ export function createDiscoveryState(
261
273
  resolvedEntryPath: entryPath,
262
274
  projectRoot: "",
263
275
  isBuildMode: false,
276
+ viteCommand: "build",
277
+ viteMode: "production",
264
278
  userResolveAlias: undefined,
265
279
  userRunnerConfig: undefined,
266
280
  userResolvePlugins: [],
@@ -300,6 +314,7 @@ export function createDiscoveryState(
300
314
  devDiscoveryEpoch: opts?.preset === "cloudflare" ? Date.now() : undefined,
301
315
  devServerOrigin: null,
302
316
  devServer: null,
317
+ transitionWhenOverlay: null,
303
318
  selfWrittenGenFiles: new Map(),
304
319
  SELF_WRITE_WINDOW_MS: 5_000,
305
320
  lastDiscoveryError: null,
@@ -115,7 +115,7 @@ function getClientModuleSignature(
115
115
  * Build: exports a placeholder for the per-router versions table. The module
116
116
  * holds nothing that varies between builds; the table is written into the
117
117
  * built chunk after the server output is hashed (the buildApp post hook in
118
- * router-discovery.ts). See docs/design/per-app-cache-version.md.
118
+ * discovery/build-discovery-phase.ts). See docs/design/per-app-cache-version.md.
119
119
  * @internal
120
120
  */
121
121
  export function createVersionPlugin(): Plugin {
@@ -354,7 +354,7 @@ export function getVirtualVersionContent(version: string): string {
354
354
  /**
355
355
  * Free identifier the production version module ships in place of the table.
356
356
  * The versions are hashes of the built server code, so they cannot be part of
357
- * it: the buildApp post hook (router-discovery.ts) replaces this token in the
357
+ * it: the buildApp post hook (discovery/build-discovery-phase.ts) replaces this token in the
358
358
  * written chunk once the hashes are final (runRouterVersionsPhase,
359
359
  * discovery/router-versions-phase.ts). An unreplaced token throws a ReferenceError
360
360
  * when the module evaluates, so a build that skipped the step cannot serve