@qzsy/vinext 0.1.11 → 0.1.80

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 (225) hide show
  1. package/README.md +19 -5
  2. package/dist/build/inject-pregenerated-paths.d.ts +4 -0
  3. package/dist/build/inject-pregenerated-paths.js +18 -0
  4. package/dist/build/pages-client-assets-module.d.ts +11 -0
  5. package/dist/build/pages-client-assets-module.js +27 -0
  6. package/dist/build/prerender.d.ts +2 -1
  7. package/dist/build/prerender.js +11 -4
  8. package/dist/build/report.d.ts +2 -1
  9. package/dist/build/report.js +2 -1
  10. package/dist/build/run-prerender.d.ts +7 -0
  11. package/dist/build/run-prerender.js +9 -0
  12. package/dist/build/standalone.js +2 -0
  13. package/dist/check.d.ts +18 -0
  14. package/dist/check.js +77 -19
  15. package/dist/cli-dev-config.d.ts +12 -0
  16. package/dist/cli-dev-config.js +23 -0
  17. package/dist/cli.js +64 -28
  18. package/dist/{server → client}/dev-error-overlay-store.d.ts +1 -1
  19. package/dist/{server → client}/dev-error-overlay-store.js +1 -1
  20. package/dist/{server → client}/dev-error-overlay.d.ts +1 -1
  21. package/dist/{server → client}/dev-error-overlay.js +2 -2
  22. package/dist/cloudflare/deploy-config.d.ts +51 -0
  23. package/dist/cloudflare/deploy-config.js +153 -0
  24. package/dist/cloudflare/index.d.ts +1 -1
  25. package/dist/cloudflare/index.js +1 -1
  26. package/dist/cloudflare/project.d.ts +41 -0
  27. package/dist/cloudflare/project.js +243 -0
  28. package/dist/cloudflare/tpr.js +1 -1
  29. package/dist/config/config-matchers.js +14 -10
  30. package/dist/config/next-config.d.ts +6 -3
  31. package/dist/config/next-config.js +47 -1
  32. package/dist/config/server-external-packages.d.ts +4 -0
  33. package/dist/config/server-external-packages.js +91 -0
  34. package/dist/deploy.d.ts +2 -122
  35. package/dist/deploy.js +20 -793
  36. package/dist/entries/app-rsc-entry.d.ts +2 -1
  37. package/dist/entries/app-rsc-entry.js +70 -12
  38. package/dist/entries/app-rsc-manifest.js +8 -0
  39. package/dist/entries/pages-client-entry.d.ts +1 -0
  40. package/dist/entries/pages-client-entry.js +2 -1
  41. package/dist/entries/pages-server-entry.js +6 -2
  42. package/dist/image/image-adapters-virtual.d.ts +59 -0
  43. package/dist/image/image-adapters-virtual.js +50 -0
  44. package/dist/index.d.ts +12 -0
  45. package/dist/index.js +158 -109
  46. package/dist/init-cloudflare.d.ts +43 -0
  47. package/dist/init-cloudflare.js +1000 -0
  48. package/dist/init-platform.d.ts +38 -0
  49. package/dist/init-platform.js +150 -0
  50. package/dist/init.d.ts +14 -37
  51. package/dist/init.js +205 -95
  52. package/dist/node_modules/.pnpm/am-i-vibing@0.5.0/node_modules/am-i-vibing/dist/detector-1yx2Hoe0.js +294 -0
  53. package/dist/node_modules/.pnpm/process-ancestry@0.1.0/node_modules/process-ancestry/dist/index.js +94 -0
  54. package/dist/{cloudflare → packages/cloudflare}/src/cache/cdn-adapter.runtime.js +1 -1
  55. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.d.ts +2 -2
  56. package/dist/{cloudflare → packages/cloudflare}/src/cache/kv-data-adapter.runtime.js +1 -1
  57. package/dist/plugins/ast-scope.d.ts +16 -0
  58. package/dist/plugins/ast-scope.js +62 -0
  59. package/dist/plugins/ast-utils.js +3 -0
  60. package/dist/plugins/css-module-imports.d.ts +14 -0
  61. package/dist/plugins/css-module-imports.js +59 -0
  62. package/dist/plugins/ignore-dynamic-requests.d.ts +11 -0
  63. package/dist/plugins/ignore-dynamic-requests.js +530 -0
  64. package/dist/plugins/middleware-server-only.d.ts +8 -6
  65. package/dist/plugins/middleware-server-only.js +8 -7
  66. package/dist/plugins/optimize-imports.js +1 -1
  67. package/dist/plugins/typeof-window.d.ts +1 -1
  68. package/dist/plugins/typeof-window.js +28 -56
  69. package/dist/routing/app-route-graph.d.ts +13 -2
  70. package/dist/routing/app-route-graph.js +116 -32
  71. package/dist/routing/app-router.d.ts +5 -0
  72. package/dist/routing/app-router.js +5 -0
  73. package/dist/routing/file-matcher.d.ts +8 -0
  74. package/dist/routing/file-matcher.js +10 -1
  75. package/dist/routing/pages-router.js +2 -2
  76. package/dist/server/app-browser-action-result.d.ts +2 -1
  77. package/dist/server/app-browser-action-result.js +5 -1
  78. package/dist/server/app-browser-entry.js +17 -12
  79. package/dist/server/app-browser-history-controller.d.ts +2 -1
  80. package/dist/server/app-browser-history-controller.js +6 -2
  81. package/dist/server/app-browser-interception-context.d.ts +1 -0
  82. package/dist/server/app-browser-interception-context.js +4 -2
  83. package/dist/server/app-browser-navigation-controller.js +1 -0
  84. package/dist/server/app-browser-server-action-client.js +2 -3
  85. package/dist/server/app-browser-state.d.ts +1 -0
  86. package/dist/server/app-browser-state.js +3 -2
  87. package/dist/server/app-fallback-renderer.d.ts +3 -2
  88. package/dist/server/app-fallback-renderer.js +12 -7
  89. package/dist/server/app-middleware.d.ts +2 -3
  90. package/dist/server/app-middleware.js +3 -2
  91. package/dist/server/app-optimistic-routing.js +1 -1
  92. package/dist/server/app-page-boundary-render.d.ts +1 -0
  93. package/dist/server/app-page-boundary-render.js +12 -3
  94. package/dist/server/app-page-cache-finalizer.d.ts +1 -0
  95. package/dist/server/app-page-cache-finalizer.js +10 -3
  96. package/dist/server/app-page-cache-render.d.ts +1 -0
  97. package/dist/server/app-page-cache-render.js +8 -4
  98. package/dist/server/app-page-cache.d.ts +1 -0
  99. package/dist/server/app-page-cache.js +4 -1
  100. package/dist/server/app-page-dispatch.d.ts +11 -3
  101. package/dist/server/app-page-dispatch.js +55 -15
  102. package/dist/server/app-page-element-builder.d.ts +5 -1
  103. package/dist/server/app-page-element-builder.js +57 -20
  104. package/dist/server/app-page-head.d.ts +12 -0
  105. package/dist/server/app-page-head.js +42 -19
  106. package/dist/server/app-page-params.d.ts +2 -1
  107. package/dist/server/app-page-params.js +8 -1
  108. package/dist/server/app-page-probe.d.ts +1 -0
  109. package/dist/server/app-page-probe.js +6 -1
  110. package/dist/server/app-page-render-identity.d.ts +1 -0
  111. package/dist/server/app-page-render-identity.js +1 -1
  112. package/dist/server/app-page-render.d.ts +4 -1
  113. package/dist/server/app-page-render.js +8 -3
  114. package/dist/server/app-page-request.d.ts +22 -1
  115. package/dist/server/app-page-request.js +89 -13
  116. package/dist/server/app-page-route-wiring.d.ts +6 -1
  117. package/dist/server/app-page-route-wiring.js +31 -15
  118. package/dist/server/app-page-search-params-observation.d.ts +4 -2
  119. package/dist/server/app-page-search-params-observation.js +11 -7
  120. package/dist/server/app-page-segment-state.js +2 -0
  121. package/dist/server/app-route-handler-dispatch.js +1 -0
  122. package/dist/server/app-route-handler-execution.js +7 -2
  123. package/dist/server/app-route-handler-response.js +1 -0
  124. package/dist/server/app-route-handler-runtime.js +1 -1
  125. package/dist/server/app-route-module-loader.d.ts +2 -0
  126. package/dist/server/app-route-module-loader.js +1 -0
  127. package/dist/server/app-router-entry.d.ts +12 -0
  128. package/dist/server/app-router-entry.js +22 -8
  129. package/dist/server/app-router-image-optimization.d.ts +37 -0
  130. package/dist/server/app-router-image-optimization.js +40 -0
  131. package/dist/server/app-rsc-errors.js +7 -1
  132. package/dist/server/app-rsc-handler.js +27 -14
  133. package/dist/server/app-rsc-route-matching.d.ts +7 -0
  134. package/dist/server/app-rsc-route-matching.js +36 -3
  135. package/dist/server/app-segment-config.d.ts +12 -0
  136. package/dist/server/app-segment-config.js +91 -5
  137. package/dist/server/app-server-action-execution.d.ts +5 -0
  138. package/dist/server/app-server-action-execution.js +94 -33
  139. package/dist/server/app-ssr-entry.js +12 -1
  140. package/dist/server/app-static-generation.d.ts +1 -0
  141. package/dist/server/app-static-generation.js +1 -0
  142. package/dist/server/client-trace-metadata.js +26 -0
  143. package/dist/server/default-global-not-found-module.d.ts +14 -0
  144. package/dist/server/default-global-not-found-module.js +14 -0
  145. package/dist/server/dev-server.js +8 -15
  146. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  147. package/dist/server/dev-stack-sourcemap.js +1 -1
  148. package/dist/server/headers.d.ts +5 -15
  149. package/dist/server/headers.js +4 -15
  150. package/dist/server/image-optimization.d.ts +51 -1
  151. package/dist/server/image-optimization.js +52 -2
  152. package/dist/server/isr-cache.d.ts +1 -1
  153. package/dist/server/isr-cache.js +2 -2
  154. package/dist/server/middleware-runtime.js +6 -1
  155. package/dist/server/navigation-planner.d.ts +1 -0
  156. package/dist/server/navigation-planner.js +14 -3
  157. package/dist/server/pages-asset-tags.d.ts +4 -6
  158. package/dist/server/pages-asset-tags.js +12 -12
  159. package/dist/server/pages-client-assets.d.ts +12 -0
  160. package/dist/server/pages-client-assets.js +10 -0
  161. package/dist/server/pages-page-data.d.ts +23 -1
  162. package/dist/server/pages-page-data.js +43 -24
  163. package/dist/server/pages-page-handler.d.ts +2 -1
  164. package/dist/server/pages-page-handler.js +10 -4
  165. package/dist/server/pages-request-pipeline.d.ts +2 -0
  166. package/dist/server/pages-request-pipeline.js +25 -1
  167. package/dist/server/prerender-manifest.d.ts +3 -1
  168. package/dist/server/prerender-route-params.js +1 -1
  169. package/dist/server/prod-server.d.ts +1 -1
  170. package/dist/server/prod-server.js +47 -25
  171. package/dist/server/request-pipeline.js +1 -0
  172. package/dist/server/seed-cache.js +4 -4
  173. package/dist/server/worker-utils.d.ts +2 -1
  174. package/dist/server/worker-utils.js +7 -1
  175. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  176. package/dist/shims/app-router-scroll-state.js +1 -0
  177. package/dist/shims/app-router-scroll.js +2 -1
  178. package/dist/shims/cache.js +19 -15
  179. package/dist/shims/cdn-cache.js +1 -1
  180. package/dist/shims/dynamic-preload-chunks.js +2 -1
  181. package/dist/shims/error-boundary.d.ts +19 -1
  182. package/dist/shims/error-boundary.js +11 -1
  183. package/dist/shims/form.d.ts +3 -1
  184. package/dist/shims/form.js +37 -43
  185. package/dist/shims/headers.d.ts +9 -1
  186. package/dist/shims/headers.js +31 -6
  187. package/dist/shims/image-optimization-url.d.ts +4 -0
  188. package/dist/shims/image-optimization-url.js +33 -1
  189. package/dist/shims/image.js +46 -13
  190. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  191. package/dist/shims/internal/app-route-detection.js +4 -17
  192. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  193. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  194. package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -5
  195. package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
  196. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  197. package/dist/shims/internal/pages-router-components.js +13 -0
  198. package/dist/shims/link.js +23 -16
  199. package/dist/shims/metadata.d.ts +3 -2
  200. package/dist/shims/metadata.js +8 -4
  201. package/dist/shims/navigation.js +4 -2
  202. package/dist/shims/root-params.d.ts +15 -1
  203. package/dist/shims/root-params.js +21 -1
  204. package/dist/shims/router.d.ts +2 -5
  205. package/dist/shims/router.js +41 -22
  206. package/dist/shims/server.js +3 -2
  207. package/dist/typegen.js +6 -5
  208. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  209. package/dist/utils/client-runtime-metadata.js +31 -22
  210. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  211. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  212. package/dist/utils/domain-locale.d.ts +6 -3
  213. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  214. package/dist/{server → utils}/middleware-request-headers.js +2 -2
  215. package/dist/utils/path.d.ts +2 -1
  216. package/dist/utils/path.js +1 -1
  217. package/dist/utils/project.d.ts +9 -1
  218. package/dist/utils/project.js +21 -4
  219. package/dist/utils/protocol-headers.d.ts +17 -0
  220. package/dist/utils/protocol-headers.js +17 -0
  221. package/dist/utils/react-version.d.ts +4 -0
  222. package/dist/utils/react-version.js +44 -0
  223. package/package.json +28 -24
  224. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  225. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
