vinext 0.1.1 → 0.1.3

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 (266) hide show
  1. package/README.md +2 -5
  2. package/dist/build/client-build-config.d.ts +7 -1
  3. package/dist/build/client-build-config.js +9 -1
  4. package/dist/build/prerender.d.ts +9 -1
  5. package/dist/build/prerender.js +41 -12
  6. package/dist/build/run-prerender.d.ts +10 -2
  7. package/dist/build/run-prerender.js +15 -1
  8. package/dist/check.js +4 -3
  9. package/dist/client/app-nav-failure-handler.d.ts +8 -0
  10. package/dist/client/app-nav-failure-handler.js +44 -0
  11. package/dist/client/navigation-runtime.d.ts +3 -2
  12. package/dist/client/vinext-next-data.d.ts +18 -1
  13. package/dist/client/window-next.d.ts +8 -5
  14. package/dist/client/window-next.js +12 -1
  15. package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
  16. package/dist/config/config-matchers.d.ts +11 -4
  17. package/dist/config/config-matchers.js +88 -16
  18. package/dist/config/next-config.d.ts +59 -4
  19. package/dist/config/next-config.js +149 -48
  20. package/dist/deploy.d.ts +30 -11
  21. package/dist/deploy.js +189 -101
  22. package/dist/entries/app-browser-entry.d.ts +9 -3
  23. package/dist/entries/app-browser-entry.js +21 -3
  24. package/dist/entries/app-rsc-entry.d.ts +2 -0
  25. package/dist/entries/app-rsc-entry.js +71 -6
  26. package/dist/entries/app-rsc-manifest.js +2 -0
  27. package/dist/entries/app-ssr-entry.js +1 -1
  28. package/dist/entries/pages-client-entry.js +54 -9
  29. package/dist/entries/pages-server-entry.js +48 -11
  30. package/dist/index.d.ts +0 -2
  31. package/dist/index.js +285 -139
  32. package/dist/plugins/dynamic-preload-metadata.d.ts +13 -0
  33. package/dist/plugins/dynamic-preload-metadata.js +415 -0
  34. package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
  35. package/dist/plugins/extensionless-dynamic-import.js +152 -0
  36. package/dist/plugins/og-assets.js +2 -2
  37. package/dist/plugins/optimize-imports.d.ts +10 -5
  38. package/dist/plugins/optimize-imports.js +27 -21
  39. package/dist/plugins/postcss.js +7 -7
  40. package/dist/plugins/sass.d.ts +53 -24
  41. package/dist/plugins/sass.js +249 -1
  42. package/dist/plugins/typeof-window.d.ts +14 -0
  43. package/dist/plugins/typeof-window.js +150 -0
  44. package/dist/plugins/wasm-module-import.d.ts +15 -0
  45. package/dist/plugins/wasm-module-import.js +50 -0
  46. package/dist/routing/app-route-graph.d.ts +25 -2
  47. package/dist/routing/app-route-graph.js +91 -22
  48. package/dist/routing/file-matcher.d.ts +10 -1
  49. package/dist/routing/file-matcher.js +23 -2
  50. package/dist/routing/pages-router.js +3 -3
  51. package/dist/routing/utils.d.ts +35 -6
  52. package/dist/routing/utils.js +59 -7
  53. package/dist/server/api-handler.d.ts +6 -1
  54. package/dist/server/api-handler.js +21 -15
  55. package/dist/server/app-browser-action-result.d.ts +19 -6
  56. package/dist/server/app-browser-action-result.js +19 -10
  57. package/dist/server/app-browser-entry.js +269 -297
  58. package/dist/server/app-browser-error.d.ts +10 -3
  59. package/dist/server/app-browser-error.js +47 -6
  60. package/dist/server/app-browser-history-controller.d.ts +104 -0
  61. package/dist/server/app-browser-history-controller.js +210 -0
  62. package/dist/server/app-browser-hydration.d.ts +2 -0
  63. package/dist/server/app-browser-hydration.js +1 -0
  64. package/dist/server/app-browser-navigation-controller.d.ts +7 -4
  65. package/dist/server/app-browser-navigation-controller.js +33 -9
  66. package/dist/server/app-browser-rsc-redirect.d.ts +11 -2
  67. package/dist/server/app-browser-rsc-redirect.js +30 -8
  68. package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
  69. package/dist/server/app-browser-server-action-navigation.js +9 -0
  70. package/dist/server/app-browser-state.js +4 -7
  71. package/dist/server/app-browser-stream.js +86 -43
  72. package/dist/server/app-browser-visible-commit.js +1 -1
  73. package/dist/server/app-elements-wire.d.ts +6 -1
  74. package/dist/server/app-elements-wire.js +14 -4
  75. package/dist/server/app-elements.d.ts +2 -2
  76. package/dist/server/app-elements.js +2 -2
  77. package/dist/server/app-fallback-renderer.d.ts +3 -1
  78. package/dist/server/app-fallback-renderer.js +6 -2
  79. package/dist/server/app-middleware.js +1 -0
  80. package/dist/server/app-optimistic-routing.js +24 -3
  81. package/dist/server/app-page-boundary-render.d.ts +3 -1
  82. package/dist/server/app-page-boundary-render.js +31 -16
  83. package/dist/server/app-page-cache-render.d.ts +53 -0
  84. package/dist/server/app-page-cache-render.js +91 -0
  85. package/dist/server/app-page-cache.d.ts +16 -2
  86. package/dist/server/app-page-cache.js +71 -8
  87. package/dist/server/app-page-dispatch.d.ts +34 -0
  88. package/dist/server/app-page-dispatch.js +167 -97
  89. package/dist/server/app-page-element-builder.d.ts +23 -2
  90. package/dist/server/app-page-element-builder.js +42 -10
  91. package/dist/server/app-page-execution.d.ts +7 -2
  92. package/dist/server/app-page-execution.js +53 -18
  93. package/dist/server/app-page-probe.d.ts +1 -0
  94. package/dist/server/app-page-probe.js +4 -0
  95. package/dist/server/app-page-render-observation.d.ts +3 -1
  96. package/dist/server/app-page-render-observation.js +17 -1
  97. package/dist/server/app-page-render.d.ts +13 -2
  98. package/dist/server/app-page-render.js +48 -17
  99. package/dist/server/app-page-request.d.ts +3 -0
  100. package/dist/server/app-page-request.js +5 -3
  101. package/dist/server/app-page-response.js +1 -1
  102. package/dist/server/app-page-route-wiring.d.ts +5 -1
  103. package/dist/server/app-page-route-wiring.js +21 -11
  104. package/dist/server/app-page-stream.d.ts +16 -9
  105. package/dist/server/app-page-stream.js +12 -9
  106. package/dist/server/app-pages-bridge.d.ts +18 -0
  107. package/dist/server/app-pages-bridge.js +22 -5
  108. package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
  109. package/dist/server/app-ppr-fallback-shell-render.js +26 -0
  110. package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
  111. package/dist/server/app-ppr-fallback-shell.js +8 -1
  112. package/dist/server/app-route-handler-dispatch.js +9 -2
  113. package/dist/server/app-route-handler-policy.d.ts +1 -0
  114. package/dist/server/app-route-handler-response.js +11 -10
  115. package/dist/server/app-route-handler-runtime.js +12 -1
  116. package/dist/server/app-router-entry.js +5 -0
  117. package/dist/server/app-rsc-cache-busting.js +2 -0
  118. package/dist/server/app-rsc-handler.d.ts +25 -0
  119. package/dist/server/app-rsc-handler.js +153 -53
  120. package/dist/server/app-rsc-response-finalizer.js +1 -1
  121. package/dist/server/app-rsc-route-matching.d.ts +3 -0
  122. package/dist/server/app-rsc-route-matching.js +2 -0
  123. package/dist/server/app-segment-config.d.ts +9 -1
  124. package/dist/server/app-segment-config.js +12 -3
  125. package/dist/server/app-server-action-execution.d.ts +12 -0
  126. package/dist/server/app-server-action-execution.js +47 -15
  127. package/dist/server/app-ssr-entry.d.ts +2 -0
  128. package/dist/server/app-ssr-entry.js +81 -8
  129. package/dist/server/app-ssr-stream.js +9 -1
  130. package/dist/server/cache-control.js +4 -0
  131. package/dist/server/dev-lockfile.js +2 -1
  132. package/dist/server/dev-server.d.ts +2 -2
  133. package/dist/server/dev-server.js +287 -63
  134. package/dist/server/headers.d.ts +8 -1
  135. package/dist/server/headers.js +8 -1
  136. package/dist/server/hybrid-route-priority.d.ts +22 -0
  137. package/dist/server/hybrid-route-priority.js +33 -0
  138. package/dist/server/image-optimization.d.ts +18 -9
  139. package/dist/server/image-optimization.js +37 -23
  140. package/dist/server/implicit-tags.d.ts +2 -1
  141. package/dist/server/implicit-tags.js +4 -1
  142. package/dist/server/instrumentation-runtime.d.ts +6 -0
  143. package/dist/server/instrumentation-runtime.js +8 -0
  144. package/dist/server/isr-decision.d.ts +79 -0
  145. package/dist/server/isr-decision.js +70 -0
  146. package/dist/server/metadata-route-response.js +5 -3
  147. package/dist/server/middleware-runtime.d.ts +13 -0
  148. package/dist/server/middleware-runtime.js +11 -7
  149. package/dist/server/middleware.js +1 -0
  150. package/dist/server/navigation-planner.d.ts +186 -22
  151. package/dist/server/navigation-planner.js +302 -0
  152. package/dist/server/navigation-trace.d.ts +18 -1
  153. package/dist/server/navigation-trace.js +18 -1
  154. package/dist/server/normalize-path.d.ts +0 -8
  155. package/dist/server/normalize-path.js +3 -1
  156. package/dist/server/otel-tracer-extension.d.ts +45 -0
  157. package/dist/server/otel-tracer-extension.js +89 -0
  158. package/dist/server/pages-api-route.d.ts +20 -3
  159. package/dist/server/pages-api-route.js +19 -3
  160. package/dist/server/pages-asset-tags.d.ts +16 -4
  161. package/dist/server/pages-asset-tags.js +22 -12
  162. package/dist/server/pages-data-route.d.ts +8 -1
  163. package/dist/server/pages-data-route.js +16 -3
  164. package/dist/server/pages-get-initial-props.d.ts +54 -4
  165. package/dist/server/pages-get-initial-props.js +43 -1
  166. package/dist/server/pages-node-compat.d.ts +3 -11
  167. package/dist/server/pages-node-compat.js +175 -122
  168. package/dist/server/pages-page-data.d.ts +39 -2
  169. package/dist/server/pages-page-data.js +261 -46
  170. package/dist/server/pages-page-handler.d.ts +5 -2
  171. package/dist/server/pages-page-handler.js +78 -25
  172. package/dist/server/pages-page-response.d.ts +47 -2
  173. package/dist/server/pages-page-response.js +73 -9
  174. package/dist/server/pages-readiness.d.ts +1 -1
  175. package/dist/server/pages-request-pipeline.d.ts +16 -1
  176. package/dist/server/pages-request-pipeline.js +96 -38
  177. package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
  178. package/dist/server/pregenerated-concrete-paths.js +2 -19
  179. package/dist/server/prerender-manifest.d.ts +33 -0
  180. package/dist/server/prerender-manifest.js +54 -0
  181. package/dist/server/prerender-route-params.d.ts +1 -2
  182. package/dist/server/prod-server.d.ts +39 -1
  183. package/dist/server/prod-server.js +107 -37
  184. package/dist/server/request-pipeline.d.ts +3 -15
  185. package/dist/server/request-pipeline.js +58 -47
  186. package/dist/server/rsc-stream-hints.d.ts +5 -1
  187. package/dist/server/rsc-stream-hints.js +6 -1
  188. package/dist/server/seed-cache.js +10 -18
  189. package/dist/shims/app-router-scroll-state.d.ts +3 -1
  190. package/dist/shims/app-router-scroll-state.js +14 -2
  191. package/dist/shims/app-router-scroll.d.ts +3 -0
  192. package/dist/shims/app-router-scroll.js +28 -18
  193. package/dist/shims/cache-runtime.js +12 -4
  194. package/dist/shims/cache.d.ts +1 -0
  195. package/dist/shims/cache.js +1 -1
  196. package/dist/shims/cdn-cache.d.ts +5 -5
  197. package/dist/shims/dynamic-preload-chunks.d.ts +8 -0
  198. package/dist/shims/dynamic-preload-chunks.js +79 -0
  199. package/dist/shims/dynamic.d.ts +4 -0
  200. package/dist/shims/dynamic.js +4 -2
  201. package/dist/shims/error-boundary.d.ts +6 -4
  202. package/dist/shims/error-boundary.js +7 -0
  203. package/dist/shims/error.js +38 -11
  204. package/dist/shims/error.react-server.d.ts +9 -0
  205. package/dist/shims/error.react-server.js +6 -0
  206. package/dist/shims/fetch-cache.d.ts +11 -1
  207. package/dist/shims/fetch-cache.js +55 -20
  208. package/dist/shims/hash-scroll.js +6 -1
  209. package/dist/shims/head.js +6 -1
  210. package/dist/shims/headers.d.ts +16 -2
  211. package/dist/shims/headers.js +66 -5
  212. package/dist/shims/image-config.js +7 -1
  213. package/dist/shims/internal/als-registry.js +28 -1
  214. package/dist/shims/internal/app-route-detection.d.ts +6 -3
  215. package/dist/shims/internal/app-route-detection.js +18 -23
  216. package/dist/shims/internal/app-router-context.d.ts +5 -0
  217. package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
  218. package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
  219. package/dist/shims/internal/navigation-untracked.d.ts +35 -0
  220. package/dist/shims/internal/navigation-untracked.js +55 -0
  221. package/dist/shims/internal/pages-data-target.d.ts +7 -2
  222. package/dist/shims/internal/pages-data-target.js +17 -8
  223. package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
  224. package/dist/shims/internal/pages-router-accessor.js +13 -0
  225. package/dist/shims/internal/router-context.d.ts +2 -1
  226. package/dist/shims/internal/router-context.js +3 -1
  227. package/dist/shims/link.js +12 -5
  228. package/dist/shims/metadata.d.ts +6 -2
  229. package/dist/shims/metadata.js +32 -14
  230. package/dist/shims/navigation.d.ts +14 -17
  231. package/dist/shims/navigation.js +93 -46
  232. package/dist/shims/ppr-fallback-shell.d.ts +5 -1
  233. package/dist/shims/ppr-fallback-shell.js +28 -7
  234. package/dist/shims/router.d.ts +13 -2
  235. package/dist/shims/router.js +434 -116
  236. package/dist/shims/script-nonce-context.d.ts +1 -1
  237. package/dist/shims/script-nonce-context.js +11 -3
  238. package/dist/shims/server.d.ts +33 -2
  239. package/dist/shims/server.js +75 -18
  240. package/dist/shims/slot.js +1 -1
  241. package/dist/shims/unified-request-context.js +2 -0
  242. package/dist/typegen.js +1 -0
  243. package/dist/utils/built-asset-url.d.ts +4 -0
  244. package/dist/utils/built-asset-url.js +11 -0
  245. package/dist/utils/client-build-manifest.js +15 -5
  246. package/dist/utils/client-runtime-metadata.d.ts +45 -0
  247. package/dist/utils/client-runtime-metadata.js +63 -0
  248. package/dist/utils/commonjs-loader.d.ts +16 -0
  249. package/dist/utils/commonjs-loader.js +100 -0
  250. package/dist/utils/deployment-id.d.ts +8 -0
  251. package/dist/utils/deployment-id.js +22 -0
  252. package/dist/utils/hash.d.ts +17 -1
  253. package/dist/utils/hash.js +36 -1
  254. package/dist/utils/html-limited-bots.d.ts +18 -1
  255. package/dist/utils/html-limited-bots.js +23 -1
  256. package/dist/utils/lazy-chunks.d.ts +27 -1
  257. package/dist/utils/lazy-chunks.js +65 -1
  258. package/dist/utils/manifest-paths.d.ts +20 -2
  259. package/dist/utils/manifest-paths.js +38 -3
  260. package/dist/utils/parse-cookie.d.ts +13 -0
  261. package/dist/utils/parse-cookie.js +52 -0
  262. package/dist/utils/path.d.ts +8 -1
  263. package/dist/utils/path.js +13 -1
  264. package/package.json +2 -2
  265. package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
  266. package/dist/shims/internal/parse-cookie-header.js +0 -30
