vinext 0.0.52 → 0.0.54

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 (330) 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/inline-css.d.ts +7 -0
  6. package/dist/build/inline-css.js +50 -0
  7. package/dist/build/inline-css.js.map +1 -0
  8. package/dist/build/prerender.d.ts +6 -2
  9. package/dist/build/prerender.js +51 -12
  10. package/dist/build/prerender.js.map +1 -1
  11. package/dist/build/run-prerender.js +10 -1
  12. package/dist/build/run-prerender.js.map +1 -1
  13. package/dist/build/static-export.d.ts +5 -0
  14. package/dist/build/static-export.js +8 -3
  15. package/dist/build/static-export.js.map +1 -1
  16. package/dist/check.js +4 -0
  17. package/dist/check.js.map +1 -1
  18. package/dist/cli.js +19 -4
  19. package/dist/cli.js.map +1 -1
  20. package/dist/client/instrumentation-client-inject.d.ts +34 -0
  21. package/dist/client/instrumentation-client-inject.js +57 -0
  22. package/dist/client/instrumentation-client-inject.js.map +1 -0
  23. package/dist/client/navigation-runtime.d.ts +16 -2
  24. package/dist/client/navigation-runtime.js +16 -1
  25. package/dist/client/navigation-runtime.js.map +1 -1
  26. package/dist/client/vinext-next-data.d.ts +2 -1
  27. package/dist/client/vinext-next-data.js.map +1 -1
  28. package/dist/client/window-next.d.ts +17 -2
  29. package/dist/client/window-next.js.map +1 -1
  30. package/dist/cloudflare/tpr.js +1 -1
  31. package/dist/cloudflare/tpr.js.map +1 -1
  32. package/dist/config/config-matchers.js +2 -1
  33. package/dist/config/config-matchers.js.map +1 -1
  34. package/dist/config/next-config.d.ts +95 -4
  35. package/dist/config/next-config.js +173 -14
  36. package/dist/config/next-config.js.map +1 -1
  37. package/dist/deploy.js +42 -7
  38. package/dist/deploy.js.map +1 -1
  39. package/dist/entries/app-browser-entry.d.ts +11 -1
  40. package/dist/entries/app-browser-entry.js +16 -6
  41. package/dist/entries/app-browser-entry.js.map +1 -1
  42. package/dist/entries/app-rsc-entry.d.ts +12 -3
  43. package/dist/entries/app-rsc-entry.js +41 -8
  44. package/dist/entries/app-rsc-entry.js.map +1 -1
  45. package/dist/entries/app-rsc-manifest.d.ts +21 -1
  46. package/dist/entries/app-rsc-manifest.js +6 -4
  47. package/dist/entries/app-rsc-manifest.js.map +1 -1
  48. package/dist/entries/pages-client-entry.d.ts +4 -1
  49. package/dist/entries/pages-client-entry.js +40 -3
  50. package/dist/entries/pages-client-entry.js.map +1 -1
  51. package/dist/entries/pages-server-entry.js +292 -34
  52. package/dist/entries/pages-server-entry.js.map +1 -1
  53. package/dist/entries/runtime-entry-module.d.ts +1 -10
  54. package/dist/entries/runtime-entry-module.js +2 -12
  55. package/dist/entries/runtime-entry-module.js.map +1 -1
  56. package/dist/index.js +91 -10
  57. package/dist/index.js.map +1 -1
  58. package/dist/plugins/fonts.js +25 -2
  59. package/dist/plugins/fonts.js.map +1 -1
  60. package/dist/plugins/remove-console.d.ts +16 -0
  61. package/dist/plugins/remove-console.js +176 -0
  62. package/dist/plugins/remove-console.js.map +1 -0
  63. package/dist/routing/app-route-graph.d.ts +24 -1
  64. package/dist/routing/app-route-graph.js +52 -4
  65. package/dist/routing/app-route-graph.js.map +1 -1
  66. package/dist/routing/app-router.d.ts +2 -2
  67. package/dist/routing/app-router.js +2 -2
  68. package/dist/routing/app-router.js.map +1 -1
  69. package/dist/routing/file-matcher.d.ts +21 -1
  70. package/dist/routing/file-matcher.js +39 -1
  71. package/dist/routing/file-matcher.js.map +1 -1
  72. package/dist/routing/pages-router.d.ts +1 -1
  73. package/dist/routing/pages-router.js +10 -3
  74. package/dist/routing/pages-router.js.map +1 -1
  75. package/dist/routing/route-trie.js +13 -18
  76. package/dist/routing/route-trie.js.map +1 -1
  77. package/dist/routing/utils.d.ts +11 -1
  78. package/dist/routing/utils.js +15 -1
  79. package/dist/routing/utils.js.map +1 -1
  80. package/dist/server/api-handler.js +19 -10
  81. package/dist/server/api-handler.js.map +1 -1
  82. package/dist/server/app-browser-action-result.d.ts +16 -1
  83. package/dist/server/app-browser-action-result.js +15 -1
  84. package/dist/server/app-browser-action-result.js.map +1 -1
  85. package/dist/server/app-browser-entry.js +47 -28
  86. package/dist/server/app-browser-entry.js.map +1 -1
  87. package/dist/server/app-browser-navigation-controller.d.ts +2 -0
  88. package/dist/server/app-browser-navigation-controller.js +4 -0
  89. package/dist/server/app-browser-navigation-controller.js.map +1 -1
  90. package/dist/server/app-elements-wire.d.ts +13 -4
  91. package/dist/server/app-elements-wire.js +10 -1
  92. package/dist/server/app-elements-wire.js.map +1 -1
  93. package/dist/server/app-elements.d.ts +2 -2
  94. package/dist/server/app-elements.js +2 -2
  95. package/dist/server/app-elements.js.map +1 -1
  96. package/dist/server/app-fallback-renderer.d.ts +27 -8
  97. package/dist/server/app-fallback-renderer.js +19 -8
  98. package/dist/server/app-fallback-renderer.js.map +1 -1
  99. package/dist/server/app-history-state.js +6 -2
  100. package/dist/server/app-history-state.js.map +1 -1
  101. package/dist/server/app-inline-css-client.d.ts +7 -0
  102. package/dist/server/app-inline-css-client.js +37 -0
  103. package/dist/server/app-inline-css-client.js.map +1 -0
  104. package/dist/server/app-interception-context-header.d.ts +33 -0
  105. package/dist/server/app-interception-context-header.js +44 -0
  106. package/dist/server/app-interception-context-header.js.map +1 -0
  107. package/dist/server/app-mounted-slots-header.d.ts +19 -0
  108. package/dist/server/app-mounted-slots-header.js +40 -1
  109. package/dist/server/app-mounted-slots-header.js.map +1 -1
  110. package/dist/server/app-optimistic-routing.js +26 -18
  111. package/dist/server/app-optimistic-routing.js.map +1 -1
  112. package/dist/server/app-page-boundary-render.d.ts +1 -0
  113. package/dist/server/app-page-boundary-render.js +2 -0
  114. package/dist/server/app-page-boundary-render.js.map +1 -1
  115. package/dist/server/app-page-boundary.d.ts +22 -1
  116. package/dist/server/app-page-boundary.js +30 -3
  117. package/dist/server/app-page-boundary.js.map +1 -1
  118. package/dist/server/app-page-cache.d.ts +9 -3
  119. package/dist/server/app-page-cache.js +14 -8
  120. package/dist/server/app-page-cache.js.map +1 -1
  121. package/dist/server/app-page-dispatch.d.ts +13 -1
  122. package/dist/server/app-page-dispatch.js +136 -82
  123. package/dist/server/app-page-dispatch.js.map +1 -1
  124. package/dist/server/app-page-element-builder.d.ts +2 -1
  125. package/dist/server/app-page-element-builder.js +17 -30
  126. package/dist/server/app-page-element-builder.js.map +1 -1
  127. package/dist/server/app-page-execution.d.ts +1 -0
  128. package/dist/server/app-page-execution.js +2 -0
  129. package/dist/server/app-page-execution.js.map +1 -1
  130. package/dist/server/app-page-head.d.ts +1 -0
  131. package/dist/server/app-page-head.js +8 -0
  132. package/dist/server/app-page-head.js.map +1 -1
  133. package/dist/server/app-page-render-identity.d.ts +22 -0
  134. package/dist/server/app-page-render-identity.js +42 -0
  135. package/dist/server/app-page-render-identity.js.map +1 -0
  136. package/dist/server/app-page-render-observation.js +1 -1
  137. package/dist/server/app-page-render.d.ts +9 -1
  138. package/dist/server/app-page-render.js +8 -2
  139. package/dist/server/app-page-render.js.map +1 -1
  140. package/dist/server/app-page-request.d.ts +6 -3
  141. package/dist/server/app-page-request.js +5 -2
  142. package/dist/server/app-page-request.js.map +1 -1
  143. package/dist/server/app-page-response.d.ts +11 -1
  144. package/dist/server/app-page-response.js +16 -4
  145. package/dist/server/app-page-response.js.map +1 -1
  146. package/dist/server/app-page-route-wiring.d.ts +16 -0
  147. package/dist/server/app-page-route-wiring.js +25 -10
  148. package/dist/server/app-page-route-wiring.js.map +1 -1
  149. package/dist/server/app-page-stream.d.ts +12 -0
  150. package/dist/server/app-page-stream.js +3 -0
  151. package/dist/server/app-page-stream.js.map +1 -1
  152. package/dist/server/app-route-handler-dispatch.d.ts +1 -0
  153. package/dist/server/app-route-handler-dispatch.js +3 -0
  154. package/dist/server/app-route-handler-dispatch.js.map +1 -1
  155. package/dist/server/app-route-handler-execution.d.ts +1 -0
  156. package/dist/server/app-route-handler-execution.js +1 -0
  157. package/dist/server/app-route-handler-execution.js.map +1 -1
  158. package/dist/server/app-route-handler-response.js +38 -6
  159. package/dist/server/app-route-handler-response.js.map +1 -1
  160. package/dist/server/app-rsc-handler.d.ts +16 -3
  161. package/dist/server/app-rsc-handler.js +60 -11
  162. package/dist/server/app-rsc-handler.js.map +1 -1
  163. package/dist/server/app-rsc-request-normalization.d.ts +2 -1
  164. package/dist/server/app-rsc-request-normalization.js +6 -4
  165. package/dist/server/app-rsc-request-normalization.js.map +1 -1
  166. package/dist/server/app-segment-config.d.ts +4 -1
  167. package/dist/server/app-segment-config.js +6 -1
  168. package/dist/server/app-segment-config.js.map +1 -1
  169. package/dist/server/app-server-action-execution.d.ts +22 -3
  170. package/dist/server/app-server-action-execution.js +46 -7
  171. package/dist/server/app-server-action-execution.js.map +1 -1
  172. package/dist/server/app-ssr-entry.d.ts +6 -0
  173. package/dist/server/app-ssr-entry.js +57 -6
  174. package/dist/server/app-ssr-entry.js.map +1 -1
  175. package/dist/server/app-ssr-error-meta.js +3 -3
  176. package/dist/server/app-ssr-error-meta.js.map +1 -1
  177. package/dist/server/app-ssr-stream.d.ts +25 -1
  178. package/dist/server/app-ssr-stream.js +237 -19
  179. package/dist/server/app-ssr-stream.js.map +1 -1
  180. package/dist/server/app-static-generation.d.ts +1 -0
  181. package/dist/server/app-static-generation.js +2 -1
  182. package/dist/server/app-static-generation.js.map +1 -1
  183. package/dist/server/client-trace-metadata.d.ts +31 -0
  184. package/dist/server/client-trace-metadata.js +83 -0
  185. package/dist/server/client-trace-metadata.js.map +1 -0
  186. package/dist/server/cookie-utils.d.ts +13 -0
  187. package/dist/server/cookie-utils.js +20 -0
  188. package/dist/server/cookie-utils.js.map +1 -0
  189. package/dist/server/default-not-found-module.d.ts +20 -0
  190. package/dist/server/default-not-found-module.js +20 -0
  191. package/dist/server/default-not-found-module.js.map +1 -0
  192. package/dist/server/dev-server.d.ts +8 -1
  193. package/dist/server/dev-server.js +56 -11
  194. package/dist/server/dev-server.js.map +1 -1
  195. package/dist/server/headers.d.ts +5 -1
  196. package/dist/server/headers.js +5 -1
  197. package/dist/server/headers.js.map +1 -1
  198. package/dist/server/html.d.ts +2 -1
  199. package/dist/server/html.js +6 -1
  200. package/dist/server/html.js.map +1 -1
  201. package/dist/server/image-optimization.d.ts +13 -4
  202. package/dist/server/image-optimization.js +15 -4
  203. package/dist/server/image-optimization.js.map +1 -1
  204. package/dist/server/isr-cache.d.ts +7 -5
  205. package/dist/server/isr-cache.js +17 -6
  206. package/dist/server/isr-cache.js.map +1 -1
  207. package/dist/server/middleware-runtime.js +1 -2
  208. package/dist/server/middleware-runtime.js.map +1 -1
  209. package/dist/server/middleware.js +1 -1
  210. package/dist/server/middleware.js.map +1 -1
  211. package/dist/server/pages-api-route.d.ts +18 -0
  212. package/dist/server/pages-api-route.js +3 -1
  213. package/dist/server/pages-api-route.js.map +1 -1
  214. package/dist/server/pages-body-parser-config.d.ts +60 -0
  215. package/dist/server/pages-body-parser-config.js +79 -0
  216. package/dist/server/pages-body-parser-config.js.map +1 -0
  217. package/dist/server/pages-data-route.js +1 -0
  218. package/dist/server/pages-data-route.js.map +1 -1
  219. package/dist/server/pages-default-404.d.ts +31 -0
  220. package/dist/server/pages-default-404.js +40 -0
  221. package/dist/server/pages-default-404.js.map +1 -0
  222. package/dist/server/pages-document-initial-props.d.ts +7 -0
  223. package/dist/server/pages-document-initial-props.js +14 -0
  224. package/dist/server/pages-document-initial-props.js.map +1 -0
  225. package/dist/server/pages-node-compat.d.ts +10 -0
  226. package/dist/server/pages-node-compat.js +12 -1
  227. package/dist/server/pages-node-compat.js.map +1 -1
  228. package/dist/server/pages-page-data.d.ts +40 -0
  229. package/dist/server/pages-page-data.js +19 -14
  230. package/dist/server/pages-page-data.js.map +1 -1
  231. package/dist/server/pages-page-method.d.ts +48 -0
  232. package/dist/server/pages-page-method.js +19 -0
  233. package/dist/server/pages-page-method.js.map +1 -0
  234. package/dist/server/pages-page-response.d.ts +8 -0
  235. package/dist/server/pages-page-response.js +21 -11
  236. package/dist/server/pages-page-response.js.map +1 -1
  237. package/dist/server/pages-serializable-props.d.ts +25 -0
  238. package/dist/server/pages-serializable-props.js +69 -0
  239. package/dist/server/pages-serializable-props.js.map +1 -0
  240. package/dist/server/prerender-route-params.d.ts +14 -0
  241. package/dist/server/prerender-route-params.js +94 -0
  242. package/dist/server/prerender-route-params.js.map +1 -0
  243. package/dist/server/prod-server.d.ts +3 -23
  244. package/dist/server/prod-server.js +43 -57
  245. package/dist/server/prod-server.js.map +1 -1
  246. package/dist/server/proxy-trust.d.ts +41 -0
  247. package/dist/server/proxy-trust.js +70 -0
  248. package/dist/server/proxy-trust.js.map +1 -0
  249. package/dist/server/request-pipeline.d.ts +3 -3
  250. package/dist/server/request-pipeline.js +5 -4
  251. package/dist/server/request-pipeline.js.map +1 -1
  252. package/dist/server/seed-cache.js +12 -6
  253. package/dist/server/seed-cache.js.map +1 -1
  254. package/dist/server/server-action-not-found.js +3 -2
  255. package/dist/server/server-action-not-found.js.map +1 -1
  256. package/dist/server/static-file-cache.js +2 -1
  257. package/dist/server/static-file-cache.js.map +1 -1
  258. package/dist/server/streaming-metadata.d.ts +5 -0
  259. package/dist/server/streaming-metadata.js +10 -0
  260. package/dist/server/streaming-metadata.js.map +1 -0
  261. package/dist/shims/app-router-scroll-state.d.ts +14 -0
  262. package/dist/shims/app-router-scroll-state.js +51 -0
  263. package/dist/shims/app-router-scroll-state.js.map +1 -0
  264. package/dist/shims/app-router-scroll.d.ts +28 -0
  265. package/dist/shims/app-router-scroll.js +115 -0
  266. package/dist/shims/app-router-scroll.js.map +1 -0
  267. package/dist/shims/before-interactive-context.d.ts +30 -0
  268. package/dist/shims/before-interactive-context.js +10 -0
  269. package/dist/shims/before-interactive-context.js.map +1 -0
  270. package/dist/shims/cache-runtime.d.ts +1 -1
  271. package/dist/shims/cache-runtime.js +14 -1
  272. package/dist/shims/cache-runtime.js.map +1 -1
  273. package/dist/shims/cache.d.ts +6 -0
  274. package/dist/shims/cache.js +7 -0
  275. package/dist/shims/cache.js.map +1 -1
  276. package/dist/shims/default-not-found.d.ts +12 -0
  277. package/dist/shims/default-not-found.js +61 -0
  278. package/dist/shims/default-not-found.js.map +1 -0
  279. package/dist/shims/error.js +3 -0
  280. package/dist/shims/error.js.map +1 -1
  281. package/dist/shims/font-local.d.ts +5 -0
  282. package/dist/shims/font-local.js +6 -2
  283. package/dist/shims/font-local.js.map +1 -1
  284. package/dist/shims/head.js +4 -4
  285. package/dist/shims/head.js.map +1 -1
  286. package/dist/shims/headers.d.ts +13 -2
  287. package/dist/shims/headers.js +73 -22
  288. package/dist/shims/headers.js.map +1 -1
  289. package/dist/shims/image.d.ts +1 -1
  290. package/dist/shims/image.js +4 -4
  291. package/dist/shims/image.js.map +1 -1
  292. package/dist/shims/internal/app-route-detection.d.ts +37 -0
  293. package/dist/shims/internal/app-route-detection.js +69 -0
  294. package/dist/shims/internal/app-route-detection.js.map +1 -0
  295. package/dist/shims/internal/pages-data-target.d.ts +58 -0
  296. package/dist/shims/internal/pages-data-target.js +91 -0
  297. package/dist/shims/internal/pages-data-target.js.map +1 -0
  298. package/dist/shims/internal/pages-data-url.d.ts +42 -0
  299. package/dist/shims/internal/pages-data-url.js +73 -0
  300. package/dist/shims/internal/pages-data-url.js.map +1 -0
  301. package/dist/shims/link.d.ts +18 -2
  302. package/dist/shims/link.js +129 -15
  303. package/dist/shims/link.js.map +1 -1
  304. package/dist/shims/metadata.d.ts +9 -7
  305. package/dist/shims/metadata.js +70 -7
  306. package/dist/shims/metadata.js.map +1 -1
  307. package/dist/shims/navigation.d.ts +1 -2
  308. package/dist/shims/navigation.js +94 -20
  309. package/dist/shims/navigation.js.map +1 -1
  310. package/dist/shims/router.d.ts +5 -0
  311. package/dist/shims/router.js +389 -80
  312. package/dist/shims/router.js.map +1 -1
  313. package/dist/shims/script.d.ts +11 -1
  314. package/dist/shims/script.js +158 -15
  315. package/dist/shims/script.js.map +1 -1
  316. package/dist/shims/server.js +1 -0
  317. package/dist/shims/server.js.map +1 -1
  318. package/dist/shims/url-utils.d.ts +2 -1
  319. package/dist/shims/url-utils.js +15 -4
  320. package/dist/shims/url-utils.js.map +1 -1
  321. package/dist/utils/html-limited-bots.d.ts +5 -0
  322. package/dist/utils/html-limited-bots.js +15 -0
  323. package/dist/utils/html-limited-bots.js.map +1 -0
  324. package/dist/utils/path.d.ts +13 -0
  325. package/dist/utils/path.js +16 -0
  326. package/dist/utils/path.js.map +1 -0
  327. package/dist/utils/query.d.ts +6 -0
  328. package/dist/utils/query.js +10 -1
  329. package/dist/utils/query.js.map +1 -1
  330. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from "./headers.js";