@@ -5,7 +5,7 @@ import { isExternalUrl } from "../config/config-matchers.js";
5
5
  import { internalServerErrorResponse, payloadTooLargeResponse } from "./http-error-responses.js";
6
6
  import { validateCsrfOrigin, validateServerActionPayload } from "./request-pipeline.js";
7
7
  import { APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI } from "./app-rsc-render-mode.js";
8
- import { headersContextFromRequest, setHeadersContext } from "../shims/headers.js";
8
+ import { headersContextFromRequest, isDraftModeRequest, setHeadersContext } from "../shims/headers.js";
9
9
  import { getAndClearActionRevalidationKind } from "../shims/cache-request-state.js";
10
10
  import { setCurrentFetchCacheMode, setCurrentFetchSoftTags, setCurrentForceDynamicFetchDefault } from "../shims/fetch-cache.js";
11
11
  import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
@@ -13,6 +13,7 @@ import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityI
13
13
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
14
14
  import { applyEdgeRuntimeHeader } from "./app-page-response.js";
15
15
  import { getNextErrorDigest, parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
16
+ import { createRootParamsUsageController, pickRootParams, runWithRootParamsScope, runWithRootParamsUsage } from "../shims/root-params.js";
16
17
  import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
17
18
  import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
18
19
  import "./app-page-stream.js";
@@ -20,7 +21,29 @@ import { buildAppPageTags } from "./implicit-tags.js";
20
21
  import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
21
22
  import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
22
23
  import { getSetCookieName } from "./cookie-utils.js";
24
+ import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
23
25
  //#region src/server/app-server-action-execution.ts
26
+ function prepareActionPageRerenderContext(options) {
27
+ if (options.dynamicConfig === "force-static" || options.dynamicConfig === "error") setHeadersContext(createStaticGenerationHeadersContext({
28
+ draftModeEnabled: isDraftModeRequest(createActionRerenderRequest({
29
+ draftModeCookie: options.draftModeCookie,
30
+ request: options.request
31
+ }), options.draftModeSecret),
32
+ draftModeSecret: options.draftModeSecret,
33
+ dynamicConfig: options.dynamicConfig,
34
+ routeKind: "page",
35
+ routePattern: options.routePattern
36
+ }));
37
+ return options.dynamicConfig === "force-static" ? new URLSearchParams() : options.searchParams;
38
+ }
39
+ function createActionRerenderRequest(options) {
40
+ if (!options.draftModeCookie) return options.request;
41
+ const headers = new Headers(options.request.headers);
42
+ const cookieHeader = applySetCookieMutationsToRequestCookieHeader(headers.get("cookie"), [options.draftModeCookie]);
43
+ if (cookieHeader === null) headers.delete("cookie");
44
+ else headers.set("cookie", cookieHeader);
45
+ return new Request(options.request.url, { headers });
46
+ }
24
47
  /**
25
48
  * Matches Next.js' server action argument cap to prevent stack overflow in
26
49
  * Function.prototype.apply when decoding hostile action payloads.
@@ -351,11 +374,14 @@ async function handleProgressiveServerActionRequest(options) {
351
374
  let actionRedirect = null;
352
375
  let actionError = void 0;
353
376
  let actionFailed = false;
377
+ let actionThrew = false;
354
378
  let actionResult;
379
+ const rootParamsUsage = createRootParamsUsageController();
355
380
  const previousHeadersPhase = options.setHeadersAccessPhase("action");
356
381
  try {
357
- actionResult = await action();
382
+ actionResult = await runWithRootParamsUsage({ kind: "server-action" }, action, rootParamsUsage);
358
383
  } catch (error) {
384
+ actionThrew = true;
359
385
  actionRedirect = getActionRedirect(error);
360
386
  if (!actionRedirect) {
361
387
  actionError = error;
@@ -375,8 +401,10 @@ async function handleProgressiveServerActionRequest(options) {
375
401
  }
376
402
  } finally {
377
403
  options.setHeadersAccessPhase(previousHeadersPhase);
404
+ if (actionThrew) rootParamsUsage.transitionToRender();
378
405
  }
379
406
  if (!actionRedirect) {
407
+ if (!actionThrew) rootParamsUsage.transitionToRender();
380
408
  const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
381
409
  const actionDraftCookie = options.getDraftModeCookieHeader();
382
410
  const revalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
@@ -544,16 +572,19 @@ async function handleServerActionRscRequest(options) {
544
572
  let returnValue;
545
573
  let actionRedirect = null;
546
574
  let actionStatus = 200;
575
+ let actionThrew = false;
547
576
  const actionWasForwarded = Boolean(options.request.headers.get(ACTION_FORWARDED_HEADER));
577
+ const rootParamsUsage = createRootParamsUsageController();
548
578
  const previousHeadersPhase = options.setHeadersAccessPhase("action");
549
579
  try {
550
580
  try {
551
581
  validateServerActionArgs(args);
552
582
  returnValue = {
553
583
  ok: true,
554
- data: await action.apply(null, args)
584
+ data: await runWithRootParamsUsage({ kind: "server-action" }, () => action.apply(null, args), rootParamsUsage)
555
585
  };
556
586
  } catch (error) {
587
+ actionThrew = true;
557
588
  actionRedirect = getActionRedirect(error);
558
589
  if (actionRedirect) returnValue = {
559
590
  ok: true,
@@ -568,6 +599,7 @@ async function handleServerActionRscRequest(options) {
568
599
  data: error
569
600
  };
570
601
  } else {
602
+ actionStatus = 500;
571
603
  console.error("[vinext] Server action error:", error);
572
604
  returnValue = {
573
605
  ok: false,
@@ -578,6 +610,7 @@ async function handleServerActionRscRequest(options) {
578
610
  }
579
611
  } finally {
580
612
  options.setHeadersAccessPhase(previousHeadersPhase);
613
+ if (actionThrew && !actionWasForwarded) rootParamsUsage.transitionToRender();
581
614
  }
582
615
  if (actionRedirect) {
583
616
  const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
@@ -622,35 +655,48 @@ async function handleServerActionRscRequest(options) {
622
655
  request: options.request,
623
656
  url: redirectTarget
624
657
  });
625
- setHeadersContext(headersContextFromRequest(redirectRenderRequest));
658
+ setHeadersContext(headersContextFromRequest(redirectRenderRequest, { draftModeSecret: options.draftModeSecret }));
659
+ const redirectDynamicConfig = options.resolveRouteDynamicConfig?.(targetMatch.route);
660
+ const redirectSearchParams = prepareActionPageRerenderContext({
661
+ draftModeCookie: actionDraftCookie,
662
+ draftModeSecret: options.draftModeSecret,
663
+ dynamicConfig: redirectDynamicConfig,
664
+ request: redirectRenderRequest,
665
+ routePattern: targetMatch.route.pattern,
666
+ searchParams: redirectTarget.searchParams
667
+ });
626
668
  const redirectNavigationParams = resolveAppPageNavigationParams(targetMatch.route, targetMatch.params, targetPathname, null);
627
669
  options.setNavigationContext({
628
670
  pathname: targetPathname,
629
- searchParams: redirectTarget.searchParams,
671
+ searchParams: redirectSearchParams,
630
672
  params: redirectNavigationParams
631
673
  });
632
674
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(targetMatch.route) ?? null);
633
- setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(targetMatch.route) === "force-dynamic");
675
+ setCurrentForceDynamicFetchDefault(redirectDynamicConfig === "force-dynamic");
634
676
  setCurrentFetchSoftTags(buildServerActionPageTags(targetMatch.route, targetPathname));
635
- const element = options.buildPageElement({
636
- cleanPathname: targetPathname,
637
- interceptOpts: void 0,
638
- isRscRequest: true,
639
- mountedSlotsHeader: null,
640
- params: targetMatch.params,
641
- request: redirectRenderRequest,
642
- route: targetMatch.route,
643
- searchParams: redirectTarget.searchParams,
644
- renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
645
- });
646
- const onRenderError = options.createRscOnErrorHandler(redirectRenderRequest, targetPathname, targetMatch.route.pattern);
647
- return createServerActionRscResponse(await options.renderToReadableStream({
648
- root: element,
649
- returnValue
650
- }, {
651
- temporaryReferences,
652
- onError: onRenderError
653
- }), {
677
+ return createServerActionRscResponse(await runWithRootParamsScope(pickRootParams(targetMatch.params, targetMatch.route.rootParamNames), () => runWithRootParamsUsage({ kind: "route" }, async () => {
678
+ const element = options.buildPageElement({
679
+ cleanPathname: targetPathname,
680
+ interceptOpts: void 0,
681
+ isRscRequest: true,
682
+ mountedSlotsHeader: null,
683
+ params: targetMatch.params,
684
+ request: redirectRenderRequest,
685
+ route: targetMatch.route,
686
+ searchParams: redirectSearchParams,
687
+ renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
688
+ observeMetadataSearchParamsAccess: redirectDynamicConfig !== "force-static",
689
+ observePageSearchParamsAccess: redirectDynamicConfig !== "force-static"
690
+ });
691
+ const onRenderError = options.createRscOnErrorHandler(redirectRenderRequest, targetPathname, targetMatch.route.pattern);
692
+ return options.renderToReadableStream({
693
+ root: element,
694
+ returnValue
695
+ }, {
696
+ temporaryReferences,
697
+ onError: onRenderError
698
+ });
699
+ })), {
654
700
  status: shouldUseForwardedActionRedirectStatus({
655
701
  actionWasForwarded,
656
702
  currentPathname: options.cleanPathname,
@@ -665,7 +711,8 @@ async function handleServerActionRscRequest(options) {
665
711
  const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
666
712
  const actionDraftCookie = options.getDraftModeCookieHeader();
667
713
  const actionRevalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
668
- if (actionWasForwarded || actionStatus === 200 && actionRevalidationKind === ACTION_DID_NOT_REVALIDATE) {
714
+ const isHttpFallback = actionStatus === 401 || actionStatus === 403 || actionStatus === 404;
715
+ if (!isHttpFallback && (actionWasForwarded || actionRevalidationKind === ACTION_DID_NOT_REVALIDATE)) {
669
716
  const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, options.cleanPathname);
670
717
  const rscStream = await options.renderToReadableStream({ returnValue }, {
671
718
  temporaryReferences,
@@ -686,6 +733,7 @@ async function handleServerActionRscRequest(options) {
686
733
  headers: actionHeaders
687
734
  }, options.clearRequestContext);
688
735
  }
736
+ if (!actionThrew) rootParamsUsage.transitionToRender();
689
737
  const match = options.matchRoute(options.cleanPathname);
690
738
  let element;
691
739
  let errorPattern = match ? match.route.pattern : options.cleanPathname;
@@ -702,16 +750,25 @@ async function handleServerActionRscRequest(options) {
702
750
  toInterceptOpts: options.toInterceptOpts
703
751
  });
704
752
  const resolvedActionNavigationParams = resolveAppPageNavigationParams(actionRerenderTarget.route, actionRerenderTarget.navigationParams, options.cleanPathname, actionRerenderTarget.interceptOpts);
753
+ await options.ensureRouteLoaded?.(actionRerenderTarget.route);
754
+ const actionRerenderDynamicConfig = options.resolveRouteDynamicConfig?.(actionRerenderTarget.route);
755
+ const actionRerenderSearchParams = prepareActionPageRerenderContext({
756
+ draftModeCookie: actionDraftCookie,
757
+ draftModeSecret: options.draftModeSecret,
758
+ dynamicConfig: actionRerenderDynamicConfig,
759
+ request: options.request,
760
+ routePattern: actionRerenderTarget.route.pattern,
761
+ searchParams: options.searchParams
762
+ });
705
763
  options.setNavigationContext({
706
764
  pathname: options.cleanPathname,
707
- searchParams: options.searchParams,
765
+ searchParams: actionRerenderSearchParams,
708
766
  params: resolvedActionNavigationParams
709
767
  });
710
- await options.ensureRouteLoaded?.(actionRerenderTarget.route);
711
768
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null);
712
- setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(actionRerenderTarget.route) === "force-dynamic");
769
+ setCurrentForceDynamicFetchDefault(actionRerenderDynamicConfig === "force-dynamic");
713
770
  setCurrentFetchSoftTags(buildServerActionPageTags(actionRerenderTarget.route, options.cleanPathname));
714
- element = options.buildPageElement({
771
+ const buildActionRerenderElement = () => options.buildPageElement({
715
772
  cleanPathname: options.cleanPathname,
716
773
  interceptOpts: actionRerenderTarget.interceptOpts,
717
774
  isRscRequest: options.isRscRequest,
@@ -719,22 +776,26 @@ async function handleServerActionRscRequest(options) {
719
776
  params: actionRerenderTarget.params,
720
777
  request: options.request,
721
778
  route: actionRerenderTarget.route,
722
- searchParams: options.searchParams,
723
- renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
779
+ searchParams: actionRerenderSearchParams,
780
+ renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
781
+ observeMetadataSearchParamsAccess: actionRerenderDynamicConfig !== "force-static",
782
+ observePageSearchParamsAccess: actionRerenderDynamicConfig !== "force-static"
724
783
  });
784
+ element = actionWasForwarded && isHttpFallback ? await runWithRootParamsUsage({ kind: "route" }, async () => buildActionRerenderElement()) : buildActionRerenderElement();
725
785
  errorPattern = actionRerenderTarget.route.pattern;
726
786
  } else {
727
787
  const actionRouteId = options.createPayloadRouteId(options.cleanPathname, null);
728
788
  element = options.createNotFoundElement(actionRouteId);
729
789
  }
730
790
  const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, errorPattern);
731
- const rscStream = await options.renderToReadableStream({
791
+ const renderActionRerender = () => options.renderToReadableStream({
732
792
  root: element,
733
793
  returnValue
734
794
  }, {
735
795
  temporaryReferences,
736
796
  onError: onRenderError
737
797
  });
798
+ const rscStream = await (actionWasForwarded && isHttpFallback ? runWithRootParamsUsage({ kind: "route" }, renderActionRerender) : renderActionRerender());
738
799
  const actionHeaders = new Headers({
739
800
  "Content-Type": VINEXT_RSC_CONTENT_TYPE,
740
801
  Vary: VINEXT_RSC_VARY_HEADER
@@ -16,6 +16,7 @@ import DefaultGlobalError from "../shims/default-global-error.js";
16
16
  import { BfcacheStateKeyMapContext, ElementsContext, Slot } from "../shims/slot.js";
17
17
  import { createSsrErrorMetaRenderer } from "./app-ssr-error-meta.js";
18
18
  import { createNavigationRuntimeRscMetadataScript, createRscEmbedTransform, createTickBufferedTransform } from "./app-ssr-stream.js";
19
+ import { setPagesClientAssets } from "./pages-client-assets.js";
19
20
  import { BeforeInteractiveContext } from "../shims/before-interactive-context.js";
20
21
  import { runWithRootParamsScope } from "../shims/root-params.js";
21
22
  import { createInitialBfcacheMaps } from "./app-bfcache-identity.js";
@@ -27,9 +28,12 @@ import { createInitialDevServerErrorScript } from "./dev-initial-server-error.js
27
28
  import { ssrAppRouterInstance } from "./app-ssr-router-instance.js";
28
29
  import { Fragment, createElement, use } from "react";
29
30
  import { renderToReadableStream, renderToStaticMarkup } from "react-dom/server.edge";
31
+ import { preinitModule } from "react-dom";
30
32
  import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr";
31
33
  import clientReferences from "virtual:vite-rsc/client-references";
34
+ import pagesClientAssets from "virtual:vinext-pages-client-assets";
32
35
  //#region src/server/app-ssr-entry.ts
36
+ setPagesClientAssets(pagesClientAssets);
33
37
  /**
34
38
  * Default cap for the preload `Link` header, matching Next.js's
35
39
  * `defaultConfig.reactMaxHeadersLength`. Used when no config value threads
@@ -52,7 +56,10 @@ async function loadStaticPrerender() {
52
56
  const [{ createRequire }, path] = await Promise.all([import("node:module"), import("node:path")]);
53
57
  const reactDomPackageJson = createRequire(import.meta.url).resolve("react-dom/package.json");
54
58
  const reactDomDir = path.dirname(reactDomPackageJson);
55
- const devRenderer = await import(path.join(reactDomDir, "cjs/react-dom-server.edge.development.js"));
59
+ const devRenderer = await import(
60
+ /* @vite-ignore */
61
+ path.join(reactDomDir, "cjs/react-dom-server.edge.development.js")
62
+ );
56
63
  if (isStaticPrerenderModule(devRenderer)) return devRenderer.prerender;
