@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
@@ -36,7 +36,7 @@
36
36
  * |
37
37
  * v
38
38
  * +---------------------------+
39
- * | resolveAllSegments() | Fresh resolution (no revalidation)
39
+ * | FRESH segment pass | Fresh resolution (no revalidation)
40
40
  * | + resolveIntercepts() | Ensures complete components
41
41
  * +---------------------------+
42
42
  * |
@@ -94,14 +94,17 @@
94
94
  * FRESH RESOLUTION (NO REVALIDATION)
95
95
  * ===================================
96
96
  *
97
- * Both full and partial requests use resolveAllSegments() (without
97
+ * Both full and partial requests resolve with a FRESH pass (without
98
98
  * revalidation logic) to ensure all segments have complete components.
99
99
  * Using revalidation-aware resolution would produce null components
100
- * for skipped segments, which would corrupt the cache entry.
100
+ * for skipped segments, which would corrupt the cache entry. Under an
101
+ * intercept the walk still skips the intercepted route's entry, as the MISS
102
+ * does: an intercept: record never holds the route's page.
101
103
  */
102
104
  import type { ResolvedSegment } from "../../types.js";
103
105
  import type { MatchContext, MatchPipelineState } from "../match-context.js";
104
106
  import { getRouterContext, type RouterContext } from "../router-context.js";
107
+ import { interceptRecordKey } from "../intercept-resolution.js";
105
108
  import type { CacheScope } from "../../cache/cache-scope.js";
106
109
  import type { GeneratorMiddleware } from "./cache-lookup.js";
107
110
  import { debugLog, debugWarn, getOrCreateRequestId } from "../logging.js";
@@ -109,12 +112,16 @@ import { INTERNAL_RANGO_DEBUG } from "../../internal-debug.js";
109
112
  import { getContext } from "../../server/context.js";
110
113
  import { executionStart } from "../../cache/tag-invalidation.js";
111
114
  import {
112
- bindRes,
113
115
  createRequestContext,
114
116
  runWithRequestContext,
115
117
  type RequestContext,
116
118
  } from "../../server/request-context.js";
119
+ import { deriveRenderPass } from "../../server/render-pass.js";
117
120
  import { recordUse } from "../segment-resolution/prefetch-deferral.js";
121
+ import {
122
+ freshPassInput,
123
+ heldNothingPassInput,
124
+ } from "../segment-resolution/resolution-pass.js";
118
125
 
119
126
  /**
120
127
  * Re-render a cached route in the background and write it with
@@ -129,23 +136,11 @@ import { recordUse } from "../segment-resolution/prefetch-deferral.js";
129
136
  * MAX_REVALIDATION_INTERVAL, as after a refresh that throws.
130
137
  *
131
138
  * Runs on a DERIVED request context that owns the per-render state the
132
- * foreground reads while it is still producing the page (a stale HIT re-runs
133
- * its loaders; a proactive render starts once the Response exists, while its
134
- * body streams):
135
- * - _handleStore: read late (loader pushes and aux-lane tracking in
136
- * loader-resolution.ts, nested cache restores and captures in
137
- * cache-scope.ts), so a swap sent live pushes into this render.
138
- * setupLoaderAccess binds the store at setup, so it runs inside the
139
- * derived context too.
140
- * - _metricsStore: undefined, and the DSL store below has `metrics` unset
141
- * (track() reads that one), so nothing lands on the foreground's perf
142
- * timeline. ctx.Store.run closes over ctx.Store, so the derived store
143
- * needs its own run.
144
- * - response writes (headers, cookies, status, onResponse callbacks) go to
145
- * a throwaway context (whose status gates the write, above) and are
146
- * dropped: a layout above the cache() boundary is outside the header
147
- * guard and an error boundary sets a status, so they would otherwise
148
- * reach the live response.
139
+ * foreground reads while it is still producing the page:
140
+ * RENDER_PASS_FIELDS["background-revalidation"] (server/render-pass.ts) lists
141
+ * each field and why. The DSL store below has `metrics` unset too (track()
142
+ * reads that one), so nothing lands on the foreground's perf timeline;
143
+ * ctx.Store.run closes over ctx.Store, so the derived store needs its own run.
149
144
  * runWithRequestContext also re-establishes the request ALS, which a waitUntil
150
145
  * task on workerd loses; the DSL store is a different ALS (build context).
151
146
  */
@@ -157,8 +152,7 @@ export async function rerenderAndCacheRoute<TEnv>(
157
152
  ): Promise<number> {
158
153
  const start = executionStart();
159
154
  const handleStore = routerCtx.createHandleStore();
160
- // Response writes land in a throwaway context nothing merges or drains. Its
161
- // mutators are closures over its own stub, and they keep the same guards.
155
+ // Response writes land in a throwaway context nothing merges or drains.
162
156
  const sink = createRequestContext({
163
157
  env: ctx.env,
164
158
  request: ctx.request,
@@ -166,26 +160,10 @@ export async function rerenderAndCacheRoute<TEnv>(
166
160
  variables: {},
167
161
  themeConfig: requestCtx._themeConfig,
168
162
  });
169
- const renderCtx: RequestContext<TEnv> = Object.assign(
170
- Object.create(requestCtx),
171
- {
172
- _handleStore: handleStore,
173
- _metricsStore: undefined,
174
- _renderErrors: [],
175
- _recoveredHandlerErrors: undefined,
176
- _onResponseCallbacks: [],
177
- header: sink.header,
178
- setCookie: sink.setCookie,
179
- deleteCookie: sink.deleteCookie,
180
- setStatus: sink.setStatus,
181
- _setStatus: sink._setStatus,
182
- setTheme: sink.setTheme,
183
- _rotateStateCookie: sink._rotateStateCookie,
184
- _setKeepCacheDirective: sink._setKeepCacheDirective,
185
- },
186
- );
187
- // ctx.res reads the sink's stub, not the live request's.
188
- bindRes(renderCtx, () => sink.res);
163
+ const renderCtx = deriveRenderPass(requestCtx, "background-revalidation", {
164
+ handleStore,
165
+ sink,
166
+ });
189
167
  const store = Object.assign(Object.create(ctx.Store), { metrics: undefined });
190
168
  const runInStore = <T>(fn: () => T): T =>
191
169
  getContext().runWithStore(
@@ -210,26 +188,36 @@ export async function rerenderAndCacheRoute<TEnv>(
210
188
  const loaderPromises = new Map<string, Promise<any>>();
211
189
  routerCtx.setupLoaderAccess(handlerContext, loaderPromises);
212
190
 
213
- const segments = await runInStore(() =>
191
+ const { segments } = await runInStore(() =>
214
192
  routerCtx.resolveAllSegments(
193
+ freshPassInput(handlerContext, ctx.routeKey, ctx.matched.params, {
194
+ skipLoaders: true,
195
+ partialRequest: !ctx.isFullMatch,
196
+ }),
215
197
  ctx.entries,
216
- ctx.routeKey,
217
- ctx.matched.params,
218
- handlerContext,
219
- loaderPromises,
220
- { skipLoaders: true },
198
+ // Under an intercept the route's own entry is skipped, as on a MISS.
199
+ {
200
+ interceptResult: ctx.interceptResult,
201
+ localRouteName: ctx.localRouteName,
202
+ pathname: handlerContext.pathname,
203
+ },
221
204
  ),
222
205
  );
223
206
  if (ctx.interceptResult) {
224
207
  segments.push(
225
208
  ...(await runInStore(() =>
226
209
  routerCtx.resolveInterceptEntry(
210
+ // Nothing held: render fresh. Its loaders are skipped as the
211
+ // route's are: the record drops them.
212
+ heldNothingPassInput(
213
+ handlerContext,
214
+ ctx.interceptResult!.intercept.routeName,
215
+ ctx.matched.params,
216
+ { skipLoaders: true },
217
+ ),
227
218
  ctx.interceptResult!.intercept,
228
219
  ctx.interceptResult!.entry,
229
- ctx.matched.params,
230
- handlerContext,
231
220
  true, // belongsToRoute
232
- undefined, // no revalidationContext: render fresh
233
221
  // A handler error rejects, so the failure is never cached.
234
222
  { background: true },
235
223
  ),
@@ -251,7 +239,7 @@ export async function rerenderAndCacheRoute<TEnv>(
251
239
  ctx.pathname,
252
240
  ctx.matched.params,
253
241
  segments,
254
- ctx.isIntercept,
242
+ interceptRecordKey(ctx.interceptResult),
255
243
  start,
256
244
  );
257
245
  return segments.length;