vinext 0.0.52 → 0.0.53

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 (238) hide show
  1. package/README.md +1 -1
  2. package/dist/build/clean-output.d.ts +14 -0
  3. package/dist/build/clean-output.js +36 -0
  4. package/dist/build/clean-output.js.map +1 -0
  5. package/dist/build/prerender.d.ts +6 -2
  6. package/dist/build/prerender.js +49 -11
  7. package/dist/build/prerender.js.map +1 -1
  8. package/dist/build/run-prerender.js +10 -1
  9. package/dist/build/run-prerender.js.map +1 -1
  10. package/dist/build/static-export.d.ts +5 -0
  11. package/dist/build/static-export.js +8 -3
  12. package/dist/build/static-export.js.map +1 -1
  13. package/dist/cli.js +19 -4
  14. package/dist/cli.js.map +1 -1
  15. package/dist/client/instrumentation-client-inject.d.ts +34 -0
  16. package/dist/client/instrumentation-client-inject.js +57 -0
  17. package/dist/client/instrumentation-client-inject.js.map +1 -0
  18. package/dist/client/navigation-runtime.d.ts +14 -1
  19. package/dist/client/navigation-runtime.js +16 -1
  20. package/dist/client/navigation-runtime.js.map +1 -1
  21. package/dist/client/vinext-next-data.d.ts +2 -1
  22. package/dist/client/vinext-next-data.js.map +1 -1
  23. package/dist/client/window-next.d.ts +10 -2
  24. package/dist/client/window-next.js.map +1 -1
  25. package/dist/cloudflare/tpr.js +1 -1
  26. package/dist/cloudflare/tpr.js.map +1 -1
  27. package/dist/config/config-matchers.js +2 -1
  28. package/dist/config/config-matchers.js.map +1 -1
  29. package/dist/config/next-config.d.ts +12 -3
  30. package/dist/config/next-config.js +44 -14
  31. package/dist/config/next-config.js.map +1 -1
  32. package/dist/deploy.js +29 -7
  33. package/dist/deploy.js.map +1 -1
  34. package/dist/entries/app-rsc-entry.d.ts +4 -2
  35. package/dist/entries/app-rsc-entry.js +23 -3
  36. package/dist/entries/app-rsc-entry.js.map +1 -1
  37. package/dist/entries/pages-client-entry.js +22 -1
  38. package/dist/entries/pages-client-entry.js.map +1 -1
  39. package/dist/entries/pages-server-entry.js +211 -31
  40. package/dist/entries/pages-server-entry.js.map +1 -1
  41. package/dist/index.js +29 -6
  42. package/dist/index.js.map +1 -1
  43. package/dist/plugins/fonts.js +25 -2
  44. package/dist/plugins/fonts.js.map +1 -1
  45. package/dist/routing/route-trie.js +13 -18
  46. package/dist/routing/route-trie.js.map +1 -1
  47. package/dist/routing/utils.d.ts +11 -1
  48. package/dist/routing/utils.js +15 -1
  49. package/dist/routing/utils.js.map +1 -1
  50. package/dist/server/api-handler.js +18 -9
  51. package/dist/server/api-handler.js.map +1 -1
  52. package/dist/server/app-browser-action-result.d.ts +16 -1
  53. package/dist/server/app-browser-action-result.js +15 -1
  54. package/dist/server/app-browser-action-result.js.map +1 -1
  55. package/dist/server/app-browser-entry.js +22 -12
  56. package/dist/server/app-browser-entry.js.map +1 -1
  57. package/dist/server/app-elements.js +1 -1
  58. package/dist/server/app-fallback-renderer.d.ts +12 -3
  59. package/dist/server/app-fallback-renderer.js +10 -5
  60. package/dist/server/app-fallback-renderer.js.map +1 -1
  61. package/dist/server/app-history-state.js +6 -2
  62. package/dist/server/app-history-state.js.map +1 -1
  63. package/dist/server/app-interception-context-header.d.ts +33 -0
  64. package/dist/server/app-interception-context-header.js +44 -0
  65. package/dist/server/app-interception-context-header.js.map +1 -0
  66. package/dist/server/app-mounted-slots-header.d.ts +19 -0
  67. package/dist/server/app-mounted-slots-header.js +40 -1
  68. package/dist/server/app-mounted-slots-header.js.map +1 -1
  69. package/dist/server/app-optimistic-routing.js +26 -18
  70. package/dist/server/app-optimistic-routing.js.map +1 -1
  71. package/dist/server/app-page-boundary-render.d.ts +1 -0
  72. package/dist/server/app-page-boundary-render.js +2 -0
  73. package/dist/server/app-page-boundary-render.js.map +1 -1
  74. package/dist/server/app-page-boundary.d.ts +1 -0
  75. package/dist/server/app-page-boundary.js +2 -0
  76. package/dist/server/app-page-boundary.js.map +1 -1
  77. package/dist/server/app-page-cache.d.ts +2 -0
  78. package/dist/server/app-page-cache.js +7 -1
  79. package/dist/server/app-page-cache.js.map +1 -1
  80. package/dist/server/app-page-dispatch.d.ts +3 -0
  81. package/dist/server/app-page-dispatch.js +11 -4
  82. package/dist/server/app-page-dispatch.js.map +1 -1
  83. package/dist/server/app-page-element-builder.d.ts +2 -1
  84. package/dist/server/app-page-element-builder.js +5 -2
  85. package/dist/server/app-page-element-builder.js.map +1 -1
  86. package/dist/server/app-page-execution.d.ts +1 -0
  87. package/dist/server/app-page-execution.js +2 -0
  88. package/dist/server/app-page-execution.js.map +1 -1
  89. package/dist/server/app-page-head.d.ts +1 -0
  90. package/dist/server/app-page-head.js +8 -0
  91. package/dist/server/app-page-head.js.map +1 -1
  92. package/dist/server/app-page-render-observation.js +1 -1
  93. package/dist/server/app-page-render.d.ts +1 -0
  94. package/dist/server/app-page-render.js +5 -2
  95. package/dist/server/app-page-render.js.map +1 -1
  96. package/dist/server/app-page-response.d.ts +11 -1
  97. package/dist/server/app-page-response.js +14 -2
  98. package/dist/server/app-page-response.js.map +1 -1
  99. package/dist/server/app-page-route-wiring.d.ts +1 -0
  100. package/dist/server/app-page-route-wiring.js +19 -6
  101. package/dist/server/app-page-route-wiring.js.map +1 -1
  102. package/dist/server/app-page-stream.d.ts +1 -0
  103. package/dist/server/app-page-stream.js +2 -0
  104. package/dist/server/app-page-stream.js.map +1 -1
  105. package/dist/server/app-route-handler-dispatch.d.ts +1 -0
  106. package/dist/server/app-route-handler-dispatch.js +3 -0
  107. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  108. package/dist/server/app-route-handler-execution.d.ts +1 -0
  109. package/dist/server/app-route-handler-execution.js +1 -0
  110. package/dist/server/app-route-handler-execution.js.map +1 -1
  111. package/dist/server/app-route-handler-response.js +1 -1
  112. package/dist/server/app-rsc-handler.d.ts +2 -0
  113. package/dist/server/app-rsc-handler.js +18 -9
  114. package/dist/server/app-rsc-handler.js.map +1 -1
  115. package/dist/server/app-rsc-request-normalization.js +3 -2
  116. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  117. package/dist/server/app-segment-config.d.ts +4 -1
  118. package/dist/server/app-segment-config.js +6 -1
  119. package/dist/server/app-segment-config.js.map +1 -1
  120. package/dist/server/app-server-action-execution.d.ts +1 -0
  121. package/dist/server/app-server-action-execution.js +4 -0
  122. package/dist/server/app-server-action-execution.js.map +1 -1
  123. package/dist/server/app-ssr-entry.js +39 -3
  124. package/dist/server/app-ssr-entry.js.map +1 -1
  125. package/dist/server/app-ssr-stream.d.ts +24 -1
  126. package/dist/server/app-ssr-stream.js +78 -5
  127. package/dist/server/app-ssr-stream.js.map +1 -1
  128. package/dist/server/app-static-generation.d.ts +1 -0
  129. package/dist/server/app-static-generation.js +2 -1
  130. package/dist/server/app-static-generation.js.map +1 -1
  131. package/dist/server/default-not-found-module.d.ts +20 -0
  132. package/dist/server/default-not-found-module.js +20 -0
  133. package/dist/server/default-not-found-module.js.map +1 -0
  134. package/dist/server/dev-server.d.ts +1 -1
  135. package/dist/server/dev-server.js +23 -7
  136. package/dist/server/dev-server.js.map +1 -1
  137. package/dist/server/headers.d.ts +5 -1
  138. package/dist/server/headers.js +5 -1
  139. package/dist/server/headers.js.map +1 -1
  140. package/dist/server/image-optimization.d.ts +13 -4
  141. package/dist/server/image-optimization.js +15 -4
  142. package/dist/server/image-optimization.js.map +1 -1
  143. package/dist/server/middleware.js +1 -1
  144. package/dist/server/middleware.js.map +1 -1
  145. package/dist/server/pages-api-route.d.ts +18 -0
  146. package/dist/server/pages-api-route.js +3 -1
  147. package/dist/server/pages-api-route.js.map +1 -1
  148. package/dist/server/pages-body-parser-config.d.ts +60 -0
  149. package/dist/server/pages-body-parser-config.js +79 -0
  150. package/dist/server/pages-body-parser-config.js.map +1 -0
  151. package/dist/server/pages-data-route.js +1 -0
  152. package/dist/server/pages-data-route.js.map +1 -1
  153. package/dist/server/pages-default-404.d.ts +31 -0
  154. package/dist/server/pages-default-404.js +40 -0
  155. package/dist/server/pages-default-404.js.map +1 -0
  156. package/dist/server/pages-node-compat.d.ts +10 -0
  157. package/dist/server/pages-node-compat.js +12 -1
  158. package/dist/server/pages-node-compat.js.map +1 -1
  159. package/dist/server/pages-page-data.d.ts +40 -0
  160. package/dist/server/pages-page-data.js +16 -14
  161. package/dist/server/pages-page-data.js.map +1 -1
  162. package/dist/server/pages-page-response.d.ts +2 -0
  163. package/dist/server/pages-page-response.js +11 -8
  164. package/dist/server/pages-page-response.js.map +1 -1
  165. package/dist/server/prerender-route-params.d.ts +14 -0
  166. package/dist/server/prerender-route-params.js +94 -0
  167. package/dist/server/prerender-route-params.js.map +1 -0
  168. package/dist/server/prod-server.d.ts +3 -23
  169. package/dist/server/prod-server.js +40 -57
  170. package/dist/server/prod-server.js.map +1 -1
  171. package/dist/server/proxy-trust.d.ts +41 -0
  172. package/dist/server/proxy-trust.js +70 -0
  173. package/dist/server/proxy-trust.js.map +1 -0
  174. package/dist/server/request-pipeline.d.ts +3 -3
  175. package/dist/server/request-pipeline.js +5 -4
  176. package/dist/server/request-pipeline.js.map +1 -1
  177. package/dist/server/seed-cache.js +12 -6
  178. package/dist/server/seed-cache.js.map +1 -1
  179. package/dist/server/static-file-cache.js +1 -1
  180. package/dist/server/static-file-cache.js.map +1 -1
  181. package/dist/server/streaming-metadata.d.ts +5 -0
  182. package/dist/server/streaming-metadata.js +10 -0
  183. package/dist/server/streaming-metadata.js.map +1 -0
  184. package/dist/shims/app-router-scroll-state.d.ts +12 -0
  185. package/dist/shims/app-router-scroll-state.js +38 -0
  186. package/dist/shims/app-router-scroll-state.js.map +1 -0
  187. package/dist/shims/app-router-scroll.d.ts +14 -0
  188. package/dist/shims/app-router-scroll.js +100 -0
  189. package/dist/shims/app-router-scroll.js.map +1 -0
  190. package/dist/shims/before-interactive-context.d.ts +30 -0
  191. package/dist/shims/before-interactive-context.js +10 -0
  192. package/dist/shims/before-interactive-context.js.map +1 -0
  193. package/dist/shims/cache-runtime.d.ts +1 -1
  194. package/dist/shims/cache-runtime.js +14 -1
  195. package/dist/shims/cache-runtime.js.map +1 -1
  196. package/dist/shims/default-not-found.d.ts +12 -0
  197. package/dist/shims/default-not-found.js +61 -0
  198. package/dist/shims/default-not-found.js.map +1 -0
  199. package/dist/shims/font-local.d.ts +5 -0
  200. package/dist/shims/font-local.js +6 -2
  201. package/dist/shims/font-local.js.map +1 -1
  202. package/dist/shims/head.js +4 -4
  203. package/dist/shims/head.js.map +1 -1
  204. package/dist/shims/headers.d.ts +6 -2
  205. package/dist/shims/headers.js +64 -21
  206. package/dist/shims/headers.js.map +1 -1
  207. package/dist/shims/image.d.ts +1 -1
  208. package/dist/shims/image.js +4 -4
  209. package/dist/shims/image.js.map +1 -1
  210. package/dist/shims/internal/pages-data-target.d.ts +58 -0
  211. package/dist/shims/internal/pages-data-target.js +91 -0
  212. package/dist/shims/internal/pages-data-target.js.map +1 -0
  213. package/dist/shims/internal/pages-data-url.d.ts +42 -0
  214. package/dist/shims/internal/pages-data-url.js +73 -0
  215. package/dist/shims/internal/pages-data-url.js.map +1 -0
  216. package/dist/shims/link.js +59 -9
  217. package/dist/shims/link.js.map +1 -1
  218. package/dist/shims/metadata.d.ts +2 -1
  219. package/dist/shims/metadata.js +61 -2
  220. package/dist/shims/metadata.js.map +1 -1
  221. package/dist/shims/navigation.js +32 -9
  222. package/dist/shims/navigation.js.map +1 -1
  223. package/dist/shims/router.js +376 -77
  224. package/dist/shims/router.js.map +1 -1
  225. package/dist/shims/script.js +86 -12
  226. package/dist/shims/script.js.map +1 -1
  227. package/dist/shims/server.js +1 -0
  228. package/dist/shims/server.js.map +1 -1
  229. package/dist/shims/url-utils.d.ts +2 -1
  230. package/dist/shims/url-utils.js +15 -4
  231. package/dist/shims/url-utils.js.map +1 -1
  232. package/dist/utils/html-limited-bots.d.ts +5 -0
  233. package/dist/utils/html-limited-bots.js +15 -0
  234. package/dist/utils/html-limited-bots.js.map +1 -0
  235. package/dist/utils/query.d.ts +6 -0
  236. package/dist/utils/query.js +10 -1
  237. package/dist/utils/query.js.map +1 -1
  238. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { StaticFileCache } from "./static-file-cache.js";
