@qwik.dev/router 2.0.0-beta.4 → 2.0.0-beta.41

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 (87) hide show
  1. package/adapters/static/vite.d.ts +1 -1
  2. package/lib/adapters/azure-swa/vite/index.d.ts +2 -2
  3. package/lib/adapters/azure-swa/vite/index.mjs +44 -58
  4. package/lib/adapters/bun-server/vite/index.d.ts +2 -2
  5. package/lib/adapters/bun-server/vite/index.mjs +16 -23
  6. package/lib/adapters/cloud-run/vite/index.d.ts +2 -2
  7. package/lib/adapters/cloud-run/vite/index.mjs +15 -20
  8. package/lib/adapters/cloudflare-pages/vite/index.d.ts +2 -2
  9. package/lib/adapters/cloudflare-pages/vite/index.mjs +45 -77
  10. package/lib/adapters/deno-server/vite/index.d.ts +2 -2
  11. package/lib/adapters/deno-server/vite/index.mjs +25 -35
  12. package/lib/adapters/netlify-edge/vite/index.d.ts +2 -2
  13. package/lib/adapters/netlify-edge/vite/index.mjs +49 -89
  14. package/lib/adapters/node-server/vite/index.d.ts +2 -2
  15. package/lib/adapters/node-server/vite/index.mjs +16 -23
  16. package/lib/adapters/shared/vite/index.d.ts +9 -22
  17. package/lib/adapters/shared/vite/index.mjs +280 -333
  18. package/lib/adapters/ssg/vite/index.d.ts +13 -0
  19. package/lib/adapters/ssg/vite/index.mjs +13 -0
  20. package/lib/adapters/vercel-edge/vite/index.d.ts +3 -3
  21. package/lib/adapters/vercel-edge/vite/index.mjs +73 -80
  22. package/lib/chunks/dev-preloaded-route-loader.mjs +2 -0
  23. package/lib/chunks/format.mjs +24 -0
  24. package/lib/chunks/fs.mjs +140 -0
  25. package/lib/chunks/head.qwik.mjs +1202 -0
  26. package/lib/chunks/http-error.qwik.mjs +27 -0
  27. package/lib/chunks/pathname.mjs +57 -0
  28. package/lib/chunks/request-body-limit.mjs +27 -0
  29. package/lib/chunks/request-path.mjs +49 -0
  30. package/lib/chunks/routes.mjs +26 -0
  31. package/lib/chunks/server-error.mjs +16 -0
  32. package/lib/chunks/system.mjs +265 -0
  33. package/lib/chunks/url.mjs +59 -0
  34. package/lib/chunks/user-response.mjs +1730 -0
  35. package/lib/chunks/worker-thread.mjs +264 -0
  36. package/lib/index.d.ts +631 -174
  37. package/lib/index.qwik.mjs +1656 -1964
  38. package/lib/middleware/aws-lambda/index.d.ts +15 -16
  39. package/lib/middleware/aws-lambda/index.mjs +45 -54
  40. package/lib/middleware/azure-swa/index.mjs +85 -295
  41. package/lib/middleware/bun/index.d.ts +20 -5
  42. package/lib/middleware/bun/index.mjs +119 -205
  43. package/lib/middleware/cloudflare-pages/index.mjs +88 -105
  44. package/lib/middleware/deno/index.d.ts +22 -5
  45. package/lib/middleware/deno/index.mjs +105 -192
  46. package/lib/middleware/firebase/index.mjs +22 -35
  47. package/lib/middleware/netlify-edge/index.mjs +63 -81
  48. package/lib/middleware/node/index.d.ts +17 -5
  49. package/lib/middleware/node/index.mjs +299 -273
  50. package/lib/middleware/request-handler/index.d.ts +206 -99
  51. package/lib/middleware/request-handler/index.mjs +105 -1648
  52. package/lib/middleware/vercel-edge/index.mjs +76 -101
  53. package/lib/modules.d.ts +11 -16
  54. package/lib/service-worker/index.mjs +13 -0
  55. package/lib/{static → ssg}/index.d.ts +46 -22
  56. package/lib/ssg/index.mjs +257 -0
  57. package/lib/vite/index.d.ts +58 -10
  58. package/lib/vite/index.mjs +2471 -27446
  59. package/modules.d.ts +11 -16
  60. package/package.json +62 -70
  61. package/ssg.d.ts +2 -0
  62. package/static.d.ts +1 -1
  63. package/lib/adapters/azure-swa/vite/index.cjs +0 -96
  64. package/lib/adapters/bun-server/vite/index.cjs +0 -50
  65. package/lib/adapters/cloud-run/vite/index.cjs +0 -47
  66. package/lib/adapters/cloudflare-pages/vite/index.cjs +0 -115
  67. package/lib/adapters/deno-server/vite/index.cjs +0 -62
  68. package/lib/adapters/netlify-edge/vite/index.cjs +0 -129
  69. package/lib/adapters/node-server/vite/index.cjs +0 -50
  70. package/lib/adapters/shared/vite/index.cjs +0 -378
  71. package/lib/adapters/static/vite/index.cjs +0 -368
  72. package/lib/adapters/static/vite/index.d.ts +0 -10
  73. package/lib/adapters/static/vite/index.mjs +0 -331
  74. package/lib/adapters/vercel-edge/vite/index.cjs +0 -118
  75. package/lib/index.qwik.cjs +0 -2022
  76. package/lib/middleware/node/index.cjs +0 -314
  77. package/lib/middleware/request-handler/index.cjs +0 -1691
  78. package/lib/service-worker.cjs +0 -17
  79. package/lib/service-worker.mjs +0 -15
  80. package/lib/static/deno.mjs +0 -8
  81. package/lib/static/index.cjs +0 -67
  82. package/lib/static/index.mjs +0 -48
  83. package/lib/static/node.cjs +0 -1126
  84. package/lib/static/node.mjs +0 -1088
  85. package/lib/vite/index.cjs +0 -27525
  86. package/middleware/request-handler/generated/not-found-paths.ts +0 -7
  87. package/middleware/request-handler/generated/static-paths.ts +0 -35
