@qzsy/vinext 0.1.12 → 0.1.81

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 (231) 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 +160 -160
  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 +106 -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-response-headers.d.ts +19 -0
  146. package/dist/server/dev-response-headers.js +78 -0
  147. package/dist/server/dev-server.js +8 -15
  148. package/dist/server/dev-stack-sourcemap.d.ts +1 -1
  149. package/dist/server/dev-stack-sourcemap.js +1 -1
  150. package/dist/server/headers.d.ts +7 -15
  151. package/dist/server/headers.js +6 -15
  152. package/dist/server/image-optimization.d.ts +51 -1
  153. package/dist/server/image-optimization.js +52 -2
  154. package/dist/server/isr-cache.d.ts +1 -1
  155. package/dist/server/isr-cache.js +2 -2
  156. package/dist/server/middleware-runtime.js +6 -1
  157. package/dist/server/navigation-planner.d.ts +1 -0
  158. package/dist/server/navigation-planner.js +14 -3
  159. package/dist/server/pages-asset-tags.d.ts +4 -6
  160. package/dist/server/pages-asset-tags.js +12 -12
  161. package/dist/server/pages-client-assets.d.ts +12 -0
  162. package/dist/server/pages-client-assets.js +10 -0
  163. package/dist/server/pages-page-data.d.ts +23 -1
  164. package/dist/server/pages-page-data.js +43 -24
  165. package/dist/server/pages-page-handler.d.ts +2 -1
  166. package/dist/server/pages-page-handler.js +10 -4
  167. package/dist/server/pages-request-pipeline.d.ts +2 -0
  168. package/dist/server/pages-request-pipeline.js +25 -1
  169. package/dist/server/prerender-manifest.d.ts +3 -1
  170. package/dist/server/prerender-route-params.js +1 -1
  171. package/dist/server/prod-server.d.ts +1 -1
  172. package/dist/server/prod-server.js +47 -25
  173. package/dist/server/request-log.d.ts +5 -14
  174. package/dist/server/request-log.js +7 -1
  175. package/dist/server/request-pipeline.js +1 -0
  176. package/dist/server/seed-cache.js +4 -4
  177. package/dist/server/server-action-logger.d.ts +39 -0
  178. package/dist/server/server-action-logger.js +104 -0
  179. package/dist/server/worker-utils.d.ts +2 -1
  180. package/dist/server/worker-utils.js +7 -1
  181. package/dist/shims/app-router-scroll-state.d.ts +1 -0
  182. package/dist/shims/app-router-scroll-state.js +1 -0
  183. package/dist/shims/app-router-scroll.js +2 -1
  184. package/dist/shims/cache.js +19 -15
  185. package/dist/shims/cdn-cache.js +1 -1
  186. package/dist/shims/dynamic-preload-chunks.js +2 -1
  187. package/dist/shims/error-boundary.d.ts +19 -1
  188. package/dist/shims/error-boundary.js +11 -1
  189. package/dist/shims/form.d.ts +3 -1
  190. package/dist/shims/form.js +37 -43
  191. package/dist/shims/headers.d.ts +9 -1
  192. package/dist/shims/headers.js +31 -6
  193. package/dist/shims/image-optimization-url.d.ts +4 -0
  194. package/dist/shims/image-optimization-url.js +33 -1
  195. package/dist/shims/image.js +46 -13
  196. package/dist/shims/internal/app-route-detection.d.ts +2 -17
  197. package/dist/shims/internal/app-route-detection.js +4 -17
  198. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +23 -0
  199. package/dist/shims/internal/hybrid-client-route-owner-direct.js +51 -0
  200. package/dist/shims/internal/hybrid-client-route-owner.d.ts +2 -5
  201. package/dist/shims/internal/hybrid-client-route-owner.js +9 -60
  202. package/dist/shims/internal/pages-router-components.d.ts +7 -0
  203. package/dist/shims/internal/pages-router-components.js +13 -0
  204. package/dist/shims/link.js +23 -16
  205. package/dist/shims/metadata.d.ts +3 -2
  206. package/dist/shims/metadata.js +8 -4
  207. package/dist/shims/navigation.js +4 -2
  208. package/dist/shims/root-params.d.ts +15 -1
  209. package/dist/shims/root-params.js +21 -1
  210. package/dist/shims/router.d.ts +2 -5
  211. package/dist/shims/router.js +41 -22
  212. package/dist/shims/server.js +3 -2
  213. package/dist/typegen.js +6 -5
  214. package/dist/utils/client-runtime-metadata.d.ts +2 -18
  215. package/dist/utils/client-runtime-metadata.js +31 -22
  216. package/dist/utils/dev-stack-sourcemap-endpoint.d.ts +4 -0
  217. package/dist/{server → utils}/dev-stack-sourcemap-endpoint.js +1 -1
  218. package/dist/utils/domain-locale.d.ts +6 -3
  219. package/dist/{server → utils}/middleware-request-headers.d.ts +1 -1
  220. package/dist/{server → utils}/middleware-request-headers.js +2 -2
  221. package/dist/utils/path.d.ts +2 -1
  222. package/dist/utils/path.js +1 -1
  223. package/dist/utils/project.d.ts +9 -1
  224. package/dist/utils/project.js +21 -4
  225. package/dist/utils/protocol-headers.d.ts +17 -0
  226. package/dist/utils/protocol-headers.js +17 -0
  227. package/dist/utils/react-version.d.ts +4 -0
  228. package/dist/utils/react-version.js +44 -0
  229. package/package.json +29 -23
  230. package/dist/server/dev-stack-sourcemap-endpoint.d.ts +0 -4
  231. /package/dist/{cloudflare → packages/cloudflare}/src/utils/cache-control-metadata.js +0 -0
