@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
@@ -5,18 +5,13 @@
5
5
  * matched entry tree, condition eval, key resolution (route key() > store
6
6
  * keyGenerator > default, CacheScope.resolveKeyFrom), tag resolution,
7
7
  * pre-handler-callback timing, and the fresh-hit / SWR-revalidate /
8
- * miss-write branches — for BOTH the production
9
- * response-route handler (rsc/response-route-handler.ts) and the dispatch testing
10
- * primitive (testing/dispatch.ts), so the two can never drift.
8
+ * miss-write branches — for the response-route handler
9
+ * (rsc/response-route-handler.ts), which the production handler and the
10
+ * dispatch testing primitive both run (rsc/request-stages.ts
11
+ * serveResponseRoute), so the two can never drift.
11
12
  *
12
- * Plugin-rsc hazard: cache-scope.ts pulls @vitejs/plugin-rsc (via segment-codec),
13
- * which the non-Vite unit-test runner cannot resolve, and this module is on the
14
- * testing barrel's EAGER graph (dispatch imports it). So `createCacheScope` is
15
- * NOT imported here at runtime — it is INJECTED by the caller (production
16
- * imports it statically; dispatch lazy-imports it only once a response route
17
- * matches). The only runtime imports here are plugin-rsc-free
18
- * (helpers' isCacheableStatus/finalizeResponse, traverseBack); cache-scope is a
19
- * type-only import (erased at build).
13
+ * `createCacheScope` is injected by the caller: the response-route handler
14
+ * passes the real one, unit tests a stub.
20
15
  */
21
16
 
22
17
  import { isRewrite } from "../route-definition/rewrite.js";
@@ -44,7 +39,7 @@ import {
44
39
  } from "../cache/tag-invalidation.js";
45
40
  import { hasPerClientSignal } from "../browser/cookie-name.js";
46
41
 
47
- /** Injected cache-scope builder (kept off this module's runtime import graph). */
42
+ /** Injected cache-scope builder. */
48
43
  export interface CacheScopeDeps {
49
44
  createCacheScope: (
50
45
  config: EntryCacheConfig | undefined,
@@ -110,8 +105,9 @@ export async function serveResponseRouteWithCache(
110
105
  let cacheKey = `response:${responseType}:${requestKeyBase(reqCtx, url.host, url.pathname, url.searchParams, undefined, reqCtx._searchParamsFilter)}`;
111
106
 
112
107
  // Keyed like the segment record (CacheScope.resolveKeyFrom): with key()
113
- // results on the cache() chain (a full override, namespaced, #975) or an
114
- // enclosing scope on another store whose keyGenerator partitions (#974),
108
+ // results on the cache() chain (they replace the URL part, namespaced,
109
+ // #975; a response entry has no request kind to keep) or an enclosing
110
+ // scope on another store whose keyGenerator partitions (#974),
115
111
  // `response:` plus the composed key, so a nested cache() never shares an
116
112
  // entry across the enclosing partitions (#970); otherwise the store's
117
113
  // keyGenerator result (it modifies the default key), else the default key.
@@ -24,7 +24,7 @@ import {
24
24
  assertNonCacheableReadAllowed,
25
25
  type EntryData,
26
26
  } from "../server/context.js";
27
- import type { HandlerContext } from "./handler-context.js";
27
+ import type { RequestStageContext } from "./request-stages.js";
28
28
  import { createProblemDetails } from "./response-error.js";
29
29
  import {
30
30
  createReloadResponse,
@@ -36,6 +36,7 @@ import {
36
36
  } from "./helpers.js";
37
37
  import { isWebSocketUpgradeResponse } from "../response-utils.js";
38
38
  import { stringifyJsonRouteResult } from "./json-route-result.js";
39
+ import { WIRE } from "../wire-params.js";
39
40
 
40
41
  export interface ResponseRouteMatch {
41
42
  responseType: string;
@@ -57,14 +58,17 @@ export interface ResponseRouteMatch {
57
58
  * so the browser triggers a hard navigation to the response route URL.
58
59
  */
59
60
  export async function handleResponseRoute<TEnv>(
60
- handlerCtx: HandlerContext<TEnv>,
61
+ handlerCtx: Pick<
62
+ RequestStageContext<TEnv>,
63
+ "callOnError" | "getRequiredRouteMap" | "reportResponseRouteError"
64
+ >,
61
65
  preview: ResponseRouteMatch,
62
66
  request: Request,
63
67
  env: TEnv,
64
68
  url: URL,
65
69
  variables: Record<string, any>,
66
70
  ): Promise<Response> {
67
- const isPartial = url.searchParams.has("_rsc_partial");
71
+ const isPartial = url.searchParams.has(WIRE.partial);
68
72
 
69
73
  // Partial requests (client-side navigation) to response routes
70
74
  // get X-RSC-Reload to trigger hard navigation in the browser
@@ -122,7 +126,7 @@ export async function handleResponseRoute<TEnv>(
122
126
  // Runtime guard: the json() return type rejects nested Promises at
123
127
  // compile time, but an `as`-cast or untyped (JS) handler can still slip
124
128
  // one through. stringifyJsonRouteResult throws a clear error instead of
125
- // shipping empty data (shared with dispatch() so the two cannot drift).
129
+ // shipping empty data.
126
130
  const body = stringifyJsonRouteResult(result);
127
131
  return createResponseWithMergedHeaders(body, {
128
132
  status: 200,
@@ -145,7 +149,11 @@ export async function handleResponseRoute<TEnv>(
145
149
  `Response route handler for "${preview.responseType}" must return a Response object, got ${typeof result}`,
146
150
  );
147
151
  } catch (error) {
148
- handlerCtx.callOnError(error, "handler", errorCtx);
152
+ if (handlerCtx.reportResponseRouteError) {
153
+ handlerCtx.reportResponseRouteError(error, errorCtx);
154
+ } else {
155
+ handlerCtx.callOnError(error, "handler", errorCtx);
156
+ }
149
157
  const isDev = process.env.NODE_ENV !== "production";
150
158
  const derivedStatus = error instanceof RouterError ? error.status : 500;
151
159
  // Resolve the effective status the same way createResponseWithMergedHeaders
@@ -26,6 +26,7 @@ import {
26
26
  recordRewriteHop,
27
27
  recordRewriteShell,
28
28
  } from "../server/rewrite-trail.js";
29
+ import { WIRE } from "../wire-params.js";
29
30
 
30
31
  /** Response header naming the route path a rewritten request rendered. */
31
32
  export const REWRITE_HEADER = "x-rango-rewrite";
@@ -138,7 +139,7 @@ export function applyRewrite(
138
139
  ): RewritePass {
139
140
  // A loader fetch first: `load()` with a body is a POST, and its refusal
140
141
  // is the loader fetch's.
141
- if (reqCtx.originalUrl.searchParams.has("_rsc_loader")) {
142
+ if (reqCtx.originalUrl.searchParams.has(WIRE.loader)) {
142
143
  throw rewriteNotSupported(rewrite, "loader-fetch");
143
144
  }
144
145
  if (passRequest.method !== "GET" && passRequest.method !== "HEAD") {
@@ -74,7 +74,7 @@ export function* step<T>(
74
74
  *
75
75
  * Settlement tracking follows the RETURNED value: a returned promise is
76
76
  * observed until it settles; a scheduler that fires-and-forgets internally
77
- * (e.g. scheduleShellCapture via runBackground) returns void, so its trace
77
+ * (e.g. planShellCapture via runBackground) returns void, so its trace
78
78
  * entry settles at the scheduling call, not at background completion. That is
79
79
  * deliberate — the plan's contract ends at the handoff.
80
80
  */