@@ -1,287 +1,313 @@
1
- // packages/qwik-router/src/middleware/node/index.ts
2
- import { getNotFound } from "@qwik-router-not-found-paths";
3
- import { isStaticPath } from "@qwik-router-static-paths";
4
- import { _deserialize, _serialize, _verifySerializable } from "@qwik.dev/core/internal";
1
+ import { n as MIME_TYPES, t as normalizeRequestUrl } from "../../chunks/url.mjs";
2
+ import { i as validateRequestBodyLimit, n as RequestBodyLimitError, t as DEFAULT_REQUEST_BODY_LIMIT } from "../../chunks/request-body-limit.mjs";
3
+ import { t as devPreloadedRouteLoaders } from "../../chunks/dev-preloaded-route-loader.mjs";
4
+ import { isDev } from "@qwik.dev/core";
5
5
  import { setServerPlatform } from "@qwik.dev/core/server";
6
- import { requestHandler } from "../request-handler/index.mjs";
7
6
  import { createReadStream } from "node:fs";
8
7
  import { basename, extname, join } from "node:path";
8
+ import { isStaticPath, requestHandler } from "@qwik.dev/router/middleware/request-handler";
9
9
  import { fileURLToPath } from "node:url";
10
-
11
- // packages/qwik-router/src/middleware/request-handler/mime-types.ts
12
- var MIME_TYPES = {
13
- "3gp": "video/3gpp",
14
- "3gpp": "video/3gpp",
15
- asf: "video/x-ms-asf",
16
- asx: "video/x-ms-asf",
17
- avi: "video/x-msvideo",
18
- avif: "image/avif",
19
- bmp: "image/x-ms-bmp",
20
- css: "text/css",
21
- flv: "video/x-flv",
22
- gif: "image/gif",
23
- htm: "text/html",
24
- html: "text/html",
25
- ico: "image/x-icon",
26
- jng: "image/x-jng",
27
- jpeg: "image/jpeg",
28
- jpg: "image/jpeg",
29
- js: "application/javascript",
30
- json: "application/json",
31
- kar: "audio/midi",
32
- m4a: "audio/x-m4a",
33
- m4v: "video/x-m4v",
34
- mid: "audio/midi",
35
- midi: "audio/midi",
36
- mng: "video/x-mng",
37
- mov: "video/quicktime",
38
- mp3: "audio/mpeg",
39
- mp4: "video/mp4",
40
- mpeg: "video/mpeg",
41
- mpg: "video/mpeg",
42
- ogg: "audio/ogg",
43
- pdf: "application/pdf",
44
- png: "image/png",
45
- rar: "application/x-rar-compressed",
46
- shtml: "text/html",
47
- svg: "image/svg+xml",
48
- svgz: "image/svg+xml",
49
- tif: "image/tiff",
50
- tiff: "image/tiff",
51
- ts: "video/mp2t",
52
- txt: "text/plain",
53
- wbmp: "image/vnd.wap.wbmp",
54
- webm: "video/webm",
55
- webp: "image/webp",
56
- wmv: "video/x-ms-wmv",
57
- woff: "font/woff",
58
- woff2: "font/woff2",
59
- xml: "text/xml",
60
- zip: "application/zip"
61
- };
62
-
63
- // packages/qwik-router/src/middleware/node/http.ts
64
10
  import { Http2ServerRequest } from "node:http2";