@@ -5,14 +5,16 @@ 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
+ import { applyServerActionLogHeader, createServerActionLogInfo, isDevServerActionLoggingEnabled } from "./server-action-logger.js";
11
12
  import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
12
13
  import { VINEXT_RSC_CONTENT_TYPE, VINEXT_RSC_VARY_HEADER, applyRscCompatibilityIdHeader } from "./app-rsc-cache-busting.js";
13
14
  import { mergeMiddlewareResponseHeaders } from "./middleware-response-headers.js";
14
15
  import { applyEdgeRuntimeHeader } from "./app-page-response.js";
15
16
  import { getNextErrorDigest, parseNextHttpErrorDigest, parseNextRedirectDigest } from "./next-error-digest.js";
17
+ import { createRootParamsUsageController, pickRootParams, runWithRootParamsScope, runWithRootParamsUsage } from "../shims/root-params.js";
16
18
  import { createServerActionNotFoundResponse, getServerActionNotFoundMessage, isServerActionNotFoundError } from "./server-action-not-found.js";
17
19
  import { deferUntilStreamConsumed } from "./defer-until-stream-consumed.js";
18
20
  import "./app-page-stream.js";
@@ -20,7 +22,29 @@ import { buildAppPageTags } from "./implicit-tags.js";
20
22
  import { resolveAppPageNavigationParams } from "./app-page-element-builder.js";
21
23
  import { resolveAppPageActionRerenderTarget } from "./app-page-request.js";
22
24
  import { getSetCookieName } from "./cookie-utils.js";
25
+ import { createStaticGenerationHeadersContext } from "./app-static-generation.js";
23
26
  //#region src/server/app-server-action-execution.ts
