vinext 0.0.10 → 0.0.12
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/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/config/config-matchers.d.ts +11 -2
- package/dist/config/config-matchers.d.ts.map +1 -1
- package/dist/config/config-matchers.js +167 -45
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +6 -4
- package/dist/deploy.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -51
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +3 -2
- package/dist/init.js.map +1 -1
- package/dist/server/app-dev-server.d.ts.map +1 -1
- package/dist/server/app-dev-server.js +34 -9
- 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 +8 -1
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/dev-server.d.ts.map +1 -1
- package/dist/server/dev-server.js +14 -2
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/middleware-codegen.d.ts.map +1 -1
- package/dist/server/middleware-codegen.js +13 -7
- package/dist/server/middleware-codegen.js.map +1 -1
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +34 -13
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/prod-server.d.ts.map +1 -1
- package/dist/server/prod-server.js +26 -3
- package/dist/server/prod-server.js.map +1 -1
- package/dist/shims/fetch-cache.d.ts.map +1 -1
- package/dist/shims/fetch-cache.js +153 -55
- package/dist/shims/fetch-cache.js.map +1 -1
- package/dist/shims/head.d.ts.map +1 -1
- package/dist/shims/head.js +4 -1
- package/dist/shims/head.js.map +1 -1
- package/dist/shims/headers.d.ts.map +1 -1
- package/dist/shims/headers.js +4 -2
- package/dist/shims/headers.js.map +1 -1
- package/dist/shims/navigation.js +2 -2
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/router.d.ts +1 -1
- package/dist/shims/router.d.ts.map +1 -1
- package/dist/shims/router.js +2 -2
- package/dist/shims/router.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-router-entry.d.ts","sourceRoot":"","sources":["../../src/server/app-router-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;;mBAOoB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADlD,
|
|
1
|
+
{"version":3,"file":"app-router-entry.d.ts","sourceRoot":"","sources":["../../src/server/app-router-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;;mBAOoB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADlD,wBA2CE"}
|
|
@@ -24,7 +24,14 @@ export default {
|
|
|
24
24
|
return new Response("404 Not Found", { status: 404 });
|
|
25
25
|
}
|
|
26
26
|
// Decode percent-encoding and normalize the path for middleware/route matching.
|
|
27
|
-
|
|
27
|
+
let normalizedPathname;
|
|
28
|
+
try {
|
|
29
|
+
normalizedPathname = normalizePath(decodeURIComponent(rawPathname));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Malformed percent-encoding (e.g. /%E0%A4%A) — return 400 instead of throwing.
|
|
33
|
+
return new Response("Bad Request", { status: 400 });
|
|
34
|
+
}
|
|
28
35
|
// Construct a new Request with normalized pathname so the RSC entry
|
|
29
36
|
// sees the canonical path for middleware and route matching.
|
|
30
37
|
let normalizedRequest = request;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-router-entry.js","sourceRoot":"","sources":["../../src/server/app-router-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uDAAuD;AACvD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,kFAAkF;QAClF,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEvD,2EAA2E;QAC3E,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,QAAQ,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,gFAAgF;QAChF,
|
|
1
|
+
{"version":3,"file":"app-router-entry.js","sourceRoot":"","sources":["../../src/server/app-router-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,uDAAuD;AACvD,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,kFAAkF;QAClF,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEvD,2EAA2E;QAC3E,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,QAAQ,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,gFAAgF;QAChF,IAAI,kBAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,kBAAkB,GAAG,aAAa,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;YAChF,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,oEAAoE;QACpE,6DAA6D;QAC7D,IAAI,iBAAiB,GAAG,OAAO,CAAC;QAChC,IAAI,kBAAkB,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,aAAa,CAAC,QAAQ,GAAG,kBAAkB,CAAC;YAC5C,iBAAiB,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAC1D,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAEnD,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;CACF,CAAC","sourcesContent":["/**\n * Default Cloudflare Worker entry point for vinext App Router.\n *\n * Use this directly in wrangler.jsonc:\n * \"main\": \"vinext/server/app-router-entry\"\n *\n * Or import and delegate to it from a custom worker:\n * import handler from \"vinext/server/app-router-entry\";\n * return handler.fetch(request);\n *\n * This file runs in the RSC environment. Configure the Cloudflare plugin with:\n * cloudflare({ viteEnvironment: { name: \"rsc\", childEnvironments: [\"ssr\"] } })\n */\n\n// @ts-expect-error — virtual module resolved by vinext\nimport rscHandler from \"virtual:vinext-rsc-entry\";\nimport { normalizePath } from \"./normalize-path.js\";\n\nexport default {\n async fetch(request: Request): Promise<Response> {\n const url = new URL(request.url);\n\n // Normalize backslashes (browsers treat /\\ as //) then decode and normalize path.\n const rawPathname = url.pathname.replaceAll(\"\\\\\", \"/\");\n\n // Block protocol-relative URL open redirects (//evil.com/ or /\\evil.com/).\n if (rawPathname.startsWith(\"//\")) {\n return new Response(\"404 Not Found\", { status: 404 });\n }\n\n // Decode percent-encoding and normalize the path for middleware/route matching.\n let normalizedPathname: string;\n try {\n normalizedPathname = normalizePath(decodeURIComponent(rawPathname));\n } catch {\n // Malformed percent-encoding (e.g. /%E0%A4%A) — return 400 instead of throwing.\n return new Response(\"Bad Request\", { status: 400 });\n }\n\n // Construct a new Request with normalized pathname so the RSC entry\n // sees the canonical path for middleware and route matching.\n let normalizedRequest = request;\n if (normalizedPathname !== url.pathname) {\n const normalizedUrl = new URL(url);\n normalizedUrl.pathname = normalizedPathname;\n normalizedRequest = new Request(normalizedUrl, request);\n }\n\n // Delegate to RSC handler\n const result = await rscHandler(normalizedRequest);\n\n if (result instanceof Response) {\n return result;\n }\n\n if (result === null || result === undefined) {\n return new Response(\"Not Found\", { status: 404 });\n }\n\n return new Response(String(result), { status: 200 });\n },\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/server/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmK/D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,cAAc,GACzB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAYrD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,cAAc,GACzB,MAAM,GAAG,IAAI,CA4Bf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,cAAc,GACzB,MAAM,GAAG,IAAI,CAiBf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,IAGhC,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,MAAM;AACX,wEAAwE;AACxE,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/server/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmK/D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,cAAc,GACzB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAYrD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,cAAc,GACzB,MAAM,GAAG,IAAI,CA4Bf;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,UAAU,EAAE,cAAc,GACzB,MAAM,GAAG,IAAI,CAiBf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,IAGhC,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,MAAM;AACX,wEAAwE;AACxE,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAAC,CA0gBjB"}
|
|
@@ -323,8 +323,14 @@ export function createSSRHandler(server, routes, pagesDir, i18nConfig) {
|
|
|
323
323
|
if (result && "redirect" in result) {
|
|
324
324
|
const { redirect } = result;
|
|
325
325
|
const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);
|
|
326
|
+
// Sanitize destination to prevent open redirect via protocol-relative URLs.
|
|
327
|
+
// Also normalize backslashes — browsers treat \ as / in URL contexts.
|
|
328
|
+
let dest = redirect.destination;
|
|
329
|
+
if (!dest.startsWith("http://") && !dest.startsWith("https://")) {
|
|
330
|
+
dest = dest.replace(/^[\\/]+/, "/");
|
|
331
|
+
}
|
|
326
332
|
res.writeHead(status, {
|
|
327
|
-
Location:
|
|
333
|
+
Location: dest,
|
|
328
334
|
});
|
|
329
335
|
res.end();
|
|
330
336
|
return;
|
|
@@ -420,8 +426,14 @@ export function createSSRHandler(server, routes, pagesDir, i18nConfig) {
|
|
|
420
426
|
if (result && "redirect" in result) {
|
|
421
427
|
const { redirect } = result;
|
|
422
428
|
const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);
|
|
429
|
+
// Sanitize destination to prevent open redirect via protocol-relative URLs.
|
|
430
|
+
// Also normalize backslashes — browsers treat \ as / in URL contexts.
|
|
431
|
+
let dest = redirect.destination;
|
|
432
|
+
if (!dest.startsWith("http://") && !dest.startsWith("https://")) {
|
|
433
|
+
dest = dest.replace(/^[\\/]+/, "/");
|
|
434
|
+
}
|
|
423
435
|
res.writeHead(status, {
|
|
424
|
-
Location:
|
|
436
|
+
Location: dest,
|
|
425
437
|
});
|
|
426
438
|
res.end();
|
|
427
439
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/server/dev-server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAE7E,OAAO,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,6BAA6B,EAC7B,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,qEAAqE;AACrE,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,gBAAgB,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAEvD;;;;;;GAMG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAA2B;IAC5D,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,CAAC,QAAQ,CAAC;IACtB,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,KAAK,UAAU,oBAAoB,CACjC,GAAmB,EACnB,OAA2B,EAC3B,OAUC;IAED,MAAM,EACJ,GAAG,EACH,MAAM,EACN,YAAY,EACZ,OAAO,EACP,iBAAiB,EACjB,UAAU,GAAG,GAAG,EAChB,YAAY,EACZ,WAAW,GACZ,GAAG,OAAO,CAAC;IAEZ,oEAAoE;IACpE,oEAAoE;IACpE,wDAAwD;IACxD,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAEzD,qDAAqD;IACrD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,2DAA2D;IAC3D,IAAI,aAAqB,CAAC;IAE1B,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAC1D,IAAI,OAAO,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACpD,+CAA+C;QAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;QAC/D,mBAAmB;QACnB,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;YAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,YAAY,GAAG,QAAQ,WAAW,CAAC,CAAC;QAChF,CAAC;QACD,+DAA+D;QAC/D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,OAAO,WAAW,CAAC,CAAC;QAChE,CAAC;QACD,aAAa,GAAG,OAAO,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,aAAa,GAAG;;;;;IAKhB,YAAY,GAAG,QAAQ;;;qBAGN,kBAAkB;IACnC,OAAO;;QAEH,CAAC;IACP,CAAC;IAED,sEAAsE;IACtE,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE7E,mCAAmC;IACnC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,WAAW;QAC3B,mBAAmB,EAAE,SAAS;QAC9B,GAAG,YAAY;KAChB,CAAC;IACF,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEnC,iDAAiD;IACjD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAElB,8EAA8E;IAC9E,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,oDAAoD;IACpD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,SAAS,sBAAsB,CAAC,QAAgB;IAC9C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,UAA0B;IAE1B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,KAAK,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;IAEnE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAAoB,EACpB,UAA0B;IAE1B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,iDAAiD;IACjD,MAAM,KAAK,GAAG,UAAU;SACrB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC;IAChD,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QAC7B,cAAc;QACd,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC;QAC5E,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAElC,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,CAC9E,CAAC;QACF,IAAI,WAAW;YAAE,OAAO,WAAW,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAoB,EACpB,UAA0B;IAE1B,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;IACxC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAE/B,iDAAiD;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,gDAAgD;IAChD,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAqB,EACrB,MAAe,EACf,QAAgB,EAChB,UAAkC;IAElC,OAAO,KAAK,EACV,GAAoB,EACpB,GAAmB,EACnB,GAAW;IACX,wEAAwE;IACxE,UAAmB,EACJ,EAAE;QACjB,+CAA+C;QAC/C,IAAI,MAA0B,CAAC;QAC/B,IAAI,iBAAiB,GAAG,GAAG,CAAC;QAE5B,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACrD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC;YAE/B,4EAA4E;YAC5E,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACxD,IAAI,YAAY,IAAI,YAAY,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;oBAC9D,2EAA2E;oBAC3E,MAAM,WAAW,GAAG,IAAI,YAAY,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAChE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBACD,oFAAoF;gBACpF,IAAI,CAAC,YAAY,IAAI,UAAU,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;oBAC1D,MAAM,cAAc,GAAG,uBAAuB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;oBAChE,IAAI,cAAc,IAAI,cAAc,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;wBAClE,MAAM,WAAW,GAAG,IAAI,cAAc,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;wBAClE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;wBAC9C,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAEpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,mDAAmD;YACnD,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QAEhC,sEAAsE;QACtE,sDAAsD;QACtD,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAC7B,gBAAgB,CAAC,GAAG,EAAE,CACpB,kBAAkB,CAAC,GAAG,EAAE,CACtB,mBAAmB,CAAC,GAAG,EAAE,CACvB,iBAAiB,CAAC,KAAK,IAAI,EAAE;YACrC,IAAI,CAAC;gBACH,6DAA6D;gBAC7D,2DAA2D;gBAC3D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;gBAC7D,IAAI,OAAO,UAAU,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACnD,UAAU,CAAC,aAAa,CAAC;wBACvB,QAAQ,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACzC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE;wBACxC,MAAM,EAAE,GAAG;wBACX,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,aAAa;wBAC3C,OAAO,EAAE,UAAU,EAAE,OAAO;wBAC5B,aAAa,EAAE,UAAU,EAAE,aAAa;qBACzC,CAAC,CAAC;gBACL,CAAC;gBAED,+EAA+E;gBAC/E,IAAI,UAAU,EAAE,CAAC;oBACd,UAAkB,CAAC,iBAAiB,GAAG,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC;oBAC1E,UAAkB,CAAC,kBAAkB,GAAG,UAAU,CAAC,OAAO,CAAC;oBAC3D,UAAkB,CAAC,yBAAyB,GAAG,UAAU,CAAC,aAAa,CAAC;gBAC3E,CAAC;gBAED,mDAAmD;gBACnD,mDAAmD;gBACnD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAE9D,0CAA0C;gBAC1C,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC;gBACzC,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,QAAQ,wBAAwB,CAAC,CAAC;oBACvE,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;oBACtC,OAAO;gBACT,CAAC;gBAED,+CAA+C;gBAC/C,IAAI,SAAS,GAA4B,EAAE,CAAC;gBAC5C,IAAI,oBAAoB,GAAkB,IAAI,CAAC;gBAE/C,8DAA8D;gBAC9D,+DAA+D;gBAC9D,IAAI,OAAO,UAAU,CAAC,cAAc,KAAK,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBACxE,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC;wBAClD,OAAO,EAAE,UAAU,EAAE,OAAO,IAAI,EAAE;wBAClC,aAAa,EAAE,UAAU,EAAE,aAAa,IAAI,EAAE;qBAC/C,CAAC,CAAC;oBACH,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,KAAK,CAAC;oBAEhD,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;wBACvB,uDAAuD;wBACvD,MAAM,KAAK,GACT,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;wBAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAgD,EAAE,EAAE;4BAClF,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE;gCACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gCAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oCACvB,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gCACrE,CAAC;gCACD,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;4BACxC,CAAC,CAAC,CAAC;wBACL,CAAC,CAAC,CAAC;wBAEH,IAAI,CAAC,WAAW,EAAE,CAAC;4BACjB,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;4BAC5D,OAAO;wBACT,CAAC;oBACH,CAAC;oBACD,uDAAuD;oBACvD,0DAA0D;oBAC1D,wDAAwD;oBACxD,kEAAkE;oBAClE,oEAAoE;gBACtE,CAAC;gBAED,IAAI,OAAO,UAAU,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;oBACxD,MAAM,OAAO,GAAG;wBACd,MAAM;wBACN,GAAG;wBACH,GAAG;wBACH,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;wBACtB,WAAW,EAAE,iBAAiB;wBAC9B,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,aAAa;wBAC3C,OAAO,EAAE,UAAU,EAAE,OAAO;wBAC5B,aAAa,EAAE,UAAU,EAAE,aAAa;qBACzC,CAAC;oBACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;oBAC5D,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;wBAChC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;oBAC3B,CAAC;oBACD,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;wBACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;wBAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACvE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;4BACpB,QAAQ,EAAE,QAAQ,CAAC,WAAW;yBAC/B,CAAC,CAAC;wBACH,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBACD,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtD,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;wBAC5D,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,kEAAkE;gBAClE,sEAAsE;gBACtE,4DAA4D;gBAC5D,IAAI,mBAAmB,GAAG,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,aAAa,GAA0C,EAAE,CAAC;oBAChE,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;oBACvE,IAAI,OAAO,eAAe,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;wBAC7D,aAAa,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBAC9D,CAAC;oBACD,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;oBACrE,IAAI,OAAO,cAAc,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;wBAC5D,aAAa,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBAC7D,CAAC;oBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC7B,mBAAmB,GAAG,aAAa;6BAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,iCAAiC,CAAC,CAAC,IAAI,eAAe,CAAC;6BAC5E,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,qCAAqC;gBACvC,CAAC;gBAED,IAAI,OAAO,UAAU,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;oBACpD,gDAAgD;oBAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAEtC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;wBACtE,mCAAmC;wBACnC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAyB,CAAC;wBAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC;wBACnC,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBACzE,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;wBAC7D,MAAM,UAAU,GAA2B;4BACzC,cAAc,EAAE,WAAW;4BAC3B,gBAAgB,EAAE,KAAK;4BACvB,eAAe,EAAE,YAAY,cAAc,0BAA0B;yBACtE,CAAC;wBACF,IAAI,mBAAmB;4BAAE,UAAU,CAAC,MAAM,CAAC,GAAG,mBAAmB,CAAC;wBAClE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBAC/B,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBACzB,OAAO;oBACT,CAAC;oBAED,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;wBACrE,gEAAgE;wBAChE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,KAAyB,CAAC;wBAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC;wBACnC,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;wBAEzE,6DAA6D;wBAC7D,iEAAiE;wBACjE,6BAA6B,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;4BACjD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;4BAChE,IAAI,WAAW,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gCAC1C,MAAM,UAAU,GAAG,OAAO,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gCAC3F,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oCACnB,MAAM,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAAC,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;gCAC1F,CAAC;4BACH,CAAC;wBACH,CAAC,CAAC,CAAC;wBAEH,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;wBAC7D,MAAM,YAAY,GAA2B;4BAC3C,cAAc,EAAE,WAAW;4BAC3B,gBAAgB,EAAE,OAAO;4BACzB,eAAe,EAAE,YAAY,cAAc,0BAA0B;yBACtE,CAAC;wBACF,IAAI,mBAAmB;4BAAE,YAAY,CAAC,MAAM,CAAC,GAAG,mBAAmB,CAAC;wBACpE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;wBACjC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBACzB,OAAO;oBACT,CAAC;oBAED,4CAA4C;oBAC5C,MAAM,OAAO,GAAG;wBACd,MAAM;wBACN,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,aAAa;wBAC3C,OAAO,EAAE,UAAU,EAAE,OAAO;wBAC5B,aAAa,EAAE,UAAU,EAAE,aAAa;qBACzC,CAAC;oBACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBACxD,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;wBAChC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;oBAC3B,CAAC;oBACD,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;wBACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;wBAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACvE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE;4BACpB,QAAQ,EAAE,QAAQ,CAAC,WAAW;yBAC/B,CAAC,CAAC;wBACH,GAAG,CAAC,GAAG,EAAE,CAAC;wBACV,OAAO;oBACT,CAAC;oBACD,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtD,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;wBAC5D,OAAO;oBACT,CAAC;oBAED,yDAAyD;oBACzD,IAAI,OAAO,MAAM,EAAE,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;wBACpE,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBAED,oCAAoC;gBACpC,8DAA8D;gBAC9D,IAAI,YAAY,GAAQ,IAAI,CAAC;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC5C,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBACtD,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;oBAC3C,CAAC;oBAAC,MAAM,CAAC;wBACP,iCAAiC;oBACnC,CAAC;gBACH,CAAC;gBAED,wEAAwE;gBACxE,qEAAqE;gBACrE,mEAAmE;gBACnE,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;gBAC1C,IAAI,OAA2B,CAAC;gBAEhC,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE;wBACpC,SAAS,EAAE,aAAa;wBACxB,SAAS;qBACV,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBACpD,CAAC;gBAED,wEAAwE;gBACxE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBACzD,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;oBAChD,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC1B,CAAC;gBAED,+DAA+D;gBAC/D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;gBAC/D,IAAI,OAAO,WAAW,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACpD,MAAM,WAAW,CAAC,aAAa,EAAE,CAAC;gBACpC,CAAC;gBAED,kEAAkE;gBAClE,gEAAgE;gBAChE,6BAA6B;gBAE7B,0EAA0E;gBAC1E,IAAI,YAAY,GAAG,EAAE,CAAC;gBACtB,MAAM,aAAa,GAAa,EAAE,CAAC;gBACnC,MAAM,eAAe,GAA0C,EAAE,CAAC;gBAClE,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;oBAClE,IAAI,OAAO,UAAU,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;wBACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;wBAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;4BAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;4BAC3E,YAAY,IAAI,gCAAgC,WAAW,UAAU,CAAC;wBACxE,CAAC;oBACH,CAAC;oBACD,IAAI,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;wBACtD,aAAa,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;oBACvD,CAAC;oBACD,iDAAiD;oBACjD,IAAI,OAAO,UAAU,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;wBACxD,eAAe,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;oBAChE,IAAI,OAAO,SAAS,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;wBACrD,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC,CAAC;oBACtD,CAAC;oBACD,yCAAyC;oBACzC,IAAI,OAAO,SAAS,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;wBACvD,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;gBACD,0EAA0E;gBAC1E,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,eAAe,EAAE,CAAC;oBAC7C,0EAA0E;oBAC1E,iEAAiE;oBACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBACrE,YAAY,IAAI,6BAA6B,QAAQ,qBAAqB,QAAQ,sBAAsB,CAAC;gBAC3G,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,YAAY,IAAI,4BAA4B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;gBACrF,CAAC;gBAED,uEAAuE;gBACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACpC,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpE,MAAM,YAAY,GAAG,YAAY;oBAC/B,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;oBAC5D,CAAC,CAAC,IAAI,CAAC;gBAET,qEAAqE;gBACrE,oEAAoE;gBACpE,MAAM,eAAe,GAAG;;;;;;;;;qCASO,aAAa;;;IAI9C,YAAY;oBACV,CAAC,CAAC;oCAC4B,YAAY;;;;GAI7C;oBACG,CAAC,CAAC;;GAGN;;;;;UAKQ,CAAC;gBAEL,MAAM,cAAc,GAAG,kCAAkC,iBAAiB,CAAC;oBACzE,KAAK,EAAE,EAAE,SAAS,EAAE;oBACpB,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC;oBACxC,KAAK,EAAE,MAAM;oBACb,UAAU,EAAE,KAAK;oBACjB,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,aAAa;oBAC3C,OAAO,EAAE,UAAU,EAAE,OAAO;oBAC5B,aAAa,EAAE,UAAU,EAAE,aAAa;oBACxC,qEAAqE;oBACrE,QAAQ,EAAE;wBACR,aAAa;wBACb,YAAY;qBACb;iBACF,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,6BAA6B,iBAAiB,CAAC,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC,8BAA8B,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,qCAAqC,iBAAiB,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;gBAE1Q,mCAAmC;gBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACjD,IAAI,iBAAiB,GAAQ,IAAI,CAAC;gBAClC,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC,IAAI,CAAC;wBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBACtD,iBAAiB,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;oBAChD,CAAC;oBAAC,MAAM,CAAC;wBACP,sCAAsC;oBACxC,CAAC;gBACH,CAAC;gBAED,MAAM,UAAU,GAAG,GAAG,cAAc,OAAO,eAAe,EAAE,CAAC;gBAE7D,wCAAwC;gBACxC,MAAM,YAAY,GAA2B,EAAE,CAAC;gBAChD,IAAI,oBAAoB,EAAE,CAAC;oBACzB,YAAY,CAAC,eAAe,CAAC,GAAG,YAAY,oBAAoB,0BAA0B,CAAC;oBAC3F,YAAY,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC;gBAC1C,CAAC;gBAED,4CAA4C;gBAC5C,iFAAiF;gBACjF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,YAAY,CAAC,MAAM,CAAC,GAAG,eAAe;yBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,iCAAiC,CAAC,CAAC,IAAI,eAAe,CAAC;yBAC5E,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAED,yCAAyC;gBACzC,kEAAkE;gBAClE,8CAA8C;gBAC9C,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE;oBACvC,GAAG;oBACH,MAAM;oBACN,YAAY;oBACZ,OAAO,EAAE,UAAU;oBACnB,iBAAiB;oBACjB,UAAU;oBACV,YAAY;oBACZ,0EAA0E;oBAC1E,kEAAkE;oBAClE,wDAAwD;oBACxD,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,QAAQ,CAAC,cAAc,KAAK,UAAU;wBAC9D,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE;wBAC3B,CAAC,CAAC,EAAE;iBACP,CAAC,CAAC;gBAEH,oCAAoC;gBACpC,IAAI,OAAO,UAAU,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;oBACnD,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;gBAED,wDAAwD;gBACxD,oEAAoE;gBACpE,yEAAyE;gBACzE,IAAI,oBAAoB,KAAK,IAAI,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;oBAC9D,MAAM,UAAU,GAAG,YAAY;wBAC7B,CAAC,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;wBAC3E,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACjD,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,4DAA4D,WAAW,SAAS,UAAU,gBAAgB,CAAC;oBAC3H,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzD,MAAM,MAAM,CACV,QAAQ,EACR,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,EACxC,oBAAoB,CACrB,CAAC;oBACF,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,yDAAyD;gBACzD,MAAM,CAAC,gBAAgB,CAAC,CAAU,CAAC,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,sDAAsD;gBACtD,kBAAkB,CAChB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAC7C;oBACE,IAAI,EAAE,GAAG;oBACT,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;oBAC3B,OAAO,EAAE,MAAM,CAAC,WAAW,CACzB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CACpG;iBACF,EACD,EAAE,UAAU,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAC9E,CAAC,KAAK,CAAC,GAAG,EAAE,GAAiC,CAAC,CAAC,CAAC;gBACjD,sCAAsC;gBACtC,IAAI,CAAC;oBACH,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,uDAAuD;oBACvD,8DAA8D;oBAC9D,2CAA2C;oBAC3C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,0BAA2B,WAAqB,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,8CAA8C;gBAC9C,mEAAmE;YACrE,CAAC;QACO,CAAC,CAAC,CAAC,wBAAwB;SAC5B,CAAC,0BAA0B;SAC7B,CAAC,yBAAyB;SAC5B,CAAC,uBAAuB;SAC1B,CAAC,CAAC,yBAAyB;IAC9B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,eAAe,CAC5B,MAAqB,EACrB,IAAqB,EACrB,GAAmB,EACnB,GAAW,EACX,QAAgB,EAChB,UAAkB;IAElB,6DAA6D;IAC7D,MAAM,UAAU,GACd,UAAU,KAAK,GAAG;QAChB,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;QACnB,CAAC,CAAC,UAAU,KAAK,GAAG;YAClB,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;YACnB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEnB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC;gBAAE,SAAS;YAErD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAC9D,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC;YAC3C,IAAI,CAAC,cAAc;gBAAE,SAAS;YAE9B,8CAA8C;YAC9C,IAAI,YAAY,GAAQ,IAAI,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC/C,IAAI,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;oBACzD,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;gBAC3C,CAAC;gBAAC,MAAM,CAAC;oBACP,iCAAiC;gBACnC,CAAC;YACH,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;YAC1C,MAAM,UAAU,GAAG,EAAE,UAAU,EAAE,CAAC;YAElC,IAAI,OAA2B,CAAC;YAChC,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,GAAG,aAAa,CAAC,YAAY,EAAE;oBACpC,SAAS,EAAE,cAAc;oBACzB,SAAS,EAAE,UAAU;iBACtB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEpD,uBAAuB;YACvB,IAAI,IAAY,CAAC;YACjB,IAAI,iBAAiB,GAAQ,IAAI,CAAC;YAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACpD,IAAI,sBAAsB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;oBACzD,iBAAiB,GAAG,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBACP,sCAAsC;gBACxC,CAAC;YACH,CAAC;YAED,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;gBACpD,IAAI,OAAO,GAAG,MAAM,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACpD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;gBACrD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;gBAC3D,IAAI,GAAG,OAAO,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG;;;;;;;qBAOM,QAAQ;;QAErB,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnE,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,SAAS;QACX,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,MAAM,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC;AAChG,CAAC","sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Route } from \"../routing/pages-router.js\";\nimport { matchRoute, patternToNextFormat } from \"../routing/pages-router.js\";\nimport type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n isrGet,\n isrSet,\n isrCacheKey,\n buildPagesCacheValue,\n triggerBackgroundRegeneration,\n setRevalidateDuration,\n getRevalidateDuration,\n} from \"./isr-cache.js\";\nimport type { CachedPagesValue } from \"../shims/cache.js\";\nimport { runWithFetchCache } from \"../shims/fetch-cache.js\";\nimport { _runWithCacheState } from \"../shims/cache.js\";\nimport { runWithPrivateCache } from \"../shims/cache-runtime.js\";\n// Import server-only state modules to register ALS-backed accessors.\n// These modules must be imported before any rendering occurs.\nimport { runWithRouterState } from \"../shims/router-state.js\";\nimport { runWithHeadState } from \"../shims/head-state.js\";\nimport { reportRequestError } from \"./instrumentation.js\";\nimport { safeJsonStringify } from \"./html.js\";\nimport { parseQueryString as parseQuery } from \"../utils/query.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport React from \"react\";\nimport { renderToReadableStream } from \"react-dom/server.edge\";\n\nconst PAGE_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n\n/**\n * Render a React element to a string using renderToReadableStream.\n *\n * Uses the edge-compatible Web Streams API. Waits for all Suspense\n * boundaries to resolve via stream.allReady before collecting output.\n * Used for _document rendering and error pages (small, non-streaming).\n */\nasync function renderToStringAsync(element: React.ReactElement): Promise<string> {\n const stream = await renderToReadableStream(element);\n await stream.allReady;\n return new Response(stream).text();\n}\n\n/** Body placeholder used to split the document shell for streaming. */\nconst STREAM_BODY_MARKER = \"<!--VINEXT_STREAM_BODY-->\";\n\n/**\n * Stream a Pages Router page response using progressive SSR.\n *\n * Sends the HTML shell (head, layout, Suspense fallbacks) immediately\n * when the React shell is ready, then streams Suspense content as it\n * resolves. This gives the browser content to render while slow data\n * loads are still in flight.\n *\n * `__NEXT_DATA__` and the hydration script are appended after the body\n * stream completes (the data is known before rendering starts, but\n * deferring them reduces TTFB and lets the browser start parsing the\n * shell sooner).\n */\nasync function streamPageToResponse(\n res: ServerResponse,\n element: React.ReactElement,\n options: {\n url: string;\n server: ViteDevServer;\n fontHeadHTML: string;\n scripts: string;\n DocumentComponent: React.ComponentType | null;\n statusCode?: number;\n extraHeaders?: Record<string, string>;\n /** Called after renderToReadableStream resolves (shell ready) to collect head HTML */\n getHeadHTML: () => string;\n },\n): Promise<void> {\n const {\n url,\n server,\n fontHeadHTML,\n scripts,\n DocumentComponent,\n statusCode = 200,\n extraHeaders,\n getHeadHTML,\n } = options;\n\n // Start the React body stream FIRST — the promise resolves when the\n // shell is ready (synchronous content outside Suspense boundaries).\n // This triggers the render which populates <Head> tags.\n const bodyStream = await renderToReadableStream(element);\n\n // Now that the shell has rendered, collect head HTML\n const headHTML = getHeadHTML();\n\n // Build the document shell with a placeholder for the body\n let shellTemplate: string;\n\n if (DocumentComponent) {\n const docElement = React.createElement(DocumentComponent);\n let docHtml = await renderToStringAsync(docElement);\n // Replace __NEXT_MAIN__ with our stream marker\n docHtml = docHtml.replace(\"__NEXT_MAIN__\", STREAM_BODY_MARKER);\n // Inject head tags\n if (headHTML || fontHeadHTML) {\n docHtml = docHtml.replace(\"</head>\", ` ${fontHeadHTML}${headHTML}\\n</head>`);\n }\n // Inject scripts: replace placeholder or append before </body>\n docHtml = docHtml.replace(\"<!-- __NEXT_SCRIPTS__ -->\", scripts);\n if (!docHtml.includes(\"__NEXT_DATA__\")) {\n docHtml = docHtml.replace(\"</body>\", ` ${scripts}\\n</body>`);\n }\n shellTemplate = docHtml;\n } else {\n shellTemplate = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n ${fontHeadHTML}${headHTML}\n</head>\n<body>\n <div id=\"__next\">${STREAM_BODY_MARKER}</div>\n ${scripts}\n</body>\n</html>`;\n }\n\n // Apply Vite's HTML transforms (injects HMR client, etc.) on the full\n // shell template, then split at the body marker.\n const transformedShell = await server.transformIndexHtml(url, shellTemplate);\n const markerIdx = transformedShell.indexOf(STREAM_BODY_MARKER);\n const prefix = transformedShell.slice(0, markerIdx);\n const suffix = transformedShell.slice(markerIdx + STREAM_BODY_MARKER.length);\n\n // Send headers and start streaming\n const headers: Record<string, string> = {\n \"Content-Type\": \"text/html\",\n \"Transfer-Encoding\": \"chunked\",\n ...extraHeaders,\n };\n res.writeHead(statusCode, headers);\n\n // Write the document prefix (head, opening body)\n res.write(prefix);\n\n // Pipe the React body stream through (Suspense content streams progressively)\n const reader = bodyStream.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n // Write the document suffix (closing tags, scripts)\n res.end(suffix);\n}\n\n/** Check if a file exists with any page extension (tsx, ts, jsx, js). */\nfunction findFileWithExtensions(basePath: string): boolean {\n return PAGE_EXTENSIONS.some((ext) => fs.existsSync(basePath + ext));\n}\n\n/**\n * Extract locale prefix from a URL path.\n * e.g. /fr/about -> { locale: \"fr\", url: \"/about\", hadPrefix: true }\n * /about -> { locale: \"en\", url: \"/about\", hadPrefix: false } (defaultLocale)\n */\nexport function extractLocaleFromUrl(\n url: string,\n i18nConfig: NextI18nConfig,\n): { locale: string; url: string; hadPrefix: boolean } {\n const pathname = url.split(\"?\")[0];\n const parts = pathname.split(\"/\").filter(Boolean);\n const query = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n\n if (parts.length > 0 && i18nConfig.locales.includes(parts[0])) {\n const locale = parts[0];\n const rest = \"/\" + parts.slice(1).join(\"/\");\n return { locale, url: (rest || \"/\") + query, hadPrefix: true };\n }\n\n return { locale: i18nConfig.defaultLocale, url, hadPrefix: false };\n}\n\n/**\n * Detect the preferred locale from the Accept-Language header.\n * Returns the best matching locale or null.\n */\nexport function detectLocaleFromHeaders(\n req: IncomingMessage,\n i18nConfig: NextI18nConfig,\n): string | null {\n const acceptLang = req.headers[\"accept-language\"];\n if (!acceptLang) return null;\n\n // Parse Accept-Language: en-US,en;q=0.9,fr;q=0.8\n const langs = acceptLang\n .split(\",\")\n .map((part) => {\n const [lang, qPart] = part.trim().split(\";\");\n const q = qPart ? parseFloat(qPart.replace(\"q=\", \"\")) : 1;\n return { lang: lang.trim().toLowerCase(), q };\n })\n .sort((a, b) => b.q - a.q);\n\n for (const { lang } of langs) {\n // Exact match\n const exactMatch = i18nConfig.locales.find((l) => l.toLowerCase() === lang);\n if (exactMatch) return exactMatch;\n\n // Prefix match (e.g. \"en-US\" matches \"en\")\n const prefix = lang.split(\"-\")[0];\n const prefixMatch = i18nConfig.locales.find(\n (l) => l.toLowerCase() === prefix || l.toLowerCase().startsWith(prefix + \"-\"),\n );\n if (prefixMatch) return prefixMatch;\n }\n\n return null;\n}\n\n/**\n * Parse the NEXT_LOCALE cookie from a request.\n * Returns the cookie value if it matches a configured locale, otherwise null.\n */\nexport function parseCookieLocale(\n req: IncomingMessage,\n i18nConfig: NextI18nConfig,\n): string | null {\n const cookieHeader = req.headers.cookie;\n if (!cookieHeader) return null;\n\n // Simple cookie parsing — find NEXT_LOCALE=value\n const match = cookieHeader.match(/(?:^|;\\s*)NEXT_LOCALE=([^;]*)/);\n if (!match) return null;\n\n let value: string;\n try {\n value = decodeURIComponent(match[1].trim());\n } catch {\n return null;\n }\n // Only return if it's a valid configured locale\n if (i18nConfig.locales.includes(value)) return value;\n return null;\n}\n\n/**\n * Create an SSR request handler for the Pages Router.\n *\n * For each request:\n * 1. Match the URL against discovered routes\n * 2. Load the page module via Vite's SSR module loader\n * 3. Call getServerSideProps/getStaticProps if present\n * 4. Render the component to HTML\n * 5. Wrap in _document shell and send response\n */\nexport function createSSRHandler(\n server: ViteDevServer,\n routes: Route[],\n pagesDir: string,\n i18nConfig?: NextI18nConfig | null,\n) {\n return async (\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n /** Status code override — propagated from middleware rewrite status. */\n statusCode?: number,\n ): Promise<void> => {\n // --- i18n: extract locale from URL prefix ---\n let locale: string | undefined;\n let localeStrippedUrl = url;\n\n if (i18nConfig) {\n const parsed = extractLocaleFromUrl(url, i18nConfig);\n locale = parsed.locale;\n localeStrippedUrl = parsed.url;\n\n // If no locale prefix, check NEXT_LOCALE cookie first, then Accept-Language\n if (!parsed.hadPrefix) {\n const cookieLocale = parseCookieLocale(req, i18nConfig);\n if (cookieLocale && cookieLocale !== i18nConfig.defaultLocale) {\n // NEXT_LOCALE cookie overrides Accept-Language — redirect to cookie locale\n const redirectUrl = `/${cookieLocale}${url === \"/\" ? \"\" : url}`;\n res.writeHead(307, { Location: redirectUrl });\n res.end();\n return;\n }\n // If no cookie or cookie matches default, fall through to Accept-Language detection\n if (!cookieLocale && i18nConfig.localeDetection !== false) {\n const detectedLocale = detectLocaleFromHeaders(req, i18nConfig);\n if (detectedLocale && detectedLocale !== i18nConfig.defaultLocale) {\n const redirectUrl = `/${detectedLocale}${url === \"/\" ? \"\" : url}`;\n res.writeHead(307, { Location: redirectUrl });\n res.end();\n return;\n }\n }\n }\n }\n\n const match = matchRoute(localeStrippedUrl, routes);\n\n if (!match) {\n // No route matched — try to render custom 404 page\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n\n const { route, params } = match;\n\n // Wrap the entire request in nested AsyncLocalStorage.run() scopes to\n // ensure per-request isolation for all state modules.\n return runWithRouterState(() =>\n runWithHeadState(() =>\n _runWithCacheState(() =>\n runWithPrivateCache(() =>\n runWithFetchCache(async () => {\n try {\n // Set SSR context for the router shim so useRouter() returns\n // the correct URL and params during server-side rendering.\n const routerShim = await server.ssrLoadModule(\"next/router\");\n if (typeof routerShim.setSSRContext === \"function\") {\n routerShim.setSSRContext({\n pathname: localeStrippedUrl.split(\"?\")[0],\n query: { ...params, ...parseQuery(url) },\n asPath: url,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n });\n }\n\n // Set globalThis locale info for Link component locale prop support during SSR\n if (i18nConfig) {\n (globalThis as any).__VINEXT_LOCALE__ = locale ?? i18nConfig.defaultLocale;\n (globalThis as any).__VINEXT_LOCALES__ = i18nConfig.locales;\n (globalThis as any).__VINEXT_DEFAULT_LOCALE__ = i18nConfig.defaultLocale;\n }\n\n // Load the page module through Vite's SSR pipeline\n // This gives us HMR and transform support for free\n const pageModule = await server.ssrLoadModule(route.filePath);\n\n // Get the page component (default export)\n const PageComponent = pageModule.default;\n if (!PageComponent) {\n console.error(`[vinext] Page ${route.filePath} has no default export`);\n res.statusCode = 500;\n res.end(\"Page has no default export\");\n return;\n }\n\n // Collect page props via data fetching methods\n let pageProps: Record<string, unknown> = {};\n let isrRevalidateSeconds: number | null = null;\n\n // Handle getStaticPaths for dynamic routes: validate the path\n // and respect fallback: false (return 404 for unlisted paths).\n if (typeof pageModule.getStaticPaths === \"function\" && route.isDynamic) {\n const pathsResult = await pageModule.getStaticPaths({\n locales: i18nConfig?.locales ?? [],\n defaultLocale: i18nConfig?.defaultLocale ?? \"\",\n });\n const fallback = pathsResult?.fallback ?? false;\n\n if (fallback === false) {\n // Only allow paths explicitly listed in getStaticPaths\n const paths: Array<{ params: Record<string, string | string[]> }> =\n pathsResult?.paths ?? [];\n const isValidPath = paths.some((p: { params: Record<string, string | string[]> }) => {\n return Object.entries(p.params).every(([key, val]) => {\n const actual = params[key];\n if (Array.isArray(val)) {\n return Array.isArray(actual) && val.join(\"/\") === actual.join(\"/\");\n }\n return String(val) === String(actual);\n });\n });\n\n if (!isValidPath) {\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n }\n // fallback: true or \"blocking\" — always SSR on-demand.\n // In dev mode, Next.js does the same (no fallback shell).\n // In production, both modes SSR on-demand with caching.\n // The difference is that fallback:true could serve a shell first,\n // but since we always have data available via SSR, we render fully.\n }\n\n if (typeof pageModule.getServerSideProps === \"function\") {\n const context = {\n params,\n req,\n res,\n query: parseQuery(url),\n resolvedUrl: localeStrippedUrl,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n };\n const result = await pageModule.getServerSideProps(context);\n if (result && \"props\" in result) {\n pageProps = result.props;\n }\n if (result && \"redirect\" in result) {\n const { redirect } = result;\n const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);\n res.writeHead(status, {\n Location: redirect.destination,\n });\n res.end();\n return;\n }\n if (result && \"notFound\" in result && result.notFound) {\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n }\n // Collect font preloads early so ISR cached responses can include\n // the Link header (font preloads are module-level state that persists\n // across requests after the font modules are first loaded).\n let earlyFontLinkHeader = \"\";\n try {\n const earlyPreloads: Array<{ href: string; type: string }> = [];\n const fontGoogleEarly = await server.ssrLoadModule(\"next/font/google\");\n if (typeof fontGoogleEarly.getSSRFontPreloads === \"function\") {\n earlyPreloads.push(...fontGoogleEarly.getSSRFontPreloads());\n }\n const fontLocalEarly = await server.ssrLoadModule(\"next/font/local\");\n if (typeof fontLocalEarly.getSSRFontPreloads === \"function\") {\n earlyPreloads.push(...fontLocalEarly.getSSRFontPreloads());\n }\n if (earlyPreloads.length > 0) {\n earlyFontLinkHeader = earlyPreloads\n .map((p) => `<${p.href}>; rel=preload; as=font; type=${p.type}; crossorigin`)\n .join(\", \");\n }\n } catch {\n // Font modules not loaded yet — skip\n }\n\n if (typeof pageModule.getStaticProps === \"function\") {\n // Check ISR cache before calling getStaticProps\n const cacheKey = isrCacheKey(\"pages\", url.split(\"?\")[0]);\n const cached = await isrGet(cacheKey);\n\n if (cached && !cached.isStale && cached.value.value?.kind === \"PAGES\") {\n // Fresh cache hit — serve directly\n const cachedPage = cached.value.value as CachedPagesValue;\n const cachedHtml = cachedPage.html;\n const transformedHtml = await server.transformIndexHtml(url, cachedHtml);\n const revalidateSecs = getRevalidateDuration(cacheKey) ?? 60;\n const hitHeaders: Record<string, string> = {\n \"Content-Type\": \"text/html\",\n \"X-Vinext-Cache\": \"HIT\",\n \"Cache-Control\": `s-maxage=${revalidateSecs}, stale-while-revalidate`,\n };\n if (earlyFontLinkHeader) hitHeaders[\"Link\"] = earlyFontLinkHeader;\n res.writeHead(200, hitHeaders);\n res.end(transformedHtml);\n return;\n }\n\n if (cached && cached.isStale && cached.value.value?.kind === \"PAGES\") {\n // Stale hit — serve stale immediately, trigger background regen\n const cachedPage = cached.value.value as CachedPagesValue;\n const cachedHtml = cachedPage.html;\n const transformedHtml = await server.transformIndexHtml(url, cachedHtml);\n\n // Trigger background regeneration: re-run getStaticProps and\n // update the cache so the next request is a HIT with fresh data.\n triggerBackgroundRegeneration(cacheKey, async () => {\n const freshResult = await pageModule.getStaticProps({ params });\n if (freshResult && \"props\" in freshResult) {\n const revalidate = typeof freshResult.revalidate === \"number\" ? freshResult.revalidate : 0;\n if (revalidate > 0) {\n await isrSet(cacheKey, buildPagesCacheValue(cachedHtml, freshResult.props), revalidate);\n }\n }\n });\n\n const revalidateSecs = getRevalidateDuration(cacheKey) ?? 60;\n const staleHeaders: Record<string, string> = {\n \"Content-Type\": \"text/html\",\n \"X-Vinext-Cache\": \"STALE\",\n \"Cache-Control\": `s-maxage=${revalidateSecs}, stale-while-revalidate`,\n };\n if (earlyFontLinkHeader) staleHeaders[\"Link\"] = earlyFontLinkHeader;\n res.writeHead(200, staleHeaders);\n res.end(transformedHtml);\n return;\n }\n\n // Cache miss — call getStaticProps normally\n const context = {\n params,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n };\n const result = await pageModule.getStaticProps(context);\n if (result && \"props\" in result) {\n pageProps = result.props;\n }\n if (result && \"redirect\" in result) {\n const { redirect } = result;\n const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);\n res.writeHead(status, {\n Location: redirect.destination,\n });\n res.end();\n return;\n }\n if (result && \"notFound\" in result && result.notFound) {\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n\n // Extract revalidate period for ISR caching after render\n if (typeof result?.revalidate === \"number\" && result.revalidate > 0) {\n isrRevalidateSeconds = result.revalidate;\n }\n }\n\n // Try to load _app.tsx if it exists\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let AppComponent: any = null;\n const appPath = path.join(pagesDir, \"_app\");\n if (findFileWithExtensions(appPath)) {\n try {\n const appModule = await server.ssrLoadModule(appPath);\n AppComponent = appModule.default ?? null;\n } catch {\n // _app exists but failed to load\n }\n }\n\n // React and ReactDOMServer are imported at the top level as native Node\n // modules. They must NOT go through Vite's SSR module runner because\n // React is CJS and the ESModulesEvaluator doesn't define `module`.\n const createElement = React.createElement;\n let element: React.ReactElement;\n\n if (AppComponent) {\n element = createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } else {\n element = createElement(PageComponent, pageProps);\n }\n\n // Reset SSR head collector before rendering so <Head> tags are captured\n const headShim = await server.ssrLoadModule(\"next/head\");\n if (typeof headShim.resetSSRHead === \"function\") {\n headShim.resetSSRHead();\n }\n\n // Flush any pending dynamic() preloads so components are ready\n const dynamicShim = await server.ssrLoadModule(\"next/dynamic\");\n if (typeof dynamicShim.flushPreloads === \"function\") {\n await dynamicShim.flushPreloads();\n }\n\n // Collect any <Head> tags that were rendered during data fetching\n // (shell head tags — Suspense children's head tags arrive late,\n // matching Next.js behavior)\n\n // Collect SSR font links (Google Fonts <link> tags) and font class styles\n let fontHeadHTML = \"\";\n const allFontStyles: string[] = [];\n const allFontPreloads: Array<{ href: string; type: string }> = [];\n try {\n const fontGoogle = await server.ssrLoadModule(\"next/font/google\");\n if (typeof fontGoogle.getSSRFontLinks === \"function\") {\n const fontUrls = fontGoogle.getSSRFontLinks();\n for (const fontUrl of fontUrls) {\n const safeFontUrl = fontUrl.replace(/&/g, \"&\").replace(/\"/g, \""\");\n fontHeadHTML += `<link rel=\"stylesheet\" href=\"${safeFontUrl}\" />\\n `;\n }\n }\n if (typeof fontGoogle.getSSRFontStyles === \"function\") {\n allFontStyles.push(...fontGoogle.getSSRFontStyles());\n }\n // Collect preloads from self-hosted Google fonts\n if (typeof fontGoogle.getSSRFontPreloads === \"function\") {\n allFontPreloads.push(...fontGoogle.getSSRFontPreloads());\n }\n } catch {\n // next/font/google not used — skip\n }\n try {\n const fontLocal = await server.ssrLoadModule(\"next/font/local\");\n if (typeof fontLocal.getSSRFontStyles === \"function\") {\n allFontStyles.push(...fontLocal.getSSRFontStyles());\n }\n // Collect preloads from local font files\n if (typeof fontLocal.getSSRFontPreloads === \"function\") {\n allFontPreloads.push(...fontLocal.getSSRFontPreloads());\n }\n } catch {\n // next/font/local not used — skip\n }\n // Emit <link rel=\"preload\"> for all collected font files (Google + local)\n for (const { href, type } of allFontPreloads) {\n // Escape href/type to prevent HTML attribute injection (defense-in-depth;\n // Vite-resolved asset paths should never contain special chars).\n const safeHref = href.replace(/&/g, \"&\").replace(/\"/g, \""\");\n const safeType = type.replace(/&/g, \"&\").replace(/\"/g, \""\");\n fontHeadHTML += `<link rel=\"preload\" href=\"${safeHref}\" as=\"font\" type=\"${safeType}\" crossorigin />\\n `;\n }\n if (allFontStyles.length > 0) {\n fontHeadHTML += `<style data-vinext-fonts>${allFontStyles.join(\"\\n\")}</style>\\n `;\n }\n\n // Convert absolute file paths to Vite-servable URLs (relative to root)\n const viteRoot = server.config.root;\n const pageModuleUrl = \"/\" + path.relative(viteRoot, route.filePath);\n const appModuleUrl = AppComponent\n ? \"/\" + path.relative(viteRoot, path.join(pagesDir, \"_app\"))\n : null;\n\n // Hydration entry: inline script that imports the page and hydrates.\n // Stores the React root and page loader for client-side navigation.\n const hydrationScript = `\n<script type=\"module\">\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\n\nconst nextData = window.__NEXT_DATA__;\nconst { pageProps } = nextData.props;\n\nasync function hydrate() {\n const pageModule = await import(\"${pageModuleUrl}\");\n const PageComponent = pageModule.default;\n let element;\n ${\n appModuleUrl\n ? `\n const appModule = await import(\"${appModuleUrl}\");\n const AppComponent = appModule.default;\n window.__VINEXT_APP__ = AppComponent;\n element = React.createElement(AppComponent, { Component: PageComponent, pageProps });\n `\n : `\n element = React.createElement(PageComponent, pageProps);\n `\n }\n const root = hydrateRoot(document.getElementById(\"__next\"), element);\n window.__VINEXT_ROOT__ = root;\n}\nhydrate();\n</script>`;\n\n const nextDataScript = `<script>window.__NEXT_DATA__ = ${safeJsonStringify({\n props: { pageProps },\n page: patternToNextFormat(route.pattern),\n query: params,\n isFallback: false,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n // Include module URLs so client navigation can import pages directly\n __vinext: {\n pageModuleUrl,\n appModuleUrl,\n },\n })}${i18nConfig ? `;window.__VINEXT_LOCALE__=${safeJsonStringify(locale ?? i18nConfig.defaultLocale)};window.__VINEXT_LOCALES__=${safeJsonStringify(i18nConfig.locales)};window.__VINEXT_DEFAULT_LOCALE__=${safeJsonStringify(i18nConfig.defaultLocale)}` : \"\"}</script>`;\n\n // Try to load custom _document.tsx\n const docPath = path.join(pagesDir, \"_document\");\n let DocumentComponent: any = null;\n if (findFileWithExtensions(docPath)) {\n try {\n const docModule = await server.ssrLoadModule(docPath);\n DocumentComponent = docModule.default ?? null;\n } catch {\n // _document exists but failed to load\n }\n }\n\n const allScripts = `${nextDataScript}\\n ${hydrationScript}`;\n\n // Build cache headers for ISR responses\n const extraHeaders: Record<string, string> = {};\n if (isrRevalidateSeconds) {\n extraHeaders[\"Cache-Control\"] = `s-maxage=${isrRevalidateSeconds}, stale-while-revalidate`;\n extraHeaders[\"X-Vinext-Cache\"] = \"MISS\";\n }\n\n // Set HTTP Link header for font preloading.\n // This lets the browser (and CDN) start fetching font files before parsing HTML.\n if (allFontPreloads.length > 0) {\n extraHeaders[\"Link\"] = allFontPreloads\n .map((p) => `<${p.href}>; rel=preload; as=font; type=${p.type}; crossorigin`)\n .join(\", \");\n }\n\n // Stream the page using progressive SSR.\n // The shell (layouts, non-suspended content) arrives immediately.\n // Suspense content streams in as it resolves.\n await streamPageToResponse(res, element, {\n url,\n server,\n fontHeadHTML,\n scripts: allScripts,\n DocumentComponent,\n statusCode,\n extraHeaders,\n // Collect head HTML AFTER the shell renders (inside streamPageToResponse,\n // after renderToReadableStream resolves). Head tags from Suspense\n // children arrive late — this matches Next.js behavior.\n getHeadHTML: () => typeof headShim.getSSRHeadHTML === \"function\"\n ? headShim.getSSRHeadHTML()\n : \"\",\n });\n\n // Clear SSR context after rendering\n if (typeof routerShim.setSSRContext === \"function\") {\n routerShim.setSSRContext(null);\n }\n\n // If ISR is enabled, we need the full HTML for caching.\n // For ISR, re-render synchronously to get the complete HTML string.\n // This runs after the stream is already sent, so it doesn't affect TTFB.\n if (isrRevalidateSeconds !== null && isrRevalidateSeconds > 0) {\n const isrElement = AppComponent\n ? createElement(AppComponent, { Component: pageModule.default, pageProps })\n : createElement(pageModule.default, pageProps);\n const isrBodyHtml = await renderToStringAsync(isrElement);\n const isrHtml = `<!DOCTYPE html><html><head></head><body><div id=\"__next\">${isrBodyHtml}</div>${allScripts}</body></html>`;\n const cacheKey = isrCacheKey(\"pages\", url.split(\"?\")[0]);\n await isrSet(\n cacheKey,\n buildPagesCacheValue(isrHtml, pageProps),\n isrRevalidateSeconds,\n );\n setRevalidateDuration(cacheKey, isrRevalidateSeconds);\n }\n } catch (e) {\n // Let Vite fix the stack trace for better dev experience\n server.ssrFixStacktrace(e as Error);\n console.error(e);\n // Report error via instrumentation hook if registered\n reportRequestError(\n e instanceof Error ? e : new Error(String(e)),\n {\n path: url,\n method: req.method ?? \"GET\",\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v.join(\", \") : String(v ?? \"\")]),\n ),\n },\n { routerKind: \"Pages Router\", routePath: route.pattern, routeType: \"render\" },\n ).catch(() => { /* ignore reporting errors */ });\n // Try to render custom 500 error page\n try {\n await renderErrorPage(server, req, res, url, pagesDir, 500);\n } catch (fallbackErr) {\n // If error page itself fails, fall back to plain text.\n // This is a dev-only code path (prod uses prod-server.ts), so\n // include the error message for debugging.\n res.statusCode = 500;\n res.end(`Internal Server Error: ${(fallbackErr as Error).message}`);\n }\n } finally {\n // Cleanup is handled by ALS scope unwinding —\n // each runWith*() scope is automatically cleaned up when it exits.\n }\n }) // end runWithFetchCache\n ) // end runWithPrivateCache\n ) // end _runWithCacheState\n ) // end runWithHeadState\n ); // end runWithRouterState\n };\n}\n\n/**\n * Render a custom error page (404.tsx, 500.tsx, or _error.tsx).\n *\n * Next.js resolution order:\n * - 404: pages/404.tsx -> pages/_error.tsx -> default\n * - 500: pages/500.tsx -> pages/_error.tsx -> default\n * - other: pages/_error.tsx -> default\n */\nasync function renderErrorPage(\n server: ViteDevServer,\n _req: IncomingMessage,\n res: ServerResponse,\n url: string,\n pagesDir: string,\n statusCode: number,\n): Promise<void> {\n // Try specific status page first, then _error, then fallback\n const candidates =\n statusCode === 404\n ? [\"404\", \"_error\"]\n : statusCode === 500\n ? [\"500\", \"_error\"]\n : [\"_error\"];\n\n for (const candidate of candidates) {\n try {\n const candidatePath = path.join(pagesDir, candidate);\n if (!findFileWithExtensions(candidatePath)) continue;\n\n const errorModule = await server.ssrLoadModule(candidatePath);\n const ErrorComponent = errorModule.default;\n if (!ErrorComponent) continue;\n\n // Try to load _app.tsx to wrap the error page\n let AppComponent: any = null;\n const appPathErr = path.join(pagesDir, \"_app\");\n if (findFileWithExtensions(appPathErr)) {\n try {\n const appModule = await server.ssrLoadModule(appPathErr);\n AppComponent = appModule.default ?? null;\n } catch {\n // _app exists but failed to load\n }\n }\n\n const createElement = React.createElement;\n const errorProps = { statusCode };\n\n let element: React.ReactElement;\n if (AppComponent) {\n element = createElement(AppComponent, {\n Component: ErrorComponent,\n pageProps: errorProps,\n });\n } else {\n element = createElement(ErrorComponent, errorProps);\n }\n\n const bodyHtml = await renderToStringAsync(element);\n\n // Try custom _document\n let html: string;\n let DocumentComponent: any = null;\n const docPathErr = path.join(pagesDir, \"_document\");\n if (findFileWithExtensions(docPathErr)) {\n try {\n const docModule = await server.ssrLoadModule(docPathErr);\n DocumentComponent = docModule.default ?? null;\n } catch {\n // _document exists but failed to load\n }\n }\n\n if (DocumentComponent) {\n const docElement = createElement(DocumentComponent);\n let docHtml = await renderToStringAsync(docElement);\n docHtml = docHtml.replace(\"__NEXT_MAIN__\", bodyHtml);\n docHtml = docHtml.replace(\"<!-- __NEXT_SCRIPTS__ -->\", \"\");\n html = docHtml;\n } else {\n html = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n</head>\n<body>\n <div id=\"__next\">${bodyHtml}</div>\n</body>\n</html>`;\n }\n\n const transformedHtml = await server.transformIndexHtml(url, html);\n res.writeHead(statusCode, { \"Content-Type\": \"text/html\" });\n res.end(transformedHtml);\n return;\n } catch {\n // This candidate doesn't exist, try next\n continue;\n }\n }\n\n // No custom error page found — use plain text fallback\n res.writeHead(statusCode, { \"Content-Type\": \"text/plain\" });\n res.end(`${statusCode} - ${statusCode === 404 ? \"Page not found\" : \"Internal Server Error\"}`);\n}\n\n\n"]}
|
|
1
|
+
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/server/dev-server.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ViteDevServer } from \"vite\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport type { Route } from \"../routing/pages-router.js\";\nimport { matchRoute, patternToNextFormat } from \"../routing/pages-router.js\";\nimport type { NextI18nConfig } from \"../config/next-config.js\";\nimport {\n isrGet,\n isrSet,\n isrCacheKey,\n buildPagesCacheValue,\n triggerBackgroundRegeneration,\n setRevalidateDuration,\n getRevalidateDuration,\n} from \"./isr-cache.js\";\nimport type { CachedPagesValue } from \"../shims/cache.js\";\nimport { runWithFetchCache } from \"../shims/fetch-cache.js\";\nimport { _runWithCacheState } from \"../shims/cache.js\";\nimport { runWithPrivateCache } from \"../shims/cache-runtime.js\";\n// Import server-only state modules to register ALS-backed accessors.\n// These modules must be imported before any rendering occurs.\nimport { runWithRouterState } from \"../shims/router-state.js\";\nimport { runWithHeadState } from \"../shims/head-state.js\";\nimport { reportRequestError } from \"./instrumentation.js\";\nimport { safeJsonStringify } from \"./html.js\";\nimport { parseQueryString as parseQuery } from \"../utils/query.js\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport React from \"react\";\nimport { renderToReadableStream } from \"react-dom/server.edge\";\n\nconst PAGE_EXTENSIONS = [\".tsx\", \".ts\", \".jsx\", \".js\"];\n\n/**\n * Render a React element to a string using renderToReadableStream.\n *\n * Uses the edge-compatible Web Streams API. Waits for all Suspense\n * boundaries to resolve via stream.allReady before collecting output.\n * Used for _document rendering and error pages (small, non-streaming).\n */\nasync function renderToStringAsync(element: React.ReactElement): Promise<string> {\n const stream = await renderToReadableStream(element);\n await stream.allReady;\n return new Response(stream).text();\n}\n\n/** Body placeholder used to split the document shell for streaming. */\nconst STREAM_BODY_MARKER = \"<!--VINEXT_STREAM_BODY-->\";\n\n/**\n * Stream a Pages Router page response using progressive SSR.\n *\n * Sends the HTML shell (head, layout, Suspense fallbacks) immediately\n * when the React shell is ready, then streams Suspense content as it\n * resolves. This gives the browser content to render while slow data\n * loads are still in flight.\n *\n * `__NEXT_DATA__` and the hydration script are appended after the body\n * stream completes (the data is known before rendering starts, but\n * deferring them reduces TTFB and lets the browser start parsing the\n * shell sooner).\n */\nasync function streamPageToResponse(\n res: ServerResponse,\n element: React.ReactElement,\n options: {\n url: string;\n server: ViteDevServer;\n fontHeadHTML: string;\n scripts: string;\n DocumentComponent: React.ComponentType | null;\n statusCode?: number;\n extraHeaders?: Record<string, string>;\n /** Called after renderToReadableStream resolves (shell ready) to collect head HTML */\n getHeadHTML: () => string;\n },\n): Promise<void> {\n const {\n url,\n server,\n fontHeadHTML,\n scripts,\n DocumentComponent,\n statusCode = 200,\n extraHeaders,\n getHeadHTML,\n } = options;\n\n // Start the React body stream FIRST — the promise resolves when the\n // shell is ready (synchronous content outside Suspense boundaries).\n // This triggers the render which populates <Head> tags.\n const bodyStream = await renderToReadableStream(element);\n\n // Now that the shell has rendered, collect head HTML\n const headHTML = getHeadHTML();\n\n // Build the document shell with a placeholder for the body\n let shellTemplate: string;\n\n if (DocumentComponent) {\n const docElement = React.createElement(DocumentComponent);\n let docHtml = await renderToStringAsync(docElement);\n // Replace __NEXT_MAIN__ with our stream marker\n docHtml = docHtml.replace(\"__NEXT_MAIN__\", STREAM_BODY_MARKER);\n // Inject head tags\n if (headHTML || fontHeadHTML) {\n docHtml = docHtml.replace(\"</head>\", ` ${fontHeadHTML}${headHTML}\\n</head>`);\n }\n // Inject scripts: replace placeholder or append before </body>\n docHtml = docHtml.replace(\"<!-- __NEXT_SCRIPTS__ -->\", scripts);\n if (!docHtml.includes(\"__NEXT_DATA__\")) {\n docHtml = docHtml.replace(\"</body>\", ` ${scripts}\\n</body>`);\n }\n shellTemplate = docHtml;\n } else {\n shellTemplate = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n ${fontHeadHTML}${headHTML}\n</head>\n<body>\n <div id=\"__next\">${STREAM_BODY_MARKER}</div>\n ${scripts}\n</body>\n</html>`;\n }\n\n // Apply Vite's HTML transforms (injects HMR client, etc.) on the full\n // shell template, then split at the body marker.\n const transformedShell = await server.transformIndexHtml(url, shellTemplate);\n const markerIdx = transformedShell.indexOf(STREAM_BODY_MARKER);\n const prefix = transformedShell.slice(0, markerIdx);\n const suffix = transformedShell.slice(markerIdx + STREAM_BODY_MARKER.length);\n\n // Send headers and start streaming\n const headers: Record<string, string> = {\n \"Content-Type\": \"text/html\",\n \"Transfer-Encoding\": \"chunked\",\n ...extraHeaders,\n };\n res.writeHead(statusCode, headers);\n\n // Write the document prefix (head, opening body)\n res.write(prefix);\n\n // Pipe the React body stream through (Suspense content streams progressively)\n const reader = bodyStream.getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(value);\n }\n } finally {\n reader.releaseLock();\n }\n\n // Write the document suffix (closing tags, scripts)\n res.end(suffix);\n}\n\n/** Check if a file exists with any page extension (tsx, ts, jsx, js). */\nfunction findFileWithExtensions(basePath: string): boolean {\n return PAGE_EXTENSIONS.some((ext) => fs.existsSync(basePath + ext));\n}\n\n/**\n * Extract locale prefix from a URL path.\n * e.g. /fr/about -> { locale: \"fr\", url: \"/about\", hadPrefix: true }\n * /about -> { locale: \"en\", url: \"/about\", hadPrefix: false } (defaultLocale)\n */\nexport function extractLocaleFromUrl(\n url: string,\n i18nConfig: NextI18nConfig,\n): { locale: string; url: string; hadPrefix: boolean } {\n const pathname = url.split(\"?\")[0];\n const parts = pathname.split(\"/\").filter(Boolean);\n const query = url.includes(\"?\") ? url.slice(url.indexOf(\"?\")) : \"\";\n\n if (parts.length > 0 && i18nConfig.locales.includes(parts[0])) {\n const locale = parts[0];\n const rest = \"/\" + parts.slice(1).join(\"/\");\n return { locale, url: (rest || \"/\") + query, hadPrefix: true };\n }\n\n return { locale: i18nConfig.defaultLocale, url, hadPrefix: false };\n}\n\n/**\n * Detect the preferred locale from the Accept-Language header.\n * Returns the best matching locale or null.\n */\nexport function detectLocaleFromHeaders(\n req: IncomingMessage,\n i18nConfig: NextI18nConfig,\n): string | null {\n const acceptLang = req.headers[\"accept-language\"];\n if (!acceptLang) return null;\n\n // Parse Accept-Language: en-US,en;q=0.9,fr;q=0.8\n const langs = acceptLang\n .split(\",\")\n .map((part) => {\n const [lang, qPart] = part.trim().split(\";\");\n const q = qPart ? parseFloat(qPart.replace(\"q=\", \"\")) : 1;\n return { lang: lang.trim().toLowerCase(), q };\n })\n .sort((a, b) => b.q - a.q);\n\n for (const { lang } of langs) {\n // Exact match\n const exactMatch = i18nConfig.locales.find((l) => l.toLowerCase() === lang);\n if (exactMatch) return exactMatch;\n\n // Prefix match (e.g. \"en-US\" matches \"en\")\n const prefix = lang.split(\"-\")[0];\n const prefixMatch = i18nConfig.locales.find(\n (l) => l.toLowerCase() === prefix || l.toLowerCase().startsWith(prefix + \"-\"),\n );\n if (prefixMatch) return prefixMatch;\n }\n\n return null;\n}\n\n/**\n * Parse the NEXT_LOCALE cookie from a request.\n * Returns the cookie value if it matches a configured locale, otherwise null.\n */\nexport function parseCookieLocale(\n req: IncomingMessage,\n i18nConfig: NextI18nConfig,\n): string | null {\n const cookieHeader = req.headers.cookie;\n if (!cookieHeader) return null;\n\n // Simple cookie parsing — find NEXT_LOCALE=value\n const match = cookieHeader.match(/(?:^|;\\s*)NEXT_LOCALE=([^;]*)/);\n if (!match) return null;\n\n let value: string;\n try {\n value = decodeURIComponent(match[1].trim());\n } catch {\n return null;\n }\n // Only return if it's a valid configured locale\n if (i18nConfig.locales.includes(value)) return value;\n return null;\n}\n\n/**\n * Create an SSR request handler for the Pages Router.\n *\n * For each request:\n * 1. Match the URL against discovered routes\n * 2. Load the page module via Vite's SSR module loader\n * 3. Call getServerSideProps/getStaticProps if present\n * 4. Render the component to HTML\n * 5. Wrap in _document shell and send response\n */\nexport function createSSRHandler(\n server: ViteDevServer,\n routes: Route[],\n pagesDir: string,\n i18nConfig?: NextI18nConfig | null,\n) {\n return async (\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n /** Status code override — propagated from middleware rewrite status. */\n statusCode?: number,\n ): Promise<void> => {\n // --- i18n: extract locale from URL prefix ---\n let locale: string | undefined;\n let localeStrippedUrl = url;\n\n if (i18nConfig) {\n const parsed = extractLocaleFromUrl(url, i18nConfig);\n locale = parsed.locale;\n localeStrippedUrl = parsed.url;\n\n // If no locale prefix, check NEXT_LOCALE cookie first, then Accept-Language\n if (!parsed.hadPrefix) {\n const cookieLocale = parseCookieLocale(req, i18nConfig);\n if (cookieLocale && cookieLocale !== i18nConfig.defaultLocale) {\n // NEXT_LOCALE cookie overrides Accept-Language — redirect to cookie locale\n const redirectUrl = `/${cookieLocale}${url === \"/\" ? \"\" : url}`;\n res.writeHead(307, { Location: redirectUrl });\n res.end();\n return;\n }\n // If no cookie or cookie matches default, fall through to Accept-Language detection\n if (!cookieLocale && i18nConfig.localeDetection !== false) {\n const detectedLocale = detectLocaleFromHeaders(req, i18nConfig);\n if (detectedLocale && detectedLocale !== i18nConfig.defaultLocale) {\n const redirectUrl = `/${detectedLocale}${url === \"/\" ? \"\" : url}`;\n res.writeHead(307, { Location: redirectUrl });\n res.end();\n return;\n }\n }\n }\n }\n\n const match = matchRoute(localeStrippedUrl, routes);\n\n if (!match) {\n // No route matched — try to render custom 404 page\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n\n const { route, params } = match;\n\n // Wrap the entire request in nested AsyncLocalStorage.run() scopes to\n // ensure per-request isolation for all state modules.\n return runWithRouterState(() =>\n runWithHeadState(() =>\n _runWithCacheState(() =>\n runWithPrivateCache(() =>\n runWithFetchCache(async () => {\n try {\n // Set SSR context for the router shim so useRouter() returns\n // the correct URL and params during server-side rendering.\n const routerShim = await server.ssrLoadModule(\"next/router\");\n if (typeof routerShim.setSSRContext === \"function\") {\n routerShim.setSSRContext({\n pathname: localeStrippedUrl.split(\"?\")[0],\n query: { ...params, ...parseQuery(url) },\n asPath: url,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n });\n }\n\n // Set globalThis locale info for Link component locale prop support during SSR\n if (i18nConfig) {\n (globalThis as any).__VINEXT_LOCALE__ = locale ?? i18nConfig.defaultLocale;\n (globalThis as any).__VINEXT_LOCALES__ = i18nConfig.locales;\n (globalThis as any).__VINEXT_DEFAULT_LOCALE__ = i18nConfig.defaultLocale;\n }\n\n // Load the page module through Vite's SSR pipeline\n // This gives us HMR and transform support for free\n const pageModule = await server.ssrLoadModule(route.filePath);\n\n // Get the page component (default export)\n const PageComponent = pageModule.default;\n if (!PageComponent) {\n console.error(`[vinext] Page ${route.filePath} has no default export`);\n res.statusCode = 500;\n res.end(\"Page has no default export\");\n return;\n }\n\n // Collect page props via data fetching methods\n let pageProps: Record<string, unknown> = {};\n let isrRevalidateSeconds: number | null = null;\n\n // Handle getStaticPaths for dynamic routes: validate the path\n // and respect fallback: false (return 404 for unlisted paths).\n if (typeof pageModule.getStaticPaths === \"function\" && route.isDynamic) {\n const pathsResult = await pageModule.getStaticPaths({\n locales: i18nConfig?.locales ?? [],\n defaultLocale: i18nConfig?.defaultLocale ?? \"\",\n });\n const fallback = pathsResult?.fallback ?? false;\n\n if (fallback === false) {\n // Only allow paths explicitly listed in getStaticPaths\n const paths: Array<{ params: Record<string, string | string[]> }> =\n pathsResult?.paths ?? [];\n const isValidPath = paths.some((p: { params: Record<string, string | string[]> }) => {\n return Object.entries(p.params).every(([key, val]) => {\n const actual = params[key];\n if (Array.isArray(val)) {\n return Array.isArray(actual) && val.join(\"/\") === actual.join(\"/\");\n }\n return String(val) === String(actual);\n });\n });\n\n if (!isValidPath) {\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n }\n // fallback: true or \"blocking\" — always SSR on-demand.\n // In dev mode, Next.js does the same (no fallback shell).\n // In production, both modes SSR on-demand with caching.\n // The difference is that fallback:true could serve a shell first,\n // but since we always have data available via SSR, we render fully.\n }\n\n if (typeof pageModule.getServerSideProps === \"function\") {\n const context = {\n params,\n req,\n res,\n query: parseQuery(url),\n resolvedUrl: localeStrippedUrl,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n };\n const result = await pageModule.getServerSideProps(context);\n if (result && \"props\" in result) {\n pageProps = result.props;\n }\n if (result && \"redirect\" in result) {\n const { redirect } = result;\n const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);\n // Sanitize destination to prevent open redirect via protocol-relative URLs.\n // Also normalize backslashes — browsers treat \\ as / in URL contexts.\n let dest = redirect.destination;\n if (!dest.startsWith(\"http://\") && !dest.startsWith(\"https://\")) {\n dest = dest.replace(/^[\\\\/]+/, \"/\");\n }\n res.writeHead(status, {\n Location: dest,\n });\n res.end();\n return;\n }\n if (result && \"notFound\" in result && result.notFound) {\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n }\n // Collect font preloads early so ISR cached responses can include\n // the Link header (font preloads are module-level state that persists\n // across requests after the font modules are first loaded).\n let earlyFontLinkHeader = \"\";\n try {\n const earlyPreloads: Array<{ href: string; type: string }> = [];\n const fontGoogleEarly = await server.ssrLoadModule(\"next/font/google\");\n if (typeof fontGoogleEarly.getSSRFontPreloads === \"function\") {\n earlyPreloads.push(...fontGoogleEarly.getSSRFontPreloads());\n }\n const fontLocalEarly = await server.ssrLoadModule(\"next/font/local\");\n if (typeof fontLocalEarly.getSSRFontPreloads === \"function\") {\n earlyPreloads.push(...fontLocalEarly.getSSRFontPreloads());\n }\n if (earlyPreloads.length > 0) {\n earlyFontLinkHeader = earlyPreloads\n .map((p) => `<${p.href}>; rel=preload; as=font; type=${p.type}; crossorigin`)\n .join(\", \");\n }\n } catch {\n // Font modules not loaded yet — skip\n }\n\n if (typeof pageModule.getStaticProps === \"function\") {\n // Check ISR cache before calling getStaticProps\n const cacheKey = isrCacheKey(\"pages\", url.split(\"?\")[0]);\n const cached = await isrGet(cacheKey);\n\n if (cached && !cached.isStale && cached.value.value?.kind === \"PAGES\") {\n // Fresh cache hit — serve directly\n const cachedPage = cached.value.value as CachedPagesValue;\n const cachedHtml = cachedPage.html;\n const transformedHtml = await server.transformIndexHtml(url, cachedHtml);\n const revalidateSecs = getRevalidateDuration(cacheKey) ?? 60;\n const hitHeaders: Record<string, string> = {\n \"Content-Type\": \"text/html\",\n \"X-Vinext-Cache\": \"HIT\",\n \"Cache-Control\": `s-maxage=${revalidateSecs}, stale-while-revalidate`,\n };\n if (earlyFontLinkHeader) hitHeaders[\"Link\"] = earlyFontLinkHeader;\n res.writeHead(200, hitHeaders);\n res.end(transformedHtml);\n return;\n }\n\n if (cached && cached.isStale && cached.value.value?.kind === \"PAGES\") {\n // Stale hit — serve stale immediately, trigger background regen\n const cachedPage = cached.value.value as CachedPagesValue;\n const cachedHtml = cachedPage.html;\n const transformedHtml = await server.transformIndexHtml(url, cachedHtml);\n\n // Trigger background regeneration: re-run getStaticProps and\n // update the cache so the next request is a HIT with fresh data.\n triggerBackgroundRegeneration(cacheKey, async () => {\n const freshResult = await pageModule.getStaticProps({ params });\n if (freshResult && \"props\" in freshResult) {\n const revalidate = typeof freshResult.revalidate === \"number\" ? freshResult.revalidate : 0;\n if (revalidate > 0) {\n await isrSet(cacheKey, buildPagesCacheValue(cachedHtml, freshResult.props), revalidate);\n }\n }\n });\n\n const revalidateSecs = getRevalidateDuration(cacheKey) ?? 60;\n const staleHeaders: Record<string, string> = {\n \"Content-Type\": \"text/html\",\n \"X-Vinext-Cache\": \"STALE\",\n \"Cache-Control\": `s-maxage=${revalidateSecs}, stale-while-revalidate`,\n };\n if (earlyFontLinkHeader) staleHeaders[\"Link\"] = earlyFontLinkHeader;\n res.writeHead(200, staleHeaders);\n res.end(transformedHtml);\n return;\n }\n\n // Cache miss — call getStaticProps normally\n const context = {\n params,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n };\n const result = await pageModule.getStaticProps(context);\n if (result && \"props\" in result) {\n pageProps = result.props;\n }\n if (result && \"redirect\" in result) {\n const { redirect } = result;\n const status = redirect.statusCode ?? (redirect.permanent ? 308 : 307);\n // Sanitize destination to prevent open redirect via protocol-relative URLs.\n // Also normalize backslashes — browsers treat \\ as / in URL contexts.\n let dest = redirect.destination;\n if (!dest.startsWith(\"http://\") && !dest.startsWith(\"https://\")) {\n dest = dest.replace(/^[\\\\/]+/, \"/\");\n }\n res.writeHead(status, {\n Location: dest,\n });\n res.end();\n return;\n }\n if (result && \"notFound\" in result && result.notFound) {\n await renderErrorPage(server, req, res, url, pagesDir, 404);\n return;\n }\n\n // Extract revalidate period for ISR caching after render\n if (typeof result?.revalidate === \"number\" && result.revalidate > 0) {\n isrRevalidateSeconds = result.revalidate;\n }\n }\n\n // Try to load _app.tsx if it exists\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let AppComponent: any = null;\n const appPath = path.join(pagesDir, \"_app\");\n if (findFileWithExtensions(appPath)) {\n try {\n const appModule = await server.ssrLoadModule(appPath);\n AppComponent = appModule.default ?? null;\n } catch {\n // _app exists but failed to load\n }\n }\n\n // React and ReactDOMServer are imported at the top level as native Node\n // modules. They must NOT go through Vite's SSR module runner because\n // React is CJS and the ESModulesEvaluator doesn't define `module`.\n const createElement = React.createElement;\n let element: React.ReactElement;\n\n if (AppComponent) {\n element = createElement(AppComponent, {\n Component: PageComponent,\n pageProps,\n });\n } else {\n element = createElement(PageComponent, pageProps);\n }\n\n // Reset SSR head collector before rendering so <Head> tags are captured\n const headShim = await server.ssrLoadModule(\"next/head\");\n if (typeof headShim.resetSSRHead === \"function\") {\n headShim.resetSSRHead();\n }\n\n // Flush any pending dynamic() preloads so components are ready\n const dynamicShim = await server.ssrLoadModule(\"next/dynamic\");\n if (typeof dynamicShim.flushPreloads === \"function\") {\n await dynamicShim.flushPreloads();\n }\n\n // Collect any <Head> tags that were rendered during data fetching\n // (shell head tags — Suspense children's head tags arrive late,\n // matching Next.js behavior)\n\n // Collect SSR font links (Google Fonts <link> tags) and font class styles\n let fontHeadHTML = \"\";\n const allFontStyles: string[] = [];\n const allFontPreloads: Array<{ href: string; type: string }> = [];\n try {\n const fontGoogle = await server.ssrLoadModule(\"next/font/google\");\n if (typeof fontGoogle.getSSRFontLinks === \"function\") {\n const fontUrls = fontGoogle.getSSRFontLinks();\n for (const fontUrl of fontUrls) {\n const safeFontUrl = fontUrl.replace(/&/g, \"&\").replace(/\"/g, \""\");\n fontHeadHTML += `<link rel=\"stylesheet\" href=\"${safeFontUrl}\" />\\n `;\n }\n }\n if (typeof fontGoogle.getSSRFontStyles === \"function\") {\n allFontStyles.push(...fontGoogle.getSSRFontStyles());\n }\n // Collect preloads from self-hosted Google fonts\n if (typeof fontGoogle.getSSRFontPreloads === \"function\") {\n allFontPreloads.push(...fontGoogle.getSSRFontPreloads());\n }\n } catch {\n // next/font/google not used — skip\n }\n try {\n const fontLocal = await server.ssrLoadModule(\"next/font/local\");\n if (typeof fontLocal.getSSRFontStyles === \"function\") {\n allFontStyles.push(...fontLocal.getSSRFontStyles());\n }\n // Collect preloads from local font files\n if (typeof fontLocal.getSSRFontPreloads === \"function\") {\n allFontPreloads.push(...fontLocal.getSSRFontPreloads());\n }\n } catch {\n // next/font/local not used — skip\n }\n // Emit <link rel=\"preload\"> for all collected font files (Google + local)\n for (const { href, type } of allFontPreloads) {\n // Escape href/type to prevent HTML attribute injection (defense-in-depth;\n // Vite-resolved asset paths should never contain special chars).\n const safeHref = href.replace(/&/g, \"&\").replace(/\"/g, \""\");\n const safeType = type.replace(/&/g, \"&\").replace(/\"/g, \""\");\n fontHeadHTML += `<link rel=\"preload\" href=\"${safeHref}\" as=\"font\" type=\"${safeType}\" crossorigin />\\n `;\n }\n if (allFontStyles.length > 0) {\n fontHeadHTML += `<style data-vinext-fonts>${allFontStyles.join(\"\\n\")}</style>\\n `;\n }\n\n // Convert absolute file paths to Vite-servable URLs (relative to root)\n const viteRoot = server.config.root;\n const pageModuleUrl = \"/\" + path.relative(viteRoot, route.filePath);\n const appModuleUrl = AppComponent\n ? \"/\" + path.relative(viteRoot, path.join(pagesDir, \"_app\"))\n : null;\n\n // Hydration entry: inline script that imports the page and hydrates.\n // Stores the React root and page loader for client-side navigation.\n const hydrationScript = `\n<script type=\"module\">\nimport React from \"react\";\nimport { hydrateRoot } from \"react-dom/client\";\n\nconst nextData = window.__NEXT_DATA__;\nconst { pageProps } = nextData.props;\n\nasync function hydrate() {\n const pageModule = await import(\"${pageModuleUrl}\");\n const PageComponent = pageModule.default;\n let element;\n ${\n appModuleUrl\n ? `\n const appModule = await import(\"${appModuleUrl}\");\n const AppComponent = appModule.default;\n window.__VINEXT_APP__ = AppComponent;\n element = React.createElement(AppComponent, { Component: PageComponent, pageProps });\n `\n : `\n element = React.createElement(PageComponent, pageProps);\n `\n }\n const root = hydrateRoot(document.getElementById(\"__next\"), element);\n window.__VINEXT_ROOT__ = root;\n}\nhydrate();\n</script>`;\n\n const nextDataScript = `<script>window.__NEXT_DATA__ = ${safeJsonStringify({\n props: { pageProps },\n page: patternToNextFormat(route.pattern),\n query: params,\n isFallback: false,\n locale: locale ?? i18nConfig?.defaultLocale,\n locales: i18nConfig?.locales,\n defaultLocale: i18nConfig?.defaultLocale,\n // Include module URLs so client navigation can import pages directly\n __vinext: {\n pageModuleUrl,\n appModuleUrl,\n },\n })}${i18nConfig ? `;window.__VINEXT_LOCALE__=${safeJsonStringify(locale ?? i18nConfig.defaultLocale)};window.__VINEXT_LOCALES__=${safeJsonStringify(i18nConfig.locales)};window.__VINEXT_DEFAULT_LOCALE__=${safeJsonStringify(i18nConfig.defaultLocale)}` : \"\"}</script>`;\n\n // Try to load custom _document.tsx\n const docPath = path.join(pagesDir, \"_document\");\n let DocumentComponent: any = null;\n if (findFileWithExtensions(docPath)) {\n try {\n const docModule = await server.ssrLoadModule(docPath);\n DocumentComponent = docModule.default ?? null;\n } catch {\n // _document exists but failed to load\n }\n }\n\n const allScripts = `${nextDataScript}\\n ${hydrationScript}`;\n\n // Build cache headers for ISR responses\n const extraHeaders: Record<string, string> = {};\n if (isrRevalidateSeconds) {\n extraHeaders[\"Cache-Control\"] = `s-maxage=${isrRevalidateSeconds}, stale-while-revalidate`;\n extraHeaders[\"X-Vinext-Cache\"] = \"MISS\";\n }\n\n // Set HTTP Link header for font preloading.\n // This lets the browser (and CDN) start fetching font files before parsing HTML.\n if (allFontPreloads.length > 0) {\n extraHeaders[\"Link\"] = allFontPreloads\n .map((p) => `<${p.href}>; rel=preload; as=font; type=${p.type}; crossorigin`)\n .join(\", \");\n }\n\n // Stream the page using progressive SSR.\n // The shell (layouts, non-suspended content) arrives immediately.\n // Suspense content streams in as it resolves.\n await streamPageToResponse(res, element, {\n url,\n server,\n fontHeadHTML,\n scripts: allScripts,\n DocumentComponent,\n statusCode,\n extraHeaders,\n // Collect head HTML AFTER the shell renders (inside streamPageToResponse,\n // after renderToReadableStream resolves). Head tags from Suspense\n // children arrive late — this matches Next.js behavior.\n getHeadHTML: () => typeof headShim.getSSRHeadHTML === \"function\"\n ? headShim.getSSRHeadHTML()\n : \"\",\n });\n\n // Clear SSR context after rendering\n if (typeof routerShim.setSSRContext === \"function\") {\n routerShim.setSSRContext(null);\n }\n\n // If ISR is enabled, we need the full HTML for caching.\n // For ISR, re-render synchronously to get the complete HTML string.\n // This runs after the stream is already sent, so it doesn't affect TTFB.\n if (isrRevalidateSeconds !== null && isrRevalidateSeconds > 0) {\n const isrElement = AppComponent\n ? createElement(AppComponent, { Component: pageModule.default, pageProps })\n : createElement(pageModule.default, pageProps);\n const isrBodyHtml = await renderToStringAsync(isrElement);\n const isrHtml = `<!DOCTYPE html><html><head></head><body><div id=\"__next\">${isrBodyHtml}</div>${allScripts}</body></html>`;\n const cacheKey = isrCacheKey(\"pages\", url.split(\"?\")[0]);\n await isrSet(\n cacheKey,\n buildPagesCacheValue(isrHtml, pageProps),\n isrRevalidateSeconds,\n );\n setRevalidateDuration(cacheKey, isrRevalidateSeconds);\n }\n } catch (e) {\n // Let Vite fix the stack trace for better dev experience\n server.ssrFixStacktrace(e as Error);\n console.error(e);\n // Report error via instrumentation hook if registered\n reportRequestError(\n e instanceof Error ? e : new Error(String(e)),\n {\n path: url,\n method: req.method ?? \"GET\",\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v.join(\", \") : String(v ?? \"\")]),\n ),\n },\n { routerKind: \"Pages Router\", routePath: route.pattern, routeType: \"render\" },\n ).catch(() => { /* ignore reporting errors */ });\n // Try to render custom 500 error page\n try {\n await renderErrorPage(server, req, res, url, pagesDir, 500);\n } catch (fallbackErr) {\n // If error page itself fails, fall back to plain text.\n // This is a dev-only code path (prod uses prod-server.ts), so\n // include the error message for debugging.\n res.statusCode = 500;\n res.end(`Internal Server Error: ${(fallbackErr as Error).message}`);\n }\n } finally {\n // Cleanup is handled by ALS scope unwinding —\n // each runWith*() scope is automatically cleaned up when it exits.\n }\n }) // end runWithFetchCache\n ) // end runWithPrivateCache\n ) // end _runWithCacheState\n ) // end runWithHeadState\n ); // end runWithRouterState\n };\n}\n\n/**\n * Render a custom error page (404.tsx, 500.tsx, or _error.tsx).\n *\n * Next.js resolution order:\n * - 404: pages/404.tsx -> pages/_error.tsx -> default\n * - 500: pages/500.tsx -> pages/_error.tsx -> default\n * - other: pages/_error.tsx -> default\n */\nasync function renderErrorPage(\n server: ViteDevServer,\n _req: IncomingMessage,\n res: ServerResponse,\n url: string,\n pagesDir: string,\n statusCode: number,\n): Promise<void> {\n // Try specific status page first, then _error, then fallback\n const candidates =\n statusCode === 404\n ? [\"404\", \"_error\"]\n : statusCode === 500\n ? [\"500\", \"_error\"]\n : [\"_error\"];\n\n for (const candidate of candidates) {\n try {\n const candidatePath = path.join(pagesDir, candidate);\n if (!findFileWithExtensions(candidatePath)) continue;\n\n const errorModule = await server.ssrLoadModule(candidatePath);\n const ErrorComponent = errorModule.default;\n if (!ErrorComponent) continue;\n\n // Try to load _app.tsx to wrap the error page\n let AppComponent: any = null;\n const appPathErr = path.join(pagesDir, \"_app\");\n if (findFileWithExtensions(appPathErr)) {\n try {\n const appModule = await server.ssrLoadModule(appPathErr);\n AppComponent = appModule.default ?? null;\n } catch {\n // _app exists but failed to load\n }\n }\n\n const createElement = React.createElement;\n const errorProps = { statusCode };\n\n let element: React.ReactElement;\n if (AppComponent) {\n element = createElement(AppComponent, {\n Component: ErrorComponent,\n pageProps: errorProps,\n });\n } else {\n element = createElement(ErrorComponent, errorProps);\n }\n\n const bodyHtml = await renderToStringAsync(element);\n\n // Try custom _document\n let html: string;\n let DocumentComponent: any = null;\n const docPathErr = path.join(pagesDir, \"_document\");\n if (findFileWithExtensions(docPathErr)) {\n try {\n const docModule = await server.ssrLoadModule(docPathErr);\n DocumentComponent = docModule.default ?? null;\n } catch {\n // _document exists but failed to load\n }\n }\n\n if (DocumentComponent) {\n const docElement = createElement(DocumentComponent);\n let docHtml = await renderToStringAsync(docElement);\n docHtml = docHtml.replace(\"__NEXT_MAIN__\", bodyHtml);\n docHtml = docHtml.replace(\"<!-- __NEXT_SCRIPTS__ -->\", \"\");\n html = docHtml;\n } else {\n html = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n</head>\n<body>\n <div id=\"__next\">${bodyHtml}</div>\n</body>\n</html>`;\n }\n\n const transformedHtml = await server.transformIndexHtml(url, html);\n res.writeHead(statusCode, { \"Content-Type\": \"text/html\" });\n res.end(transformedHtml);\n return;\n } catch {\n // This candidate doesn't exist, try next\n continue;\n }\n }\n\n // No custom error page found — use plain text fallback\n res.writeHead(statusCode, { \"Content-Type\": \"text/plain\" });\n res.end(`${statusCode} - ${statusCode === 404 ? \"Page not found\" : \"Internal Server Error\"}`);\n}\n\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware-codegen.d.ts","sourceRoot":"","sources":["../../src/server/middleware-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,QAAQ,GAAG,KAAgB,GAAG,MAAM,CAuEjF;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,GAAE,QAAQ,GAAG,KAAgB,GAAG,MAAM,CA2BpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,GAAE,QAAQ,GAAG,KAAgB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"middleware-codegen.d.ts","sourceRoot":"","sources":["../../src/server/middleware-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,QAAQ,GAAG,KAAgB,GAAG,MAAM,CAuEjF;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,GAAE,QAAQ,GAAG,KAAgB,GAAG,MAAM,CA2BpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,GAAE,QAAQ,GAAG,KAAgB,GAAG,MAAM,CAiDxF"}
|
|
@@ -137,6 +137,7 @@ function __normalizePath(pathname) {
|
|
|
137
137
|
*/
|
|
138
138
|
export function generateMiddlewareMatcherCode(style = "modern") {
|
|
139
139
|
const v = style === "modern" ? "const" : "var";
|
|
140
|
+
const l = style === "modern" ? "let" : "var";
|
|
140
141
|
const fn = style === "modern"
|
|
141
142
|
? (params, body) => `(${params}) => { ${body} }`
|
|
142
143
|
: (params, body) => `function(${params}) { ${body} }`;
|
|
@@ -152,13 +153,18 @@ function matchMiddlewarePattern(pathname, pattern) {
|
|
|
152
153
|
${v} re = __safeRegExp("^" + pattern + "$");
|
|
153
154
|
if (re) return re.test(pathname);
|
|
154
155
|
}
|
|
155
|
-
//
|
|
156
|
-
//
|
|
157
|
-
${
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
156
|
+
// Single-pass tokenizer (avoids chained .replace() flagged by CodeQL as
|
|
157
|
+
// incomplete sanitization — later passes could re-process earlier outputs).
|
|
158
|
+
${l} regexStr = "";
|
|
159
|
+
${v} tokenRe = /\\/:([\\w]+)\\*|\\/:([\\w]+)\\+|:([\\w]+)|[.]|[^/:.]+|./g;
|
|
160
|
+
${l} tok;
|
|
161
|
+
while ((tok = tokenRe.exec(pattern)) !== null) {
|
|
162
|
+
if (tok[1] !== undefined) { regexStr += "(?:/.*)?"; }
|
|
163
|
+
else if (tok[2] !== undefined) { regexStr += "(?:/.+)"; }
|
|
164
|
+
else if (tok[3] !== undefined) { regexStr += "([^/]+)"; }
|
|
165
|
+
else if (tok[0] === ".") { regexStr += "\\\\."; }
|
|
166
|
+
else { regexStr += tok[0]; }
|
|
167
|
+
}
|
|
162
168
|
${v} re2 = __safeRegExp("^" + regexStr + "$");
|
|
163
169
|
return re2 ? re2.test(pathname) : pathname === pattern;
|
|
164
170
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware-codegen.js","sourceRoot":"","sources":["../../src/server/middleware-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,QAAQ;IACvE,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;IAEL,CAAC;IACD,CAAC;IACD,CAAC;;MAEC,CAAC;;;;;;;;;;;;;;;;;;;QAmBC,CAAC;;QAED,CAAC;;;;;;;;;;;;;;QAcD,CAAC;;;;;;;;QAQD,CAAC;;;;;;;;;;;;;;;;;;EAkBP,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA0B,QAAQ;IAC1E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;;;;;;;;;;;;;IAcL,CAAC;IACD,CAAC;SACI,CAAC;MACJ,CAAC;;;;;;EAML,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAA0B,QAAQ;IAC9E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,EAAE,GAAG,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,MAAM,UAAU,IAAI,IAAI;QAChE,CAAC,CAAC,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,YAAY,MAAM,OAAO,IAAI,IAAI,CAAC;IAExE,oEAAoE;IACpE,qEAAqE;IACrE,iCAAiC;IACjC,OAAO;;;;;;MAMH,CAAC;;;;;IAKH,CAAC
|
|
1
|
+
{"version":3,"file":"middleware-codegen.js","sourceRoot":"","sources":["../../src/server/middleware-codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAA0B,QAAQ;IACvE,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;IAEL,CAAC;IACD,CAAC;IACD,CAAC;;MAEC,CAAC;;;;;;;;;;;;;;;;;;;QAmBC,CAAC;;QAED,CAAC;;;;;;;;;;;;;;QAcD,CAAC;;;;;;;;QAQD,CAAC;;;;;;;;;;;;;;;;;;EAkBP,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,QAA0B,QAAQ;IAC1E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,OAAO;;;;;;;;;;;;;;IAcL,CAAC;IACD,CAAC;SACI,CAAC;MACJ,CAAC;;;;;;EAML,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAA0B,QAAQ;IAC9E,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,MAAM,CAAC,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,MAAM,EAAE,GAAG,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,MAAM,UAAU,IAAI,IAAI;QAChE,CAAC,CAAC,CAAC,MAAc,EAAE,IAAY,EAAE,EAAE,CAAC,YAAY,MAAM,OAAO,IAAI,IAAI,CAAC;IAExE,oEAAoE;IACpE,qEAAqE;IACrE,iCAAiC;IACjC,OAAO;;;;;;MAMH,CAAC;;;;;IAKH,CAAC;IACD,CAAC;IACD,CAAC;;;;;;;;IAQD,CAAC;;;;;;;;IAQD,CAAC;;;WAGM,CAAC;;;;;yBAKa,EAAE,CAAC,GAAG,EAAE,6CAA6C,CAAC;EAC7E,CAAC;AACH,CAAC","sourcesContent":["/**\n * Shared middleware matching code generator.\n *\n * Both the App Router RSC entry (app-dev-server.ts) and the Pages Router\n * production entry (index.ts) need middleware matching logic inlined as\n * generated JavaScript strings. This module provides a single source of\n * truth to prevent the implementations from diverging.\n *\n * The regex detection guard (checking for \"(\" or \"\\\\\") is critical.\n * Without it, dot-escaping corrupts regex patterns like\n * /((?!api|_next).*), causing middleware to silently skip paths.\n */\n\n/**\n * Returns the generated JavaScript source for `__isSafeRegex` and `__safeRegExp`.\n *\n * @param style - \"modern\" emits const/let (for RSC entry), \"es5\" emits var (for prod entry)\n */\nexport function generateSafeRegExpCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n return `\nfunction __isSafeRegex(pattern) {\n ${v} quantifierAtDepth = [];\n ${l} depth = 0;\n ${l} i = 0;\n while (i < pattern.length) {\n ${v} ch = pattern[i];\n if (ch === \"\\\\\\\\\") { i += 2; continue; }\n if (ch === \"[\") {\n i++;\n while (i < pattern.length && pattern[i] !== \"]\") {\n if (pattern[i] === \"\\\\\\\\\") i++;\n i++;\n }\n i++;\n continue;\n }\n if (ch === \"(\") {\n depth++;\n if (quantifierAtDepth.length <= depth) quantifierAtDepth.push(false);\n else quantifierAtDepth[depth] = false;\n i++;\n continue;\n }\n if (ch === \")\") {\n ${v} hadQ = depth > 0 && quantifierAtDepth[depth];\n if (depth > 0) depth--;\n ${v} next = pattern[i + 1];\n if (next === \"+\" || next === \"*\" || next === \"{\") {\n if (hadQ) return false;\n if (depth >= 0 && depth < quantifierAtDepth.length) quantifierAtDepth[depth] = true;\n }\n i++;\n continue;\n }\n if (ch === \"+\" || ch === \"*\") {\n if (depth > 0) quantifierAtDepth[depth] = true;\n i++;\n continue;\n }\n if (ch === \"?\") {\n ${v} prev = i > 0 ? pattern[i - 1] : \"\";\n if (prev !== \"+\" && prev !== \"*\" && prev !== \"?\" && prev !== \"}\") {\n if (depth > 0) quantifierAtDepth[depth] = true;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n ${l} j = i + 1;\n while (j < pattern.length && /[\\\\d,]/.test(pattern[j])) j++;\n if (j < pattern.length && pattern[j] === \"}\" && j > i + 1) {\n if (depth > 0) quantifierAtDepth[depth] = true;\n i = j + 1;\n continue;\n }\n }\n i++;\n }\n return true;\n}\nfunction __safeRegExp(pattern, flags) {\n if (!__isSafeRegex(pattern)) {\n console.warn(\"[vinext] Ignoring potentially unsafe regex pattern (ReDoS risk): \" + pattern);\n return null;\n }\n try { return new RegExp(pattern, flags); } catch { return null; }\n}`;\n}\n\n/**\n * Returns the generated JavaScript source for `__normalizePath`.\n *\n * This must be kept in sync with `normalizePath()` in `normalize-path.ts`.\n * The inline version is used by codegen entries that can't import modules.\n *\n * @param style - \"modern\" emits const/let, \"es5\" emits var\n */\nexport function generateNormalizePathCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n return `\nfunction __normalizePath(pathname) {\n if (\n pathname === \"/\" ||\n (pathname.length > 1 &&\n pathname[0] === \"/\" &&\n !pathname.includes(\"//\") &&\n !pathname.includes(\"/./\") &&\n !pathname.includes(\"/../\") &&\n !pathname.endsWith(\"/.\") &&\n !pathname.endsWith(\"/..\"))\n ) {\n return pathname;\n }\n ${v} segments = pathname.split(\"/\");\n ${v} resolved = [];\n for (${l} i = 0; i < segments.length; i++) {\n ${v} seg = segments[i];\n if (seg === \"\" || seg === \".\") continue;\n if (seg === \"..\") { resolved.pop(); }\n else { resolved.push(seg); }\n }\n return \"/\" + resolved.join(\"/\");\n}`;\n}\n\n/**\n * Returns the generated JavaScript source for middleware pattern matching.\n *\n * This includes:\n * - `matchMiddlewarePattern(pathname, pattern)` — matches a single pattern\n * - `matchesMiddleware(pathname, matcher)` — matches the full matcher config\n *\n * The generated code depends on `__safeRegExp` being defined in the same scope\n * (use `generateSafeRegExpCode` to emit it).\n *\n * @param style - \"modern\" emits const/let/arrow functions, \"es5\" emits var/function\n */\nexport function generateMiddlewareMatcherCode(style: \"modern\" | \"es5\" = \"modern\"): string {\n const v = style === \"modern\" ? \"const\" : \"var\";\n const l = style === \"modern\" ? \"let\" : \"var\";\n const fn = style === \"modern\"\n ? (params: string, body: string) => `(${params}) => { ${body} }`\n : (params: string, body: string) => `function(${params}) { ${body} }`;\n\n // The pattern matching logic must be identical to matchPattern() in\n // packages/vinext/src/server/middleware.ts. Any changes here must be\n // mirrored there and vice versa.\n return `\nfunction matchMiddlewarePattern(pathname, pattern) {\n // Regex patterns: if the pattern contains \"(\" or \"\\\\\" it's a regex —\n // pass it through to RegExp directly WITHOUT dot-escaping.\n // This guard prevents regex pattern corruption from dot-escaping.\n if (pattern.includes(\"(\") || pattern.includes(\"\\\\\\\\\")) {\n ${v} re = __safeRegExp(\"^\" + pattern + \"$\");\n if (re) return re.test(pathname);\n }\n // Single-pass tokenizer (avoids chained .replace() flagged by CodeQL as\n // incomplete sanitization — later passes could re-process earlier outputs).\n ${l} regexStr = \"\";\n ${v} tokenRe = /\\\\/:([\\\\w]+)\\\\*|\\\\/:([\\\\w]+)\\\\+|:([\\\\w]+)|[.]|[^/:.]+|./g;\n ${l} tok;\n while ((tok = tokenRe.exec(pattern)) !== null) {\n if (tok[1] !== undefined) { regexStr += \"(?:/.*)?\"; }\n else if (tok[2] !== undefined) { regexStr += \"(?:/.+)\"; }\n else if (tok[3] !== undefined) { regexStr += \"([^/]+)\"; }\n else if (tok[0] === \".\") { regexStr += \"\\\\\\\\.\"; }\n else { regexStr += tok[0]; }\n }\n ${v} re2 = __safeRegExp(\"^\" + regexStr + \"$\");\n return re2 ? re2.test(pathname) : pathname === pattern;\n}\n\nfunction matchesMiddleware(pathname, matcher) {\n if (!matcher) {\n return true;\n }\n ${v} patterns = [];\n if (typeof matcher === \"string\") { patterns.push(matcher); }\n else if (Array.isArray(matcher)) {\n for (${v} m of matcher) {\n if (typeof m === \"string\") patterns.push(m);\n else if (m && typeof m === \"object\" && \"source\" in m) patterns.push(m.source);\n }\n }\n return patterns.some(${fn(\"p\", \"return matchMiddlewarePattern(pathname, p);\")});\n}`;\n}\n\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AA+B1C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB9D;AAED,qDAAqD;AACrD,KAAK,aAAa,GACd,MAAM,GACN,MAAM,EAAE,GACR;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,CAAC;AAE1F;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GAAG,SAAS,GACjC,OAAO,CAqBT;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AA+B1C;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqB9D;AAED,qDAAqD;AACrD,KAAK,aAAa,GACd,MAAM,GACN,MAAM,EAAE,GACR;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,CAAC;AAE1F;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GAAG,SAAS,GACjC,OAAO,CAqBT;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAiCvE;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,gBAAgB,CAAC,CAgH3B"}
|
|
@@ -111,18 +111,31 @@ export function matchPattern(pathname, pattern) {
|
|
|
111
111
|
return re.test(pathname);
|
|
112
112
|
// Fall through to simple matching
|
|
113
113
|
}
|
|
114
|
-
// Convert Next.js path patterns to regex.
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
114
|
+
// Convert Next.js path patterns to regex in a single pass.
|
|
115
|
+
// Matches /:param*, /:param+, :param, dots, and literal text.
|
|
116
|
+
let regexStr = "";
|
|
117
|
+
const tokenRe = /\/:(\w+)\*|\/:(\w+)\+|:(\w+)|[.]|[^/:.]+|./g;
|
|
118
|
+
let tok;
|
|
119
|
+
while ((tok = tokenRe.exec(pattern)) !== null) {
|
|
120
|
+
if (tok[1] !== undefined) {
|
|
121
|
+
// /:param* → optionally match slash + zero or more segments
|
|
122
|
+
regexStr += "(?:/.*)?";
|
|
123
|
+
}
|
|
124
|
+
else if (tok[2] !== undefined) {
|
|
125
|
+
// /:param+ → match slash + one or more segments
|
|
126
|
+
regexStr += "(?:/.+)";
|
|
127
|
+
}
|
|
128
|
+
else if (tok[3] !== undefined) {
|
|
129
|
+
// :param → match one segment
|
|
130
|
+
regexStr += "([^/]+)";
|
|
131
|
+
}
|
|
132
|
+
else if (tok[0] === ".") {
|
|
133
|
+
regexStr += "\\.";
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
regexStr += tok[0];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
126
139
|
const re = safeRegExp("^" + regexStr + "$");
|
|
127
140
|
if (re)
|
|
128
141
|
return re.test(pathname);
|
|
@@ -151,7 +164,15 @@ export async function runMiddleware(server, middlewarePath, request) {
|
|
|
151
164
|
const url = new URL(request.url);
|
|
152
165
|
// Normalize the pathname before middleware matching to prevent bypasses
|
|
153
166
|
// via percent-encoding (/%61dmin → /admin) or double slashes (/dashboard//settings).
|
|
154
|
-
|
|
167
|
+
let decodedPathname;
|
|
168
|
+
try {
|
|
169
|
+
decodedPathname = decodeURIComponent(url.pathname);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Malformed percent-encoding (e.g. /%E0%A4%A) — return 400 instead of throwing.
|
|
173
|
+
return { continue: false, response: new Response("Bad Request", { status: 400 }) };
|
|
174
|
+
}
|
|
175
|
+
const normalizedPathname = normalizePath(decodedPathname);
|
|
155
176
|
if (!matchesMiddleware(normalizedPathname, matcher)) {
|
|
156
177
|
return { continue: true };
|
|
157
178
|
}
|