65
- function computeOrigin(req, opts) {
66
- var _a;
67
- return ((_a = opts == null ? void 0 : opts.getOrigin) == null ? void 0 : _a.call(opts, req)) ?? (opts == null ? void 0 : opts.origin) ?? process.env.ORIGIN ?? fallbackOrigin(req);
68
- }
69
11
  function fallbackOrigin(req) {
70
- const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
71
- const headers = req.headers;
72
- const protocol = PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http");
73
- const hostHeader = HOST_HEADER ?? (req instanceof Http2ServerRequest ? ":authority" : "host");
74
- const host = headers[hostHeader];
75
- return `${protocol}://${host}`;
12
+ const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
13
+ const headers = req.headers;
14
+ return `${PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http")}://${headers[HOST_HEADER ?? (req instanceof Http2ServerRequest ? ":authority" : "host")]}`;
76
15
  }
77
- function getUrl(req, origin) {
78
- return normalizeUrl(req.originalUrl || req.url || "/", origin);
16
+ function computeOrigin(req, opts) {
17
+ return opts?.getOrigin?.(req) ?? opts?.origin ?? process.env.ORIGIN ?? fallbackOrigin(req);
79
18
  }
80
- function isIgnoredError(message = "") {
81
- const ignoredErrors = ["The stream has been destroyed", "write after end"];
82
- return ignoredErrors.some((ignored) => message.includes(ignored));
19
+ function isClientAbortWriteError(error) {
20
+ if (!(error instanceof Error)) return false;
21
+ const code = error.code;
22
+ if (code === "EPIPE" || code === "ECONNRESET" || code === "ERR_STREAM_DESTROYED" || code === "ERR_STREAM_WRITE_AFTER_END") return true;
23
+ return false;
83
24
  }
84
25
  var invalidHeadersPattern = /^:(method|scheme|authority|path)$/i;
85
26
  function normalizeUrl(url, base) {
86
- const DOUBLE_SLASH_REG = /\/\/|\\\\/g;
87
- return new URL(url.replace(DOUBLE_SLASH_REG, "/"), base);
27
+ return normalizeRequestUrl(url, base);
28
+ }
29
+ function getUrl(req, origin) {
30
+ return normalizeUrl(req.originalUrl || req.url || "/", origin);
31
+ }
32
+ function createNodeResponseSink(res) {
33
+ let closed = res.closed || res.destroyed;
34
+ let responseError;
35
+ let resolveClosed;
36
+ const closedPromise = closed ? Promise.resolve() : new Promise((resolve) => {
37
+ resolveClosed = resolve;
38
+ res.once("close", () => {
39
+ closed = true;
40
+ resolve();
41
+ });
42
+ });
43
+ res.on("error", (error) => {
44
+ if (responseError === void 0) responseError = error;
45
+ if (!closed) {
46
+ closed = true;
47
+ resolveClosed();
48
+ }
49
+ });
50
+ const shouldPropagateResponseError = () => responseError !== void 0 && !isClientAbortWriteError(responseError);
51
+ const write = (chunk) => {
52
+ if (closed || res.closed || res.destroyed) {
53
+ if (shouldPropagateResponseError()) return Promise.reject(responseError);
54
+ return;
55
+ }
56
+ return new Promise((resolve, reject) => {
57
+ let settled = false;
58
+ let onDrain;
59
+ const cleanupDrain = () => {
60
+ if (onDrain) {
61
+ res.off("drain", onDrain);
62
+ onDrain = void 0;
63
+ }
64
+ };
65
+ const finish = () => {
66
+ if (settled) return;
67
+ settled = true;
68
+ cleanupDrain();
69
+ setImmediate(resolve);
70
+ };
71
+ const finishClosed = () => {
72
+ closed = true;
73
+ finish();
74
+ };
75
+ const fail = (error) => {
76
+ if (settled) return;
77
+ settled = true;
78
+ closed = true;
79
+ cleanupDrain();
80
+ reject(error);
81
+ };
82
+ closedPromise.then(() => {
83
+ if (shouldPropagateResponseError()) {
84
+ fail(responseError);
85
+ return;
86
+ }
87
+ finish();
88
+ });
89
+ let ok;
90
+ try {
91
+ ok = res.write(chunk, (error) => {
92
+ if (error) {
93
+ if (isClientAbortWriteError(error)) {
94
+ finishClosed();
95
+ return;
96
+ }
97
+ fail(error);
98
+ return;
99
+ }
100
+ finish();
101
+ });
102
+ } catch (error) {
103
+ if (isClientAbortWriteError(error)) {
104
+ finishClosed();
105
+ return;
106
+ }
107
+ fail(error);
108
+ return;
109
+ }
110
+ if (settled) return;
111
+ if (ok) finish();
112
+ else {
113
+ onDrain = () => {
114
+ onDrain = void 0;
115
+ finish();
116
+ };
117
+ res.once("drain", onDrain);
118
+ }
119
+ });
120
+ };
121
+ const close = () => {
122
+ if (closed || res.closed || res.destroyed) {
123
+ if (shouldPropagateResponseError()) return Promise.reject(responseError);
124
+ return;
125
+ }
126
+ return new Promise((resolve, reject) => {
127
+ let settled = false;
128
+ const finish = () => {
129
+ if (settled) return;
130
+ settled = true;
131
+ closed = true;
132
+ resolve();
133
+ };
134
+ const fail = (error) => {
135
+ if (settled) return;
136
+ settled = true;
137
+ closed = true;
138
+ reject(error);
139
+ };
140
+ closedPromise.then(() => {
141
+ if (shouldPropagateResponseError()) {
142
+ fail(responseError);
143
+ return;
144
+ }
145
+ finish();
146
+ });
147
+ res.once("finish", finish);
148
+ try {
149
+ res.end();
150
+ } catch (error) {
151
+ if (isClientAbortWriteError(error)) {
152
+ finish();
153
+ return;
154
+ }
155
+ fail(error);
156
+ }
157
+ });
158
+ };
159
+ return {
160
+ write,
161
+ close
162
+ };
88
163
  }
89
- async function fromNodeHttp(url, req, res, mode, getClientConn) {
90
- const requestHeaders = new Headers();
91
- const nodeRequestHeaders = req.headers;
92
- try {
93
- for (const [key, value] of Object.entries(nodeRequestHeaders)) {
94
- if (invalidHeadersPattern.test(key)) {
95
- continue;
96
- }
97
- if (typeof value === "string") {
98
- requestHeaders.set(key, value);
99
- } else if (Array.isArray(value)) {
100
- for (const v of value) {
101
- requestHeaders.append(key, v);
102
- }
103
- }
104
- }
105
- } catch (err) {
106
- console.error(err);
107
- }
108
- const getRequestBody = async function* () {
109
- for await (const chunk of req) {
110
- yield chunk;
111
- }
112
- };
113
- const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
114
- const controller = new AbortController();
115
- const options = {
116
- method: req.method,
117
- headers: requestHeaders,
118
- body,
119
- signal: controller.signal,
120
- duplex: "half"
121
- };
122
- res.on("close", () => {
123
- controller.abort();
124
- });
125
- const serverRequestEv = {
126
- mode,
127
- url,
128
- request: new Request(url.href, options),
129
- env: {
130
- get(key) {
131
- return process.env[key];
132
- }
133
- },
134
- getWritableStream: (status, headers, cookies) => {
135
- res.statusCode = status;
136
- try {
137
- for (const [key, value] of headers) {
138
- if (invalidHeadersPattern.test(key)) {
139
- continue;
140
- }
141
- res.setHeader(key, value);
142
- }
143
- const cookieHeaders = cookies.headers();
144
- if (cookieHeaders.length > 0) {
145
- res.setHeader("Set-Cookie", cookieHeaders);
146
- }
147
- } catch (err) {
148
- console.error(err);
149
- }
150
- return new WritableStream({
151
- write(chunk) {
152
- if (res.closed || res.destroyed) {
153
- return;
154
- }
155
- res.write(chunk, (error) => {
156
- if (error && !isIgnoredError(error.message)) {
157
- console.error(error);
158
- }
159
- });
160
- },
161
- close() {
162
- res.end();
163
- }
164
- });
165
- },
166
- getClientConn: () => {
167
- return getClientConn ? getClientConn(req) : {
168
- ip: req.socket.remoteAddress
169
- };
170
- },
171
- platform: {
172
- ssr: true,
173
- incomingMessage: req,
174
- node: process.versions.node
175
- // Weirdly needed to make typecheck of insights happy
176
- },
177
- locale: void 0
178
- };
179
- return serverRequestEv;
164
+ async function fromNodeHttp(url, req, res, mode, getClientConn, requestBodyLimit = DEFAULT_REQUEST_BODY_LIMIT) {
165
+ validateRequestBodyLimit(requestBodyLimit);
166
+ const requestHeaders = new Headers();
167
+ const nodeRequestHeaders = req.headers;
168
+ try {
169
+ for (const [key, value] of Object.entries(nodeRequestHeaders)) {
170
+ if (invalidHeadersPattern.test(key)) continue;
171
+ if (typeof value === "string") requestHeaders.set(key, value);
172
+ else if (Array.isArray(value)) for (const v of value) requestHeaders.append(key, v);
173
+ }
174
+ } catch (err) {
175
+ console.error(err);
176
+ }
177
+ const getRequestBody = async function* () {
178
+ let received = 0;
179
+ for await (const chunk of req) {
180
+ const byteLength = typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.byteLength;
181
+ if (byteLength > requestBodyLimit - received) {
182
+ req.resume();
183
+ throw new RequestBodyLimitError(requestBodyLimit);
184
+ }
185
+ received += byteLength;
186
+ yield chunk;
187
+ }
188
+ };
189
+ const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
190
+ const controller = new AbortController();
191
+ const abort = () => {
192
+ controller.abort();
193
+ };
194
+ const options = {
195
+ method: req.method,
196
+ headers: requestHeaders,
197
+ body,
198
+ signal: controller.signal,
199
+ duplex: "half"
200
+ };
201
+ req.on("aborted", abort);
202
+ req.on("error", abort);
203
+ res.on("close", abort);
204
+ res.on("error", abort);
205
+ return {
206
+ mode,
207
+ url,
208
+ request: new Request(url.href, options),
209
+ env: { get(key) {
210
+ return process.env[key];
211
+ } },
212
+ getWritableStream: (status, headers, cookies, resolve) => {
213
+ res.statusCode = status;
214
+ const sink = createNodeResponseSink(res);
215
+ try {
216
+ for (const [key, value] of headers) {
217
+ if (invalidHeadersPattern.test(key)) continue;
218
+ res.setHeader(key, value);
219
+ }
220
+ const cookieHeaders = cookies.headers();
221
+ if (cookieHeaders.length > 0) res.setHeader("Set-Cookie", cookieHeaders);
222
+ } catch (err) {
223
+ console.error(err);
224
+ }
225
+ resolve(true);
226
+ return new WritableStream({
227
+ write(chunk) {
228
+ return sink.write(chunk);
229
+ },
230
+ close() {
231
+ return sink.close();
232
+ }
233
+ });
234
+ },
235
+ getClientConn: () => {
236
+ return getClientConn ? getClientConn(req) : { ip: req.socket.remoteAddress };
237
+ },
238
+ platform: {
239
+ ssr: true,
240
+ incomingMessage: req,
241
+ node: process.versions.node
242
+ },
243
+ locale: void 0
244
+ };
180
245
  }
181
-
182
- // packages/qwik-router/src/middleware/node/index.ts
183
- function createQwikRouter(opts) {
184
- var _a;
185
- if (opts.qwikCityPlan && !opts.qwikRouterConfig) {
186
- console.warn("qwikCityPlan is deprecated. Use qwikRouterConfig instead.");
187
- opts.qwikRouterConfig = opts.qwikCityPlan;
188
- } else if (!opts.qwikRouterConfig) {
189
- throw new Error("qwikRouterConfig is required.");
190
- }
191
- const qwikSerializer = {
192
- _deserialize,
193
- _serialize,
194
- _verifySerializable
195
- };
196
- if (opts.manifest) {
197
- setServerPlatform(opts.manifest);
198
- }
199
- const staticFolder = ((_a = opts.static) == null ? void 0 : _a.root) ?? join(fileURLToPath(import.meta.url), "..", "..", "dist");
200
- const router = async (req, res, next) => {
201
- try {
202
- const origin = computeOrigin(req, opts);
203
- const serverRequestEv = await fromNodeHttp(
204
- getUrl(req, origin),
205
- req,
206
- res,
207
- "server",
208
- opts.getClientConn
209
- );
210
- const handled = await requestHandler(serverRequestEv, opts, qwikSerializer);
211
- if (handled) {
212
- const err = await handled.completion;
213
- if (err) {
214
- throw err;
215
- }
216
- if (handled.requestEv.headersSent) {
217
- return;
218
- }
219
- }
220
- next();
221
- } catch (e) {
222
- console.error(e);
223
- next(e);
224
- }
225
- };
226
- const notFound = async (req, res, next) => {
227
- try {
228
- if (!res.headersSent) {
229
- const origin = computeOrigin(req, opts);
230
- const url = getUrl(req, origin);
231
- const notFoundHtml = isStaticPath(req.method || "GET", url) ? "Not Found" : getNotFound(url.pathname);
232
- res.writeHead(404, {
233
- "Content-Type": "text/html; charset=utf-8",
234
- "X-Not-Found": url.pathname
235
- });
236
- res.end(notFoundHtml);
237
- }
238
- } catch (e) {
239
- console.error(e);
240
- next(e);
241
- }
242
- };
243
- const staticFile = async (req, res, next) => {
244
- var _a2;
245
- try {
246
- const origin = computeOrigin(req, opts);
247
- const url = getUrl(req, origin);
248
- if (isStaticPath(req.method || "GET", url)) {
249
- const pathname = url.pathname;
250
- let filePath;
251
- if (basename(pathname).includes(".")) {
252
- filePath = join(staticFolder, pathname);
253
- } else if (opts.qwikRouterConfig.trailingSlash) {
254
- filePath = join(staticFolder, pathname + "index.html");
255
- } else {
256
- filePath = join(staticFolder, pathname, "index.html");
257
- }
258
- const ext = extname(filePath).replace(/^\./, "");
259
- const stream = createReadStream(filePath);
260
- stream.on("error", next);
261
- const contentType = MIME_TYPES[ext];
262
- if (contentType) {
263
- res.setHeader("Content-Type", contentType);
264
- }
265
- if ((_a2 = opts.static) == null ? void 0 : _a2.cacheControl) {
266
- res.setHeader("Cache-Control", opts.static.cacheControl);
267
- }
268
- stream.pipe(res);
269
- return;
270
- }
271
- return next();
272
- } catch (e) {
273
- console.error(e);
274
- next(e);
275
- }
276
- };
277
- return {
278
- router,
279
- notFound,
280
- staticFile
281
- };
246
+ /** @public */ function createQwikRouter(opts) {
247
+ if (opts.manifest) setServerPlatform(opts.manifest);
248
+ const staticFolder = opts.static?.root ?? join(fileURLToPath(import.meta.url), "..", "..", "dist");
249
+ const router = async (req, res, next, limits = {}) => {
250
+ try {
251
+ const origin = computeOrigin(req, opts);
252
+ let requestBodyLimit = opts.requestBodyLimit;
253
+ if (limits?.bodyLimit !== void 0) {
254
+ if (requestBodyLimit === void 0) requestBodyLimit = limits.bodyLimit;
255
+ else requestBodyLimit = Math.min(requestBodyLimit, limits.bodyLimit);
256
+ }
257
+ const serverRequestEv = await fromNodeHttp(getUrl(req, origin), req, res, "server", opts.getClientConn, requestBodyLimit);
258
+ if (isDev && opts.platform) Object.assign(serverRequestEv.platform, opts.platform);
259
+ if (isDev) {
260
+ const loader = devPreloadedRouteLoaders.get(req);
261
+ if (loader) {
262
+ devPreloadedRouteLoaders.set(serverRequestEv.request, loader);
263
+ devPreloadedRouteLoaders.delete(req);
264
+ }
265
+ }
266
+ const handled = await requestHandler(serverRequestEv, opts);
267
+ if (handled) {
268
+ const err = await handled.completion;
269
+ if (handled.requestEv.headersSent) return;
270
+ if (err) throw err;
271
+ }
272
+ next();
273
+ } catch (e) {
274
+ console.error(e);
275
+ next(e);
276
+ }
277
+ };
278
+ /** @deprecated `router` handles 404 responses. Will be removed in V3. */ const notFound = async (_req, _res, next) => next();
279
+ const staticFile = async (req, res, next) => {
280
+ try {
281
+ const url = getUrl(req, computeOrigin(req, opts));
282
+ if (isStaticPath(req.method || "GET", url)) {
283
+ const pathname = url.pathname;
284
+ let filePath;
285
+ if (basename(pathname).includes(".")) filePath = join(staticFolder, pathname);
286
+ else if (!globalThis.__NO_TRAILING_SLASH__) filePath = join(staticFolder, pathname + "index.html");
287
+ else filePath = join(staticFolder, pathname, "index.html");
288
+ const ext = extname(filePath).replace(/^\./, "");
289
+ const stream = createReadStream(filePath);
290
+ stream.on("error", next);
291
+ const contentType = MIME_TYPES[ext];
292
+ if (contentType) res.setHeader("Content-Type", contentType);
293
+ if (opts.static?.cacheControl) res.setHeader("Cache-Control", opts.static.cacheControl);
294
+ stream.pipe(res);
295
+ return;
296
+ }
297
+ return next();
298
+ } catch (e) {
299
+ console.error(e);
300
+ next(e);
301
+ }
302
+ };
303
+ return {
304
+ router,
305
+ notFound,
306
+ staticFile
307
+ };
282
308
  }
283
- var createQwikCity = createQwikRouter;
284
- export {
285
- createQwikCity,
286
- createQwikRouter
287
- };
309
+ /**
310
+ * @deprecated Use `createQwikRouter` instead. Will be removed in V3
311
+ * @public
312
+ */ var createQwikCity = createQwikRouter;
313
+ export { createQwikCity, createQwikRouter };