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.
- package/README.md +2 -5
- package/dist/build/client-build-config.d.ts +7 -1
- package/dist/build/client-build-config.js +9 -1
- package/dist/build/prerender.d.ts +9 -1
- package/dist/build/prerender.js +41 -12
- package/dist/build/run-prerender.d.ts +10 -2
- package/dist/build/run-prerender.js +15 -1
- package/dist/check.js +4 -3
- package/dist/client/app-nav-failure-handler.d.ts +8 -0
- package/dist/client/app-nav-failure-handler.js +44 -0
- package/dist/client/navigation-runtime.d.ts +3 -2
- package/dist/client/vinext-next-data.d.ts +18 -1
- package/dist/client/window-next.d.ts +8 -5
- package/dist/client/window-next.js +12 -1
- package/dist/cloudflare/src/cache/cdn-adapter.runtime.js +6 -1
- package/dist/config/config-matchers.d.ts +11 -4
- package/dist/config/config-matchers.js +88 -16
- package/dist/config/next-config.d.ts +59 -4
- package/dist/config/next-config.js +149 -48
- package/dist/deploy.d.ts +30 -11
- package/dist/deploy.js +189 -101
- package/dist/entries/app-browser-entry.d.ts +9 -3
- package/dist/entries/app-browser-entry.js +21 -3
- package/dist/entries/app-rsc-entry.d.ts +2 -0
- package/dist/entries/app-rsc-entry.js +71 -6
- package/dist/entries/app-rsc-manifest.js +2 -0
- package/dist/entries/app-ssr-entry.js +1 -1
- package/dist/entries/pages-client-entry.js +54 -9
- package/dist/entries/pages-server-entry.js +48 -11
- package/dist/index.d.ts +0 -2
- package/dist/index.js +285 -139
- package/dist/plugins/dynamic-preload-metadata.d.ts +13 -0
- package/dist/plugins/dynamic-preload-metadata.js +415 -0
- package/dist/plugins/extensionless-dynamic-import.d.ts +6 -0
- package/dist/plugins/extensionless-dynamic-import.js +152 -0
- package/dist/plugins/og-assets.js +2 -2
- package/dist/plugins/optimize-imports.d.ts +10 -5
- package/dist/plugins/optimize-imports.js +27 -21
- package/dist/plugins/postcss.js +7 -7
- package/dist/plugins/sass.d.ts +53 -24
- package/dist/plugins/sass.js +249 -1
- package/dist/plugins/typeof-window.d.ts +14 -0
- package/dist/plugins/typeof-window.js +150 -0
- package/dist/plugins/wasm-module-import.d.ts +15 -0
- package/dist/plugins/wasm-module-import.js +50 -0
- package/dist/routing/app-route-graph.d.ts +25 -2
- package/dist/routing/app-route-graph.js +91 -22
- package/dist/routing/file-matcher.d.ts +10 -1
- package/dist/routing/file-matcher.js +23 -2
- package/dist/routing/pages-router.js +3 -3
- package/dist/routing/utils.d.ts +35 -6
- package/dist/routing/utils.js +59 -7
- package/dist/server/api-handler.d.ts +6 -1
- package/dist/server/api-handler.js +21 -15
- package/dist/server/app-browser-action-result.d.ts +19 -6
- package/dist/server/app-browser-action-result.js +19 -10
- package/dist/server/app-browser-entry.js +269 -297
- package/dist/server/app-browser-error.d.ts +10 -3
- package/dist/server/app-browser-error.js +47 -6
- package/dist/server/app-browser-history-controller.d.ts +104 -0
- package/dist/server/app-browser-history-controller.js +210 -0
- package/dist/server/app-browser-hydration.d.ts +2 -0
- package/dist/server/app-browser-hydration.js +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +7 -4
- package/dist/server/app-browser-navigation-controller.js +33 -9
- package/dist/server/app-browser-rsc-redirect.d.ts +11 -2
- package/dist/server/app-browser-rsc-redirect.js +30 -8
- package/dist/server/app-browser-server-action-navigation.d.ts +6 -0
- package/dist/server/app-browser-server-action-navigation.js +9 -0
- package/dist/server/app-browser-state.js +4 -7
- package/dist/server/app-browser-stream.js +86 -43
- package/dist/server/app-browser-visible-commit.js +1 -1
- package/dist/server/app-elements-wire.d.ts +6 -1
- package/dist/server/app-elements-wire.js +14 -4
- package/dist/server/app-elements.d.ts +2 -2
- package/dist/server/app-elements.js +2 -2
- package/dist/server/app-fallback-renderer.d.ts +3 -1
- package/dist/server/app-fallback-renderer.js +6 -2
- package/dist/server/app-middleware.js +1 -0
- package/dist/server/app-optimistic-routing.js +24 -3
- package/dist/server/app-page-boundary-render.d.ts +3 -1
- package/dist/server/app-page-boundary-render.js +31 -16
- package/dist/server/app-page-cache-render.d.ts +53 -0
- package/dist/server/app-page-cache-render.js +91 -0
- package/dist/server/app-page-cache.d.ts +16 -2
- package/dist/server/app-page-cache.js +71 -8
- package/dist/server/app-page-dispatch.d.ts +34 -0
- package/dist/server/app-page-dispatch.js +167 -97
- package/dist/server/app-page-element-builder.d.ts +23 -2
- package/dist/server/app-page-element-builder.js +42 -10
- package/dist/server/app-page-execution.d.ts +7 -2
- package/dist/server/app-page-execution.js +53 -18
- package/dist/server/app-page-probe.d.ts +1 -0
- package/dist/server/app-page-probe.js +4 -0
- package/dist/server/app-page-render-observation.d.ts +3 -1
- package/dist/server/app-page-render-observation.js +17 -1
- package/dist/server/app-page-render.d.ts +13 -2
- package/dist/server/app-page-render.js +48 -17
- package/dist/server/app-page-request.d.ts +3 -0
- package/dist/server/app-page-request.js +5 -3
- package/dist/server/app-page-response.js +1 -1
- package/dist/server/app-page-route-wiring.d.ts +5 -1
- package/dist/server/app-page-route-wiring.js +21 -11
- package/dist/server/app-page-stream.d.ts +16 -9
- package/dist/server/app-page-stream.js +12 -9
- package/dist/server/app-pages-bridge.d.ts +18 -0
- package/dist/server/app-pages-bridge.js +22 -5
- package/dist/server/app-ppr-fallback-shell-render.d.ts +17 -0
- package/dist/server/app-ppr-fallback-shell-render.js +26 -0
- package/dist/server/app-ppr-fallback-shell.d.ts +13 -1
- package/dist/server/app-ppr-fallback-shell.js +8 -1
- package/dist/server/app-route-handler-dispatch.js +9 -2
- package/dist/server/app-route-handler-policy.d.ts +1 -0
- package/dist/server/app-route-handler-response.js +11 -10
- package/dist/server/app-route-handler-runtime.js +12 -1
- package/dist/server/app-router-entry.js +5 -0
- package/dist/server/app-rsc-cache-busting.js +2 -0
- package/dist/server/app-rsc-handler.d.ts +25 -0
- package/dist/server/app-rsc-handler.js +153 -53
- package/dist/server/app-rsc-response-finalizer.js +1 -1
- package/dist/server/app-rsc-route-matching.d.ts +3 -0
- package/dist/server/app-rsc-route-matching.js +2 -0
- package/dist/server/app-segment-config.d.ts +9 -1
- package/dist/server/app-segment-config.js +12 -3
- package/dist/server/app-server-action-execution.d.ts +12 -0
- package/dist/server/app-server-action-execution.js +47 -15
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +81 -8
- package/dist/server/app-ssr-stream.js +9 -1
- package/dist/server/cache-control.js +4 -0
- package/dist/server/dev-lockfile.js +2 -1
- package/dist/server/dev-server.d.ts +2 -2
- package/dist/server/dev-server.js +287 -63
- package/dist/server/headers.d.ts +8 -1
- package/dist/server/headers.js +8 -1
- package/dist/server/hybrid-route-priority.d.ts +22 -0
- package/dist/server/hybrid-route-priority.js +33 -0
- package/dist/server/image-optimization.d.ts +18 -9
- package/dist/server/image-optimization.js +37 -23
- package/dist/server/implicit-tags.d.ts +2 -1
- package/dist/server/implicit-tags.js +4 -1
- package/dist/server/instrumentation-runtime.d.ts +6 -0
- package/dist/server/instrumentation-runtime.js +8 -0
- package/dist/server/isr-decision.d.ts +79 -0
- package/dist/server/isr-decision.js +70 -0
- package/dist/server/metadata-route-response.js +5 -3
- package/dist/server/middleware-runtime.d.ts +13 -0
- package/dist/server/middleware-runtime.js +11 -7
- package/dist/server/middleware.js +1 -0
- package/dist/server/navigation-planner.d.ts +186 -22
- package/dist/server/navigation-planner.js +302 -0
- package/dist/server/navigation-trace.d.ts +18 -1
- package/dist/server/navigation-trace.js +18 -1
- package/dist/server/normalize-path.d.ts +0 -8
- package/dist/server/normalize-path.js +3 -1
- package/dist/server/otel-tracer-extension.d.ts +45 -0
- package/dist/server/otel-tracer-extension.js +89 -0
- package/dist/server/pages-api-route.d.ts +20 -3
- package/dist/server/pages-api-route.js +19 -3
- package/dist/server/pages-asset-tags.d.ts +16 -4
- package/dist/server/pages-asset-tags.js +22 -12
- package/dist/server/pages-data-route.d.ts +8 -1
- package/dist/server/pages-data-route.js +16 -3
- package/dist/server/pages-get-initial-props.d.ts +54 -4
- package/dist/server/pages-get-initial-props.js +43 -1
- package/dist/server/pages-node-compat.d.ts +3 -11
- package/dist/server/pages-node-compat.js +175 -122
- package/dist/server/pages-page-data.d.ts +39 -2
- package/dist/server/pages-page-data.js +261 -46
- package/dist/server/pages-page-handler.d.ts +5 -2
- package/dist/server/pages-page-handler.js +78 -25
- package/dist/server/pages-page-response.d.ts +47 -2
- package/dist/server/pages-page-response.js +73 -9
- package/dist/server/pages-readiness.d.ts +1 -1
- package/dist/server/pages-request-pipeline.d.ts +16 -1
- package/dist/server/pages-request-pipeline.js +96 -38
- package/dist/server/pregenerated-concrete-paths.d.ts +1 -17
- package/dist/server/pregenerated-concrete-paths.js +2 -19
- package/dist/server/prerender-manifest.d.ts +33 -0
- package/dist/server/prerender-manifest.js +54 -0
- package/dist/server/prerender-route-params.d.ts +1 -2
- package/dist/server/prod-server.d.ts +39 -1
- package/dist/server/prod-server.js +107 -37
- package/dist/server/request-pipeline.d.ts +3 -15
- package/dist/server/request-pipeline.js +58 -47
- package/dist/server/rsc-stream-hints.d.ts +5 -1
- package/dist/server/rsc-stream-hints.js +6 -1
- package/dist/server/seed-cache.js +10 -18
- package/dist/shims/app-router-scroll-state.d.ts +3 -1
- package/dist/shims/app-router-scroll-state.js +14 -2
- package/dist/shims/app-router-scroll.d.ts +3 -0
- package/dist/shims/app-router-scroll.js +28 -18
- package/dist/shims/cache-runtime.js +12 -4
- package/dist/shims/cache.d.ts +1 -0
- package/dist/shims/cache.js +1 -1
- package/dist/shims/cdn-cache.d.ts +5 -5
- package/dist/shims/dynamic-preload-chunks.d.ts +8 -0
- package/dist/shims/dynamic-preload-chunks.js +79 -0
- package/dist/shims/dynamic.d.ts +4 -0
- package/dist/shims/dynamic.js +4 -2
- package/dist/shims/error-boundary.d.ts +6 -4
- package/dist/shims/error-boundary.js +7 -0
- package/dist/shims/error.js +38 -11
- package/dist/shims/error.react-server.d.ts +9 -0
- package/dist/shims/error.react-server.js +6 -0
- package/dist/shims/fetch-cache.d.ts +11 -1
- package/dist/shims/fetch-cache.js +55 -20
- package/dist/shims/hash-scroll.js +6 -1
- package/dist/shims/head.js +6 -1
- package/dist/shims/headers.d.ts +16 -2
- package/dist/shims/headers.js +66 -5
- package/dist/shims/image-config.js +7 -1
- package/dist/shims/internal/als-registry.js +28 -1
- package/dist/shims/internal/app-route-detection.d.ts +6 -3
- package/dist/shims/internal/app-route-detection.js +18 -23
- package/dist/shims/internal/app-router-context.d.ts +5 -0
- package/dist/shims/internal/hybrid-client-route-owner.d.ts +31 -0
- package/dist/shims/internal/hybrid-client-route-owner.js +143 -0
- package/dist/shims/internal/navigation-untracked.d.ts +35 -0
- package/dist/shims/internal/navigation-untracked.js +55 -0
- package/dist/shims/internal/pages-data-target.d.ts +7 -2
- package/dist/shims/internal/pages-data-target.js +17 -8
- package/dist/shims/internal/pages-router-accessor.d.ts +19 -0
- package/dist/shims/internal/pages-router-accessor.js +13 -0
- package/dist/shims/internal/router-context.d.ts +2 -1
- package/dist/shims/internal/router-context.js +3 -1
- package/dist/shims/link.js +12 -5
- package/dist/shims/metadata.d.ts +6 -2
- package/dist/shims/metadata.js +32 -14
- package/dist/shims/navigation.d.ts +14 -17
- package/dist/shims/navigation.js +93 -46
- package/dist/shims/ppr-fallback-shell.d.ts +5 -1
- package/dist/shims/ppr-fallback-shell.js +28 -7
- package/dist/shims/router.d.ts +13 -2
- package/dist/shims/router.js +434 -116
- package/dist/shims/script-nonce-context.d.ts +1 -1
- package/dist/shims/script-nonce-context.js +11 -3
- package/dist/shims/server.d.ts +33 -2
- package/dist/shims/server.js +75 -18
- package/dist/shims/slot.js +1 -1
- package/dist/shims/unified-request-context.js +2 -0
- package/dist/typegen.js +1 -0
- package/dist/utils/built-asset-url.d.ts +4 -0
- package/dist/utils/built-asset-url.js +11 -0
- package/dist/utils/client-build-manifest.js +15 -5
- package/dist/utils/client-runtime-metadata.d.ts +45 -0
- package/dist/utils/client-runtime-metadata.js +63 -0
- package/dist/utils/commonjs-loader.d.ts +16 -0
- package/dist/utils/commonjs-loader.js +100 -0
- package/dist/utils/deployment-id.d.ts +8 -0
- package/dist/utils/deployment-id.js +22 -0
- package/dist/utils/hash.d.ts +17 -1
- package/dist/utils/hash.js +36 -1
- package/dist/utils/html-limited-bots.d.ts +18 -1
- package/dist/utils/html-limited-bots.js +23 -1
- package/dist/utils/lazy-chunks.d.ts +27 -1
- package/dist/utils/lazy-chunks.js +65 -1
- package/dist/utils/manifest-paths.d.ts +20 -2
- package/dist/utils/manifest-paths.js +38 -3
- package/dist/utils/parse-cookie.d.ts +13 -0
- package/dist/utils/parse-cookie.js +52 -0
- package/dist/utils/path.d.ts +8 -1
- package/dist/utils/path.js +13 -1
- package/package.json +2 -2
- package/dist/shims/internal/parse-cookie-header.d.ts +0 -14
- package/dist/shims/internal/parse-cookie-header.js +0 -30
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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:
|
|
86
|
-
|
|
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
|
-
|
|
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: (
|
|
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
|
-
|
|
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
|