57
64
  const devRendererDefault = typeof devRenderer === "object" && devRenderer !== null && "default" in devRenderer && devRenderer.default;
58
65
  if (isStaticPrerenderModule(devRendererDefault)) return devRendererDefault.prerender;
@@ -182,6 +189,10 @@ async function handleSsr(rscStream, navContext, fontData, options) {
182
189
  }
183
190
  let flightRoot = null;
184
191
  function VinextFlightRoot() {
192
+ for (const moduleUrl of pagesClientAssets.appBootstrapPreinitModules ?? []) preinitModule(moduleUrl, {
193
+ as: "script",
194
+ nonce: options?.scriptNonce
195
+ });
185
196
  if (!flightRoot) flightRoot = createFromReadableStream(ssrStream);
186
197
  const wireElements = use(flightRoot);
187
198
  const elements = AppElementsWire.decode(wireElements);
@@ -3,6 +3,7 @@ import { HeadersContext } from "../shims/headers.js";
3
3
  //#region src/server/app-static-generation.d.ts
4
4
  type AppStaticGenerationRouteKind = "page" | "route";
5
5
  type CreateStaticGenerationHeadersContextOptions = {
6
+ draftModeEnabled?: boolean;
6
7
  draftModeSecret?: string;
7
8
  dynamicConfig?: string;
8
9
  routeKind: AppStaticGenerationRouteKind;
@@ -9,6 +9,7 @@ function createStaticGenerationHeadersContext(options) {
9
9
  const context = {
10
10
  headers: new Headers(),
11
11
  cookies: /* @__PURE__ */ new Map(),
12
+ draftModeEnabled: options.draftModeEnabled,
12
13
  draftModeSecret: options.draftModeSecret
13
14
  };
14
15
  if (options.dynamicConfig === "force-static") context.forceStatic = true;
@@ -24,7 +24,32 @@ const carrierSetter = { set(carrier, key, value) {
24
24
  value
25
25
  });
26
26
  } };
27
+ const OPEN_TELEMETRY_API_SYMBOL = Symbol.for("opentelemetry.js.api.1");
28
+ const OPEN_TELEMETRY_SPAN_SYMBOL = Symbol.for("OpenTelemetry Context Key SPAN");
29
+ function getRegisteredOpenTelemetryTraceData() {
30
+ let metadataSpan = null;
31
+ try {
32
+ const registry = globalThis[OPEN_TELEMETRY_API_SYMBOL];
33
+ if (!registry?.context || !registry.propagation) return null;
34
+ const contextApi = registry.context;
35
+ const propagation = registry.propagation;
36
+ const activeContext = contextApi.active();
37
+ metadataSpan = activeContext.getValue(OPEN_TELEMETRY_SPAN_SYMBOL) !== void 0 ? null : registry.trace?.getTracer("vinext").startSpan("vinext.clientTraceMetadata", void 0, activeContext) ?? null;
38
+ const context = metadataSpan ? activeContext.setValue(OPEN_TELEMETRY_SPAN_SYMBOL, metadataSpan) : activeContext;
39
+ const entries = [];
40
+ contextApi.with(context, () => {
41
+ propagation.inject(context, entries, carrierSetter);
42
+ });
43
+ return entries;
44
+ } catch {
45
+ return [];
46
+ } finally {
47
+ metadataSpan?.end();
48
+ }
49
+ }
27
50
  function getOpenTelemetryTraceData() {
51
+ const registeredEntries = getRegisteredOpenTelemetryTraceData();
52
+ if (registeredEntries) return registeredEntries;
28
53
  let api;
29
54
  try {
30
55
  const req = globalThis.require;
@@ -75,6 +100,7 @@ function renderClientTraceMetadataTags(entries) {
75
100
  */
76
101
  function getClientTraceMetadataHTML(allowList) {
77
102
  if (!allowList || allowList.length === 0) return "";
103
+ if (typeof process !== "undefined" && process.env.VINEXT_PRERENDER === "1") return "";
78
104
  return renderClientTraceMetadataTags(filterClientTraceMetadata(getOpenTelemetryTraceData(), allowList));
79
105
  }
80
106
  //#endregion
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+
3
+ //#region src/server/default-global-not-found-module.d.ts
4
+ declare function DefaultGlobalNotFound(): React.ReactElement;
5
+ /**
6
+ * Module-shaped wrapper around Next.js's built-in global not-found document.
7
+ * Unlike the regular default not-found boundary, this component owns the
8
+ * document shell because global not-found responses skip the root layout.
9
+ */
10
+ declare const DEFAULT_GLOBAL_NOT_FOUND_MODULE: {
11
+ readonly default: typeof DefaultGlobalNotFound;
12
+ };
13
+ //#endregion
14
+ export { DEFAULT_GLOBAL_NOT_FOUND_MODULE };
@@ -0,0 +1,14 @@
1
+ import DefaultNotFound from "../shims/default-not-found.js";
2
+ import React from "react";
3
+ //#region src/server/default-global-not-found-module.ts
4
+ function DefaultGlobalNotFound() {
5
+ return React.createElement("html", null, React.createElement("body", null, React.createElement(DefaultNotFound)));
6
+ }
7
+ /**
8
+ * Module-shaped wrapper around Next.js's built-in global not-found document.
9
+ * Unlike the regular default not-found boundary, this component owns the
10
+ * document shell because global not-found responses skip the root layout.
11
+ */
12
+ const DEFAULT_GLOBAL_NOT_FOUND_MODULE = { default: DefaultGlobalNotFound };
13
+ //#endregion
14
+ export { DEFAULT_GLOBAL_NOT_FOUND_MODULE };
@@ -3,7 +3,6 @@ import { createValidFileMatcher, findFileWithExtensions } from "../routing/file-
3
3
  import { patternToNextFormat } from "../routing/route-validation.js";
4
4
  import { matchRoute } from "../routing/pages-router.js";
5
5
  import { NEXTJS_DEPLOYMENT_ID_HEADER } from "./headers.js";
6
- import { normalizeStaticPathname } from "../routing/route-pattern.js";
7
6
  import { importModule, reportRequestError } from "./instrumentation.js";
8
7
  import { buildCacheStateHeaders } from "./cache-headers.js";
9
8
  import { isUnknownRecord } from "../utils/record.js";
@@ -26,12 +25,13 @@ import { detectLocaleFromAcceptLanguage, extractLocaleFromUrl as extractLocaleFr
26
25
  import { buildDefaultPagesNotFoundResponse } from "./pages-default-404.js";
27
26
  import { buildPagesReadinessNextData } from "./pages-readiness.js";
28
27
  import { resolvePagesPageMethodResponse } from "./pages-page-method.js";
29
- import { createPagesDevModuleUrl } from "./pages-dev-module-url.js";
30
- import { isSerializableProps } from "./pages-serializable-props.js";
31
28
  import { loadUserDocumentInitialProps, runDocumentRenderPage } from "./pages-document-initial-props.js";
32
29
  import { callDocumentGetInitialProps } from "./document-initial-head.js";
33
30
  import { hasPagesGetInitialProps, loadDevAppInitialProps, loadPagesGetInitialProps } from "./pages-get-initial-props.js";
31
+ import { isSerializableProps } from "./pages-serializable-props.js";
34
32
  import { isBotUserAgent } from "../utils/html-limited-bots.js";
33
+ import { getPagesRouteParams, matchesPagesStaticPath } from "./pages-page-data.js";
34
+ import { createPagesDevModuleUrl } from "./pages-dev-module-url.js";
35
35
  import path from "node:path";
36
36
  import React from "react";
37
37
  import { renderToReadableStream } from "react-dom/server.edge";
@@ -248,8 +248,9 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
248
248
  if (isDataReq) {
249
249
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
250
250
  const notFoundHeaders = { "Content-Type": "application/json" };
251
+ if (hasMiddleware) notFoundHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${localeStrippedUrl}`;
251
252
  if (deploymentId) notFoundHeaders[NEXTJS_DEPLOYMENT_ID_HEADER] = deploymentId;
252
- res.writeHead(404, notFoundHeaders);
253
+ res.writeHead(hasMiddleware ? 200 : 404, notFoundHeaders);
253
254
  res.end("{}");
254
255
  return;
255
256
  }
@@ -340,17 +341,8 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
340
341
  });
341
342
  const fallback = pathsResult?.fallback ?? false;
342
343
  const paths = pathsResult?.paths ?? [];
343
- const currentPathname = normalizeStaticPathname(url);
344
- const isValidPath = paths.some((p) => {
345
- if (typeof p === "string") return normalizeStaticPathname(p) === currentPathname;
346
- const entryParams = p.params;
347
- if (entryParams === void 0 || entryParams === null) return false;
348
- return Object.entries(entryParams).every(([key, val]) => {
349
- const actual = params[key];
350
- if (Array.isArray(val)) return Array.isArray(actual) && val.join("/") === actual.join("/");
351
- return String(val) === String(actual);
352
- });
353
- });
344
+ const routeParams = getPagesRouteParams(patternToNextFormat(route.pattern));
345
+ const isValidPath = paths.some((pathEntry) => matchesPagesStaticPath(pathEntry, params, routeParams, url));
354
346
  if (fallback === false && !isValidPath) {
355
347
  if (isDataReq) {
356
348
  const deploymentId = process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID;
@@ -762,6 +754,7 @@ function createSSRHandler(server, runner, routes, pagesDir, i18nConfig, fileMatc
762
754
  setRevalidateDuration(cacheKey, revalidateSeconds);
763
755
  }
764
756
  const dataHeaders = { "Content-Type": "application/json" };
757
+ if ((statusCode ?? 200) === 200) dataHeaders["x-nextjs-matched-path"] = `${locale ? `/${locale}` : ""}${patternToNextFormat(route.pattern)}`;
765
758
  if (gsspExtraHeaders) for (const [k, v] of Object.entries(gsspExtraHeaders)) dataHeaders[k] = v;
766
759
  const dataRoutePattern = patternToNextFormat(route.pattern);
767
760
  if (dataRoutePattern !== "/_error" && dataRoutePattern !== "/500") {
@@ -1,4 +1,4 @@
1
- import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "./dev-stack-sourcemap-endpoint.js";
1
+ import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "../utils/dev-stack-sourcemap-endpoint.js";
2
2
  import { ViteDevServer } from "vite";
3
3
 
4
4
  //#region src/server/dev-stack-sourcemap.d.ts
@@ -1,4 +1,4 @@
1
- import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "./dev-stack-sourcemap-endpoint.js";
1
+ import { VINEXT_ORIGINAL_STACK_TRACE_ENDPOINT } from "../utils/dev-stack-sourcemap-endpoint.js";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { fileURLToPath, pathToFileURL } from "node:url";
4
4
  //#region src/server/dev-stack-sourcemap.ts
@@ -1,3 +1,5 @@
1
+ import { MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_SET_COOKIE_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
2
+
1
3
  //#region src/server/headers.d.ts
2
4
  /**
3
5
  * Internal HTTP header name constants used throughout vinext.
@@ -15,14 +17,8 @@ declare const VINEXT_CACHE_HEADER = "X-Vinext-Cache";
15
17
  declare const NEXTJS_CACHE_HEADER = "x-nextjs-cache";
16
18
  /** Static file signal — value is URL-encoded pathname. */
17
19
  declare const VINEXT_STATIC_FILE_HEADER = "x-vinext-static-file";
18
- /** Serialized middleware context (JSON) forwarded from dev server to RSC entry. */
19
- declare const VINEXT_MW_CTX_HEADER = "x-vinext-mw-ctx";
20
20
  /** Timing metrics: `handlerStart,compileMs,renderMs`. */
21
21
  declare const VINEXT_TIMING_HEADER = "x-vinext-timing";
22
- /** Build-time prerender authentication secret. */
23
- declare const VINEXT_PRERENDER_SECRET_HEADER = "x-vinext-prerender-secret";
24
- /** URL-encoded JSON route params for build-time prerender renders. */
25
- declare const VINEXT_PRERENDER_ROUTE_PARAMS_HEADER = "x-vinext-prerender-route-params";
26
22
  /** Internal endpoint used to evaluate App Router generateStaticParams exports. */
27
23
  declare const VINEXT_PRERENDER_STATIC_PARAMS_PATH = "/__vinext/prerender/static-params";
28
24
  /** Internal endpoint used to evaluate Pages Router getStaticPaths exports. */
@@ -81,22 +77,16 @@ declare const ACTION_REDIRECT_HEADER = "x-action-redirect";
81
77
  declare const ACTION_REDIRECT_TYPE_HEADER = "x-action-redirect-type";
82
78
  /** HTTP status for a Server Action redirect (e.g. "308"). */
83
79
  declare const ACTION_REDIRECT_STATUS_HEADER = "x-action-redirect-status";
84
- /** Prefix for forwarded request headers (e.g. `x-middleware-request-cookie`). */
85
- declare const MIDDLEWARE_REQUEST_HEADER_PREFIX = "x-middleware-request-";
86
- /** Comma-separated list of header names that middleware wants to override. */
87
- declare const MIDDLEWARE_OVERRIDE_HEADERS = "x-middleware-override-headers";
88
- /** Carries cookies set by middleware for same-render reads. */
89
- declare const MIDDLEWARE_SET_COOKIE_HEADER = "x-middleware-set-cookie";
90
80
  /** Signal from `NextResponse.next()` — value "1" means "continue to next handler". */
91
81
  declare const MIDDLEWARE_NEXT_HEADER = "x-middleware-next";
92
82
  /** Rewrite destination URL set by `NextResponse.rewrite()`. */
93
83
  declare const MIDDLEWARE_REWRITE_HEADER = "x-middleware-rewrite";
94
- /** Generic prefix for all middleware internal headers. */
95
- declare const MIDDLEWARE_HEADER_PREFIX = "x-middleware-";
96
84
  declare const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
97
85
  declare const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
98
86
  declare const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
99
87
  declare const NEXT_URL_HEADER = "Next-Url";
88
+ declare const NEXT_REQUEST_ID_HEADER = "x-nextjs-request-id";
89
+ declare const NEXT_HTML_REQUEST_ID_HEADER = "x-nextjs-html-request-id";
100
90
  /** Lowercase flight header variants used in middleware forwarding. */
101
91
  declare const FLIGHT_HEADERS: readonly string[];
102
92
  /**
@@ -111,4 +101,4 @@ declare const INTERNAL_HEADERS: string[];
111
101
  /** Vinext-only internal headers stripped alongside Next.js protocol internals. */
112
102
  declare const VINEXT_INTERNAL_HEADERS: string[];
113
103
  //#endregion
114
- export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_REQUEST_HEADER_PREFIX, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
104
+ export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_HTML_REQUEST_ID_HEADER, NEXT_REQUEST_ID_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
@@ -1,3 +1,4 @@
1
+ import { MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_SET_COOKIE_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "../utils/protocol-headers.js";
1
2
  //#region src/server/headers.ts
2
3
  /**
3
4
  * Internal HTTP header name constants used throughout vinext.
@@ -15,14 +16,8 @@ const VINEXT_CACHE_HEADER = "X-Vinext-Cache";
15
16
  const NEXTJS_CACHE_HEADER = "x-nextjs-cache";
16
17
  /** Static file signal — value is URL-encoded pathname. */
17
18
  const VINEXT_STATIC_FILE_HEADER = "x-vinext-static-file";
18
- /** Serialized middleware context (JSON) forwarded from dev server to RSC entry. */
19
- const VINEXT_MW_CTX_HEADER = "x-vinext-mw-ctx";
20
19
  /** Timing metrics: `handlerStart,compileMs,renderMs`. */
21
20
  const VINEXT_TIMING_HEADER = "x-vinext-timing";
22
- /** Build-time prerender authentication secret. */
23
- const VINEXT_PRERENDER_SECRET_HEADER = "x-vinext-prerender-secret";
24
- /** URL-encoded JSON route params for build-time prerender renders. */
25
- const VINEXT_PRERENDER_ROUTE_PARAMS_HEADER = "x-vinext-prerender-route-params";
26
21
  /** Internal endpoint used to evaluate App Router generateStaticParams exports. */
27
22
  const VINEXT_PRERENDER_STATIC_PARAMS_PATH = "/__vinext/prerender/static-params";
28
23
  /** Internal endpoint used to evaluate Pages Router getStaticPaths exports. */
@@ -81,12 +76,6 @@ const ACTION_REDIRECT_HEADER = "x-action-redirect";
81
76
  const ACTION_REDIRECT_TYPE_HEADER = "x-action-redirect-type";
82
77
  /** HTTP status for a Server Action redirect (e.g. "308"). */
83
78
  const ACTION_REDIRECT_STATUS_HEADER = "x-action-redirect-status";
84
- /** Prefix for forwarded request headers (e.g. `x-middleware-request-cookie`). */
85
- const MIDDLEWARE_REQUEST_HEADER_PREFIX = "x-middleware-request-";
86
- /** Comma-separated list of header names that middleware wants to override. */
87
- const MIDDLEWARE_OVERRIDE_HEADERS = "x-middleware-override-headers";
88
- /** Carries cookies set by middleware for same-render reads. */
89
- const MIDDLEWARE_SET_COOKIE_HEADER = "x-middleware-set-cookie";
90
79
  /** Signal from `NextResponse.next()` — value "1" means "continue to next handler". */
91
80
  const MIDDLEWARE_NEXT_HEADER = "x-middleware-next";
92
81
  /** Rewrite destination URL set by `NextResponse.rewrite()`. */
@@ -95,12 +84,12 @@ const MIDDLEWARE_REWRITE_HEADER = "x-middleware-rewrite";
95
84
  const MIDDLEWARE_REDIRECT_HEADER = "x-middleware-redirect";
96
85
  /** Skip-middleware signal. */
97
86
  const MIDDLEWARE_SKIP_HEADER = "x-middleware-skip";
98
- /** Generic prefix for all middleware internal headers. */
99
- const MIDDLEWARE_HEADER_PREFIX = "x-middleware-";
100
87
  const NEXT_ROUTER_STATE_TREE_HEADER = "Next-Router-State-Tree";
101
88
  const NEXT_ROUTER_PREFETCH_HEADER = "Next-Router-Prefetch";
102
89
  const NEXT_ROUTER_SEGMENT_PREFETCH_HEADER = "Next-Router-Segment-Prefetch";
103
90
  const NEXT_URL_HEADER = "Next-Url";
91
+ const NEXT_REQUEST_ID_HEADER = "x-nextjs-request-id";
92
+ const NEXT_HTML_REQUEST_ID_HEADER = "x-nextjs-html-request-id";
104
93
  /** Lowercase flight header variants used in middleware forwarding. */
105
94
  const FLIGHT_HEADERS = [
106
95
  "rsc",
@@ -133,4 +122,4 @@ const INTERNAL_HEADERS = [
133
122
  /** Vinext-only internal headers stripped alongside Next.js protocol internals. */
134
123
  const VINEXT_INTERNAL_HEADERS = [VINEXT_PRERENDER_ROUTE_PARAMS_HEADER];
135
124
  //#endregion
136
- export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_OVERRIDE_HEADERS, MIDDLEWARE_REQUEST_HEADER_PREFIX, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
125
+ export { ACTION_FORWARDED_HEADER, ACTION_REDIRECT_HEADER, ACTION_REDIRECT_STATUS_HEADER, ACTION_REDIRECT_TYPE_HEADER, ACTION_REVALIDATED_HEADER, FLIGHT_HEADERS, INTERNAL_HEADERS, MIDDLEWARE_HEADER_PREFIX, MIDDLEWARE_NEXT_HEADER, MIDDLEWARE_REWRITE_HEADER, MIDDLEWARE_SET_COOKIE_HEADER, NEXTJS_ACTION_NOT_FOUND_HEADER, NEXTJS_CACHE_HEADER, NEXTJS_DEPLOYMENT_ID_HEADER, NEXT_ACTION_HEADER, NEXT_HTML_REQUEST_ID_HEADER, NEXT_REQUEST_ID_HEADER, NEXT_ROUTER_PREFETCH_HEADER, NEXT_ROUTER_SEGMENT_PREFETCH_HEADER, NEXT_ROUTER_STATE_TREE_HEADER, NEXT_URL_HEADER, RSC_ACTION_HEADER, RSC_HEADER, VINEXT_CACHE_HEADER, VINEXT_CLIENT_REUSE_MANIFEST_HEADER, VINEXT_DYNAMIC_STALE_TIME_HEADER, VINEXT_INTERCEPTION_CONTEXT_HEADER, VINEXT_INTERNAL_HEADERS, VINEXT_MOUNTED_SLOTS_HEADER, VINEXT_MW_CTX_HEADER, VINEXT_PARAMS_HEADER, VINEXT_PRERENDER_PAGES_STATIC_PATHS_PATH, VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_PRERENDER_STATIC_PARAMS_PATH, VINEXT_REVALIDATE_HEADER, VINEXT_RSC_MARKER_HEADER, VINEXT_RSC_REDIRECT_HEADER, VINEXT_RSC_RENDER_MODE_HEADER, VINEXT_STATIC_FILE_HEADER, VINEXT_TIMING_HEADER };
@@ -126,5 +126,55 @@ type ImageHandlers = {
126
126
  * cache headers.
127
127
  */
128
128
  declare function handleImageOptimization(request: Request, handlers: ImageHandlers, allowedWidths?: number[], imageConfig?: ImageConfig): Promise<Response>;
129
+ /**
130
+ * A server-side image optimizer: the transform backend that resizes/transcodes
131
+ * a source image. Produced by an adapter factory (e.g. `imagesOptimizer()` from
132
+ * `@vinext/cloudflare/images/images-optimizer`) and registered via
133
+ * {@link setImageOptimizer}.
134
+ */
135
+ type ImageOptimizer = {
136
+ /** Transform the source image (resize, format, quality). */transformImage: (body: ReadableStream, options: {
137
+ width: number;
138
+ format: string;
139
+ quality: number;
140
+ }) => Promise<Response>;
141
+ };
142
+ /**
143
+ * Register the active image optimizer (transform backend). An explicit
144
+ * registration always wins; passing `null` clears it (falling back to
145
+ * unoptimized passthrough).
146
+ *
147
+ * Configure this declaratively via the `images.optimizer` option on the
148
+ * `vinext()` plugin in your `vite.config.ts` rather than calling it directly.
149
+ * On Cloudflare Workers:
150
+ *
151
+ * ```ts
152
+ * import { vinext } from "vinext";
153
+ * import { imagesOptimizer } from "@vinext/cloudflare/images/images-optimizer";
154
+ *
155
+ * export default defineConfig({
156
+ * plugins: [vinext({ images: { optimizer: imagesOptimizer() } })],
157
+ * });
158
+ * ```
159
+ *
160
+ * The plugin registers the optimizer across every runtime/router entry, so you
161
+ * don't have to wire `env.IMAGES` into a custom worker entry. This setter
162
+ * remains the internal registration target.
163
+ */
164
+ declare function setImageOptimizer(optimizer: ImageOptimizer | null): void;
165
+ /** Get the active image optimizer, or `null` when none is configured. */
166
+ declare function getImageOptimizer(): ImageOptimizer | null;
167
+ /**
168
+ * Handle an image optimization request using the configured optimizer (if any).
169
+ *
170
+ * This is the single entry point every runtime/router seam (App Router worker,
171
+ * Pages worker, Node prod server) should call: it reads the registered
172
+ * {@link ImageOptimizer} and wires its `transformImage` into
173
+ * {@link handleImageOptimization}, with the caller supplying the runtime's
174
+ * `fetchAsset` (e.g. the Cloudflare `ASSETS` binding, or filesystem reads on
175
+ * Node). When no optimizer is registered, the request is served unoptimized
176
+ * (passthrough) with the same security/cache headers.
177
+ */
178
+ declare function handleConfiguredImageOptimization(request: Request, fetchAsset: (path: string, request: Request) => Promise<Response>, allowedWidths?: number[], imageConfig?: ImageConfig): Promise<Response>;
129
179
  //#endregion
130
- export { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, IMAGE_CACHE_CONTROL, IMAGE_CONTENT_SECURITY_POLICY, IMAGE_OPTIMIZATION_PATH, ImageConfig, ImageHandlers, ParseImageParamsOptions, VINEXT_IMAGE_OPTIMIZATION_PATH, handleImageOptimization, isImageOptimizationPath, isSafeImageContentType, negotiateImageFormat, parseImageParams, resolveDevImageRedirect, snapToNearestAllowedWidth };
180
+ export { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, IMAGE_CACHE_CONTROL, IMAGE_CONTENT_SECURITY_POLICY, IMAGE_OPTIMIZATION_PATH, ImageConfig, ImageHandlers, ImageOptimizer, ParseImageParamsOptions, VINEXT_IMAGE_OPTIMIZATION_PATH, getImageOptimizer, handleConfiguredImageOptimization, handleImageOptimization, isImageOptimizationPath, isSafeImageContentType, negotiateImageFormat, parseImageParams, resolveDevImageRedirect, setImageOptimizer, snapToNearestAllowedWidth };