2
+ import { isUnknownRecord } from "../utils/record.js";
3
+ //#region src/server/prerender-route-params.ts
4
+ function isPrerenderRouteParams(value) {
5
+ if (!isUnknownRecord(value)) return false;
6
+ for (const [, param] of Object.entries(value)) {
7
+ if (typeof param === "string") continue;
8
+ if (Array.isArray(param) && param.every((item) => typeof item === "string")) continue;
9
+ return false;
10
+ }
11
+ return true;
12
+ }
13
+ function isPrerenderRouteParamsPayload(value) {
14
+ if (!isUnknownRecord(value)) return false;
15
+ if (Object.keys(value).length !== 2) return false;
16
+ return typeof value.routePattern === "string" && value.routePattern.startsWith("/") && isPrerenderRouteParams(value.params);
17
+ }
18
+ function serializePrerenderRouteParamsHeader(payload) {
19
+ if (payload === null || Object.keys(payload.params).length === 0) return null;
20
+ return encodeURIComponent(JSON.stringify(payload));
21
+ }
22
+ function parsePrerenderRouteParamsHeader(value) {
23
+ if (value === null || value === "") return null;
24
+ try {
25
+ const parsed = JSON.parse(decodeURIComponent(value));
26
+ return isPrerenderRouteParamsPayload(parsed) ? parsed : null;
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+ function readTrustedPrerenderRouteParamsFromHeaders(headers, expectedSecret) {
32
+ if (process.env.VINEXT_PRERENDER !== "1") return null;
33
+ const secret = headers.get(VINEXT_PRERENDER_SECRET_HEADER);
34
+ if (secret === null) return null;
35
+ if (expectedSecret !== void 0 && secret !== expectedSecret) return null;
36
+ const header = headers.get(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER);
37
+ if (header === null) return null;
38
+ const params = parsePrerenderRouteParamsHeader(header);
39
+ if (params === null) throw new Error("[vinext] Invalid internal prerender route params header.");
40
+ return params;
41
+ }
42
+ function readTrustedPrerenderRouteParams(request) {
43
+ return readTrustedPrerenderRouteParamsFromHeaders(request.headers);
44
+ }
45
+ function decodePrerenderRouteParam(value) {
46
+ try {
47
+ return decodeURIComponent(value);
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ function decodedPrerenderRouteParamEquals(prerenderValue, matchedValue) {
53
+ if (Array.isArray(prerenderValue) || Array.isArray(matchedValue)) {
54
+ if (!Array.isArray(prerenderValue) || !Array.isArray(matchedValue)) return false;
55
+ if (prerenderValue.length !== matchedValue.length) return false;
56
+ return prerenderValue.every((item, index) => {
57
+ const decoded = decodePrerenderRouteParam(item);
58
+ return decoded !== null && decoded === matchedValue[index];
59
+ });
60
+ }
61
+ const decoded = decodePrerenderRouteParam(prerenderValue);
62
+ return decoded !== null && decoded === matchedValue;
63
+ }
64
+ function prerenderRouteParamsPayloadMatchesRoute(payload, routePattern, params) {
65
+ if (payload === null) return false;
66
+ if (payload.routePattern !== routePattern) return false;
67
+ if (Object.keys(payload.params).length !== Object.keys(params).length) return false;
68
+ for (const [key, prerenderValue] of Object.entries(payload.params)) {
69
+ const matchedValue = params[key];
70
+ if (matchedValue === void 0) return false;
71
+ if (!decodedPrerenderRouteParamEquals(prerenderValue, matchedValue)) return false;
72
+ }
73
+ return true;
74
+ }
75
+ function encodePrerenderRouteParams(pattern, params) {
76
+ const encoded = {};
77
+ for (const part of pattern.split("/").filter(Boolean)) {
78
+ let paramName = null;
79
+ if (part.startsWith(":") && (part.endsWith("+") || part.endsWith("*"))) paramName = part.slice(1, -1);
80
+ else if (part.startsWith(":")) paramName = part.slice(1);
81
+ if (paramName === null) continue;
82
+ const value = params[paramName];
83
+ if (Array.isArray(value)) encoded[paramName] = value.map((item) => encodeURIComponent(item));
84
+ else if (typeof value === "string") encoded[paramName] = encodeURIComponent(value);
85
+ }
86
+ return Object.keys(encoded).length > 0 ? {
87
+ routePattern: pattern,
88
+ params: encoded
89
+ } : null;
90
+ }
91
+ //#endregion
92
+ export { encodePrerenderRouteParams, prerenderRouteParamsPayloadMatchesRoute, readTrustedPrerenderRouteParams, readTrustedPrerenderRouteParamsFromHeaders, serializePrerenderRouteParamsHeader };
93
+
94
+ //# sourceMappingURL=prerender-route-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerender-route-params.js","names":[],"sources":["../../src/server/prerender-route-params.ts"],"sourcesContent":["import { VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, VINEXT_PRERENDER_SECRET_HEADER } from \"./headers.js\";\nimport { isUnknownRecord } from \"../utils/record.js\";\n\nexport type PrerenderRouteParams = Record<string, string | string[]>;\n\nexport type PrerenderRouteParamsPayload = {\n params: PrerenderRouteParams;\n routePattern: string;\n};\n\nfunction isPrerenderRouteParams(value: unknown): value is PrerenderRouteParams {\n if (!isUnknownRecord(value)) return false;\n\n for (const [, param] of Object.entries(value)) {\n if (typeof param === \"string\") continue;\n if (Array.isArray(param) && param.every((item) => typeof item === \"string\")) continue;\n return false;\n }\n\n return true;\n}\n\nfunction isPrerenderRouteParamsPayload(value: unknown): value is PrerenderRouteParamsPayload {\n if (!isUnknownRecord(value)) return false;\n if (Object.keys(value).length !== 2) return false;\n return (\n typeof value.routePattern === \"string\" &&\n value.routePattern.startsWith(\"/\") &&\n isPrerenderRouteParams(value.params)\n );\n}\n\n// A payload with no dynamic params serializes to `null`, which is\n// indistinguishable from an absent header on the read side. This is intentional:\n// the only producer, `encodePrerenderRouteParams`, already returns `null` for\n// param-less patterns, so an empty-params payload never carries information worth\n// propagating. Routes with no dynamic segments need no encoded-render override.\nexport function serializePrerenderRouteParamsHeader(\n payload: PrerenderRouteParamsPayload | null,\n): string | null {\n if (payload === null || Object.keys(payload.params).length === 0) return null;\n return encodeURIComponent(JSON.stringify(payload));\n}\n\nfunction parsePrerenderRouteParamsHeader(value: string | null): PrerenderRouteParamsPayload | null {\n if (value === null || value === \"\") return null;\n\n try {\n const parsed: unknown = JSON.parse(decodeURIComponent(value));\n return isPrerenderRouteParamsPayload(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\nexport function readTrustedPrerenderRouteParamsFromHeaders(\n headers: Headers,\n expectedSecret?: string,\n): PrerenderRouteParamsPayload | null {\n if (process.env.VINEXT_PRERENDER !== \"1\") return null;\n const secret = headers.get(VINEXT_PRERENDER_SECRET_HEADER);\n if (secret === null) return null;\n if (expectedSecret !== undefined && secret !== expectedSecret) return null;\n const header = headers.get(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER);\n if (header === null) return null;\n const params = parsePrerenderRouteParamsHeader(header);\n if (params === null) {\n throw new Error(\"[vinext] Invalid internal prerender route params header.\");\n }\n return params;\n}\n\n// Convenience wrapper for reads that happen AFTER the prerender secret has\n// already been verified at the trust boundary. The only entry point that\n// receives raw external input, `prod-server`'s `nodeToWebRequest`, calls\n// `readTrustedPrerenderRouteParamsFromHeaders` WITH `expectedSecret` and\n// re-serializes the validated payload onto a clean header. Every downstream\n// reader (the App Router handler) therefore operates on an already-trusted\n// request and deliberately omits `expectedSecret`. The `VINEXT_PRERENDER=1`\n// gate still ensures this never activates outside the build-time prerender\n// phase. Do not call this on unverified external input.\nexport function readTrustedPrerenderRouteParams(\n request: Request,\n): PrerenderRouteParamsPayload | null {\n return readTrustedPrerenderRouteParamsFromHeaders(request.headers);\n}\n\nfunction decodePrerenderRouteParam(value: string): string | null {\n try {\n return decodeURIComponent(value);\n } catch {\n return null;\n }\n}\n\nfunction decodedPrerenderRouteParamEquals(\n prerenderValue: string | string[],\n matchedValue: string | string[],\n): boolean {\n if (Array.isArray(prerenderValue) || Array.isArray(matchedValue)) {\n if (!Array.isArray(prerenderValue) || !Array.isArray(matchedValue)) return false;\n if (prerenderValue.length !== matchedValue.length) return false;\n\n return prerenderValue.every((item, index) => {\n const decoded = decodePrerenderRouteParam(item);\n return decoded !== null && decoded === matchedValue[index];\n });\n }\n\n const decoded = decodePrerenderRouteParam(prerenderValue);\n return decoded !== null && decoded === matchedValue;\n}\n\nexport function prerenderRouteParamsPayloadMatchesRoute(\n payload: PrerenderRouteParamsPayload | null,\n routePattern: string,\n params: PrerenderRouteParams,\n): payload is PrerenderRouteParamsPayload {\n if (payload === null) return false;\n if (payload.routePattern !== routePattern) return false;\n\n const prerenderParamKeys = Object.keys(payload.params);\n if (prerenderParamKeys.length !== Object.keys(params).length) return false;\n\n for (const [key, prerenderValue] of Object.entries(payload.params)) {\n const matchedValue = params[key];\n if (matchedValue === undefined) return false;\n if (!decodedPrerenderRouteParamEquals(prerenderValue, matchedValue)) return false;\n }\n\n return true;\n}\n\nexport function encodePrerenderRouteParams(\n pattern: string,\n params: PrerenderRouteParams,\n): PrerenderRouteParamsPayload | null {\n const encoded: PrerenderRouteParams = {};\n\n for (const part of pattern.split(\"/\").filter(Boolean)) {\n let paramName: string | null = null;\n if (part.startsWith(\":\") && (part.endsWith(\"+\") || part.endsWith(\"*\"))) {\n paramName = part.slice(1, -1);\n } else if (part.startsWith(\":\")) {\n paramName = part.slice(1);\n }\n\n if (paramName === null) continue;\n const value = params[paramName];\n if (Array.isArray(value)) {\n encoded[paramName] = value.map((item) => encodeURIComponent(item));\n } else if (typeof value === \"string\") {\n encoded[paramName] = encodeURIComponent(value);\n }\n }\n\n return Object.keys(encoded).length > 0 ? { routePattern: pattern, params: encoded } : null;\n}\n"],"mappings":"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"}
@@ -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,21 @@
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";
16
+ import { collectInlineCssManifest } from "../build/inline-css.js";
14
17
  import { manifestFileWithBase } from "../utils/manifest-paths.js";
15
- import { DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES, isSafeImageContentType, parseImageParams } from "./image-optimization.js";
18
+ import { readTrustedPrerenderRouteParamsFromHeaders, serializePrerenderRouteParamsHeader } from "./prerender-route-params.js";
16
19
  import { computeLazyChunks } from "../utils/lazy-chunks.js";
17
20
  import { readPrerenderSecret } from "../build/server-manifest.js";
18
21
  import { seedMemoryCacheFromPrerender } from "./seed-cache.js";
@@ -132,8 +135,20 @@ function mergeResponseHeaders(middlewareHeaders, response) {
132
135
  }
133
136
  function toWebHeaders(headersRecord) {
134
137
  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);
138
+ for (const [key, value] of Object.entries(headersRecord)) appendWebHeader(headers, key, value);
139
+ return headers;
140
+ }
141
+ function appendWebHeader(headers, key, value) {
142
+ if (value === void 0) return;
143
+ if (Array.isArray(value)) {
144
+ for (const item of value) headers.append(key, item);
145
+ return;
146
+ }
147
+ headers.set(key, value);
148
+ }
149
+ function nodeHeadersToWebHeaders(headersRecord) {
150
+ const headers = new Headers();
151
+ for (const [key, value] of Object.entries(headersRecord)) appendWebHeader(headers, key, value);
137
152
  return headers;
138
153
  }
139
154
  const NO_BODY_RESPONSE_STATUSES = new Set([
@@ -428,35 +443,6 @@ async function statIfFile(filePath) {
428
443
  }
429
444
  }
430
445
  /**
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
446
  * Convert a Node.js IncomingMessage to a Web Request object.
461
447
  *
462
448
  * When `urlOverride` is provided, it is used as the path + query string
@@ -465,17 +451,14 @@ const trustProxy = process.env.VINEXT_TRUST_PROXY === "1" || trustedHosts.size >
465
451
  * Router prod server normalizes before static-asset lookup, and can pass
466
452
  * the result here so the downstream RSC handler doesn't re-normalize).
467
453
  */
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")}`;
454
+ function nodeToWebRequest(req, urlOverride, prerenderSecret) {
455
+ const origin = `${resolveRequestProtocol(req)}://${resolveRequestHost(req, "localhost")}`;
471
456
  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
- }
457
+ const rawHeaders = nodeHeadersToWebHeaders(req.headers);
458
+ const prerenderRouteParamsPayload = readTrustedPrerenderRouteParamsFromHeaders(rawHeaders, prerenderSecret);
478
459
  const headers = filterInternalHeaders(rawHeaders);
460
+ const prerenderRouteParamsHeader = serializePrerenderRouteParamsHeader(prerenderRouteParamsPayload);
461
+ if (prerenderRouteParamsHeader !== null) headers.set(VINEXT_PRERENDER_ROUTE_PARAMS_HEADER, prerenderRouteParamsHeader);
479
462
  const method = req.method ?? "GET";
480
463
  const hasBody = method !== "GET" && method !== "HEAD";
481
464
  const init = {
@@ -669,6 +652,8 @@ async function startAppRouterServer(options) {
669
652
  const rscModule = await import(`${pathToFileURL(rscEntryPath).href}?t=${rscMtime}`);
670
653
  const rscHandler = resolveAppRouterHandler(rscModule.default);
671
654
  const appRouterAssetPrefix = typeof rscModule.__assetPrefix === "string" ? rscModule.__assetPrefix : "";
655
+ const appRouterInlineCss = rscModule.__inlineCss === true;
656
+ globalThis.__VINEXT_INLINE_CSS__ = appRouterInlineCss ? collectInlineCssManifest(clientDir, appRouterAssetPrefix) : void 0;
672
657
  const appAssetPathPrefix = assetPrefixPathname(appRouterAssetPrefix);
673
658
  const seededRoutes = await resolveAppRouterPrerenderSeeder(rscModule)(path.dirname(rscEntryPath));
674
659
  if (seededRoutes > 0) console.log(`[vinext] Seeded ${seededRoutes} pre-rendered route${seededRoutes !== 1 ? "s" : ""} into memory cache`);
@@ -707,7 +692,7 @@ async function startAppRouterServer(options) {
707
692
  return;
708
693
  }
709
694
  }
710
- if (pathname === "/_vinext/image") {
695
+ if (isImageOptimizationPath(pathname)) {
711
696
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]);
712
697
  if (!params) {
713
698
  res.writeHead(400);
@@ -731,7 +716,7 @@ async function startAppRouterServer(options) {
731
716
  }
732
717
  try {
733
718
  const qs = rawUrl.includes("?") ? rawUrl.slice(rawUrl.indexOf("?")) : "";
734
- const response = await rscHandler(nodeToWebRequest(req, pathname + qs));
719
+ const response = await rscHandler(nodeToWebRequest(req, pathname + qs, prerenderSecret));
735
720
  const staticFileSignal = response.headers.get(VINEXT_STATIC_FILE_HEADER);
736
721
  if (staticFileSignal) {
737
722
  let staticFilePath = "/";
@@ -892,7 +877,7 @@ async function startPagesRouterServer(options) {
892
877
  res.end("Not Found");
893
878
  return;
894
879
  }
895
- if (pathname === "/_vinext/image" || staticLookupPath === "/_vinext/image") {
880
+ if (isImageOptimizationPath(pathname) || isImageOptimizationPath(staticLookupPath)) {
896
881
  const params = parseImageParams(new URL(rawUrl, "http://localhost"), allowedImageWidths);
897
882
  if (!params) {
898
883
  res.writeHead(400);
@@ -949,13 +934,9 @@ async function startPagesRouterServer(options) {
949
934
  url = dataMatch.pagePathname + qs;
950
935
  pathname = dataMatch.pagePathname;
951
936
  }
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());
937
+ const protocol = resolveRequestProtocol(req);
938
+ const hostHeader = resolveRequestHost(req, `${host}:${port}`);
939
+ const rawReqHeaders = nodeHeadersToWebHeaders(req.headers);
959
940
  const isDataRequest = rawReqHeaders.get("x-nextjs-data") === "1";
960
941
  const reqHeaders = filterInternalHeaders(rawReqHeaders);
961
942
  const method = req.method ?? "GET";
@@ -1087,18 +1068,23 @@ async function startPagesRouterServer(options) {
1087
1068
  let response;
1088
1069
  if (typeof renderPage === "function") {
1089
1070
  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) {
1071
+ const renderPageMatch = matchPageRoute ? matchPageRoute(resolvedPathname, webRequest) : null;
1072
+ const shouldDeferErrorPageOnMiss = !isDataReq && !!matchPageRoute && !renderPageMatch;
1073
+ const dataRenderOptions = isDataReq ? { isDataReq: true } : void 0;
1074
+ response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders, shouldDeferErrorPageOnMiss ? { renderErrorPageOnMiss: false } : dataRenderOptions);
1075
+ let matchedFallbackRewrite = false;
1076
+ if (response && response.status === 404 && shouldDeferErrorPageOnMiss && configRewrites.fallback?.length) {
1093
1077
  const fallbackRewrite = matchRewrite(matchResolvedPathname(resolvedPathname), configRewrites.fallback, postMwReqCtx, basePathState);
1094
1078
  if (fallbackRewrite) {
1095
1079
  if (isExternalUrl(fallbackRewrite)) {
1096
1080
  await sendWebResponse(await proxyExternalRequest(webRequest, fallbackRewrite), req, res, compress);
1097
1081
  return;
1098
1082
  }
1099
- response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, renderOptions);
1083
+ matchedFallbackRewrite = true;
1084
+ response = await renderPage(webRequest, mergeRewriteQuery(resolvedUrl, fallbackRewrite), ssrManifest, void 0, middlewareResponseHeaders, dataRenderOptions);
1100
1085
  }
1101
1086
  }
1087
+ if (response && response.status === 404 && shouldDeferErrorPageOnMiss && !matchedFallbackRewrite) response = await renderPage(webRequest, resolvedUrl, ssrManifest, void 0, middlewareResponseHeaders);
1102
1088
  }
1103
1089
  if (!response) {
1104
1090
  res.writeHead(404);
@@ -1141,6 +1127,6 @@ async function startPagesRouterServer(options) {
1141
1127
  };
1142
1128
  }
1143
1129
  //#endregion
1144
- export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
1130
+ export { COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, mergeResponseHeaders, mergeWebResponse, negotiateEncoding, nodeToWebRequest, resolveAppRouterAssetPath, resolveAppRouterPrerenderSeeder, resolveRequestHost as resolveHost, sendCompressed, sendWebResponse, startProdServer, trustProxy, trustedHosts, tryServeStatic };
1145
1131
 
1146
1132
  //# sourceMappingURL=prod-server.js.map