2
+ import { resolveRequestHost, trustProxy, trustedHosts } from "./proxy-trust.js";
2
3
  import * as _$node_http0 from "node:http";
3
4
  import { IncomingMessage, ServerResponse } from "node:http";
4
5
 
@@ -50,27 +51,6 @@ declare function sendCompressed(req: IncomingMessage, res: ServerResponse, body:
50
51
  * unlike the old sync existsSync/statSync approach).
51
52
  */
52
53
  declare function tryServeStatic(req: IncomingMessage, res: ServerResponse, clientDir: string, pathname: string, compress: boolean, cache?: StaticFileCache, extraHeaders?: Record<string, string | string[]>, statusCode?: number): Promise<boolean>;
53
- /**
54
- * Resolve the host for a request, ignoring X-Forwarded-Host to prevent
55
- * host header poisoning attacks (open redirects, cache poisoning).
56
- *
57
- * X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var
58
- * lists the forwarded host value. Without this, an attacker can send
59
- * X-Forwarded-Host: evil.com and poison any redirect that resolves
60
- * against request.url.
61
- *
62
- * On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare
63
- * itself, so this is only a concern for the Node.js prod-server.
64
- */
65
- declare function resolveHost(req: IncomingMessage, fallback: string): string;
66
- /** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */
67
- declare const trustedHosts: Set<string>;
68
- /**
69
- * Whether to trust X-Forwarded-Proto from upstream proxies.
70
- * Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set
71
- * (having trusted hosts implies a trusted proxy).
72
- */
73
- declare const trustProxy: boolean;
74
54
  /**
75
55
  * Convert a Node.js IncomingMessage to a Web Request object.
76
56
  *
@@ -80,7 +60,7 @@ declare const trustProxy: boolean;
80
60
  * Router prod server normalizes before static-asset lookup, and can pass
81
61
  * the result here so the downstream RSC handler doesn't re-normalize).
82
62
  */