@@ -1,9 +1,10 @@
1
- import { parseCookies } from "../config/config-matchers.js";
1
+ import { parseCookieHeader } from "../utils/parse-cookie.js";
2
2
  import { readStreamAsTextWithLimit } from "../utils/text-stream.js";
3
3
  import { PagesBodyParseError, getMediaType, isJsonMediaType } from "./pages-media-type.js";
4
4
  import { DEFAULT_PAGES_API_BODY_SIZE_LIMIT } from "./pages-body-parser-config.js";
5
5
  import { performOnDemandRevalidate } from "./pages-revalidate.js";
6
6
  import { decode } from "node:querystring";
7
+ import { Readable, Writable } from "node:stream";
7
8
  //#region src/server/pages-node-compat.ts
8
9
  const MAX_PAGES_API_BODY_SIZE = DEFAULT_PAGES_API_BODY_SIZE_LIMIT;
9
10
  async function readPagesRequestBodyWithLimit(request, maxBytes) {
@@ -41,140 +42,192 @@ async function parsePagesApiBody(request, maxBytes = MAX_PAGES_API_BODY_SIZE) {
41
42
  if (mediaType === "application/x-www-form-urlencoded") return decode(rawBody);
42
43
  return rawBody;
43
44
  }
45
+ async function* requestBodyChunks(request) {
46
+ if (!request.body || request.bodyUsed) return;
47
+ const reader = request.body.getReader();
48
+ try {
49
+ for (;;) {
50
+ const { value, done } = await reader.read();
51
+ if (done) return;
52
+ yield Buffer.from(value.buffer, value.byteOffset, value.byteLength);
53
+ }
54
+ } finally {
55
+ try {
56
+ await reader.cancel();
57
+ } catch {}
58
+ reader.releaseLock();
59
+ }
60
+ }
61
+ function createRequestReadable(request) {
62
+ return Readable.from(requestBodyChunks(request), { objectMode: false });
63
+ }
64
+ var PagesResponseStream = class extends Writable {
65
+ resolveResponse;
66
+ rejectResponse;
67
+ requestHeaders;
68
+ resStatusCode = 200;
69
+ resHeaders = {};
70
+ setCookieHeaders = [];
71
+ resolved = false;
72
+ controller = null;
73
+ bufferedChunks = [];
74
+ streamEnded = false;
75
+ constructor(resolveResponse, rejectResponse, requestHeaders) {
76
+ super();
77
+ this.resolveResponse = resolveResponse;
78
+ this.rejectResponse = rejectResponse;
79
+ this.requestHeaders = requestHeaders;
80
+ this.once("error", (err) => {
81
+ if (!this.resolved) {
82
+ this.resolved = true;
83
+ this.rejectResponse(err);
84
+ }
85
+ });
86
+ }
87
+ get statusCode() {
88
+ return this.resStatusCode;
89
+ }
90
+ set statusCode(code) {
91
+ this.resStatusCode = code;
92
+ }
93
+ get headersSent() {
94
+ return this.writableEnded || this.resolved;
95
+ }
96
+ writeHead(code, headers) {
97
+ this.resStatusCode = code;
98
+ if (headers) for (const [key, value] of Object.entries(headers)) this.setHeaderValue(key, value, { replaceSetCookie: false });
99
+ return this;
100
+ }
101
+ setHeader(name, value) {
102
+ this.setHeaderValue(name, value, { replaceSetCookie: true });
103
+ return this;
104
+ }
105
+ getHeader(name) {
106
+ if (name.toLowerCase() === "set-cookie") return this.setCookieHeaders.length > 0 ? this.setCookieHeaders : void 0;
107
+ return this.resHeaders[name.toLowerCase()];
108
+ }
109
+ status(code) {
110
+ this.resStatusCode = code;
111
+ return this;
112
+ }
113
+ json(data) {
114
+ this.resHeaders["content-type"] = "application/json";
115
+ this.end(JSON.stringify(data));
116
+ }
117
+ send(data) {
118
+ if (Buffer.isBuffer(data)) {
119
+ if (!this.resHeaders["content-type"]) this.resHeaders["content-type"] = "application/octet-stream";
120
+ this.resHeaders["content-length"] = String(data.length);
121
+ this.end(data);
122
+ return;
123
+ }
124
+ if (typeof data === "object" && data !== null) {
125
+ this.resHeaders["content-type"] = "application/json";
126
+ this.end(JSON.stringify(data));
127
+ return;
128
+ }
129
+ if (!this.resHeaders["content-type"]) this.resHeaders["content-type"] = "text/plain";
130
+ this.end(String(data));
131
+ }
132
+ redirect(statusOrUrl, url) {
133
+ if (typeof statusOrUrl === "string") this.writeHead(307, { Location: statusOrUrl });
134
+ else this.writeHead(statusOrUrl, { Location: url ?? "" });
135
+ this.end();
136
+ }
137
+ getHeaders() {
138
+ const headers = { ...this.resHeaders };
139
+ if (this.setCookieHeaders.length > 0) headers["set-cookie"] = this.setCookieHeaders;
140
+ return headers;
141
+ }
142
+ async revalidate(urlPath, opts) {
143
+ await performOnDemandRevalidate(this.requestHeaders, urlPath, opts);
144
+ }
145
+ _write(chunk, encoding, callback) {
146
+ const buffer = typeof chunk === "string" ? Buffer.from(chunk, encoding) : Buffer.from(chunk);
147
+ if (this.controller && !this.streamEnded) try {
148
+ this.controller.enqueue(buffer);
149
+ } catch {}
150
+ else this.bufferedChunks.push(buffer);
151
+ this.resolveOnce();
152
+ callback();
153
+ }
154
+ _final(callback) {
155
+ this.streamEnded = true;
156
+ if (this.controller) try {
157
+ this.controller.close();
158
+ } catch {}
159
+ this.resolveOnce();
160
+ callback();
161
+ }
162
+ _destroy(error, callback) {
163
+ this.streamEnded = true;
164
+ if (!this.resolved) if (error) {
165
+ this.resolved = true;
166
+ this.rejectResponse(error);
167
+ } else this.resolveOnce();
168
+ if (this.controller) try {
169
+ if (error) this.controller.error(error);
170
+ else this.controller.close();
171
+ } catch {}
172
+ callback(error);
173
+ }
174
+ setHeaderValue(name, value, options) {
175
+ if (name.toLowerCase() === "set-cookie") {
176
+ if (options.replaceSetCookie) this.setCookieHeaders.length = 0;
177
+ if (Array.isArray(value)) this.setCookieHeaders.push(...value.map(String));
178
+ else this.setCookieHeaders.push(String(value));
179
+ return;
180
+ }
181
+ this.resHeaders[name.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
182
+ }
183
+ resolveOnce() {
184
+ if (this.resolved) return;
185
+ this.resolved = true;
186
+ const headers = new Headers();
187
+ for (const [key, value] of Object.entries(this.resHeaders)) headers.set(key, String(value));
188
+ for (const cookie of this.setCookieHeaders) headers.append("set-cookie", cookie);
189
+ const stream = new ReadableStream({
190
+ start: (controller) => {
191
+ this.controller = controller;
192
+ for (const buffer of this.bufferedChunks) try {
193
+ controller.enqueue(buffer);
194
+ } catch {}
195
+ this.bufferedChunks.length = 0;
196
+ if (this.streamEnded) try {
197
+ controller.close();
198
+ } catch {}
199
+ },
200
+ cancel: (reason) => {
201
+ this.bufferedChunks.length = 0;
202
+ this.destroy(reason instanceof Error ? reason : /* @__PURE__ */ new Error("Response body cancelled"));
203
+ }
204
+ });
205
+ this.resolveResponse(new Response(stream, {
206
+ status: this.resStatusCode,
207
+ headers
208
+ }));
209
+ }
210
+ };
44
211
  function createPagesReqRes(options) {
45
212
  const headersObj = {};
46
213
  for (const [key, value] of options.request.headers) headersObj[key.toLowerCase()] = value;
47
- const requestBody = options.request.body;
48
- const reqAsyncIterator = () => {
49
- if (!requestBody) return { next() {
50
- return Promise.resolve({
51
- value: void 0,
52
- done: true
53
- });
54
- } };
55
- const reader = requestBody.getReader();
56
- return {
57
- async next() {
58
- const { value, done } = await reader.read();
59
- if (done) return {
60
- value: void 0,
61
- done: true
62
- };
63
- return {
64
- value,
65
- done: false
66
- };
67
- },
68
- async return() {
69
- try {
70
- await reader.cancel();
71
- } catch {}
72
- return {
73
- value: void 0,
74
- done: true
75
- };
76
- }
77
- };
78
- };
79
- const req = {
214
+ const req = Object.assign(createRequestReadable(options.request), {
80
215
  method: options.request.method,
81
216
  url: options.url,
82
217
  headers: headersObj,
83
218
  query: options.query,
84
219
  body: options.body,
85
- cookies: parseCookies(options.request.headers.get("cookie")),
86
- [Symbol.asyncIterator]: reqAsyncIterator
87
- };
88
- let resStatusCode = 200;
89
- const resHeaders = {};
90
- const setCookieHeaders = [];
91
- let resBody = null;
92
- let ended = false;
220
+ cookies: parseCookieHeader(options.request.headers.get("cookie"))
221
+ });
93
222
  let resolveResponse;
94
- const responsePromise = new Promise((resolve) => {
223
+ let rejectResponse;
224
+ const responsePromise = new Promise((resolve, reject) => {
95
225
  resolveResponse = resolve;
226
+ rejectResponse = reject;
96
227
  });
97
- const res = {
98
- get statusCode() {
99
- return resStatusCode;
100
- },
101
- set statusCode(code) {
102
- resStatusCode = code;
103
- },
104
- get headersSent() {
105
- return ended;
106
- },
107
- writeHead(code, headers) {
108
- resStatusCode = code;
109
- if (headers) for (const [key, value] of Object.entries(headers)) if (key.toLowerCase() === "set-cookie") if (Array.isArray(value)) setCookieHeaders.push(...value.map(String));
110
- else setCookieHeaders.push(String(value));
111
- else resHeaders[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
112
- return res;
113
- },
114
- setHeader(name, value) {
115
- if (name.toLowerCase() === "set-cookie") {
116
- setCookieHeaders.length = 0;
117
- if (Array.isArray(value)) setCookieHeaders.push(...value.map(String));
118
- else setCookieHeaders.push(String(value));
119
- } else resHeaders[name.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
120
- return res;
121
- },
122
- getHeader(name) {
123
- if (name.toLowerCase() === "set-cookie") return setCookieHeaders.length > 0 ? setCookieHeaders : void 0;
124
- return resHeaders[name.toLowerCase()];
125
- },
126
- end(data) {
127
- if (ended) return;
128
- ended = true;
129
- if (data !== void 0 && data !== null) resBody = data;
130
- const headers = new Headers();
131
- for (const [key, value] of Object.entries(resHeaders)) headers.set(key, String(value));
132
- for (const cookie of setCookieHeaders) headers.append("set-cookie", cookie);
133
- resolveResponse(new Response(resBody, {
134
- status: resStatusCode,
135
- headers
136
- }));
137
- },
138
- status(code) {
139
- resStatusCode = code;
140
- return res;
141
- },
142
- json(data) {
143
- resHeaders["content-type"] = "application/json";
144
- res.end(JSON.stringify(data));
145
- },
146
- send(data) {
147
- if (Buffer.isBuffer(data)) {
148
- if (!resHeaders["content-type"]) resHeaders["content-type"] = "application/octet-stream";
149
- resHeaders["content-length"] = String(data.length);
150
- res.end(new Uint8Array(data));
151
- return;
152
- }
153
- if (typeof data === "object" && data !== null) {
154
- resHeaders["content-type"] = "application/json";
155
- res.end(JSON.stringify(data));
156
- return;
157
- }
158
- if (!resHeaders["content-type"]) resHeaders["content-type"] = "text/plain";
159
- res.end(String(data));
160
- },
161
- redirect(statusOrUrl, url) {
162
- if (typeof statusOrUrl === "string") res.writeHead(307, { Location: statusOrUrl });
163
- else res.writeHead(statusOrUrl, { Location: url ?? "" });
164
- res.end();
165
- },
166
- getHeaders() {
167
- const headers = { ...resHeaders };
168
- if (setCookieHeaders.length > 0) headers["set-cookie"] = setCookieHeaders;
169
- return headers;
170
- },
171
- async revalidate(urlPath, opts) {
172
- await performOnDemandRevalidate(options.request.headers, urlPath, opts);
173
- }
174
- };
175
228
  return {
176
229
  req,
177
- res,
230
+ res: new PagesResponseStream(resolveResponse, rejectResponse, options.request.headers),
178
231
  responsePromise
179
232
  };
180
233
  }
@@ -33,6 +33,9 @@ type PagesGsspContextResponse = {
33
33
  res: PagesMutableGsspResponse;
34
34
  responsePromise: Promise<Response>;
35
35
  };
36
+ type PagesRenderProps = Record<string, unknown> & {
37
+ pageProps: unknown;
38
+ };
36
39
  type PagesPageModule = {
37
40
  default?: unknown;
38
41
  getStaticPaths?: (context: {
@@ -82,9 +85,10 @@ type PagesPageModule = {
82
85
  type RenderPagesIsrHtmlOptions = {
83
86
  buildId: string | null;
84
87
  cachedHtml: string;
85
- createPageElement: (pageProps: Record<string, unknown>) => ReactNode;
88
+ createPageElement: (props: Record<string, unknown>) => ReactNode;
86
89
  i18n: PagesI18nRenderContext;
87
90
  pageProps: Record<string, unknown>;
91
+ props?: Record<string, unknown>;
88
92
  params: Record<string, unknown>;
89
93
  renderIsrPassToStringAsync: (element: ReactNode) => Promise<string>;
90
94
  routePattern: string;
@@ -106,7 +110,8 @@ type ResolvePagesPageDataOptions = {
106
110
  isDataReq?: boolean;
107
111
  err?: unknown;
108
112
  createGsspReqRes: () => PagesGsspContextResponse;
109
- createPageElement: (pageProps: Record<string, unknown>) => ReactNode;
113
+ createAppTree?: (props: Record<string, unknown>) => ReactNode;
114
+ createPageElement: (props: Record<string, unknown>) => ReactNode;
110
115
  fontLinkHeader: string;
111
116
  i18n: PagesI18nRenderContext;
112
117
  isrCacheKey: (router: string, pathname: string) => string;
@@ -138,10 +143,20 @@ type ResolvePagesPageDataOptions = {
138
143
  * presence — see the security note in `isr-cache.ts`.
139
144
  */
140
145
  isOnDemandRevalidate?: boolean;
146
+ /**
147
+ * The deployment ID used for deployment-skew protection. When set, it is
148
+ * included as `x-nextjs-deployment-id` on all `_next/data` responses
149
+ * (success, redirect, notFound). Mirrors Next.js pages-handler.ts behavior.
150
+ * Typically sourced from `process.env.__VINEXT_DEPLOYMENT_ID || process.env.NEXT_DEPLOYMENT_ID`.
151
+ */
152
+ deploymentId?: string;
153
+ htmlLimitedBots?: string;
141
154
  pageModule: PagesPageModule;
155
+ AppComponent?: unknown;
142
156
  params: Record<string, unknown>;
143
157
  query: Record<string, unknown>;
144
158
  asPath?: string;
159
+ resolvedUrl?: string;
145
160
  route: Pick<Route, "isDynamic">;
146
161
  routePattern: string;
147
162
  routeUrl: string;
@@ -158,12 +173,34 @@ type ResolvePagesPageDataOptions = {
158
173
  renderIsrPassToStringAsync: (element: ReactNode) => Promise<string>;
159
174
  vinext?: VinextNextData["__vinext"];
160
175
  nextData?: PagesNextDataExtras;
176
+ /**
177
+ * The request's User-Agent string. When this matches a known crawler/bot
178
+ * pattern, ISR cache-HIT and cache-STALE responses receive an ETag header
179
+ * for consistency with the fresh-MISS path (which also attaches an ETag for
180
+ * bot UAs via `renderPagesPageResponse`). See the divergence note in
181
+ * `pages-page-response.ts` for why UA-gating is used instead of Next.js's
182
+ * `isDynamic` check.
183
+ */
184
+ userAgent?: string;
185
+ /**
186
+ * The incoming request's `If-None-Match` header value. When the cached HTML
187
+ * ETag matches (weak-ETag semantics), the ISR cache-HIT or cache-STALE
188
+ * response is a `304 Not Modified` with no body.
189
+ */
190
+ ifNoneMatch?: string;
191
+ /**
192
+ * The incoming request's `Cache-Control` header value. When it contains
193
+ * `no-cache`, the 304 short-circuit is skipped and a full response is
194
+ * returned — mirroring the `fresh` package used by Next.js.
195
+ */
196
+ requestCacheControl?: string;
161
197
  };
162
198
  type ResolvePagesPageDataRenderResult = {
163
199
  kind: "render";
164
200
  gsspRes: PagesGsspResponse | null;
165
201
  isrRevalidateSeconds: number | null;
166
202
  pageProps: Record<string, unknown>;
203
+ props: PagesRenderProps;
167
204
  /**
168
205
  * True when `getStaticPaths` returned `fallback: true` AND the requested path
169
206
  * is not in the pre-rendered list. The caller renders a loading shell with