@qwik.dev/router 2.0.0-beta.11 → 2.0.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/lib/adapters/azure-swa/vite/index.mjs +28 -207
  2. package/lib/adapters/bun-server/vite/index.mjs +16 -202
  3. package/lib/adapters/cloud-run/vite/index.mjs +15 -201
  4. package/lib/adapters/cloudflare-pages/vite/index.mjs +65 -6
  5. package/lib/adapters/deno-server/vite/index.mjs +18 -204
  6. package/lib/adapters/netlify-edge/vite/index.mjs +58 -246
  7. package/lib/adapters/node-server/vite/index.mjs +16 -202
  8. package/lib/adapters/shared/vite/index.d.ts +4 -4
  9. package/lib/adapters/shared/vite/index.mjs +250 -149
  10. package/lib/adapters/ssg/vite/index.mjs +12 -199
  11. package/lib/adapters/vercel-edge/vite/index.d.ts +1 -1
  12. package/lib/adapters/vercel-edge/vite/index.mjs +50 -235
  13. package/lib/chunks/error-handler.mjs +57 -0
  14. package/lib/chunks/format-error.mjs +137 -0
  15. package/lib/chunks/fs.mjs +254 -0
  16. package/lib/chunks/index.mjs +884 -0
  17. package/lib/chunks/mime-types.mjs +52 -0
  18. package/lib/chunks/routing.qwik.mjs +429 -0
  19. package/lib/chunks/types.qwik.mjs +22 -0
  20. package/lib/index.d.ts +11 -4
  21. package/lib/index.qwik.mjs +533 -1019
  22. package/lib/middleware/aws-lambda/index.mjs +38 -28
  23. package/lib/middleware/azure-swa/index.mjs +65 -48
  24. package/lib/middleware/bun/index.mjs +104 -119
  25. package/lib/middleware/cloudflare-pages/index.mjs +69 -49
  26. package/lib/middleware/deno/index.mjs +94 -114
  27. package/lib/middleware/firebase/index.mjs +26 -18
  28. package/lib/middleware/netlify-edge/index.mjs +53 -38
  29. package/lib/middleware/node/index.mjs +184 -167
  30. package/lib/middleware/request-handler/index.d.ts +22 -4
  31. package/lib/middleware/request-handler/index.mjs +1203 -877
  32. package/lib/middleware/vercel-edge/index.mjs +72 -49
  33. package/lib/service-worker/index.mjs +4 -0
  34. package/lib/ssg/index.mjs +14 -22
  35. package/lib/vite/index.d.ts +13 -7
  36. package/lib/vite/index.mjs +1609 -1217
  37. package/package.json +27 -44
  38. package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +0 -1
  39. package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +0 -651
  40. package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +0 -6
  41. package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +0 -22
  42. package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +0 -11
  43. package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +0 -1
  44. package/lib/adapters/azure-swa/vite/index.cjs +0 -5
  45. package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +0 -1
  46. package/lib/adapters/bun-server/vite/index-CBIchDYq.js +0 -651
  47. package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +0 -6
  48. package/lib/adapters/bun-server/vite/index-CrwlB95_.js +0 -22
  49. package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +0 -11
  50. package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +0 -1
  51. package/lib/adapters/bun-server/vite/index.cjs +0 -5
  52. package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +0 -1
  53. package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +0 -651
  54. package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +0 -6
  55. package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +0 -22
  56. package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +0 -11
  57. package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +0 -1
  58. package/lib/adapters/cloud-run/vite/index.cjs +0 -5
  59. package/lib/adapters/cloudflare-pages/vite/index-Bg_9YkM5.js +0 -22
  60. package/lib/adapters/cloudflare-pages/vite/index-C1aDmh1S.cjs +0 -1
  61. package/lib/adapters/cloudflare-pages/vite/index-CHT9Y93A.js +0 -254
  62. package/lib/adapters/cloudflare-pages/vite/index-Ck7KvpK1.cjs +0 -11
  63. package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +0 -6
  64. package/lib/adapters/cloudflare-pages/vite/index-Cp1cjAds.js +0 -645
  65. package/lib/adapters/cloudflare-pages/vite/index-D9RL9dvJ.cjs +0 -5
  66. package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +0 -1
  67. package/lib/adapters/cloudflare-pages/vite/index.cjs +0 -1
  68. package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +0 -1
  69. package/lib/adapters/deno-server/vite/index-CBIchDYq.js +0 -651
  70. package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +0 -6
  71. package/lib/adapters/deno-server/vite/index-CrwlB95_.js +0 -22
  72. package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +0 -11
  73. package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +0 -1
  74. package/lib/adapters/deno-server/vite/index.cjs +0 -5
  75. package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +0 -1
  76. package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +0 -651
  77. package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +0 -6
  78. package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +0 -22
  79. package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +0 -11
  80. package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +0 -1
  81. package/lib/adapters/netlify-edge/vite/index.cjs +0 -6
  82. package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +0 -1
  83. package/lib/adapters/node-server/vite/index-CBIchDYq.js +0 -651
  84. package/lib/adapters/node-server/vite/index-ClHGw5z1.js +0 -6
  85. package/lib/adapters/node-server/vite/index-CrwlB95_.js +0 -22
  86. package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +0 -11
  87. package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +0 -1
  88. package/lib/adapters/node-server/vite/index.cjs +0 -5
  89. package/lib/adapters/shared/vite/index-BqUeglYs.cjs +0 -1
  90. package/lib/adapters/shared/vite/index-CBIchDYq.js +0 -651
  91. package/lib/adapters/shared/vite/index-ClHGw5z1.js +0 -6
  92. package/lib/adapters/shared/vite/index-CrwlB95_.js +0 -22
  93. package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +0 -11
  94. package/lib/adapters/shared/vite/index-vQuPcef3.cjs +0 -1
  95. package/lib/adapters/shared/vite/index.cjs +0 -5
  96. package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +0 -1
  97. package/lib/adapters/ssg/vite/index-CBIchDYq.js +0 -651
  98. package/lib/adapters/ssg/vite/index-ClHGw5z1.js +0 -6
  99. package/lib/adapters/ssg/vite/index-CrwlB95_.js +0 -22
  100. package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +0 -11
  101. package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +0 -1
  102. package/lib/adapters/ssg/vite/index.cjs +0 -5
  103. package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +0 -1
  104. package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +0 -651
  105. package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +0 -6
  106. package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +0 -22
  107. package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +0 -11
  108. package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +0 -1
  109. package/lib/adapters/vercel-edge/vite/index.cjs +0 -5
  110. package/lib/index.qwik.cjs +0 -2126
  111. package/lib/middleware/aws-lambda/index.cjs +0 -1
  112. package/lib/middleware/azure-swa/index.cjs +0 -1
  113. package/lib/middleware/bun/index.cjs +0 -1
  114. package/lib/middleware/cloudflare-pages/index.cjs +0 -1
  115. package/lib/middleware/deno/index.cjs +0 -1
  116. package/lib/middleware/firebase/index.cjs +0 -1
  117. package/lib/middleware/netlify-edge/index.cjs +0 -1
  118. package/lib/middleware/node/index.cjs +0 -1
  119. package/lib/middleware/request-handler/index.cjs +0 -18
  120. package/lib/middleware/vercel-edge/index.cjs +0 -1
  121. package/lib/service-worker.cjs +0 -1
  122. package/lib/service-worker.mjs +0 -5
  123. package/lib/ssg/deno.cjs +0 -1
  124. package/lib/ssg/deno.mjs +0 -6
  125. package/lib/ssg/index-CBIchDYq.js +0 -651
  126. package/lib/ssg/index-ClHGw5z1.js +0 -6
  127. package/lib/ssg/index-DTIOTwZo.cjs +0 -11
  128. package/lib/ssg/index-vQuPcef3.cjs +0 -1
  129. package/lib/ssg/index.cjs +0 -1
  130. package/lib/ssg/node.cjs +0 -11
  131. package/lib/ssg/node.mjs +0 -651
  132. package/lib/vite/index.cjs +0 -42