83
- declare function nodeToWebRequest(req: IncomingMessage, urlOverride?: string): Request;
63
+ declare function nodeToWebRequest(req: IncomingMessage, urlOverride?: string, prerenderSecret?: string): Request;
84
64
  /**
85
65
  * Stream a Web Response back to a Node.js ServerResponse.
86
66
  * Supports streaming compression for SSR responses.
@@ -122,5 +102,5 @@ declare function resolveAppRouterPrerenderSeeder(entryModule: unknown): AppRoute
122
102
  */
123
103
  declare function resolveAppRouterAssetPath(pathname: string, assetPathPrefix: string, assetPrefix: string): string | null;
124
104
  //#endregion
125
- export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, ProdServerOptions, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
105
+ export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, ProdServerOptions, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
126
106
  //# sourceMappingURL=prod-server.d.ts.map
@@ -1,18 +1,20 @@
1
1
  import { normalizePathnameForRouteMatchStrict } from "../routing/utils.js";
2
2
  import { hasBasePath, stripBasePath } from "../utils/base-path.js";
3
- import { VINEXT_PRERENDER_SECRET_HEADER, VINEXT_STATIC_FILE_HEADER } from "./headers.js";
3
+ import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER, VINEXT_STATIC_FILE_HEADER } from "./headers.js";
4
4
  import { normalizePath } from "./normalize-path.js";
