vinext 0.0.8 → 0.0.10
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 +30 -1
- package/dist/cli.js +13 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/entry.js +1 -15
- package/dist/client/entry.js.map +1 -1
- package/dist/client/validate-module-path.d.ts +15 -0
- package/dist/client/validate-module-path.d.ts.map +1 -0
- package/dist/client/validate-module-path.js +31 -0
- package/dist/client/validate-module-path.js.map +1 -0
- package/dist/config/config-matchers.d.ts +12 -0
- package/dist/config/config-matchers.d.ts.map +1 -1
- package/dist/config/config-matchers.js +28 -0
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/dotenv.d.ts +40 -0
- package/dist/config/dotenv.d.ts.map +1 -0
- package/dist/config/dotenv.js +100 -0
- package/dist/config/dotenv.js.map +1 -0
- package/dist/config/next-config.d.ts +4 -0
- package/dist/config/next-config.d.ts.map +1 -1
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +16 -8
- package/dist/deploy.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -111
- package/dist/index.js.map +1 -1
- package/dist/server/api-handler.d.ts.map +1 -1
- package/dist/server/api-handler.js +2 -1
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-dev-server.d.ts +2 -0
- package/dist/server/app-dev-server.d.ts.map +1 -1
- package/dist/server/app-dev-server.js +292 -155
- package/dist/server/app-dev-server.js.map +1 -1
- package/dist/server/app-router-entry.d.ts.map +1 -1
- package/dist/server/app-router-entry.js +16 -3
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/dev-origin-check.d.ts +61 -0
- package/dist/server/dev-origin-check.d.ts.map +1 -0
- package/dist/server/dev-origin-check.js +164 -0
- package/dist/server/dev-origin-check.js.map +1 -0
- package/dist/server/dev-server.d.ts +0 -2
- package/dist/server/dev-server.d.ts.map +1 -1
- package/dist/server/dev-server.js +379 -372
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/image-optimization.d.ts +32 -2
- package/dist/server/image-optimization.d.ts.map +1 -1
- package/dist/server/image-optimization.js +110 -9
- package/dist/server/image-optimization.js.map +1 -1
- package/dist/server/middleware-codegen.d.ts +41 -0
- package/dist/server/middleware-codegen.d.ts.map +1 -0
- package/dist/server/middleware-codegen.js +181 -0
- package/dist/server/middleware-codegen.js.map +1 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +12 -7
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/normalize-path.d.ts +22 -0
- package/dist/server/normalize-path.d.ts.map +1 -0
- package/dist/server/normalize-path.js +50 -0
- package/dist/server/normalize-path.js.map +1 -0
- package/dist/server/prod-server.d.ts.map +1 -1
- package/dist/server/prod-server.js +89 -25
- package/dist/server/prod-server.js.map +1 -1
- package/dist/shims/cache-runtime.d.ts +7 -0
- package/dist/shims/cache-runtime.d.ts.map +1 -1
- package/dist/shims/cache-runtime.js +19 -15
- package/dist/shims/cache-runtime.js.map +1 -1
- package/dist/shims/cache.d.ts +8 -0
- package/dist/shims/cache.d.ts.map +1 -1
- package/dist/shims/cache.js +20 -15
- package/dist/shims/cache.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts +2 -3
- package/dist/shims/fetch-cache.d.ts.map +1 -1
- package/dist/shims/fetch-cache.js +74 -9
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/head-state.d.ts +6 -1
- package/dist/shims/head-state.d.ts.map +1 -1
- package/dist/shims/head-state.js +18 -15
- package/dist/shims/head-state.js.map +1 -1
- package/dist/shims/headers.d.ts +9 -13
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/headers.js +26 -47
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/image.d.ts.map +1 -1
- package/dist/shims/image.js +11 -2
- package/dist/shims/image.js.map +1 -1
- package/dist/shims/navigation-state.d.ts +6 -1
- package/dist/shims/navigation-state.d.ts.map +1 -1
- package/dist/shims/navigation-state.js +20 -29
- package/dist/shims/navigation-state.js.map +1 -1
- package/dist/shims/navigation.js +2 -2
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/router-state.d.ts +6 -1
- package/dist/shims/router-state.d.ts.map +1 -1
- package/dist/shims/router-state.js +16 -21
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts.map +1 -1
- package/dist/shims/router.js +19 -6
- package/dist/shims/router.js.map +1 -1
- package/package.json +1 -1
|
@@ -23,8 +23,9 @@ import { pathToFileURL } from "node:url";
|
|
|
23
23
|
import fs from "node:fs";
|
|
24
24
|
import path from "node:path";
|
|
25
25
|
import zlib from "node:zlib";
|
|
26
|
-
import { matchRedirect, matchRewrite, matchHeaders, requestContextFromRequest, isExternalUrl, proxyExternalRequest } from "../config/config-matchers.js";
|
|
27
|
-
import { IMAGE_OPTIMIZATION_PATH, parseImageParams } from "./image-optimization.js";
|
|
26
|
+
import { matchRedirect, matchRewrite, matchHeaders, requestContextFromRequest, isExternalUrl, proxyExternalRequest, sanitizeDestination } from "../config/config-matchers.js";
|
|
27
|
+
import { IMAGE_OPTIMIZATION_PATH, IMAGE_CONTENT_SECURITY_POLICY, parseImageParams, isSafeImageContentType, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "./image-optimization.js";
|
|
28
|
+
import { normalizePath } from "./normalize-path.js";
|
|
28
29
|
import { computeLazyChunks } from "../index.js";
|
|
29
30
|
/** Convert a Node.js IncomingMessage into a ReadableStream for Web Request body. */
|
|
30
31
|
function readNodeStream(req) {
|
|
@@ -99,11 +100,23 @@ function sendCompressed(req, res, body, contentType, statusCode, extraHeaders =
|
|
|
99
100
|
const encoding = compress ? negotiateEncoding(req) : null;
|
|
100
101
|
if (encoding && COMPRESSIBLE_TYPES.has(baseType) && buf.length >= COMPRESS_THRESHOLD) {
|
|
101
102
|
const compressor = createCompressor(encoding);
|
|
103
|
+
// Merge Accept-Encoding into existing Vary header from extraHeaders instead
|
|
104
|
+
// of overwriting. Preserves Vary values set by the App Router for content
|
|
105
|
+
// negotiation (e.g. "RSC, Accept").
|
|
106
|
+
const existingVary = extraHeaders["Vary"] ?? extraHeaders["vary"];
|
|
107
|
+
let varyValue;
|
|
108
|
+
if (existingVary) {
|
|
109
|
+
const existing = String(existingVary).toLowerCase();
|
|
110
|
+
varyValue = existing.includes("accept-encoding") ? String(existingVary) : existingVary + ", Accept-Encoding";
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
varyValue = "Accept-Encoding";
|
|
114
|
+
}
|
|
102
115
|
res.writeHead(statusCode, {
|
|
103
116
|
...extraHeaders,
|
|
104
117
|
"Content-Type": contentType,
|
|
105
118
|
"Content-Encoding": encoding,
|
|
106
|
-
Vary:
|
|
119
|
+
Vary: varyValue,
|
|
107
120
|
});
|
|
108
121
|
compressor.end(buf);
|
|
109
122
|
pipeline(compressor, res, () => { });
|
|
@@ -142,7 +155,7 @@ const CONTENT_TYPES = {
|
|
|
142
155
|
* Try to serve a static file from the client build directory.
|
|
143
156
|
* Returns true if the file was served, false otherwise.
|
|
144
157
|
*/
|
|
145
|
-
function tryServeStatic(req, res, clientDir, pathname, compress) {
|
|
158
|
+
function tryServeStatic(req, res, clientDir, pathname, compress, extraHeaders) {
|
|
146
159
|
// Resolve the path and guard against directory traversal (e.g. /../../../etc/passwd)
|
|
147
160
|
const resolvedClient = path.resolve(clientDir);
|
|
148
161
|
let decodedPathname;
|
|
@@ -167,6 +180,11 @@ function tryServeStatic(req, res, clientDir, pathname, compress) {
|
|
|
167
180
|
const cacheControl = isHashed
|
|
168
181
|
? "public, max-age=31536000, immutable"
|
|
169
182
|
: "public, max-age=3600";
|
|
183
|
+
const baseHeaders = {
|
|
184
|
+
"Content-Type": ct,
|
|
185
|
+
"Cache-Control": cacheControl,
|
|
186
|
+
...extraHeaders,
|
|
187
|
+
};
|
|
170
188
|
const baseType = ct.split(";")[0].trim();
|
|
171
189
|
if (compress && COMPRESSIBLE_TYPES.has(baseType)) {
|
|
172
190
|
const encoding = negotiateEncoding(req);
|
|
@@ -174,19 +192,15 @@ function tryServeStatic(req, res, clientDir, pathname, compress) {
|
|
|
174
192
|
const fileStream = fs.createReadStream(staticFile);
|
|
175
193
|
const compressor = createCompressor(encoding);
|
|
176
194
|
res.writeHead(200, {
|
|
177
|
-
|
|
195
|
+
...baseHeaders,
|
|
178
196
|
"Content-Encoding": encoding,
|
|
179
|
-
"Cache-Control": cacheControl,
|
|
180
197
|
Vary: "Accept-Encoding",
|
|
181
198
|
});
|
|
182
199
|
pipeline(fileStream, compressor, res, () => { });
|
|
183
200
|
return true;
|
|
184
201
|
}
|
|
185
202
|
}
|
|
186
|
-
res.writeHead(200,
|
|
187
|
-
"Content-Type": ct,
|
|
188
|
-
"Cache-Control": cacheControl,
|
|
189
|
-
});
|
|
203
|
+
res.writeHead(200, baseHeaders);
|
|
190
204
|
fs.createReadStream(staticFile).pipe(res);
|
|
191
205
|
return true;
|
|
192
206
|
}
|
|
@@ -298,7 +312,19 @@ async function sendWebResponse(webResponse, req, res, compress) {
|
|
|
298
312
|
delete nodeHeaders["content-length"];
|
|
299
313
|
delete nodeHeaders["Content-Length"];
|
|
300
314
|
nodeHeaders["Content-Encoding"] = encoding;
|
|
301
|
-
|
|
315
|
+
// Merge Accept-Encoding into existing Vary header (e.g. "RSC, Accept") instead
|
|
316
|
+
// of overwriting. This prevents stripping the Vary values that the App Router
|
|
317
|
+
// sets for content negotiation (RSC stream vs HTML).
|
|
318
|
+
const existingVary = nodeHeaders["Vary"] ?? nodeHeaders["vary"];
|
|
319
|
+
if (existingVary) {
|
|
320
|
+
const existing = String(existingVary).toLowerCase();
|
|
321
|
+
if (!existing.includes("accept-encoding")) {
|
|
322
|
+
nodeHeaders["Vary"] = existingVary + ", Accept-Encoding";
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
nodeHeaders["Vary"] = "Accept-Encoding";
|
|
327
|
+
}
|
|
302
328
|
}
|
|
303
329
|
res.writeHead(status, nodeHeaders);
|
|
304
330
|
// HEAD requests: send headers only, skip the body
|
|
@@ -370,10 +396,12 @@ async function startAppRouterServer(options) {
|
|
|
370
396
|
}
|
|
371
397
|
const server = createServer(async (req, res) => {
|
|
372
398
|
const url = req.url ?? "/";
|
|
373
|
-
|
|
399
|
+
// Normalize backslashes (browsers treat /\ as //), then decode and normalize path.
|
|
400
|
+
const rawPathname = url.split("?")[0].replaceAll("\\", "/");
|
|
401
|
+
const pathname = normalizePath(decodeURIComponent(rawPathname));
|
|
374
402
|
// Guard against protocol-relative URL open redirect attacks.
|
|
375
|
-
//
|
|
376
|
-
if (
|
|
403
|
+
// Check rawPathname before normalizePath collapses //.
|
|
404
|
+
if (rawPathname.startsWith("//")) {
|
|
377
405
|
res.writeHead(404);
|
|
378
406
|
res.end("404 Not Found");
|
|
379
407
|
return;
|
|
@@ -383,17 +411,32 @@ async function startAppRouterServer(options) {
|
|
|
383
411
|
return;
|
|
384
412
|
}
|
|
385
413
|
// Image optimization passthrough (Node.js prod server has no Images binding;
|
|
386
|
-
// serves the original file with cache headers)
|
|
414
|
+
// serves the original file with cache headers and security headers)
|
|
387
415
|
if (pathname === IMAGE_OPTIMIZATION_PATH) {
|
|
388
416
|
const parsedUrl = new URL(url, "http://localhost");
|
|
389
|
-
const
|
|
417
|
+
const defaultAllowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES];
|
|
418
|
+
const params = parseImageParams(parsedUrl, defaultAllowedWidths);
|
|
390
419
|
if (!params) {
|
|
391
420
|
res.writeHead(400);
|
|
392
421
|
res.end("Bad Request");
|
|
393
422
|
return;
|
|
394
423
|
}
|
|
395
|
-
//
|
|
396
|
-
|
|
424
|
+
// Block SVG and other unsafe content types by checking the file extension.
|
|
425
|
+
// This must happen before serving to prevent XSS via SVG passthrough.
|
|
426
|
+
const ext = path.extname(params.imageUrl).toLowerCase();
|
|
427
|
+
const ct = CONTENT_TYPES[ext] ?? "application/octet-stream";
|
|
428
|
+
if (!isSafeImageContentType(ct)) {
|
|
429
|
+
res.writeHead(400);
|
|
430
|
+
res.end("The requested resource is not an allowed image type");
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
// Serve the original image with CSP and security headers
|
|
434
|
+
const imageSecurityHeaders = {
|
|
435
|
+
"Content-Security-Policy": IMAGE_CONTENT_SECURITY_POLICY,
|
|
436
|
+
"X-Content-Type-Options": "nosniff",
|
|
437
|
+
"Content-Disposition": "inline",
|
|
438
|
+
};
|
|
439
|
+
if (tryServeStatic(req, res, clientDir, params.imageUrl, false, imageSecurityHeaders)) {
|
|
397
440
|
return;
|
|
398
441
|
}
|
|
399
442
|
res.writeHead(404);
|
|
@@ -465,13 +508,20 @@ async function startPagesRouterServer(options) {
|
|
|
465
508
|
const configRedirects = vinextConfig?.redirects ?? [];
|
|
466
509
|
const configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };
|
|
467
510
|
const configHeaders = vinextConfig?.headers ?? [];
|
|
511
|
+
// Compute allowed image widths from config (union of deviceSizes + imageSizes)
|
|
512
|
+
const allowedImageWidths = [
|
|
513
|
+
...(vinextConfig?.images?.deviceSizes ?? DEFAULT_DEVICE_SIZES),
|
|
514
|
+
...(vinextConfig?.images?.imageSizes ?? DEFAULT_IMAGE_SIZES),
|
|
515
|
+
];
|
|
468
516
|
const server = createServer(async (req, res) => {
|
|
469
517
|
const rawUrl = req.url ?? "/";
|
|
470
518
|
let url = rawUrl;
|
|
471
|
-
|
|
519
|
+
// Normalize backslashes (browsers treat /\ as //), then decode and normalize path.
|
|
520
|
+
const rawPagesPathname = url.split("?")[0].replaceAll("\\", "/");
|
|
521
|
+
let pathname = normalizePath(decodeURIComponent(rawPagesPathname));
|
|
472
522
|
// Guard against protocol-relative URL open redirect attacks.
|
|
473
|
-
//
|
|
474
|
-
if (
|
|
523
|
+
// Check rawPagesPathname before normalizePath collapses //.
|
|
524
|
+
if (rawPagesPathname.startsWith("//")) {
|
|
475
525
|
res.writeHead(404);
|
|
476
526
|
res.end("404 Not Found");
|
|
477
527
|
return;
|
|
@@ -491,13 +541,26 @@ async function startPagesRouterServer(options) {
|
|
|
491
541
|
// ── Image optimization passthrough ──────────────────────────────
|
|
492
542
|
if (pathname === IMAGE_OPTIMIZATION_PATH || staticLookupPath === IMAGE_OPTIMIZATION_PATH) {
|
|
493
543
|
const parsedUrl = new URL(rawUrl, "http://localhost");
|
|
494
|
-
const params = parseImageParams(parsedUrl);
|
|
544
|
+
const params = parseImageParams(parsedUrl, allowedImageWidths);
|
|
495
545
|
if (!params) {
|
|
496
546
|
res.writeHead(400);
|
|
497
547
|
res.end("Bad Request");
|
|
498
548
|
return;
|
|
499
549
|
}
|
|
500
|
-
|
|
550
|
+
// Block SVG and other unsafe content types
|
|
551
|
+
const ext = path.extname(params.imageUrl).toLowerCase();
|
|
552
|
+
const ct = CONTENT_TYPES[ext] ?? "application/octet-stream";
|
|
553
|
+
if (!isSafeImageContentType(ct)) {
|
|
554
|
+
res.writeHead(400);
|
|
555
|
+
res.end("The requested resource is not an allowed image type");
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
const imageSecurityHeaders = {
|
|
559
|
+
"Content-Security-Policy": IMAGE_CONTENT_SECURITY_POLICY,
|
|
560
|
+
"X-Content-Type-Options": "nosniff",
|
|
561
|
+
"Content-Disposition": "inline",
|
|
562
|
+
};
|
|
563
|
+
if (tryServeStatic(req, res, clientDir, params.imageUrl, false, imageSecurityHeaders)) {
|
|
501
564
|
return;
|
|
502
565
|
}
|
|
503
566
|
res.writeHead(404);
|
|
@@ -611,9 +674,10 @@ async function startPagesRouterServer(options) {
|
|
|
611
674
|
if (redirect) {
|
|
612
675
|
// Guard against double-prefixing: only add basePath if destination
|
|
613
676
|
// doesn't already start with it.
|
|
614
|
-
|
|
677
|
+
// Sanitize the final destination to prevent protocol-relative URL open redirects.
|
|
678
|
+
const dest = sanitizeDestination(basePath && !redirect.destination.startsWith(basePath)
|
|
615
679
|
? basePath + redirect.destination
|
|
616
|
-
: redirect.destination;
|
|
680
|
+
: redirect.destination);
|
|
617
681
|
res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });
|
|
618
682
|
res.end();
|
|
619
683
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prod-server.js","sourceRoot":"","sources":["../../src/server/prod-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,yBAAyB,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzJ,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,oFAAoF;AACpF,SAAS,cAAc,CAAC,GAAoB;IAC1C,OAAO,IAAI,cAAc,CAAC;QACxB,KAAK,CAAC,UAAU;YACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7E,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAaD,mDAAmD;AACnD,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,WAAW;IACX,UAAU;IACV,YAAY;IACZ,UAAU;IACV,iBAAiB;IACjB,wBAAwB;IACxB,kBAAkB;IAClB,iBAAiB;IACjB,uBAAuB;IACvB,qBAAqB;IACrB,sBAAsB;IACtB,eAAe;IACf,2BAA2B;IAC3B,kBAAkB;CACnB,CAAC,CAAC;AAEH,0GAA0G;AAC1G,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;GAGG;AACH,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,QAAmC;IAC3D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,IAAI,CAAC,oBAAoB,CAAC;gBAC/B,MAAM,EAAE;oBACN,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,+CAA+C;iBAC1F;aACF,CAAC,CAAC;QACL,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,8BAA8B;QACtE,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,GAAoB,EACpB,GAAmB,EACnB,IAAqB,EACrB,WAAmB,EACnB,UAAkB,EAClB,eAAuC,EAAE,EACzC,WAAoB,IAAI;IAExB,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1D,IAAI,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACrF,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE;YACxB,GAAG,YAAY;YACf,cAAc,EAAE,WAAW;YAC3B,kBAAkB,EAAE,QAAQ;YAC5B,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAsD,CAAC,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE;YACxB,GAAG,YAAY;YACf,cAAc,EAAE,WAAW;YAC3B,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;SACrC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;AACH,CAAC;AAED,6CAA6C;AAC7C,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,WAAW;IACpB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,+BAA+B;IACvC,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,kBAAkB;CAC3B,CAAC;AAEF;;;GAGG;AACH,SAAS,cAAc,CACrB,GAAoB,EACpB,GAAmB,EACnB,SAAiB,EACjB,QAAgB,EAChB,QAAiB;IAEjB,qFAAqF;IACrF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,eAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,eAAe,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IACE,QAAQ,KAAK,GAAG;QAChB,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAC1B,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EACjC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;IAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,QAAQ;QAC3B,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,sBAAsB,CAAC;IAE3B,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,EAAE;gBAClB,kBAAkB,EAAE,QAAQ;gBAC5B,eAAe,EAAE,YAAY;gBAC7B,IAAI,EAAE,iBAAiB;aACxB,CAAC,CAAC;YACH,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAgB,CAAC,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,EAAE;QAClB,eAAe,EAAE,YAAY;KAC9B,CAAC,CAAC;IACH,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,WAAW,CAAC,GAAoB,EAAE,QAAgB;IACzD,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAuB,CAAC;IAC3E,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;IAEpC,IAAI,YAAY,EAAE,CAAC;QACjB,+DAA+D;QAC/D,gEAAgE;QAChE,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtE,IAAI,aAAa,IAAI,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YACrD,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,IAAI,QAAQ,CAAC;AAChC,CAAC;AAED,4EAA4E;AAC5E,MAAM,YAAY,GAAgB,IAAI,GAAG,CACvC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;KACrC,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;KAClC,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC;AAEnF;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAoB;IAC5C,MAAM,QAAQ,GAAG,UAAU;QACzB,CAAC,CAAE,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QACrE,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;IAEtD,MAAM,IAAI,GAAsC;QAC9C,MAAM;QACN,OAAO;KACR,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,0EAA0E;QAC1E,kDAAkD;QAClD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,wCAAwC;IAChE,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,eAAe,CAC5B,WAAqB,EACrB,GAAoB,EACpB,GAAmB,EACnB,QAAiB;IAEjB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAElC,kEAAkE;IAClE,MAAM,WAAW,GAAsC,EAAE,CAAC;IAC1D,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACxC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC;gBACtB,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACnC,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,4CAA4C;IAC5C,sEAAsE;IACtE,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,QAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAExE,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACrC,OAAO,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACrC,WAAW,CAAC,kBAAkB,CAAC,GAAG,QAAS,CAAC;QAC5C,WAAW,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC;IAC1C,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEnC,kDAAkD;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1B,GAAG,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,oDAAoD;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,IAA2C,CAAC,CAAC;IAE7F,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAS,CAAC,CAAC;QAC/C,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAsD,CAAC,CAAC,CAAC;IACtG,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAsD,CAAC,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAA6B,EAAE;IACnE,MAAM,EACJ,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAC3D,IAAI,GAAG,SAAS,EAChB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAC7B,aAAa,GAAG,KAAK,GACtB,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,CAAC,aAAa,CAAC;IAChC,qEAAqE;IACrE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEtD,oBAAoB;IACpB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAEhD,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,oBAAoB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,sBAAsB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;AACtF,CAAC;AAYD;;;;;;;;;;;;;;;GAeG;AACH,KAAK,UAAU,oBAAoB,CAAC,OAA+B;IACjE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAElE,uEAAuE;IACvE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,UAAU,GAA4C,SAAS,CAAC,OAAO,CAAC;IAE9E,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnC,6DAA6D;QAC7D,wEAAwE;QACxE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,QAAQ,KAAK,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;YAChF,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,+CAA+C;QAC/C,IAAI,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,2DAA2D;YAC3D,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,kEAAkE;YAClE,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAE3C,uDAAuD;YACvD,MAAM,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAYD;;;;;;;;GAQG;AACH,KAAK,UAAU,sBAAsB,CAAC,OAAiC;IACrE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAErE,gEAAgE;IAChE,IAAI,WAAW,GAA6B,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACxE,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,6EAA6E;IAC7E,kEAAkE;IAClE,oDAAoD;IACpD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACzE,IAAI,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9E,MAAM,UAAU,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,UAAkB,CAAC,sBAAsB,GAAG,UAAU,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACvC,CAAC;IAED,+EAA+E;IAC/E,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;IAE3F,qEAAqE;IACrE,MAAM,QAAQ,GAAW,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC;IACtD,MAAM,aAAa,GAAY,YAAY,EAAE,aAAa,IAAI,KAAK,CAAC;IACpE,MAAM,eAAe,GAAG,YAAY,EAAE,SAAS,IAAI,EAAE,CAAC;IACtD,MAAM,cAAc,GAAG,YAAY,EAAE,QAAQ,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnG,MAAM,aAAa,GAAG,YAAY,EAAE,OAAO,IAAI,EAAE,CAAC;IAElD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAC9B,IAAI,GAAG,GAAG,MAAM,CAAC;QACjB,IAAI,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjC,6DAA6D;QAC7D,wEAAwE;QACxE,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,qEAAqE;QACrE,kEAAkE;QAClE,2CAA2C;QAC3C,MAAM,gBAAgB,GAAG,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC;YAChE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG;YACxC,CAAC,CAAC,QAAQ,CAAC;QACb,IACE,gBAAgB,KAAK,GAAG;YACxB,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC;YACrC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAC/D,CAAC;YACD,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,IAAI,QAAQ,KAAK,uBAAuB,IAAI,gBAAgB,KAAK,uBAAuB,EAAE,CAAC;YACzF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,IAAI,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,iEAAiE;YACjE,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;gBACxD,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,GAAG,QAAQ,GAAG,EAAE,CAAC;gBACpB,QAAQ,GAAG,QAAQ,CAAC;YACtB,CAAC;YAED,iEAAiE;YACjE,IAAI,QAAQ,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC3C,IAAI,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;oBAClC,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;oBACjE,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;qBAAM,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;oBACzC,MAAM,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/E,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;YACH,CAAC;YAED,0DAA0D;YAC1D,MAAM,WAAW,GAAG,UAAU;gBAC5B,CAAC,CAAE,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;gBACrE,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,QAAQ,GAAG,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1F,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBAClE,IAAI,CAAC;oBAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,CAAC;YACX,CAAC,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;YACnC,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,GAAG,QAAQ,MAAM,UAAU,GAAG,GAAG,EAAE,EAAE;gBAClE,MAAM;gBACN,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC/C,gEAAgE;gBAChE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;aACrC,CAAC,CAAC;YAEH,2DAA2D;YAC3D,MAAM,MAAM,GAAmB,yBAAyB,CAAC,UAAU,CAAC,CAAC;YAErE,iEAAiE;YACjE,IAAI,WAAW,GAAG,GAAG,CAAC;YACtB,MAAM,iBAAiB,GAA2B,EAAE,CAAC;YACrD,IAAI,uBAA2C,CAAC;YAChD,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;gBAE/C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;oBACrB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;wBACvB,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,IAAI,GAAG,EAAE;4BAC1C,QAAQ,EAAE,MAAM,CAAC,WAAW;yBAC7B,CAAC,CAAC;wBACH,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACpB,+DAA+D;wBAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;wBAC9D,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;wBACnF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,mEAAmE;gBACnE,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;wBAClD,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACjC,CAAC;gBACH,CAAC;gBAED,2BAA2B;gBAC3B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACtB,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;gBAClC,CAAC;gBAED,mDAAmD;gBACnD,oDAAoD;gBACpD,uBAAuB,GAAG,MAAM,CAAC,aAAa,CAAC;YACjD,CAAC;YAED,wEAAwE;YACxE,mEAAmE;YACnE,kFAAkF;YAClF,MAAM,WAAW,GAAG,uBAAuB,CAAC;YAC5C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACjD,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;oBAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAC/C,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;oBACzD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,IAAI,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjD,iEAAiE;YACjE,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;gBAC9D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;gBAC1E,IAAI,QAAQ,EAAE,CAAC;oBACb,mEAAmE;oBACnE,iCAAiC;oBACjC,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC;wBACjE,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,WAAW;wBACjC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACzB,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClE,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,IAAI,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;gBACvC,MAAM,SAAS,GAAG,YAAY,CAAC,gBAAgB,EAAE,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;gBACrF,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7B,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;wBACxE,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;wBACzD,OAAO;oBACT,CAAC;oBACD,WAAW,GAAG,SAAS,CAAC;oBACxB,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,IAAI,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;gBACxE,IAAI,QAAkB,CAAC;gBACvB,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;oBACpC,QAAQ,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,IAAI,QAAQ,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACxE,CAAC;gBAED,sDAAsD;gBACtD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC/D,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC;gBAC/D,MAAM,eAAe,GAA2B,EAAE,GAAG,iBAAiB,EAAE,CAAC;gBACzE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEhE,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,uBAAuB,IAAI,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;gBAClH,OAAO;YACT,CAAC;YAED,iEAAiE;YACjE,IAAI,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,YAAY,CAAC,gBAAgB,EAAE,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACpF,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC7B,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;wBACxE,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;wBACzD,OAAO;oBACT,CAAC;oBACD,WAAW,GAAG,SAAS,CAAC;oBACxB,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,IAAI,QAA8B,CAAC;YACnC,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrC,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;gBAElE,+DAA+D;gBAC/D,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;oBAC3E,MAAM,eAAe,GAAG,YAAY,CAAC,gBAAgB,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBACxF,IAAI,eAAe,EAAE,CAAC;wBACpB,IAAI,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;4BACnC,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;4BAC9E,MAAM,eAAe,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;4BACzD,OAAO;wBACT,CAAC;wBACD,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,sDAAsD;YACtD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC;YAC/D,MAAM,eAAe,GAA2B,EAAE,GAAG,iBAAiB,EAAE,CAAC;YACzE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhE,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,uBAAuB,IAAI,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QACpH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6BAA6B;AAC7B,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC","sourcesContent":["/**\n * Production server for vinext.\n *\n * Serves the built output from `vinext build`. Handles:\n * - Static asset serving from client build output\n * - Pages Router: SSR rendering + API route handling\n * - App Router: RSC/SSR rendering, route handlers, server actions\n * - Gzip/Brotli compression for text-based responses\n * - Streaming SSR for App Router\n *\n * Build output for Pages Router:\n * - dist/client/ — static assets (JS, CSS, images) + .vite/ssr-manifest.json\n * - dist/server/entry.js — SSR entry point (virtual:vinext-server-entry)\n *\n * Build output for App Router:\n * - dist/client/ — static assets (JS, CSS, images)\n * - dist/server/index.js — RSC entry (default export: handler(Request) → Response)\n * - dist/server/ssr/index.js — SSR entry (imported by RSC entry at runtime)\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { Readable, pipeline } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { matchRedirect, matchRewrite, matchHeaders, requestContextFromRequest, isExternalUrl, proxyExternalRequest } from \"../config/config-matchers.js\";\nimport type { RequestContext } from \"../config/config-matchers.js\";\nimport { IMAGE_OPTIMIZATION_PATH, parseImageParams } from \"./image-optimization.js\";\nimport { computeLazyChunks } from \"../index.js\";\n\n/** Convert a Node.js IncomingMessage into a ReadableStream for Web Request body. */\nfunction readNodeStream(req: IncomingMessage): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n req.on(\"data\", (chunk: Buffer) => controller.enqueue(new Uint8Array(chunk)));\n req.on(\"end\", () => controller.close());\n req.on(\"error\", (err) => controller.error(err));\n },\n });\n}\n\nexport interface ProdServerOptions {\n /** Port to listen on */\n port?: number;\n /** Host to bind to */\n host?: string;\n /** Path to the build output directory */\n outDir?: string;\n /** Disable compression (default: false) */\n noCompression?: boolean;\n}\n\n/** Content types that benefit from compression. */\nconst COMPRESSIBLE_TYPES = new Set([\n \"text/html\",\n \"text/css\",\n \"text/plain\",\n \"text/xml\",\n \"text/javascript\",\n \"application/javascript\",\n \"application/json\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"application/rss+xml\",\n \"application/atom+xml\",\n \"image/svg+xml\",\n \"application/manifest+json\",\n \"application/wasm\",\n]);\n\n/** Minimum size threshold for compression (in bytes). Below this, compression overhead isn't worth it. */\nconst COMPRESS_THRESHOLD = 1024;\n\n/**\n * Parse the Accept-Encoding header and return the best supported encoding.\n * Preference order: br > gzip > deflate > identity.\n */\nfunction negotiateEncoding(req: IncomingMessage): \"br\" | \"gzip\" | \"deflate\" | null {\n const accept = req.headers[\"accept-encoding\"];\n if (!accept || typeof accept !== \"string\") return null;\n const lower = accept.toLowerCase();\n if (lower.includes(\"br\")) return \"br\";\n if (lower.includes(\"gzip\")) return \"gzip\";\n if (lower.includes(\"deflate\")) return \"deflate\";\n return null;\n}\n\n/**\n * Create a compression stream for the given encoding.\n */\nfunction createCompressor(encoding: \"br\" | \"gzip\" | \"deflate\"): zlib.BrotliCompress | zlib.Gzip | zlib.Deflate {\n switch (encoding) {\n case \"br\":\n return zlib.createBrotliCompress({\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4, // Fast compression (1-11, 4 is a good balance)\n },\n });\n case \"gzip\":\n return zlib.createGzip({ level: 6 }); // Default level, good balance\n case \"deflate\":\n return zlib.createDeflate({ level: 6 });\n }\n}\n\n/**\n * Send a compressed response if the content type is compressible and the\n * client supports compression. Otherwise send uncompressed.\n */\nfunction sendCompressed(\n req: IncomingMessage,\n res: ServerResponse,\n body: string | Buffer,\n contentType: string,\n statusCode: number,\n extraHeaders: Record<string, string> = {},\n compress: boolean = true,\n): void {\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = compress ? negotiateEncoding(req) : null;\n\n if (encoding && COMPRESSIBLE_TYPES.has(baseType) && buf.length >= COMPRESS_THRESHOLD) {\n const compressor = createCompressor(encoding);\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Encoding\": encoding,\n Vary: \"Accept-Encoding\",\n });\n compressor.end(buf);\n pipeline(compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Length\": String(buf.length),\n });\n res.end(buf);\n }\n}\n\n/** Content-type lookup for static assets. */\nconst CONTENT_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".map\": \"application/json\",\n};\n\n/**\n * Try to serve a static file from the client build directory.\n * Returns true if the file was served, false otherwise.\n */\nfunction tryServeStatic(\n req: IncomingMessage,\n res: ServerResponse,\n clientDir: string,\n pathname: string,\n compress: boolean,\n): boolean {\n // Resolve the path and guard against directory traversal (e.g. /../../../etc/passwd)\n const resolvedClient = path.resolve(clientDir);\n let decodedPathname: string;\n try {\n decodedPathname = decodeURIComponent(pathname);\n } catch {\n return false;\n }\n const staticFile = path.resolve(clientDir, \".\" + decodedPathname);\n if (!staticFile.startsWith(resolvedClient + path.sep) && staticFile !== resolvedClient) {\n return false;\n }\n if (\n pathname === \"/\" ||\n !fs.existsSync(staticFile) ||\n !fs.statSync(staticFile).isFile()\n ) {\n return false;\n }\n\n const ext = path.extname(staticFile);\n const ct = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n const isHashed = pathname.startsWith(\"/assets/\");\n const cacheControl = isHashed\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=3600\";\n\n const baseType = ct.split(\";\")[0].trim();\n if (compress && COMPRESSIBLE_TYPES.has(baseType)) {\n const encoding = negotiateEncoding(req);\n if (encoding) {\n const fileStream = fs.createReadStream(staticFile);\n const compressor = createCompressor(encoding);\n res.writeHead(200, {\n \"Content-Type\": ct,\n \"Content-Encoding\": encoding,\n \"Cache-Control\": cacheControl,\n Vary: \"Accept-Encoding\",\n });\n pipeline(fileStream, compressor, res, () => { /* ignore */ });\n return true;\n }\n }\n\n res.writeHead(200, {\n \"Content-Type\": ct,\n \"Cache-Control\": cacheControl,\n });\n fs.createReadStream(staticFile).pipe(res);\n return true;\n}\n\n/**\n * Resolve the host for a request, ignoring X-Forwarded-Host to prevent\n * host header poisoning attacks (open redirects, cache poisoning).\n *\n * X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var\n * lists the forwarded host value. Without this, an attacker can send\n * X-Forwarded-Host: evil.com and poison any redirect that resolves\n * against request.url.\n *\n * On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare\n * itself, so this is only a concern for the Node.js prod-server.\n */\nfunction resolveHost(req: IncomingMessage, fallback: string): string {\n const rawForwarded = req.headers[\"x-forwarded-host\"] as string | undefined;\n const hostHeader = req.headers.host;\n\n if (rawForwarded) {\n // X-Forwarded-Host can be comma-separated when passing through\n // multiple proxies — take only the first (client-facing) value.\n const forwardedHost = rawForwarded.split(\",\")[0].trim().toLowerCase();\n if (forwardedHost && trustedHosts.has(forwardedHost)) {\n return forwardedHost;\n }\n }\n\n return hostHeader || fallback;\n}\n\n/** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */\nconst trustedHosts: Set<string> = new Set(\n (process.env.VINEXT_TRUSTED_HOSTS ?? \"\")\n .split(\",\")\n .map((h) => h.trim().toLowerCase())\n .filter(Boolean),\n);\n\n/**\n * Whether to trust X-Forwarded-Proto from upstream proxies.\n * Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set\n * (having trusted hosts implies a trusted proxy).\n */\nconst trustProxy = process.env.VINEXT_TRUST_PROXY === \"1\" || trustedHosts.size > 0;\n\n/**\n * Convert a Node.js IncomingMessage to a Web Request object.\n */\nfunction nodeToWebRequest(req: IncomingMessage): Request {\n const rawProto = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const proto = rawProto === \"https\" || rawProto === \"http\" ? rawProto : \"http\";\n const host = resolveHost(req, \"localhost\");\n const origin = `${proto}://${host}`;\n const url = new URL(req.url ?? \"/\", origin);\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n const init: RequestInit & { duplex?: string } = {\n method,\n headers,\n };\n\n if (hasBody) {\n // Convert Node.js readable stream to Web ReadableStream for request body.\n // Readable.toWeb() is available since Node.js 17.\n init.body = Readable.toWeb(req) as ReadableStream;\n init.duplex = \"half\"; // Required for streaming request bodies\n }\n\n return new Request(url, init);\n}\n\n/**\n * Stream a Web Response back to a Node.js ServerResponse.\n * Supports streaming compression for SSR responses.\n */\nasync function sendWebResponse(\n webResponse: Response,\n req: IncomingMessage,\n res: ServerResponse,\n compress: boolean,\n): Promise<void> {\n const status = webResponse.status;\n\n // Collect headers, handling multi-value headers (e.g. Set-Cookie)\n const nodeHeaders: Record<string, string | string[]> = {};\n webResponse.headers.forEach((value, key) => {\n const existing = nodeHeaders[key];\n if (existing !== undefined) {\n nodeHeaders[key] = Array.isArray(existing)\n ? [...existing, value]\n : [existing, value];\n } else {\n nodeHeaders[key] = value;\n }\n });\n\n if (!webResponse.body) {\n res.writeHead(status, nodeHeaders);\n res.end();\n return;\n }\n\n // Check if we should compress the response.\n // Skip if the upstream already compressed (avoid double-compression).\n const alreadyEncoded = webResponse.headers.has(\"content-encoding\");\n const contentType = webResponse.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = (compress && !alreadyEncoded) ? negotiateEncoding(req) : null;\n const shouldCompress = !!(encoding && COMPRESSIBLE_TYPES.has(baseType));\n\n if (shouldCompress) {\n delete nodeHeaders[\"content-length\"];\n delete nodeHeaders[\"Content-Length\"];\n nodeHeaders[\"Content-Encoding\"] = encoding!;\n nodeHeaders[\"Vary\"] = \"Accept-Encoding\";\n }\n\n res.writeHead(status, nodeHeaders);\n\n // HEAD requests: send headers only, skip the body\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n\n // Convert Web ReadableStream to Node.js Readable and pipe to response.\n // Readable.fromWeb() is available since Node.js 17.\n const nodeStream = Readable.fromWeb(webResponse.body as import(\"stream/web\").ReadableStream);\n\n if (shouldCompress) {\n const compressor = createCompressor(encoding!);\n pipeline(nodeStream, compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n pipeline(nodeStream, res, () => { /* ignore pipeline errors on closed connections */ });\n }\n}\n\n/**\n * Start the production server.\n *\n * Automatically detects whether the build is App Router (dist/server/index.js) or\n * Pages Router (dist/server/entry.js) and configures the appropriate handler.\n */\nexport async function startProdServer(options: ProdServerOptions = {}) {\n const {\n port = process.env.PORT ? parseInt(process.env.PORT) : 3000,\n host = \"0.0.0.0\",\n outDir = path.resolve(\"dist\"),\n noCompression = false,\n } = options;\n\n const compress = !noCompression;\n // Always resolve outDir to absolute to ensure dynamic import() works\n const resolvedOutDir = path.resolve(outDir);\n const clientDir = path.join(resolvedOutDir, \"client\");\n\n // Detect build type\n const rscEntryPath = path.join(resolvedOutDir, \"server\", \"index.js\");\n const serverEntryPath = path.join(resolvedOutDir, \"server\", \"entry.js\");\n const isAppRouter = fs.existsSync(rscEntryPath);\n\n if (!isAppRouter && !fs.existsSync(serverEntryPath)) {\n console.error(`[vinext] No build output found in ${outDir}`);\n console.error(\"Run `vinext build` first.\");\n process.exit(1);\n }\n\n if (isAppRouter) {\n return startAppRouterServer({ port, host, clientDir, rscEntryPath, compress });\n }\n\n return startPagesRouterServer({ port, host, clientDir, serverEntryPath, compress });\n}\n\n// ─── App Router Production Server ─────────────────────────────────────────────\n\ninterface AppRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n rscEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the App Router production server.\n *\n * The RSC entry (dist/server/index.js) exports a default handler function:\n * handler(request: Request) → Promise<Response>\n *\n * This handler already does everything: route matching, RSC rendering,\n * SSR HTML generation (via import(\"./ssr/index.js\")), route handlers,\n * server actions, ISR caching, 404s, redirects, etc.\n *\n * The production server's job is simply to:\n * 1. Serve static assets from dist/client/\n * 2. Convert Node.js IncomingMessage → Web Request\n * 3. Call the RSC handler\n * 4. Stream the Web Response back (with optional compression)\n */\nasync function startAppRouterServer(options: AppRouterServerOptions) {\n const { port, host, clientDir, rscEntryPath, compress } = options;\n\n // Import the RSC handler (use file:// URL for reliable dynamic import)\n const rscModule = await import(pathToFileURL(rscEntryPath).href);\n const rscHandler: (request: Request) => Promise<Response> = rscModule.default;\n\n if (typeof rscHandler !== \"function\") {\n console.error(\"[vinext] RSC entry does not export a default handler function\");\n process.exit(1);\n }\n\n const server = createServer(async (req, res) => {\n const url = req.url ?? \"/\";\n const pathname = url.split(\"?\")[0];\n\n // Guard against protocol-relative URL open redirect attacks.\n // See comment in app-dev-server.ts _handleRequest for full explanation.\n if (pathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // Serve static assets from client build\n if (pathname !== \"/\" && tryServeStatic(req, res, clientDir, pathname, compress)) {\n return;\n }\n\n // Image optimization passthrough (Node.js prod server has no Images binding;\n // serves the original file with cache headers)\n if (pathname === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(url, \"http://localhost\");\n const params = parseImageParams(parsedUrl);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n // Serve the original image from the client build directory\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // Convert Node.js request to Web Request and call the RSC handler\n const request = nodeToWebRequest(req);\n const response = await rscHandler(request);\n\n // Stream the Web Response back to the Node.js response\n await sendWebResponse(response, req, res, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// ─── Pages Router Production Server ───────────────────────────────────────────\n\ninterface PagesRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n serverEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the Pages Router production server.\n *\n * Uses the server entry (dist/server/entry.js) which exports:\n * - renderPage(request, url, manifest) — SSR rendering (Web Request → Response)\n * - handleApiRoute(request, url) — API route handling (Web Request → Response)\n * - runMiddleware(request) — middleware execution\n * - vinextConfig — embedded next.config.js settings\n */\nasync function startPagesRouterServer(options: PagesRouterServerOptions) {\n const { port, host, clientDir, serverEntryPath, compress } = options;\n\n // Load the SSR manifest (maps module URLs to client asset URLs)\n let ssrManifest: Record<string, string[]> = {};\n const manifestPath = path.join(clientDir, \".vite\", \"ssr-manifest.json\");\n if (fs.existsSync(manifestPath)) {\n ssrManifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n }\n\n // Load the build manifest to compute lazy chunks — chunks only reachable via\n // dynamic imports (React.lazy, next/dynamic). These should not be\n // modulepreloaded since they are fetched on demand.\n const buildManifestPath = path.join(clientDir, \".vite\", \"manifest.json\");\n if (fs.existsSync(buildManifestPath)) {\n try {\n const buildManifest = JSON.parse(fs.readFileSync(buildManifestPath, \"utf-8\"));\n const lazyChunks = computeLazyChunks(buildManifest);\n if (lazyChunks.length > 0) {\n (globalThis as any).__VINEXT_LAZY_CHUNKS__ = lazyChunks;\n }\n } catch { /* ignore parse errors */ }\n }\n\n // Import the server entry module (use file:// URL for reliable dynamic import)\n const serverEntry = await import(pathToFileURL(serverEntryPath).href);\n const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig } = serverEntry;\n\n // Extract config values (embedded at build time in the server entry)\n const basePath: string = vinextConfig?.basePath ?? \"\";\n const trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;\n const configRedirects = vinextConfig?.redirects ?? [];\n const configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };\n const configHeaders = vinextConfig?.headers ?? [];\n\n const server = createServer(async (req, res) => {\n const rawUrl = req.url ?? \"/\";\n let url = rawUrl;\n let pathname = url.split(\"?\")[0];\n\n // Guard against protocol-relative URL open redirect attacks.\n // See comment in app-dev-server.ts _handleRequest for full explanation.\n if (pathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // ── 1. Static assets ──────────────────────────────────────────\n // Serve static files from client build. When basePath is configured,\n // Vite's `base` config ensures assets are under basePath/assets/.\n // We check both with and without basePath.\n const staticLookupPath = basePath && pathname.startsWith(basePath)\n ? pathname.slice(basePath.length) || \"/\"\n : pathname;\n if (\n staticLookupPath !== \"/\" &&\n !staticLookupPath.startsWith(\"/api/\") &&\n tryServeStatic(req, res, clientDir, staticLookupPath, compress)\n ) {\n return;\n }\n\n // ── Image optimization passthrough ──────────────────────────────\n if (pathname === IMAGE_OPTIMIZATION_PATH || staticLookupPath === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(rawUrl, \"http://localhost\");\n const params = parseImageParams(parsedUrl);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // ── 2. Strip basePath ─────────────────────────────────────────\n if (basePath && pathname.startsWith(basePath)) {\n const stripped = pathname.slice(basePath.length) || \"/\";\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n url = stripped + qs;\n pathname = stripped;\n }\n\n // ── 3. Trailing slash normalization ───────────────────────────\n if (pathname !== \"/\" && !pathname.startsWith(\"/api\")) {\n const hasTrailing = pathname.endsWith(\"/\");\n if (trailingSlash && !hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname + \"/\" + qs });\n res.end();\n return;\n } else if (!trailingSlash && hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname.replace(/\\/+$/, \"\") + qs });\n res.end();\n return;\n }\n }\n\n // Convert Node.js req to Web Request for the server entry\n const rawProtocol = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const protocol = rawProtocol === \"https\" || rawProtocol === \"http\" ? rawProtocol : \"http\";\n const hostHeader = resolveHost(req, `${host}:${port}`);\n const reqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {\n if (v) h.set(k, Array.isArray(v) ? v.join(\", \") : v);\n return h;\n }, new Headers());\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const webRequest = new Request(`${protocol}://${hostHeader}${url}`, {\n method,\n headers: reqHeaders,\n body: hasBody ? readNodeStream(req) : undefined,\n // @ts-expect-error — duplex needed for streaming request bodies\n duplex: hasBody ? \"half\" : undefined,\n });\n\n // Build request context for has/missing condition matching\n const reqCtx: RequestContext = requestContextFromRequest(webRequest);\n\n // ── 4. Run middleware ─────────────────────────────────────────\n let resolvedUrl = url;\n const middlewareHeaders: Record<string, string> = {};\n let middlewareRewriteStatus: number | undefined;\n if (typeof runMiddleware === \"function\") {\n const result = await runMiddleware(webRequest);\n\n if (!result.continue) {\n if (result.redirectUrl) {\n res.writeHead(result.redirectStatus ?? 307, {\n Location: result.redirectUrl,\n });\n res.end();\n return;\n }\n if (result.response) {\n // Use arrayBuffer() to handle binary response bodies correctly\n const body = Buffer.from(await result.response.arrayBuffer());\n res.writeHead(result.response.status, Object.fromEntries(result.response.headers));\n res.end(body);\n return;\n }\n }\n\n // Collect middleware response headers to merge into final response\n if (result.responseHeaders) {\n for (const [key, value] of result.responseHeaders) {\n middlewareHeaders[key] = value;\n }\n }\n\n // Apply middleware rewrite\n if (result.rewriteUrl) {\n resolvedUrl = result.rewriteUrl;\n }\n\n // Apply custom status code from middleware rewrite\n // (e.g. NextResponse.rewrite(url, { status: 403 }))\n middlewareRewriteStatus = result.rewriteStatus;\n }\n\n // Unpack x-middleware-request-* headers into the actual request so that\n // renderPage / handleApiRoute see the middleware-modified headers.\n // Also remove them from middlewareHeaders to prevent leaking as response headers.\n const mwReqPrefix = \"x-middleware-request-\";\n for (const key of Object.keys(middlewareHeaders)) {\n if (key.startsWith(mwReqPrefix)) {\n const realName = key.slice(mwReqPrefix.length);\n webRequest.headers.set(realName, middlewareHeaders[key]);\n delete middlewareHeaders[key];\n }\n }\n\n let resolvedPathname = resolvedUrl.split(\"?\")[0];\n\n // ── 5. Apply custom headers from next.config.js ───────────────\n if (configHeaders.length) {\n const matched = matchHeaders(resolvedPathname, configHeaders);\n for (const h of matched) {\n middlewareHeaders[h.key.toLowerCase()] = h.value;\n }\n }\n\n // ── 6. Apply redirects from next.config.js ────────────────────\n if (configRedirects.length) {\n const redirect = matchRedirect(resolvedPathname, configRedirects, reqCtx);\n if (redirect) {\n // Guard against double-prefixing: only add basePath if destination\n // doesn't already start with it.\n const dest = basePath && !redirect.destination.startsWith(basePath)\n ? basePath + redirect.destination\n : redirect.destination;\n res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });\n res.end();\n return;\n }\n }\n\n // ── 7. Apply beforeFiles rewrites from next.config.js ─────────\n if (configRewrites.beforeFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.beforeFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 8. API routes ─────────────────────────────────────────────\n if (resolvedPathname.startsWith(\"/api/\") || resolvedPathname === \"/api\") {\n let response: Response;\n if (typeof handleApi === \"function\") {\n response = await handleApi(webRequest, resolvedUrl);\n } else {\n response = new Response(\"404 - API route not found\", { status: 404 });\n }\n\n // Merge middleware + config headers into the response\n const responseBody = Buffer.from(await response.arrayBuffer());\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n return;\n }\n\n // ── 9. Apply afterFiles rewrites from next.config.js ──────────\n if (configRewrites.afterFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.afterFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 10. SSR page rendering ────────────────────────────────────\n let response: Response | undefined;\n if (typeof renderPage === \"function\") {\n response = await renderPage(webRequest, resolvedUrl, ssrManifest);\n\n // ── 11. Fallback rewrites (if SSR returned 404) ─────────────\n if (response && response.status === 404 && configRewrites.fallback?.length) {\n const fallbackRewrite = matchRewrite(resolvedPathname, configRewrites.fallback, reqCtx);\n if (fallbackRewrite) {\n if (isExternalUrl(fallbackRewrite)) {\n const proxyResponse = await proxyExternalRequest(webRequest, fallbackRewrite);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n response = await renderPage(webRequest, fallbackRewrite, ssrManifest);\n }\n }\n }\n\n if (!response) {\n res.writeHead(404);\n res.end(\"404 - Not found\");\n return;\n }\n\n // Merge middleware + config headers into the response\n const responseBody = Buffer.from(await response.arrayBuffer());\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// Export helpers for testing\nexport { sendCompressed, negotiateEncoding, COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, resolveHost, trustedHosts, trustProxy, nodeToWebRequest };\n"]}
|
|
1
|
+
{"version":3,"file":"prod-server.js","sourceRoot":"","sources":["../../src/server/prod-server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Production server for vinext.\n *\n * Serves the built output from `vinext build`. Handles:\n * - Static asset serving from client build output\n * - Pages Router: SSR rendering + API route handling\n * - App Router: RSC/SSR rendering, route handlers, server actions\n * - Gzip/Brotli compression for text-based responses\n * - Streaming SSR for App Router\n *\n * Build output for Pages Router:\n * - dist/client/ — static assets (JS, CSS, images) + .vite/ssr-manifest.json\n * - dist/server/entry.js — SSR entry point (virtual:vinext-server-entry)\n *\n * Build output for App Router:\n * - dist/client/ — static assets (JS, CSS, images)\n * - dist/server/index.js — RSC entry (default export: handler(Request) → Response)\n * - dist/server/ssr/index.js — SSR entry (imported by RSC entry at runtime)\n */\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { Readable, pipeline } from \"node:stream\";\nimport { pathToFileURL } from \"node:url\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { matchRedirect, matchRewrite, matchHeaders, requestContextFromRequest, isExternalUrl, proxyExternalRequest, sanitizeDestination } from \"../config/config-matchers.js\";\nimport type { RequestContext } from \"../config/config-matchers.js\";\nimport { IMAGE_OPTIMIZATION_PATH, IMAGE_CONTENT_SECURITY_POLICY, parseImageParams, isSafeImageContentType, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from \"./image-optimization.js\";\nimport { normalizePath } from \"./normalize-path.js\";\nimport { computeLazyChunks } from \"../index.js\";\n\n/** Convert a Node.js IncomingMessage into a ReadableStream for Web Request body. */\nfunction readNodeStream(req: IncomingMessage): ReadableStream<Uint8Array> {\n return new ReadableStream({\n start(controller) {\n req.on(\"data\", (chunk: Buffer) => controller.enqueue(new Uint8Array(chunk)));\n req.on(\"end\", () => controller.close());\n req.on(\"error\", (err) => controller.error(err));\n },\n });\n}\n\nexport interface ProdServerOptions {\n /** Port to listen on */\n port?: number;\n /** Host to bind to */\n host?: string;\n /** Path to the build output directory */\n outDir?: string;\n /** Disable compression (default: false) */\n noCompression?: boolean;\n}\n\n/** Content types that benefit from compression. */\nconst COMPRESSIBLE_TYPES = new Set([\n \"text/html\",\n \"text/css\",\n \"text/plain\",\n \"text/xml\",\n \"text/javascript\",\n \"application/javascript\",\n \"application/json\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"application/rss+xml\",\n \"application/atom+xml\",\n \"image/svg+xml\",\n \"application/manifest+json\",\n \"application/wasm\",\n]);\n\n/** Minimum size threshold for compression (in bytes). Below this, compression overhead isn't worth it. */\nconst COMPRESS_THRESHOLD = 1024;\n\n/**\n * Parse the Accept-Encoding header and return the best supported encoding.\n * Preference order: br > gzip > deflate > identity.\n */\nfunction negotiateEncoding(req: IncomingMessage): \"br\" | \"gzip\" | \"deflate\" | null {\n const accept = req.headers[\"accept-encoding\"];\n if (!accept || typeof accept !== \"string\") return null;\n const lower = accept.toLowerCase();\n if (lower.includes(\"br\")) return \"br\";\n if (lower.includes(\"gzip\")) return \"gzip\";\n if (lower.includes(\"deflate\")) return \"deflate\";\n return null;\n}\n\n/**\n * Create a compression stream for the given encoding.\n */\nfunction createCompressor(encoding: \"br\" | \"gzip\" | \"deflate\"): zlib.BrotliCompress | zlib.Gzip | zlib.Deflate {\n switch (encoding) {\n case \"br\":\n return zlib.createBrotliCompress({\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4, // Fast compression (1-11, 4 is a good balance)\n },\n });\n case \"gzip\":\n return zlib.createGzip({ level: 6 }); // Default level, good balance\n case \"deflate\":\n return zlib.createDeflate({ level: 6 });\n }\n}\n\n/**\n * Send a compressed response if the content type is compressible and the\n * client supports compression. Otherwise send uncompressed.\n */\nfunction sendCompressed(\n req: IncomingMessage,\n res: ServerResponse,\n body: string | Buffer,\n contentType: string,\n statusCode: number,\n extraHeaders: Record<string, string> = {},\n compress: boolean = true,\n): void {\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = compress ? negotiateEncoding(req) : null;\n\n if (encoding && COMPRESSIBLE_TYPES.has(baseType) && buf.length >= COMPRESS_THRESHOLD) {\n const compressor = createCompressor(encoding);\n // Merge Accept-Encoding into existing Vary header from extraHeaders instead\n // of overwriting. Preserves Vary values set by the App Router for content\n // negotiation (e.g. \"RSC, Accept\").\n const existingVary = extraHeaders[\"Vary\"] ?? extraHeaders[\"vary\"];\n let varyValue: string;\n if (existingVary) {\n const existing = String(existingVary).toLowerCase();\n varyValue = existing.includes(\"accept-encoding\") ? String(existingVary) : existingVary + \", Accept-Encoding\";\n } else {\n varyValue = \"Accept-Encoding\";\n }\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Encoding\": encoding,\n Vary: varyValue,\n });\n compressor.end(buf);\n pipeline(compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n res.writeHead(statusCode, {\n ...extraHeaders,\n \"Content-Type\": contentType,\n \"Content-Length\": String(buf.length),\n });\n res.end(buf);\n }\n}\n\n/** Content-type lookup for static assets. */\nconst CONTENT_TYPES: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".eot\": \"application/vnd.ms-fontobject\",\n \".webp\": \"image/webp\",\n \".avif\": \"image/avif\",\n \".map\": \"application/json\",\n};\n\n/**\n * Try to serve a static file from the client build directory.\n * Returns true if the file was served, false otherwise.\n */\nfunction tryServeStatic(\n req: IncomingMessage,\n res: ServerResponse,\n clientDir: string,\n pathname: string,\n compress: boolean,\n extraHeaders?: Record<string, string>,\n): boolean {\n // Resolve the path and guard against directory traversal (e.g. /../../../etc/passwd)\n const resolvedClient = path.resolve(clientDir);\n let decodedPathname: string;\n try {\n decodedPathname = decodeURIComponent(pathname);\n } catch {\n return false;\n }\n const staticFile = path.resolve(clientDir, \".\" + decodedPathname);\n if (!staticFile.startsWith(resolvedClient + path.sep) && staticFile !== resolvedClient) {\n return false;\n }\n if (\n pathname === \"/\" ||\n !fs.existsSync(staticFile) ||\n !fs.statSync(staticFile).isFile()\n ) {\n return false;\n }\n\n const ext = path.extname(staticFile);\n const ct = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n const isHashed = pathname.startsWith(\"/assets/\");\n const cacheControl = isHashed\n ? \"public, max-age=31536000, immutable\"\n : \"public, max-age=3600\";\n\n const baseHeaders = {\n \"Content-Type\": ct,\n \"Cache-Control\": cacheControl,\n ...extraHeaders,\n };\n\n const baseType = ct.split(\";\")[0].trim();\n if (compress && COMPRESSIBLE_TYPES.has(baseType)) {\n const encoding = negotiateEncoding(req);\n if (encoding) {\n const fileStream = fs.createReadStream(staticFile);\n const compressor = createCompressor(encoding);\n res.writeHead(200, {\n ...baseHeaders,\n \"Content-Encoding\": encoding,\n Vary: \"Accept-Encoding\",\n });\n pipeline(fileStream, compressor, res, () => { /* ignore */ });\n return true;\n }\n }\n\n res.writeHead(200, baseHeaders);\n fs.createReadStream(staticFile).pipe(res);\n return true;\n}\n\n/**\n * Resolve the host for a request, ignoring X-Forwarded-Host to prevent\n * host header poisoning attacks (open redirects, cache poisoning).\n *\n * X-Forwarded-Host is only trusted when the VINEXT_TRUSTED_HOSTS env var\n * lists the forwarded host value. Without this, an attacker can send\n * X-Forwarded-Host: evil.com and poison any redirect that resolves\n * against request.url.\n *\n * On Cloudflare Workers, X-Forwarded-Host is always set by Cloudflare\n * itself, so this is only a concern for the Node.js prod-server.\n */\nfunction resolveHost(req: IncomingMessage, fallback: string): string {\n const rawForwarded = req.headers[\"x-forwarded-host\"] as string | undefined;\n const hostHeader = req.headers.host;\n\n if (rawForwarded) {\n // X-Forwarded-Host can be comma-separated when passing through\n // multiple proxies — take only the first (client-facing) value.\n const forwardedHost = rawForwarded.split(\",\")[0].trim().toLowerCase();\n if (forwardedHost && trustedHosts.has(forwardedHost)) {\n return forwardedHost;\n }\n }\n\n return hostHeader || fallback;\n}\n\n/** Hosts that are allowed as X-Forwarded-Host values (stored lowercase). */\nconst trustedHosts: Set<string> = new Set(\n (process.env.VINEXT_TRUSTED_HOSTS ?? \"\")\n .split(\",\")\n .map((h) => h.trim().toLowerCase())\n .filter(Boolean),\n);\n\n/**\n * Whether to trust X-Forwarded-Proto from upstream proxies.\n * Enabled when VINEXT_TRUST_PROXY=1 or when VINEXT_TRUSTED_HOSTS is set\n * (having trusted hosts implies a trusted proxy).\n */\nconst trustProxy = process.env.VINEXT_TRUST_PROXY === \"1\" || trustedHosts.size > 0;\n\n/**\n * Convert a Node.js IncomingMessage to a Web Request object.\n */\nfunction nodeToWebRequest(req: IncomingMessage): Request {\n const rawProto = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const proto = rawProto === \"https\" || rawProto === \"http\" ? rawProto : \"http\";\n const host = resolveHost(req, \"localhost\");\n const origin = `${proto}://${host}`;\n const url = new URL(req.url ?? \"/\", origin);\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n const init: RequestInit & { duplex?: string } = {\n method,\n headers,\n };\n\n if (hasBody) {\n // Convert Node.js readable stream to Web ReadableStream for request body.\n // Readable.toWeb() is available since Node.js 17.\n init.body = Readable.toWeb(req) as ReadableStream;\n init.duplex = \"half\"; // Required for streaming request bodies\n }\n\n return new Request(url, init);\n}\n\n/**\n * Stream a Web Response back to a Node.js ServerResponse.\n * Supports streaming compression for SSR responses.\n */\nasync function sendWebResponse(\n webResponse: Response,\n req: IncomingMessage,\n res: ServerResponse,\n compress: boolean,\n): Promise<void> {\n const status = webResponse.status;\n\n // Collect headers, handling multi-value headers (e.g. Set-Cookie)\n const nodeHeaders: Record<string, string | string[]> = {};\n webResponse.headers.forEach((value, key) => {\n const existing = nodeHeaders[key];\n if (existing !== undefined) {\n nodeHeaders[key] = Array.isArray(existing)\n ? [...existing, value]\n : [existing, value];\n } else {\n nodeHeaders[key] = value;\n }\n });\n\n if (!webResponse.body) {\n res.writeHead(status, nodeHeaders);\n res.end();\n return;\n }\n\n // Check if we should compress the response.\n // Skip if the upstream already compressed (avoid double-compression).\n const alreadyEncoded = webResponse.headers.has(\"content-encoding\");\n const contentType = webResponse.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0].trim();\n const encoding = (compress && !alreadyEncoded) ? negotiateEncoding(req) : null;\n const shouldCompress = !!(encoding && COMPRESSIBLE_TYPES.has(baseType));\n\n if (shouldCompress) {\n delete nodeHeaders[\"content-length\"];\n delete nodeHeaders[\"Content-Length\"];\n nodeHeaders[\"Content-Encoding\"] = encoding!;\n // Merge Accept-Encoding into existing Vary header (e.g. \"RSC, Accept\") instead\n // of overwriting. This prevents stripping the Vary values that the App Router\n // sets for content negotiation (RSC stream vs HTML).\n const existingVary = nodeHeaders[\"Vary\"] ?? nodeHeaders[\"vary\"];\n if (existingVary) {\n const existing = String(existingVary).toLowerCase();\n if (!existing.includes(\"accept-encoding\")) {\n nodeHeaders[\"Vary\"] = existingVary + \", Accept-Encoding\";\n }\n } else {\n nodeHeaders[\"Vary\"] = \"Accept-Encoding\";\n }\n }\n\n res.writeHead(status, nodeHeaders);\n\n // HEAD requests: send headers only, skip the body\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n\n // Convert Web ReadableStream to Node.js Readable and pipe to response.\n // Readable.fromWeb() is available since Node.js 17.\n const nodeStream = Readable.fromWeb(webResponse.body as import(\"stream/web\").ReadableStream);\n\n if (shouldCompress) {\n const compressor = createCompressor(encoding!);\n pipeline(nodeStream, compressor, res, () => { /* ignore pipeline errors on closed connections */ });\n } else {\n pipeline(nodeStream, res, () => { /* ignore pipeline errors on closed connections */ });\n }\n}\n\n/**\n * Start the production server.\n *\n * Automatically detects whether the build is App Router (dist/server/index.js) or\n * Pages Router (dist/server/entry.js) and configures the appropriate handler.\n */\nexport async function startProdServer(options: ProdServerOptions = {}) {\n const {\n port = process.env.PORT ? parseInt(process.env.PORT) : 3000,\n host = \"0.0.0.0\",\n outDir = path.resolve(\"dist\"),\n noCompression = false,\n } = options;\n\n const compress = !noCompression;\n // Always resolve outDir to absolute to ensure dynamic import() works\n const resolvedOutDir = path.resolve(outDir);\n const clientDir = path.join(resolvedOutDir, \"client\");\n\n // Detect build type\n const rscEntryPath = path.join(resolvedOutDir, \"server\", \"index.js\");\n const serverEntryPath = path.join(resolvedOutDir, \"server\", \"entry.js\");\n const isAppRouter = fs.existsSync(rscEntryPath);\n\n if (!isAppRouter && !fs.existsSync(serverEntryPath)) {\n console.error(`[vinext] No build output found in ${outDir}`);\n console.error(\"Run `vinext build` first.\");\n process.exit(1);\n }\n\n if (isAppRouter) {\n return startAppRouterServer({ port, host, clientDir, rscEntryPath, compress });\n }\n\n return startPagesRouterServer({ port, host, clientDir, serverEntryPath, compress });\n}\n\n// ─── App Router Production Server ─────────────────────────────────────────────\n\ninterface AppRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n rscEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the App Router production server.\n *\n * The RSC entry (dist/server/index.js) exports a default handler function:\n * handler(request: Request) → Promise<Response>\n *\n * This handler already does everything: route matching, RSC rendering,\n * SSR HTML generation (via import(\"./ssr/index.js\")), route handlers,\n * server actions, ISR caching, 404s, redirects, etc.\n *\n * The production server's job is simply to:\n * 1. Serve static assets from dist/client/\n * 2. Convert Node.js IncomingMessage → Web Request\n * 3. Call the RSC handler\n * 4. Stream the Web Response back (with optional compression)\n */\nasync function startAppRouterServer(options: AppRouterServerOptions) {\n const { port, host, clientDir, rscEntryPath, compress } = options;\n\n // Import the RSC handler (use file:// URL for reliable dynamic import)\n const rscModule = await import(pathToFileURL(rscEntryPath).href);\n const rscHandler: (request: Request) => Promise<Response> = rscModule.default;\n\n if (typeof rscHandler !== \"function\") {\n console.error(\"[vinext] RSC entry does not export a default handler function\");\n process.exit(1);\n }\n\n const server = createServer(async (req, res) => {\n const url = req.url ?? \"/\";\n // Normalize backslashes (browsers treat /\\ as //), then decode and normalize path.\n const rawPathname = url.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n const pathname = normalizePath(decodeURIComponent(rawPathname));\n\n // Guard against protocol-relative URL open redirect attacks.\n // Check rawPathname before normalizePath collapses //.\n if (rawPathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // Serve static assets from client build\n if (pathname !== \"/\" && tryServeStatic(req, res, clientDir, pathname, compress)) {\n return;\n }\n\n // Image optimization passthrough (Node.js prod server has no Images binding;\n // serves the original file with cache headers and security headers)\n if (pathname === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(url, \"http://localhost\");\n const defaultAllowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES];\n const params = parseImageParams(parsedUrl, defaultAllowedWidths);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n // Block SVG and other unsafe content types by checking the file extension.\n // This must happen before serving to prevent XSS via SVG passthrough.\n const ext = path.extname(params.imageUrl).toLowerCase();\n const ct = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n if (!isSafeImageContentType(ct)) {\n res.writeHead(400);\n res.end(\"The requested resource is not an allowed image type\");\n return;\n }\n // Serve the original image with CSP and security headers\n const imageSecurityHeaders: Record<string, string> = {\n \"Content-Security-Policy\": IMAGE_CONTENT_SECURITY_POLICY,\n \"X-Content-Type-Options\": \"nosniff\",\n \"Content-Disposition\": \"inline\",\n };\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false, imageSecurityHeaders)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // Convert Node.js request to Web Request and call the RSC handler\n const request = nodeToWebRequest(req);\n const response = await rscHandler(request);\n\n // Stream the Web Response back to the Node.js response\n await sendWebResponse(response, req, res, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// ─── Pages Router Production Server ───────────────────────────────────────────\n\ninterface PagesRouterServerOptions {\n port: number;\n host: string;\n clientDir: string;\n serverEntryPath: string;\n compress: boolean;\n}\n\n/**\n * Start the Pages Router production server.\n *\n * Uses the server entry (dist/server/entry.js) which exports:\n * - renderPage(request, url, manifest) — SSR rendering (Web Request → Response)\n * - handleApiRoute(request, url) — API route handling (Web Request → Response)\n * - runMiddleware(request) — middleware execution\n * - vinextConfig — embedded next.config.js settings\n */\nasync function startPagesRouterServer(options: PagesRouterServerOptions) {\n const { port, host, clientDir, serverEntryPath, compress } = options;\n\n // Load the SSR manifest (maps module URLs to client asset URLs)\n let ssrManifest: Record<string, string[]> = {};\n const manifestPath = path.join(clientDir, \".vite\", \"ssr-manifest.json\");\n if (fs.existsSync(manifestPath)) {\n ssrManifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\n }\n\n // Load the build manifest to compute lazy chunks — chunks only reachable via\n // dynamic imports (React.lazy, next/dynamic). These should not be\n // modulepreloaded since they are fetched on demand.\n const buildManifestPath = path.join(clientDir, \".vite\", \"manifest.json\");\n if (fs.existsSync(buildManifestPath)) {\n try {\n const buildManifest = JSON.parse(fs.readFileSync(buildManifestPath, \"utf-8\"));\n const lazyChunks = computeLazyChunks(buildManifest);\n if (lazyChunks.length > 0) {\n (globalThis as any).__VINEXT_LAZY_CHUNKS__ = lazyChunks;\n }\n } catch { /* ignore parse errors */ }\n }\n\n // Import the server entry module (use file:// URL for reliable dynamic import)\n const serverEntry = await import(pathToFileURL(serverEntryPath).href);\n const { renderPage, handleApiRoute: handleApi, runMiddleware, vinextConfig } = serverEntry;\n\n // Extract config values (embedded at build time in the server entry)\n const basePath: string = vinextConfig?.basePath ?? \"\";\n const trailingSlash: boolean = vinextConfig?.trailingSlash ?? false;\n const configRedirects = vinextConfig?.redirects ?? [];\n const configRewrites = vinextConfig?.rewrites ?? { beforeFiles: [], afterFiles: [], fallback: [] };\n const configHeaders = vinextConfig?.headers ?? [];\n // Compute allowed image widths from config (union of deviceSizes + imageSizes)\n const allowedImageWidths: number[] = [\n ...(vinextConfig?.images?.deviceSizes ?? DEFAULT_DEVICE_SIZES),\n ...(vinextConfig?.images?.imageSizes ?? DEFAULT_IMAGE_SIZES),\n ];\n\n const server = createServer(async (req, res) => {\n const rawUrl = req.url ?? \"/\";\n let url = rawUrl;\n // Normalize backslashes (browsers treat /\\ as //), then decode and normalize path.\n const rawPagesPathname = url.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n let pathname = normalizePath(decodeURIComponent(rawPagesPathname));\n\n // Guard against protocol-relative URL open redirect attacks.\n // Check rawPagesPathname before normalizePath collapses //.\n if (rawPagesPathname.startsWith(\"//\")) {\n res.writeHead(404);\n res.end(\"404 Not Found\");\n return;\n }\n\n // ── 1. Static assets ──────────────────────────────────────────\n // Serve static files from client build. When basePath is configured,\n // Vite's `base` config ensures assets are under basePath/assets/.\n // We check both with and without basePath.\n const staticLookupPath = basePath && pathname.startsWith(basePath)\n ? pathname.slice(basePath.length) || \"/\"\n : pathname;\n if (\n staticLookupPath !== \"/\" &&\n !staticLookupPath.startsWith(\"/api/\") &&\n tryServeStatic(req, res, clientDir, staticLookupPath, compress)\n ) {\n return;\n }\n\n // ── Image optimization passthrough ──────────────────────────────\n if (pathname === IMAGE_OPTIMIZATION_PATH || staticLookupPath === IMAGE_OPTIMIZATION_PATH) {\n const parsedUrl = new URL(rawUrl, \"http://localhost\");\n const params = parseImageParams(parsedUrl, allowedImageWidths);\n if (!params) {\n res.writeHead(400);\n res.end(\"Bad Request\");\n return;\n }\n // Block SVG and other unsafe content types\n const ext = path.extname(params.imageUrl).toLowerCase();\n const ct = CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n if (!isSafeImageContentType(ct)) {\n res.writeHead(400);\n res.end(\"The requested resource is not an allowed image type\");\n return;\n }\n const imageSecurityHeaders: Record<string, string> = {\n \"Content-Security-Policy\": IMAGE_CONTENT_SECURITY_POLICY,\n \"X-Content-Type-Options\": \"nosniff\",\n \"Content-Disposition\": \"inline\",\n };\n if (tryServeStatic(req, res, clientDir, params.imageUrl, false, imageSecurityHeaders)) {\n return;\n }\n res.writeHead(404);\n res.end(\"Image not found\");\n return;\n }\n\n try {\n // ── 2. Strip basePath ─────────────────────────────────────────\n if (basePath && pathname.startsWith(basePath)) {\n const stripped = pathname.slice(basePath.length) || \"/\";\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n url = stripped + qs;\n pathname = stripped;\n }\n\n // ── 3. Trailing slash normalization ───────────────────────────\n if (pathname !== \"/\" && !pathname.startsWith(\"/api\")) {\n const hasTrailing = pathname.endsWith(\"/\");\n if (trailingSlash && !hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname + \"/\" + qs });\n res.end();\n return;\n } else if (!trailingSlash && hasTrailing) {\n const qs = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n res.writeHead(308, { Location: basePath + pathname.replace(/\\/+$/, \"\") + qs });\n res.end();\n return;\n }\n }\n\n // Convert Node.js req to Web Request for the server entry\n const rawProtocol = trustProxy\n ? (req.headers[\"x-forwarded-proto\"] as string)?.split(\",\")[0]?.trim()\n : undefined;\n const protocol = rawProtocol === \"https\" || rawProtocol === \"http\" ? rawProtocol : \"http\";\n const hostHeader = resolveHost(req, `${host}:${port}`);\n const reqHeaders = Object.entries(req.headers).reduce((h, [k, v]) => {\n if (v) h.set(k, Array.isArray(v) ? v.join(\", \") : v);\n return h;\n }, new Headers());\n const method = req.method ?? \"GET\";\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n const webRequest = new Request(`${protocol}://${hostHeader}${url}`, {\n method,\n headers: reqHeaders,\n body: hasBody ? readNodeStream(req) : undefined,\n // @ts-expect-error — duplex needed for streaming request bodies\n duplex: hasBody ? \"half\" : undefined,\n });\n\n // Build request context for has/missing condition matching\n const reqCtx: RequestContext = requestContextFromRequest(webRequest);\n\n // ── 4. Run middleware ─────────────────────────────────────────\n let resolvedUrl = url;\n const middlewareHeaders: Record<string, string> = {};\n let middlewareRewriteStatus: number | undefined;\n if (typeof runMiddleware === \"function\") {\n const result = await runMiddleware(webRequest);\n\n if (!result.continue) {\n if (result.redirectUrl) {\n res.writeHead(result.redirectStatus ?? 307, {\n Location: result.redirectUrl,\n });\n res.end();\n return;\n }\n if (result.response) {\n // Use arrayBuffer() to handle binary response bodies correctly\n const body = Buffer.from(await result.response.arrayBuffer());\n res.writeHead(result.response.status, Object.fromEntries(result.response.headers));\n res.end(body);\n return;\n }\n }\n\n // Collect middleware response headers to merge into final response\n if (result.responseHeaders) {\n for (const [key, value] of result.responseHeaders) {\n middlewareHeaders[key] = value;\n }\n }\n\n // Apply middleware rewrite\n if (result.rewriteUrl) {\n resolvedUrl = result.rewriteUrl;\n }\n\n // Apply custom status code from middleware rewrite\n // (e.g. NextResponse.rewrite(url, { status: 403 }))\n middlewareRewriteStatus = result.rewriteStatus;\n }\n\n // Unpack x-middleware-request-* headers into the actual request so that\n // renderPage / handleApiRoute see the middleware-modified headers.\n // Also remove them from middlewareHeaders to prevent leaking as response headers.\n const mwReqPrefix = \"x-middleware-request-\";\n for (const key of Object.keys(middlewareHeaders)) {\n if (key.startsWith(mwReqPrefix)) {\n const realName = key.slice(mwReqPrefix.length);\n webRequest.headers.set(realName, middlewareHeaders[key]);\n delete middlewareHeaders[key];\n }\n }\n\n let resolvedPathname = resolvedUrl.split(\"?\")[0];\n\n // ── 5. Apply custom headers from next.config.js ───────────────\n if (configHeaders.length) {\n const matched = matchHeaders(resolvedPathname, configHeaders);\n for (const h of matched) {\n middlewareHeaders[h.key.toLowerCase()] = h.value;\n }\n }\n\n // ── 6. Apply redirects from next.config.js ────────────────────\n if (configRedirects.length) {\n const redirect = matchRedirect(resolvedPathname, configRedirects, reqCtx);\n if (redirect) {\n // Guard against double-prefixing: only add basePath if destination\n // doesn't already start with it.\n // Sanitize the final destination to prevent protocol-relative URL open redirects.\n const dest = sanitizeDestination(\n basePath && !redirect.destination.startsWith(basePath)\n ? basePath + redirect.destination\n : redirect.destination,\n );\n res.writeHead(redirect.permanent ? 308 : 307, { Location: dest });\n res.end();\n return;\n }\n }\n\n // ── 7. Apply beforeFiles rewrites from next.config.js ─────────\n if (configRewrites.beforeFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.beforeFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 8. API routes ─────────────────────────────────────────────\n if (resolvedPathname.startsWith(\"/api/\") || resolvedPathname === \"/api\") {\n let response: Response;\n if (typeof handleApi === \"function\") {\n response = await handleApi(webRequest, resolvedUrl);\n } else {\n response = new Response(\"404 - API route not found\", { status: 404 });\n }\n\n // Merge middleware + config headers into the response\n const responseBody = Buffer.from(await response.arrayBuffer());\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n return;\n }\n\n // ── 9. Apply afterFiles rewrites from next.config.js ──────────\n if (configRewrites.afterFiles?.length) {\n const rewritten = matchRewrite(resolvedPathname, configRewrites.afterFiles, reqCtx);\n if (rewritten) {\n if (isExternalUrl(rewritten)) {\n const proxyResponse = await proxyExternalRequest(webRequest, rewritten);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n resolvedUrl = rewritten;\n resolvedPathname = rewritten.split(\"?\")[0];\n }\n }\n\n // ── 10. SSR page rendering ────────────────────────────────────\n let response: Response | undefined;\n if (typeof renderPage === \"function\") {\n response = await renderPage(webRequest, resolvedUrl, ssrManifest);\n\n // ── 11. Fallback rewrites (if SSR returned 404) ─────────────\n if (response && response.status === 404 && configRewrites.fallback?.length) {\n const fallbackRewrite = matchRewrite(resolvedPathname, configRewrites.fallback, reqCtx);\n if (fallbackRewrite) {\n if (isExternalUrl(fallbackRewrite)) {\n const proxyResponse = await proxyExternalRequest(webRequest, fallbackRewrite);\n await sendWebResponse(proxyResponse, req, res, compress);\n return;\n }\n response = await renderPage(webRequest, fallbackRewrite, ssrManifest);\n }\n }\n }\n\n if (!response) {\n res.writeHead(404);\n res.end(\"404 - Not found\");\n return;\n }\n\n // Merge middleware + config headers into the response\n const responseBody = Buffer.from(await response.arrayBuffer());\n const ct = response.headers.get(\"content-type\") ?? \"text/html\";\n const responseHeaders: Record<string, string> = { ...middlewareHeaders };\n response.headers.forEach((v, k) => { responseHeaders[k] = v; });\n\n sendCompressed(req, res, responseBody, ct, middlewareRewriteStatus ?? response.status, responseHeaders, compress);\n } catch (e) {\n console.error(\"[vinext] Server error:\", e);\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n }\n });\n\n await new Promise<void>((resolve) => {\n server.listen(port, host, () => {\n const addr = server.address();\n const actualPort = typeof addr === \"object\" && addr ? addr.port : port;\n console.log(`[vinext] Production server running at http://${host}:${actualPort}`);\n resolve();\n });\n });\n\n return server;\n}\n\n// Export helpers for testing\nexport { sendCompressed, negotiateEncoding, COMPRESSIBLE_TYPES, COMPRESS_THRESHOLD, resolveHost, trustedHosts, trustProxy, nodeToWebRequest };\n"]}
|
|
@@ -51,8 +51,15 @@ export declare function getCacheContext(): CacheContext | null;
|
|
|
51
51
|
* Exported for testing.
|
|
52
52
|
*/
|
|
53
53
|
export declare function replyToCacheKey(reply: string | FormData): Promise<string>;
|
|
54
|
+
/**
|
|
55
|
+
* Run a function within a private cache ALS scope.
|
|
56
|
+
* Ensures per-request isolation for "use cache: private" entries
|
|
57
|
+
* on concurrent runtimes.
|
|
58
|
+
*/
|
|
59
|
+
export declare function runWithPrivateCache<T>(fn: () => T | Promise<T>): T | Promise<T>;
|
|
54
60
|
/**
|
|
55
61
|
* Clear the private per-request cache. Should be called at the start of each request.
|
|
62
|
+
* Only needed when not using runWithPrivateCache() (legacy path).
|
|
56
63
|
*/
|
|
57
64
|
export declare function clearPrivateCache(): void;
|
|
58
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-runtime.d.ts","sourceRoot":"","sources":["../../src/shims/cache-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAqE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAMrH,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+EAA+E;IAC/E,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,iCAAwC,CAAC;AAMzE;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AA+ED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB/E;
|
|
1
|
+
{"version":3,"file":"cache-runtime.d.ts","sourceRoot":"","sources":["../../src/shims/cache-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAqE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAMrH,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,+EAA+E;IAC/E,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,mBAAmB,iCAAwC,CAAC;AAMzE;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AA+ED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB/E;AAmED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAK/E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAC/E,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,CAiJH"}
|
|
@@ -168,28 +168,32 @@ const _privateAls = (_g[_PRIVATE_ALS_KEY] ??= new AsyncLocalStorage());
|
|
|
168
168
|
const _privateFallbackState = (_g[_PRIVATE_FALLBACK_KEY] ??= {
|
|
169
169
|
cache: new Map(),
|
|
170
170
|
});
|
|
171
|
-
function _privateEnterWith(state) {
|
|
172
|
-
const enterWith = _privateAls.enterWith;
|
|
173
|
-
if (typeof enterWith === "function") {
|
|
174
|
-
try {
|
|
175
|
-
enterWith.call(_privateAls, state);
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
// Fall through to best-effort fallback.
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
_privateFallbackState.cache = state.cache;
|
|
183
|
-
}
|
|
184
171
|
function _getPrivateState() {
|
|
185
172
|
return _privateAls.getStore() ?? _privateFallbackState;
|
|
186
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Run a function within a private cache ALS scope.
|
|
176
|
+
* Ensures per-request isolation for "use cache: private" entries
|
|
177
|
+
* on concurrent runtimes.
|
|
178
|
+
*/
|
|
179
|
+
export function runWithPrivateCache(fn) {
|
|
180
|
+
const state = {
|
|
181
|
+
cache: new Map(),
|
|
182
|
+
};
|
|
183
|
+
return _privateAls.run(state, fn);
|
|
184
|
+
}
|
|
187
185
|
/**
|
|
188
186
|
* Clear the private per-request cache. Should be called at the start of each request.
|
|
187
|
+
* Only needed when not using runWithPrivateCache() (legacy path).
|
|
189
188
|
*/
|
|
190
189
|
export function clearPrivateCache() {
|
|
191
|
-
|
|
192
|
-
|
|
190
|
+
const state = _privateAls.getStore();
|
|
191
|
+
if (state) {
|
|
192
|
+
state.cache = new Map();
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
_privateFallbackState.cache = new Map();
|
|
196
|
+
}
|
|
193
197
|
}
|
|
194
198
|
// ---------------------------------------------------------------------------
|
|
195
199
|
// Core runtime: registerCachedFunction
|