27
+ function prepareActionPageRerenderContext(options) {
28
+ if (options.dynamicConfig === "force-static" || options.dynamicConfig === "error") setHeadersContext(createStaticGenerationHeadersContext({
29
+ draftModeEnabled: isDraftModeRequest(createActionRerenderRequest({
30
+ draftModeCookie: options.draftModeCookie,
31
+ request: options.request
32
+ }), options.draftModeSecret),
33
+ draftModeSecret: options.draftModeSecret,
34
+ dynamicConfig: options.dynamicConfig,
35
+ routeKind: "page",
36
+ routePattern: options.routePattern
37
+ }));
38
+ return options.dynamicConfig === "force-static" ? new URLSearchParams() : options.searchParams;
39
+ }
40
+ function createActionRerenderRequest(options) {
41
+ if (!options.draftModeCookie) return options.request;
42
+ const headers = new Headers(options.request.headers);
43
+ const cookieHeader = applySetCookieMutationsToRequestCookieHeader(headers.get("cookie"), [options.draftModeCookie]);
44
+ if (cookieHeader === null) headers.delete("cookie");
45
+ else headers.set("cookie", cookieHeader);
46
+ return new Request(options.request.url, { headers });
47
+ }
24
48
  /**
25
49
  * Matches Next.js' server action argument cap to prevent stack overflow in
26
50
  * Function.prototype.apply when decoding hostile action payloads.
@@ -351,11 +375,14 @@ async function handleProgressiveServerActionRequest(options) {
351
375
  let actionRedirect = null;
352
376
  let actionError = void 0;
353
377
  let actionFailed = false;
378
+ let actionThrew = false;
354
379
  let actionResult;
380
+ const rootParamsUsage = createRootParamsUsageController();
355
381
  const previousHeadersPhase = options.setHeadersAccessPhase("action");
356
382
  try {
357
- actionResult = await action();
383
+ actionResult = await runWithRootParamsUsage({ kind: "server-action" }, action, rootParamsUsage);
358
384
  } catch (error) {
385
+ actionThrew = true;
359
386
  actionRedirect = getActionRedirect(error);
360
387
  if (!actionRedirect) {
361
388
  actionError = error;
@@ -375,8 +402,10 @@ async function handleProgressiveServerActionRequest(options) {
375
402
  }
376
403
  } finally {
377
404
  options.setHeadersAccessPhase(previousHeadersPhase);
405
+ if (actionThrew) rootParamsUsage.transitionToRender();
378
406
  }
379
407
  if (!actionRedirect) {
408
+ if (!actionThrew) rootParamsUsage.transitionToRender();
380
409
  const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
381
410
  const actionDraftCookie = options.getDraftModeCookieHeader();
382
411
  const revalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
@@ -544,16 +573,22 @@ async function handleServerActionRscRequest(options) {
544
573
  let returnValue;
545
574
  let actionRedirect = null;
546
575
  let actionStatus = 200;
576
+ let actionThrew = false;
547
577
  const actionWasForwarded = Boolean(options.request.headers.get(ACTION_FORWARDED_HEADER));
578
+ const rootParamsUsage = createRootParamsUsageController();
579
+ const shouldLogAction = isDevServerActionLoggingEnabled();
580
+ const actionLogStart = shouldLogAction ? performance.now() : 0;
581
+ let actionLogInfo = null;
548
582
  const previousHeadersPhase = options.setHeadersAccessPhase("action");
549
583
  try {
550
584
  try {
551
585
  validateServerActionArgs(args);
552
586
  returnValue = {
553
587
  ok: true,
554
- data: await action.apply(null, args)
588
+ data: await runWithRootParamsUsage({ kind: "server-action" }, () => action.apply(null, args), rootParamsUsage)
555
589
  };
556
590
  } catch (error) {
591
+ actionThrew = true;
557
592
  actionRedirect = getActionRedirect(error);
558
593
  if (actionRedirect) returnValue = {
559
594
  ok: true,
@@ -568,6 +603,7 @@ async function handleServerActionRscRequest(options) {
568
603
  data: error
569
604
  };
570
605
  } else {
606
+ actionStatus = 500;
571
607
  console.error("[vinext] Server action error:", error);
572
608
  returnValue = {
573
609
  ok: false,
@@ -577,7 +613,13 @@ async function handleServerActionRscRequest(options) {
577
613
  }
578
614
  }
579
615
  } finally {
616
+ if (shouldLogAction) actionLogInfo = createServerActionLogInfo({
617
+ actionId: options.actionId,
618
+ args,
619
+ durationMs: Math.round(performance.now() - actionLogStart)
620
+ });
580
621
  options.setHeadersAccessPhase(previousHeadersPhase);
622
+ if (actionThrew && !actionWasForwarded) rootParamsUsage.transitionToRender();
581
623
  }
582
624
  if (actionRedirect) {
583
625
  const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
@@ -597,6 +639,7 @@ async function handleServerActionRscRequest(options) {
597
639
  for (const cookie of actionPendingCookies) redirectHeaders.append("Set-Cookie", cookie);
598
640
  if (actionDraftCookie) redirectHeaders.append("Set-Cookie", actionDraftCookie);
599
641
  setActionRevalidatedHeader(redirectHeaders, actionRevalidationKind);
642
+ applyServerActionLogHeader(redirectHeaders, actionLogInfo);
600
643
  const redirectTarget = resolveInternalActionRedirectTarget(actionRedirectUrl, options.request.url, options.basePath ?? "");
601
644
  if (!redirectTarget) {
602
645
  options.clearRequestContext();
@@ -622,35 +665,48 @@ async function handleServerActionRscRequest(options) {
622
665
  request: options.request,
623
666
  url: redirectTarget
624
667
  });
625
- setHeadersContext(headersContextFromRequest(redirectRenderRequest));
668
+ setHeadersContext(headersContextFromRequest(redirectRenderRequest, { draftModeSecret: options.draftModeSecret }));
669
+ const redirectDynamicConfig = options.resolveRouteDynamicConfig?.(targetMatch.route);
670
+ const redirectSearchParams = prepareActionPageRerenderContext({
671
+ draftModeCookie: actionDraftCookie,
672
+ draftModeSecret: options.draftModeSecret,
673
+ dynamicConfig: redirectDynamicConfig,
674
+ request: redirectRenderRequest,
675
+ routePattern: targetMatch.route.pattern,
676
+ searchParams: redirectTarget.searchParams
677
+ });
626
678
  const redirectNavigationParams = resolveAppPageNavigationParams(targetMatch.route, targetMatch.params, targetPathname, null);
627
679
  options.setNavigationContext({
628
680
  pathname: targetPathname,
629
- searchParams: redirectTarget.searchParams,
681
+ searchParams: redirectSearchParams,
630
682
  params: redirectNavigationParams
631
683
  });
632
684
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(targetMatch.route) ?? null);
633
- setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(targetMatch.route) === "force-dynamic");
685
+ setCurrentForceDynamicFetchDefault(redirectDynamicConfig === "force-dynamic");
634
686
  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
- }), {
687
+ return createServerActionRscResponse(await runWithRootParamsScope(pickRootParams(targetMatch.params, targetMatch.route.rootParamNames), () => runWithRootParamsUsage({ kind: "route" }, async () => {
688
+ const element = options.buildPageElement({
689
+ cleanPathname: targetPathname,
690
+ interceptOpts: void 0,
691
+ isRscRequest: true,
692
+ mountedSlotsHeader: null,
693
+ params: targetMatch.params,
694
+ request: redirectRenderRequest,
695
+ route: targetMatch.route,
696
+ searchParams: redirectSearchParams,
697
+ renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
698
+ observeMetadataSearchParamsAccess: redirectDynamicConfig !== "force-static",
699
+ observePageSearchParamsAccess: redirectDynamicConfig !== "force-static"
700
+ });
701
+ const onRenderError = options.createRscOnErrorHandler(redirectRenderRequest, targetPathname, targetMatch.route.pattern);
702
+ return options.renderToReadableStream({
703
+ root: element,
704
+ returnValue
705
+ }, {
706
+ temporaryReferences,
707
+ onError: onRenderError
708
+ });
709
+ })), {
654
710
  status: shouldUseForwardedActionRedirectStatus({
655
711
  actionWasForwarded,
656
712
  currentPathname: options.cleanPathname,
@@ -665,7 +721,8 @@ async function handleServerActionRscRequest(options) {
665
721
  const actionPendingCookies = dedupePendingCookies(options.getAndClearPendingCookies());
666
722
  const actionDraftCookie = options.getDraftModeCookieHeader();
667
723
  const actionRevalidationKind = resolveActionRevalidationKind(actionPendingCookies.length > 0 || Boolean(actionDraftCookie));
668
- if (actionWasForwarded || actionStatus === 200 && actionRevalidationKind === ACTION_DID_NOT_REVALIDATE) {
724
+ const isHttpFallback = actionStatus === 401 || actionStatus === 403 || actionStatus === 404;
725
+ if (!isHttpFallback && (actionWasForwarded || actionRevalidationKind === ACTION_DID_NOT_REVALIDATE)) {
669
726
  const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, options.cleanPathname);
670
727
  const rscStream = await options.renderToReadableStream({ returnValue }, {
671
728
  temporaryReferences,
@@ -681,11 +738,13 @@ async function handleServerActionRscRequest(options) {
681
738
  for (const cookie of actionPendingCookies) actionHeaders.append("Set-Cookie", cookie);
682
739
  if (actionDraftCookie) actionHeaders.append("Set-Cookie", actionDraftCookie);
683
740
  setActionRevalidatedHeader(actionHeaders, actionRevalidationKind);
741
+ applyServerActionLogHeader(actionHeaders, actionLogInfo);
684
742
  return createServerActionRscResponse(rscStream, {
685
743
  status: options.middlewareStatus ?? actionStatus,
686
744
  headers: actionHeaders
687
745
  }, options.clearRequestContext);
688
746
  }
747
+ if (!actionThrew) rootParamsUsage.transitionToRender();
689
748
  const match = options.matchRoute(options.cleanPathname);
690
749
  let element;
691
750
  let errorPattern = match ? match.route.pattern : options.cleanPathname;
@@ -702,16 +761,25 @@ async function handleServerActionRscRequest(options) {
702
761
  toInterceptOpts: options.toInterceptOpts
703
762
  });
704
763
  const resolvedActionNavigationParams = resolveAppPageNavigationParams(actionRerenderTarget.route, actionRerenderTarget.navigationParams, options.cleanPathname, actionRerenderTarget.interceptOpts);
764
+ await options.ensureRouteLoaded?.(actionRerenderTarget.route);
765
+ const actionRerenderDynamicConfig = options.resolveRouteDynamicConfig?.(actionRerenderTarget.route);
766
+ const actionRerenderSearchParams = prepareActionPageRerenderContext({
767
+ draftModeCookie: actionDraftCookie,
768
+ draftModeSecret: options.draftModeSecret,
769
+ dynamicConfig: actionRerenderDynamicConfig,
770
+ request: options.request,
771
+ routePattern: actionRerenderTarget.route.pattern,
772
+ searchParams: options.searchParams
773
+ });
705
774
  options.setNavigationContext({
706
775
  pathname: options.cleanPathname,
707
- searchParams: options.searchParams,
776
+ searchParams: actionRerenderSearchParams,
708
777
  params: resolvedActionNavigationParams
709
778
  });
710
- await options.ensureRouteLoaded?.(actionRerenderTarget.route);
711
779
  setCurrentFetchCacheMode(options.resolveRouteFetchCacheMode?.(actionRerenderTarget.route) ?? null);
712
- setCurrentForceDynamicFetchDefault(options.resolveRouteDynamicConfig?.(actionRerenderTarget.route) === "force-dynamic");
780
+ setCurrentForceDynamicFetchDefault(actionRerenderDynamicConfig === "force-dynamic");
713
781
  setCurrentFetchSoftTags(buildServerActionPageTags(actionRerenderTarget.route, options.cleanPathname));
714
- element = options.buildPageElement({
782
+ const buildActionRerenderElement = () => options.buildPageElement({
715
783
  cleanPathname: options.cleanPathname,
716
784
  interceptOpts: actionRerenderTarget.interceptOpts,
717
785
  isRscRequest: options.isRscRequest,
@@ -719,22 +787,26 @@ async function handleServerActionRscRequest(options) {
719
787
  params: actionRerenderTarget.params,
720
788
  request: options.request,
721
789
  route: actionRerenderTarget.route,
722
- searchParams: options.searchParams,
723
- renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI
790
+ searchParams: actionRerenderSearchParams,
791
+ renderMode: APP_RSC_RENDER_MODE_ACTION_RERENDER_PRESERVE_UI,
792
+ observeMetadataSearchParamsAccess: actionRerenderDynamicConfig !== "force-static",
793
+ observePageSearchParamsAccess: actionRerenderDynamicConfig !== "force-static"
724
794
  });
795
+ element = actionWasForwarded && isHttpFallback ? await runWithRootParamsUsage({ kind: "route" }, async () => buildActionRerenderElement()) : buildActionRerenderElement();
725
796
  errorPattern = actionRerenderTarget.route.pattern;
726
797
  } else {
727
798
  const actionRouteId = options.createPayloadRouteId(options.cleanPathname, null);
728
799
  element = options.createNotFoundElement(actionRouteId);
729
800
  }
730
801
  const onRenderError = options.createRscOnErrorHandler(options.request, options.cleanPathname, errorPattern);
731
- const rscStream = await options.renderToReadableStream({
802
+ const renderActionRerender = () => options.renderToReadableStream({
732
803
  root: element,
733
804
  returnValue
734
805
  }, {
735
806
  temporaryReferences,
736
807
  onError: onRenderError
737
808
  });
809
+ const rscStream = await (actionWasForwarded && isHttpFallback ? runWithRootParamsUsage({ kind: "route" }, renderActionRerender) : renderActionRerender());
738
810
  const actionHeaders = new Headers({
739
811
  "Content-Type": VINEXT_RSC_CONTENT_TYPE,
740
812
  Vary: VINEXT_RSC_VARY_HEADER
@@ -743,6 +815,7 @@ async function handleServerActionRscRequest(options) {
743
815
  mergeMiddlewareResponseHeaders(actionHeaders, options.middlewareHeaders);
744
816
  applyRscCompatibilityIdHeader(actionHeaders);
745
817
  setActionRevalidatedHeader(actionHeaders, actionRevalidationKind);
818
+ applyServerActionLogHeader(actionHeaders, actionLogInfo);
746
819
  const actionResponse = createServerActionRscResponse(rscStream, {
747
820
  status: options.middlewareStatus ?? actionStatus,
748
821
  headers: actionHeaders
@@ -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 };
@@ -0,0 +1,19 @@
1
+ import { RequestLogOptions } from "./request-log.js";
2
+ import { ServerResponse } from "node:http";
3
+
4
+ //#region src/server/dev-response-headers.d.ts
5
+ type DevResponseMetrics = {
6
+ compileMs?: number;
7
+ renderMs?: number;
8
+ actionLogRaw?: string;
9
+ };
10
+ declare function parseVinextTimingHeader(raw: unknown, reqStart: number): Pick<DevResponseMetrics, "compileMs" | "renderMs">;
11
+ /** Intercept dev-only headers on a Node response and capture their payloads. */
12
+ declare function interceptDevResponseHeaders(res: ServerResponse, reqStart: number, metrics: DevResponseMetrics): void;
13
+ declare function flushDevRequestLogs(metrics: DevResponseMetrics, options: RequestLogOptions): void;
14
+ /** Install App Router request + server action logging on the Vite dev server. */
15
+ declare function installAppRouterDevRequestLogging(middlewares: {
16
+ use: (handler: (req: import("node:http").IncomingMessage, res: ServerResponse, next: (err?: unknown) => void) => void) => void;
17
+ }): void;
18
+ //#endregion
19
+ export { DevResponseMetrics, flushDevRequestLogs, installAppRouterDevRequestLogging, interceptDevResponseHeaders, parseVinextTimingHeader };
@@ -0,0 +1,78 @@
1
+ import "./headers.js";
2
+ import { parseServerActionLogHeader } from "./server-action-logger.js";
3
+ import { logRequest, logServerAction, now } from "./request-log.js";
4
+ //#region src/server/dev-response-headers.ts
5
+ function parseVinextTimingHeader(raw, reqStart) {
6
+ const [handlerStart, inHandlerCompileMs, renderMs] = String(raw).split(",").map((v) => Number(v));
7
+ const metrics = {};
8
+ if (!Number.isNaN(handlerStart) && !Number.isNaN(inHandlerCompileMs) && inHandlerCompileMs !== -1) metrics.compileMs = Math.max(0, Math.round(handlerStart - reqStart)) + inHandlerCompileMs;
9
+ if (!Number.isNaN(renderMs) && renderMs !== -1) metrics.renderMs = renderMs;
10
+ return metrics;
11
+ }
12
+ function consumeDevInternalHeader(name, value, reqStart, metrics) {
13
+ const lowerName = name.toLowerCase();
14
+ if (lowerName === "x-vinext-timing") {
15
+ Object.assign(metrics, parseVinextTimingHeader(value, reqStart));
16
+ return true;
17
+ }
18
+ if (lowerName === "x-vinext-action-log") {
19
+ metrics.actionLogRaw = String(value);
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+ function stripDevInternalHeadersFromObject(headers, reqStart, metrics) {
25
+ for (const key of Object.keys(headers)) if (consumeDevInternalHeader(key, headers[key], reqStart, metrics)) delete headers[key];
26
+ }
27
+ /** Intercept dev-only headers on a Node response and capture their payloads. */
28
+ function interceptDevResponseHeaders(res, reqStart, metrics) {
29
+ const origSetHeader = res.setHeader.bind(res);
30
+ res.setHeader = function(name, value) {
31
+ if (consumeDevInternalHeader(String(name), value, reqStart, metrics)) return res;
32
+ return origSetHeader(name, value);
33
+ };
34
+ const origWriteHead = res.writeHead.bind(res);
35
+ res.writeHead = function(statusCode, ...args) {
36
+ let headers;
37
+ const [reasonOrHeaders, maybeHeaders] = args;
38
+ if (typeof reasonOrHeaders === "string") headers = maybeHeaders;
39
+ else headers = reasonOrHeaders;
40
+ if (headers && typeof headers === "object" && !Array.isArray(headers)) stripDevInternalHeadersFromObject(headers, reqStart, metrics);
41
+ return origWriteHead(statusCode, ...args);
42
+ };
43
+ }
44
+ function flushDevRequestLogs(metrics, options) {
45
+ logRequest(options);
46
+ const actionLog = metrics.actionLogRaw ? parseServerActionLogHeader(metrics.actionLogRaw) : null;
47
+ if (actionLog) logServerAction(actionLog);
48
+ }
49
+ function shouldSkipDevRequestLogUrl(url) {
50
+ const [pathname] = url.split("?");
51
+ return url.startsWith("/@") || url.startsWith("/__vite") || url.startsWith("/node_modules") || url.includes(".") && !pathname.endsWith(".html") && !pathname.endsWith(".rsc");
52
+ }
53
+ /** Install App Router request + server action logging on the Vite dev server. */
54
+ function installAppRouterDevRequestLogging(middlewares) {
55
+ middlewares.use((req, res, next) => {
56
+ const url = req.url ?? "/";
57
+ if (shouldSkipDevRequestLogUrl(url)) return next();
58
+ const reqStart = now();
59
+ const metrics = {};
60
+ interceptDevResponseHeaders(res, reqStart, metrics);
61
+ res.on("finish", () => {
62
+ const logUrl = url.replace(/\.rsc(\?|$)/, "$1");
63
+ const totalMs = now() - reqStart;
64
+ const resolvedRenderMs = metrics.renderMs !== void 0 ? metrics.renderMs : metrics.compileMs !== void 0 ? Math.max(0, Math.round(totalMs - metrics.compileMs)) : void 0;
65
+ flushDevRequestLogs(metrics, {
66
+ method: req.method ?? "GET",
67
+ url: logUrl,
68
+ status: res.statusCode,
69
+ totalMs,
70
+ compileMs: metrics.compileMs,
71
+ renderMs: resolvedRenderMs
72
+ });
73
+ });
74
+ next();
75
+ });
76
+ }
77
+ //#endregion
78
+ export { flushDevRequestLogs, installAppRouterDevRequestLogging, interceptDevResponseHeaders, parseVinextTimingHeader };
@@ -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