5
5
  import { applyMiddlewareRequestHeaders, isExternalUrl, matchRedirect, matchRewrite, proxyExternalRequest, requestContextFromRequest, sanitizeDestination } from "../config/config-matchers.js";
6
6
  import { notFoundResponse } from "./http-error-responses.js";
7
7
  import { applyConfigHeadersToHeaderRecord, filterInternalHeaders, isOpenRedirectShaped, normalizeTrailingSlash } from "./request-pipeline.js";
8
8
  import { mergeRewriteQuery } from "../utils/query.js";
9
9
  import { normalizeDefaultLocalePathname, stripI18nLocaleForApiRoute } from "./pages-i18n.js";
10
+ import { resolveRequestHost, resolveRequestProtocol, trustProxy, trustedHosts } from "./proxy-trust.js";
11
+ import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isImageOptimizationPath, isSafeImageContentType, parseImageParams } from "./image-optimization.js";
10
12
  import { installSocketErrorBackstop } from "./socket-error-backstop.js";
11
13
  import { ASSET_PREFIX_URL_DIR, assetPrefixPathname, isAbsoluteAssetPrefix } from "../utils/asset-prefix.js";
12
14
  import { CONTENT_TYPES, StaticFileCache, etagFromFilenameHash } from "./static-file-cache.js";