@@ -1,205 +1,222 @@
1
- import { setServerPlatform as R } from "@qwik.dev/core/server";
2
- import { requestHandler as b, isStaticPath as x, getNotFound as C } from "@qwik.dev/router/middleware/request-handler";
3
- import { createReadStream as k } from "node:fs";
4
- import { join as v, basename as S, extname as T } from "node:path";
5
- import { fileURLToPath as j } from "node:url";
6
- import { Http2ServerRequest as O } from "node:http2";
7
- const _ = {
8
- "3gp": "video/3gpp",
9
- "3gpp": "video/3gpp",
10
- asf: "video/x-ms-asf",
11
- asx: "video/x-ms-asf",
12
- avi: "video/x-msvideo",
13
- avif: "image/avif",
14
- bmp: "image/x-ms-bmp",
15
- css: "text/css",
16
- flv: "video/x-flv",
17
- gif: "image/gif",
18
- htm: "text/html",
19
- html: "text/html",
20
- ico: "image/x-icon",
21
- jng: "image/x-jng",
22
- jpeg: "image/jpeg",
23
- jpg: "image/jpeg",
24
- js: "application/javascript",
25
- json: "application/json",
26
- kar: "audio/midi",
27
- m4a: "audio/x-m4a",
28
- m4v: "video/x-m4v",
29
- mid: "audio/midi",
30
- midi: "audio/midi",
31
- mng: "video/x-mng",
32
- mov: "video/quicktime",
33
- mp3: "audio/mpeg",
34
- mp4: "video/mp4",
35
- mpeg: "video/mpeg",
36
- mpg: "video/mpeg",
37
- ogg: "audio/ogg",
38
- pdf: "application/pdf",
39
- png: "image/png",
40
- rar: "application/x-rar-compressed",
41
- shtml: "text/html",
42
- svg: "image/svg+xml",
43
- svgz: "image/svg+xml",
44
- tif: "image/tiff",
45
- tiff: "image/tiff",
46
- ts: "video/mp2t",
47
- txt: "text/plain",
48
- wbmp: "image/vnd.wap.wbmp",
49
- webm: "video/webm",
50
- webp: "image/webp",
51
- wmv: "video/x-ms-wmv",
52
- woff: "font/woff",
53
- woff2: "font/woff2",
54
- xml: "text/xml",
55
- zip: "application/zip"
56
- };
57
- function w(e, t) {
58
- return t?.getOrigin?.(e) ?? t?.origin ?? process.env.ORIGIN ?? A(e);
1
+ import { isDev } from '@qwik.dev/core';
2
+ import { setServerPlatform } from '@qwik.dev/core/server';
3
+ import { isStaticPath, getNotFound, requestHandler } from '@qwik.dev/router/middleware/request-handler';
4
+ import { createReadStream } from 'node:fs';
5
+ import { join, basename, extname } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { M as MIME_TYPES } from '../../chunks/mime-types.mjs';
8
+ import { Http2ServerRequest } from 'node:http2';
9
+
10
+ function computeOrigin(req, opts) {
11
+ return opts?.getOrigin?.(req) ?? opts?.origin ?? process.env.ORIGIN ?? fallbackOrigin(req);
59
12
  }
60
- function A(e) {
61
- const { PROTOCOL_HEADER: t, HOST_HEADER: n } = process.env, u = e.headers, h = t && u[t] || (e.socket.encrypted || e.connection.encrypted ? "https" : "http"), o = n ?? (e instanceof O ? ":authority" : "host"), r = u[o];
62
- return `${h}://${r}`;
13
+ function fallbackOrigin(req) {
14
+ const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
15
+ const headers = req.headers;
16
+ const protocol = PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http");
17
+ const hostHeader = HOST_HEADER ?? (req instanceof Http2ServerRequest ? ":authority" : "host");
18
+ const host = headers[hostHeader];
19
+ return `${protocol}://${host}`;
63
20
  }
64
- function y(e, t) {
65
- return F(e.originalUrl || e.url || "/", t);
21
+ function getUrl(req, origin) {
22
+ return normalizeUrl(req.originalUrl || req.url || "/", origin);
66
23
  }
67
- function P(e = "") {
68
- return ["The stream has been destroyed", "write after end"].some((n) => e.includes(n));
24
+ function isIgnoredError(message = "") {
25
+ const ignoredErrors = ["The stream has been destroyed", "write after end"];
26
+ return ignoredErrors.some((ignored) => message.includes(ignored));
69
27
  }
70
- const H = /^:(method|scheme|authority|path)$/i;
71
- function F(e, t) {
72
- const n = /\/\/|\\\\/g;
73
- return new URL(e.replace(n, "/"), t);
28
+ const invalidHeadersPattern = /^:(method|scheme|authority|path)$/i;
29
+ function normalizeUrl(url, base) {
30
+ const DOUBLE_SLASH_REG = /\/\/|\\\\/g;
31
+ return new URL(url.replace(DOUBLE_SLASH_REG, "/"), base);
74
32
  }
75
- async function L(e, t, n, u, h) {
76
- const o = new Headers(), r = t.headers;
33
+ async function fromNodeHttp(url, req, res, mode, getClientConn) {
34
+ const requestHeaders = new Headers();
35
+ const nodeRequestHeaders = req.headers;
77
36
  try {
78
- for (const [a, l] of Object.entries(r))
79
- if (!H.test(a)) {
80
- if (typeof l == "string")
81
- o.set(a, l);
82
- else if (Array.isArray(l))
83
- for (const f of l)
84
- o.append(a, f);
37
+ for (const [key, value] of Object.entries(nodeRequestHeaders)) {
38
+ if (invalidHeadersPattern.test(key)) {
39
+ continue;
85
40
  }
86
- } catch (a) {
87
- console.error(a);
41
+ if (typeof value === "string") {
42
+ requestHeaders.set(key, value);
43
+ } else if (Array.isArray(value)) {
44
+ for (const v of value) {
45
+ requestHeaders.append(key, v);
46
+ }
47
+ }
48
+ }
49
+ } catch (err) {
50
+ console.error(err);
88
51
  }
89
- const m = async function* () {
90
- for await (const a of t)
91
- yield a;
92
- }, i = t.method === "HEAD" || t.method === "GET" ? void 0 : m(), c = new AbortController(), s = {
93
- method: t.method,
94
- headers: o,
95
- body: i,
96
- signal: c.signal,
52
+ const getRequestBody = async function* () {
53
+ for await (const chunk of req) {
54
+ yield chunk;
55
+ }
56
+ };
57
+ const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
58
+ const controller = new AbortController();
59
+ const options = {
60
+ method: req.method,
61
+ headers: requestHeaders,
62
+ body,
63
+ signal: controller.signal,
97
64
  duplex: "half"
98
65
  };
99
- return n.on("close", () => {
100
- c.abort();
101
- }), {
102
- mode: u,
103
- url: e,
104
- request: new Request(e.href, s),
66
+ res.on("close", () => {
67
+ controller.abort();
68
+ });
69
+ const serverRequestEv = {
70
+ mode,
71
+ url,
72
+ request: new Request(url.href, options),
105
73
  env: {
106
- get(a) {
107
- return process.env[a];
74
+ get(key) {
75
+ return process.env[key];
108
76
  }
109
77
  },
110
- getWritableStream: (a, l, f) => {
111
- n.statusCode = a;
78
+ getWritableStream: (status, headers, cookies) => {
79
+ res.statusCode = status;
112
80
  try {
113
- for (const [g, E] of l)
114
- H.test(g) || n.setHeader(g, E);
115
- const p = f.headers();
116
- p.length > 0 && n.setHeader("Set-Cookie", p);
117
- } catch (p) {
118
- console.error(p);
81
+ for (const [key, value] of headers) {
82
+ if (invalidHeadersPattern.test(key)) {
83
+ continue;
84
+ }
85
+ res.setHeader(key, value);
86
+ }
87
+ const cookieHeaders = cookies.headers();
88
+ if (cookieHeaders.length > 0) {
89
+ res.setHeader("Set-Cookie", cookieHeaders);
90
+ }
91
+ } catch (err) {
92
+ console.error(err);
119
93
  }
120
94
  return new WritableStream({
121
- write(p) {
122
- n.closed || n.destroyed || n.write(p, (g) => {
123
- g && !P(g.message) && console.error(g);
95
+ write(chunk) {
96
+ if (res.closed || res.destroyed) {
97
+ return;
98
+ }
99
+ res.write(chunk, (error) => {
100
+ if (error && !isIgnoredError(error.message)) {
101
+ console.error(error);
102
+ }
124
103
  });
125
104
  },
126
105
  close() {
127
- n.end();
106
+ res.end();
128
107
  }
129
108
  });
130
109
  },
131
- getClientConn: () => h ? h(t) : {
132
- ip: t.socket.remoteAddress
110
+ getClientConn: () => {
111
+ return getClientConn ? getClientConn(req) : {
112
+ ip: req.socket.remoteAddress
113
+ };
133
114
  },
134
115
  platform: {
135
- ssr: !0,
136
- incomingMessage: t,
116
+ ssr: true,
117
+ incomingMessage: req,
137
118
  node: process.versions.node
138
119
  // Weirdly needed to make typecheck of insights happy
139
120
  },
140
121
  locale: void 0
141
122
  };
123
+ return serverRequestEv;
142
124
  }
143
- function N(e) {
144
- e.qwikCityPlan && !e.qwikRouterConfig && (console.warn("qwikCityPlan is deprecated. Simply remove it."), e.qwikRouterConfig = e.qwikCityPlan), e.manifest && R(e.manifest);
145
- const t = e.static?.root ?? v(j(import.meta.url), "..", "..", "dist");
146
- return {
147
- router: async (o, r, m) => {
148
- try {
149
- const i = w(o, e), c = await L(
150
- y(o, i),
151
- o,
152
- r,
153
- "server",
154
- e.getClientConn
155
- ), s = await b(c, e);
156
- if (s) {
157
- const d = await s.completion;
158
- if (d)
159
- throw d;
160
- if (s.requestEv.headersSent)
161
- return;
162
- }
163
- m();
164
- } catch (i) {
165
- console.error(i), m(i);
125
+
126
+ function createQwikRouter(opts) {
127
+ if (opts.qwikCityPlan && !opts.qwikRouterConfig) {
128
+ console.warn("qwikCityPlan is deprecated. Simply remove it.");
129
+ opts.qwikRouterConfig = opts.qwikCityPlan;
130
+ }
131
+ if (opts.manifest) {
132
+ setServerPlatform(opts.manifest);
133
+ }
134
+ const staticFolder = opts.static?.root ?? join(fileURLToPath(import.meta.url), "..", "..", "dist");
135
+ const router = async (req, res, next) => {
136
+ try {
137
+ const origin = computeOrigin(req, opts);
138
+ const serverRequestEv = await fromNodeHttp(
139
+ getUrl(req, origin),
140
+ req,
141
+ res,
142
+ "server",
143
+ opts.getClientConn
144
+ );
145
+ if (isDev && opts.platform) {
146
+ Object.assign(serverRequestEv.platform, opts.platform);
166
147
  }
167
- },
168
- notFound: async (o, r, m) => {
169
- try {
170
- if (!r.headersSent) {
171
- const i = w(o, e), c = y(o, i), s = !o.headers.accept?.includes("text/html") || x(o.method || "GET", c) ? "Not Found" : C(c.pathname);
172
- r.writeHead(404, {
173
- "Content-Type": "text/html; charset=utf-8",
174
- "X-Not-Found": c.pathname
175
- }), r.end(s);
148
+ const handled = await requestHandler(serverRequestEv, opts);
149
+ if (handled) {
150
+ const err = await handled.completion;
151
+ if (err) {
152
+ throw err;
176
153
  }
177
- } catch (i) {
178
- console.error(i), m(i);
179
- }
180
- },
181
- staticFile: async (o, r, m) => {
182
- try {
183
- const i = w(o, e), c = y(o, i);
184
- if (x(o.method || "GET", c)) {
185
- const s = c.pathname;
186
- let d;
187
- S(s).includes(".") ? d = v(t, s) : globalThis.__NO_TRAILING_SLASH__ ? d = v(t, s, "index.html") : d = v(t, s + "index.html");
188
- const a = T(d).replace(/^\./, ""), l = k(d);
189
- l.on("error", m);
190
- const f = _[a];
191
- f && r.setHeader("Content-Type", f), e.static?.cacheControl && r.setHeader("Cache-Control", e.static.cacheControl), l.pipe(r);
154
+ if (handled.requestEv.headersSent) {
192
155
  return;
193
156
  }
194
- return m();
195
- } catch (i) {
196
- console.error(i), m(i);
197
157
  }
158
+ next();
159
+ } catch (e) {
160
+ console.error(e);
161
+ next(e);
198
162
  }
199
163
  };
164
+ const notFound = async (req, res, next) => {
165
+ try {
166
+ if (!res.headersSent) {
167
+ const origin = computeOrigin(req, opts);
168
+ const url = getUrl(req, origin);
169
+ const notFoundHtml = !req.headers.accept?.includes("text/html") || isStaticPath(req.method || "GET", url) ? "Not Found" : getNotFound(url.pathname);
170
+ res.writeHead(404, {
171
+ "Content-Type": "text/html; charset=utf-8",
172
+ "X-Not-Found": url.pathname
173
+ });
174
+ res.end(notFoundHtml);
175
+ }
176
+ } catch (e) {
177
+ console.error(e);
178
+ next(e);
179
+ }
180
+ };
181
+ const staticFile = async (req, res, next) => {
182
+ try {
183
+ const origin = computeOrigin(req, opts);
184
+ const url = getUrl(req, origin);
185
+ if (isStaticPath(req.method || "GET", url)) {
186
+ const pathname = url.pathname;
187
+ let filePath;
188
+ if (basename(pathname).includes(".")) {
189
+ filePath = join(staticFolder, pathname);
190
+ } else if (!globalThis.__NO_TRAILING_SLASH__) {
191
+ filePath = join(staticFolder, pathname + "index.html");
192
+ } else {
193
+ filePath = join(staticFolder, pathname, "index.html");
194
+ }
195
+ const ext = extname(filePath).replace(/^\./, "");
196
+ const stream = createReadStream(filePath);
197
+ stream.on("error", next);
198
+ const contentType = MIME_TYPES[ext];
199
+ if (contentType) {
200
+ res.setHeader("Content-Type", contentType);
201
+ }
202
+ if (opts.static?.cacheControl) {
203
+ res.setHeader("Cache-Control", opts.static.cacheControl);
204
+ }
205
+ stream.pipe(res);
206
+ return;
207
+ }
208
+ return next();
209
+ } catch (e) {
210
+ console.error(e);
211
+ next(e);
212
+ }
213
+ };
214
+ return {
215
+ router,
216
+ notFound,
217
+ staticFile
218
+ };
200
219
  }
201
- const $ = N;
202
- export {
203
- $ as createQwikCity,
204
- N as createQwikRouter
205
- };
220
+ const createQwikCity = createQwikRouter;
221
+
222
+ export { createQwikCity, createQwikRouter };
@@ -1,10 +1,12 @@
1
1
  import type { Action } from '@qwik.dev/router';
2
+ import type { AsyncLocalStorage } from 'node:async_hooks';
2
3
  import type { EnvGetter as EnvGetter_2 } from '@qwik.dev/router/middleware/request-handler';
3
4
  import type { FailReturn } from '@qwik.dev/router';
4
5
  import type { Loader as Loader_2 } from '@qwik.dev/router';
5
6
  import type { QwikCityPlan } from '@qwik.dev/router';
6
7
  import type { QwikIntrinsicElements } from '@qwik.dev/core';
7
8
  import type { QwikRouterConfig } from '@qwik.dev/router';
9
+ import { RedirectMessage as RedirectMessage_2 } from '@qwik.dev/router/middleware/request-handler';
8
10
  import type { Render } from '@qwik.dev/core/server';
9
11
  import type { RenderOptions } from '@qwik.dev/core/server';
10
12
  import { RequestEvent as RequestEvent_2 } from '@qwik.dev/router/middleware/request-handler';
@@ -17,6 +19,9 @@ import type { ValueOrPromise } from '@qwik.dev/core';
17
19
  export declare class AbortMessage {
18
20
  }
19
21
 
22
+ /** @internal */
23
+ export declare let _asyncRequestStore: AsyncLocalStorage<RequestEventInternal> | undefined;
24
+
20
25
  /** @public */
21
26
  export declare type CacheControl = CacheControlOptions | number | 'day' | 'week' | 'month' | 'year' | 'no-cache' | 'immutable' | 'private';
22
27
 
@@ -204,6 +209,7 @@ declare type DocumentHead = DocumentHeadValue | ((props: DocumentHeadProps) => D
204
209
  /** @public */
205
210
  declare interface DocumentHeadProps extends RouteLocation {
206
211
  readonly head: ResolvedDocumentHead;
212
+ /** @deprecated This is not necessary, it works correctly without */
207
213
  readonly withLocale: <T>(fn: () => T) => T;
208
214
  readonly resolveValue: ResolveSyncValue_2;
209
215
  }
@@ -330,9 +336,21 @@ declare interface PageModule extends RouteModule {
330
336
  declare type PathParams = Record<string, string>;
331
337
 
332
338
  declare interface QwikRouterRun<T> {
339
+ /**
340
+ * The response to the request, if any. If there is no response, there might have been an error,
341
+ * or the request was aborted.
342
+ */
333
343
  response: Promise<T | null>;
334
344
  requestEv: RequestEvent_2;
335
- completion: Promise<unknown>;
345
+ /**
346
+ * Promise for the completion of the request.
347
+ *
348
+ * If it returns a RedirectMessage, it means the request must be redirected.
349
+ *
350
+ * If it returns an Error, it means there was an error, and if possible, the response already
351
+ * includes the error. The error is informational only.
352
+ */
353
+ completion: Promise<RedirectMessage_2 | Error | undefined>;
336
354
  }
337
355
 
338
356
  /**
@@ -570,7 +588,7 @@ export declare const RequestEvShareQData = "qData";
570
588
  export declare type RequestHandler<PLATFORM = QwikRouterPlatform> = (ev: RequestEvent<PLATFORM>) => Promise<void> | void;
571
589
 
572
590
  /**
573
- * The request handler for QwikRouter. Called by every integration.
591
+ * The request handler for QwikRouter. Called by every adapter.
574
592
  *
575
593
  * @public
576
594
  */
@@ -581,14 +599,14 @@ declare type ResolvedDocumentHead<FrontMatter extends Record<string, any> = Reco
581
599
 
582
600
  /** @public */
583
601
  export declare interface ResolveSyncValue {
602
+ <T, INPUT, OPTIONAL extends boolean>(action: Action<T, INPUT, OPTIONAL>): Awaited<T> | undefined;
584
603
  <T>(loader: Loader_2<T>): Awaited<T> extends () => any ? never : Awaited<T>;
585
- <T>(action: Action<T>): Awaited<T> | undefined;
586
604
  }
587
605
 
588
606
  /** @public */
589
607
  export declare interface ResolveValue {
608
+ <T, INPUT, OPTIONAL extends boolean>(action: Action<T, INPUT, OPTIONAL>): Promise<T | undefined>;
590
609
  <T>(loader: Loader_2<T>): Awaited<T> extends () => any ? never : Promise<T>;
591
- <T>(action: Action<T>): Promise<T | undefined>;
592
610
  }
593
611
 
594
612
  /** @public */