13
15
  import { buildNextDataNotFoundResponse, isNextDataPathname, parseNextDataPathname } from "./pages-data-route.js";
14
16
  import { manifestFileWithBase } from "../utils/manifest-paths.js";
15
- import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isSafeImageContentType, parseImageParams } from "./image-optimization.js";
17
+ import { readTrustedPrerenderRouteParamsFromHeaders, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
16
18
  import { computeLazyChunks } from "../utils/lazy-chunks.js";
17
19
  import { readPrerenderSecret } from "../build/server-manifest.js";
18
20
  import { seedMemoryCacheFromPrerender } from "./seed-cache.js";
@@ -132,8 +134,20 @@ function mergeResponseHeaders(middlewareHeaders, response) {
132
134
  }
133
135
  function toWebHeaders(headersRecord) {
134
136
  const headers = new Headers();
135
- for (const [key, value] of Object.entries(headersRecord)) if (Array.isArray(value)) for (const item of value) headers.append(key, item);
136
- else headers.set(key, value);
137
+ for (const [key, value] of Object.entries(headersRecord)) appendWebHeader(headers, key, value);
138
+ return headers;
139
+ }
140
+ function appendWebHeader(headers, key, value) {
141
+ if (value === void 0) return;
142
+ if (Array.isArray(value)) {
143
+ for (const item of value) headers.append(key, item);
144
+ return;
145
+ }
146
+ headers.set(key, value);
147
+ }
148
+ function nodeHeadersToWebHeaders(headersRecord) {
149
+ const headers = new Headers();
150
+ for (const [key, value] of Object.entries(headersRecord)) appendWebHeader(headers, key, value);
137
151
  return headers;
138
152
  }
139
153
  const NO_BODY_RESPONSE_STATUSES = new Set([
@@ -428,35 +442,6 @@ async function statIfFile(filePath) {
428
442
  }
429
443
  }
430
444
  /**
431
- * Resolve the host for a request, ignoring X-Forwarded-Host to prevent
432
- * host header poisoning attacks (open redirects, cache poisoning).
433
- *
434
- * X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var
435
- * lists the forwarded host value. Without this, an attacker can send
436
- * X-Forwarded-Host: evil.com and poison any redirect that resolves
437
- * against request.url.
438
- *
439
- * On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare
440
- * itself, so this is only a concern for the Node.js prod-server.
441
- */
442
- function resolveHost(req, fallback) {
443
- const rawForwarded = req.headers["x-forwarded-host"];
444
- const hostHeader = req.headers.host;
445
- if (rawForwarded) {
446
- const forwardedHost = rawForwarded.split(",")[0].trim().toLowerCase();
447
- if (forwardedHost && trustedHosts.has(forwardedHost)) return forwardedHost;
448
- }
449
- return hostHeader || fallback;
450
- }
451
- /** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */
452
- const trustedHosts = new Set((process.env.VINEXT_TRUSTED_HOSTS ?? "").split(",").map((h) => h.trim().toLowerCase()).filter(Boolean));
453
- /**
454
- * Whether to trust X-Forwarded-Proto from upstream proxies.
455
- * Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set
456
- * (having trusted hosts implies a trusted proxy).
457
- */
458
- const trustProxy = process.env.VINEXT_TRUST_PROXY === "1" || trustedHosts.size > 0;
459
- /**
460
445
  * Convert a Node.js IncomingMessage to a Web Request object.
461
446
  *
462
447
  * When `urlOverride` is provided, it is used as the path + query string
@@ -465,17 +450,14 @@ const trustProxy = process.env.VINEXT_TRUST_PROXY === "1" || trustedHosts.size >
465
450
  * Router prod server normalizes before static-asset lookup, and can pass
466
451
  * the result here so the downstream RSC handler doesn't re-normalize).
467
452
  */
468
- function nodeToWebRequest(req, urlOverride) {
469
- const rawProto = trustProxy ? req.headers["x-forwarded-proto"]?.split(",")[0]?.trim() : void 0;
470
- const origin = `${rawProto === "https" || rawProto === "http" ? rawProto : "http"}://${resolveHost(req, "localhost")}`;
453
+ function nodeToWebRequest(req, urlOverride, prerenderSecret) {
454
+ const origin = `${resolveRequestProtocol(req)}://${resolveRequestHost(req, "localhost")}`;
471
455
  const url = new URL(urlOverride ?? req.url ?? "/", origin);
472
- const rawHeaders = new Headers();
473
- for (const [key, value] of Object.entries(req.headers)) {
474
- if (value === void 0) continue;
475
- if (Array.isArray(value)) for (const v of value) rawHeaders.append(key, v);
476
- else rawHeaders.set(key, value);
477
- }
456
+ const rawHeaders = nodeHeadersToWebHeaders(req.headers);
457
+ const prerenderRouteParamsPayload = readTrustedPrerenderRouteParamsFromHeaders(rawHeaders, prerenderSecret);
478
458
  const headers = filterInternalHeaders(rawHeaders);
459
+ const prerenderRouteParamsHeader = serializePrerenderRouteParamsHeader(prerenderRouteParamsPayload);
460
+ if (prerenderRouteParamsHeader !== null) headers.set(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, prerenderRouteParamsHeader);
479
461
  const method = req.method ?? "GET";
480
462
  const hasBody = method !== "GET" && method !== "HEAD";
481
463
  const init = {
@@ -707,7 +689,7 @@ async function startAppRouterServer(options) {
707
689
  return;
708
690
  }
709
691
  }
710
- if (pathname === "/_vinext/image") {
692
+ if (isImageOptimizationPath(pathname)) {
711
693
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]);
712
694
  if (!params) {
713
695
  res.writeHead(400);
@@ -731,7 +713,7 @@ async function startAppRouterServer(options) {
731
713
  }
732
714
  try {
733
715
  const qs = rawUrl.includes("?") ? rawUrl.slice(rawUrl.indexOf("?")) : "";
734
- const response = await rscHandler(nodeToWebRequest(req, pathname + qs));
716
+ const response = await rscHandler(nodeToWebRequest(req, pathname + qs, prerenderSecret));
735
717
  const staticFileSignal = response.headers.get(VINEXT_STATIC_FILE_HEADER);
736
718
  if (staticFileSignal) {
737
719
  let staticFilePath = "/";
@@ -892,7 +874,7 @@ async function startPagesRouterServer(options) {
892
874
  res.end("Not Found");
893
875
  return;
894
876
  }
895
- if (pathname === "/_vinext/image" || staticLookupPath === "/_vinext/image") {
877
+ if (isImageOptimizationPath(pathname) || isImageOptimizationPath(staticLookupPath)) {
896
878
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), allowedImageWidths);
897
879
  if (!params) {
898
880
  res.writeHead(400);
@@ -949,13 +931,9 @@ async function startPagesRouterServer(options) {
949
931
  url = dataMatch.pagePathname + qs;
950
932
  pathname = dataMatch.pagePathname;
951
933
  }
952
- const rawProtocol = trustProxy ? req.headers["x-forwarded-proto"]?.split(",")[0]?.trim() : void 0;
953
- const protocol = rawProtocol === "https" || rawProtocol === "http" ? rawProtocol : "http";
954
- const hostHeader = resolveHost(req, `${host}:${port}`);
955
- const rawReqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {
956
- if (v) h.set(k, Array.isArray(v) ? v.join(", ") : v);
957
- return h;
958
- }, new Headers());
934
+ const protocol = resolveRequestProtocol(req);
935
+ const hostHeader = resolveRequestHost(req, `${host}:${port}`);
936
+ const rawReqHeaders = nodeHeadersToWebHeaders(req.headers);
959
937
  const isDataRequest = rawReqHeaders.get("x-nextjs-data") === "1";
960
938
  const reqHeaders = filterInternalHeaders(rawReqHeaders);
961
939
  const method = req.method ?? "GET";
@@ -1087,18 +1065,23 @@ async function startPagesRouterServer(options) {
1087
1065
  let response;
1088
1066
  if (typeof renderPage === "function") {
1089
1067
  const middlewareResponseHeaders = toWebHeaders(middlewareHeaders);
1090
- const renderOptions = isDataReq ? { isDataReq: true } : void 0;
1091
- response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
1092
- if (response && response.status === 404 && configRewrites.fallback?.length) {
1068
+ const renderPageMatch = matchPageRoute ? matchPageRoute(resolvedPathname, webRequest) : null;
1069
+ const shouldDeferErrorPageOnMiss = !isDataReq && !!matchPageRoute && !renderPageMatch;
1070
+ const dataRenderOptions = isDataReq ? { isDataReq: true } : void 0;
1071
+ response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders, shouldDeferErrorPageOnMiss ? { renderErrorPageOnMiss: false } : dataRenderOptions);
1072
+ let matchedFallbackRewrite = false;
1073
+ if (response && response.status === 404 && shouldDeferErrorPageOnMiss && configRewrites.fallback?.length) {
1093
1074
  const fallbackRewrite = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.fallback, postMwReqCtx, basePathState);
1094
1075
  if (fallbackRewrite) {
1095
1076
  if (isExternalUrl(fallbackRewrite)) {
1096
1077
  await sendWebResponse(await proxyExternalRequest(webRequest, fallbackRewrite), req, res, compress);
1097
1078
  return;
1098
1079
  }
1099
- response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
1080
+ matchedFallbackRewrite = true;
1081
+ response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, dataRenderOptions);
1100
1082
  }
1101
1083
  }
1084
+ if (response && response.status === 404 && shouldDeferErrorPageOnMiss && !matchedFallbackRewrite) response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders);
1102
1085
  }
1103
1086
  if (!response) {
1104
1087
  res.writeHead(404);
@@ -1141,6 +1124,6 @@ async function startPagesRouterServer(options) {
1141
1124
  };
1142
1125
  }
1143
1126
  //#endregion
1144
- export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
1127
+ export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
1145
1128
 
1146
1129
  //# sourceMappingURL=prod-server.js.map