@qwik.dev/router 2.0.0-beta.10 → 2.0.0-beta.13
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/lib/adapters/azure-swa/vite/index.cjs +61 -5
- package/lib/adapters/azure-swa/vite/index.mjs +26 -201
- package/lib/adapters/bun-server/vite/index.cjs +27 -5
- package/lib/adapters/bun-server/vite/index.mjs +14 -196
- package/lib/adapters/cloud-run/vite/index.cjs +24 -5
- package/lib/adapters/cloud-run/vite/index.mjs +13 -195
- package/lib/adapters/cloudflare-pages/vite/index.cjs +65 -1
- package/lib/adapters/cloudflare-pages/vite/index.mjs +63 -4
- package/lib/adapters/deno-server/vite/index.cjs +39 -5
- package/lib/adapters/deno-server/vite/index.mjs +16 -198
- package/lib/adapters/netlify-edge/vite/index.cjs +88 -6
- package/lib/adapters/netlify-edge/vite/index.mjs +56 -240
- package/lib/adapters/node-server/vite/index.cjs +27 -5
- package/lib/adapters/node-server/vite/index.mjs +14 -196
- package/lib/adapters/shared/vite/index.cjs +303 -2
- package/lib/adapters/shared/vite/index.d.ts +4 -4
- package/lib/adapters/shared/vite/index.mjs +248 -143
- package/lib/adapters/ssg/vite/index.cjs +19 -5
- package/lib/adapters/ssg/vite/index.mjs +11 -193
- package/lib/adapters/vercel-edge/vite/index.cjs +81 -5
- package/lib/adapters/vercel-edge/vite/index.d.ts +1 -1
- package/lib/adapters/vercel-edge/vite/index.mjs +48 -229
- package/lib/chunks/error-handler.cjs +58 -0
- package/lib/chunks/error-handler.mjs +59 -0
- package/lib/chunks/format-error.cjs +136 -0
- package/lib/chunks/format-error.mjs +137 -0
- package/lib/chunks/fs.cjs +274 -0
- package/lib/chunks/fs.mjs +275 -0
- package/lib/chunks/index.cjs +877 -0
- package/lib/chunks/index.mjs +876 -0
- package/lib/chunks/mime-types.cjs +52 -0
- package/lib/chunks/mime-types.mjs +53 -0
- package/lib/chunks/routing.qwik.cjs +452 -0
- package/lib/chunks/routing.qwik.mjs +453 -0
- package/lib/chunks/types.qwik.cjs +24 -0
- package/lib/chunks/types.qwik.mjs +25 -0
- package/lib/index.d.ts +9 -3
- package/lib/index.qwik.cjs +543 -1001
- package/lib/index.qwik.mjs +512 -972
- package/lib/middleware/aws-lambda/index.cjs +52 -1
- package/lib/middleware/aws-lambda/index.mjs +37 -26
- package/lib/middleware/azure-swa/index.cjs +92 -1
- package/lib/middleware/azure-swa/index.mjs +64 -46
- package/lib/middleware/bun/index.cjs +143 -1
- package/lib/middleware/bun/index.mjs +103 -117
- package/lib/middleware/cloudflare-pages/index.cjs +96 -1
- package/lib/middleware/cloudflare-pages/index.mjs +68 -47
- package/lib/middleware/deno/index.cjs +130 -1
- package/lib/middleware/deno/index.mjs +93 -112
- package/lib/middleware/firebase/index.cjs +33 -1
- package/lib/middleware/firebase/index.mjs +25 -16
- package/lib/middleware/netlify-edge/index.cjs +71 -1
- package/lib/middleware/netlify-edge/index.mjs +52 -36
- package/lib/middleware/node/index.cjs +219 -1
- package/lib/middleware/node/index.mjs +178 -165
- package/lib/middleware/request-handler/index.cjs +1488 -18
- package/lib/middleware/request-handler/index.d.ts +20 -2
- package/lib/middleware/request-handler/index.mjs +1225 -873
- package/lib/middleware/vercel-edge/index.cjs +98 -1
- package/lib/middleware/vercel-edge/index.mjs +71 -47
- package/lib/service-worker/index.cjs +5 -0
- package/lib/service-worker/index.mjs +5 -0
- package/lib/ssg/index.cjs +15 -1
- package/lib/ssg/index.mjs +12 -19
- package/lib/vite/index.cjs +2006 -27
- package/lib/vite/index.d.ts +9 -9
- package/lib/vite/index.mjs +1597 -1216
- package/package.json +9 -8
- package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/bun-server/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/bun-server/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/cloudflare-pages/vite/index-BIeHg2Cj.cjs +0 -5
- package/lib/adapters/cloudflare-pages/vite/index-C455V8_A.cjs +0 -1
- package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/cloudflare-pages/vite/index-D3HITboM.js +0 -645
- package/lib/adapters/cloudflare-pages/vite/index-DKcVHRBy.cjs +0 -11
- package/lib/adapters/cloudflare-pages/vite/index-DwovcBp3.js +0 -22
- package/lib/adapters/cloudflare-pages/vite/index-bogwy7wh.js +0 -250
- package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/deno-server/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/deno-server/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/node-server/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/node-server/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/node-server/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/shared/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/shared/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/shared/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/shared/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/shared/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/ssg/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/ssg/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/ssg/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +0 -1
- package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +0 -1
- package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +0 -651
- package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +0 -6
- package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +0 -22
- package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +0 -11
- package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +0 -1
- package/lib/service-worker.cjs +0 -1
- package/lib/service-worker.mjs +0 -5
- package/lib/ssg/deno.cjs +0 -1
- package/lib/ssg/deno.mjs +0 -6
- package/lib/ssg/index-CBIchDYq.js +0 -651
- package/lib/ssg/index-ClHGw5z1.js +0 -6
- package/lib/ssg/index-DTIOTwZo.cjs +0 -11
- package/lib/ssg/index-vQuPcef3.cjs +0 -1
- package/lib/ssg/node.cjs +0 -11
- package/lib/ssg/node.mjs +0 -651
|
@@ -1 +1,219 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const server = require("@qwik.dev/core/server");
|
|
4
|
+
const requestHandler = require("@qwik.dev/router/middleware/request-handler");
|
|
5
|
+
const fs = require("node:fs");
|
|
6
|
+
const path = require("node:path");
|
|
7
|
+
const node_url = require("node:url");
|
|
8
|
+
const mimeTypes = require("../../chunks/mime-types.cjs");
|
|
9
|
+
const node_http2 = require("node:http2");
|
|
10
|
+
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
11
|
+
function computeOrigin(req, opts) {
|
|
12
|
+
return opts?.getOrigin?.(req) ?? opts?.origin ?? process.env.ORIGIN ?? fallbackOrigin(req);
|
|
13
|
+
}
|
|
14
|
+
function fallbackOrigin(req) {
|
|
15
|
+
const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
|
|
16
|
+
const headers = req.headers;
|
|
17
|
+
const protocol = PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http");
|
|
18
|
+
const hostHeader = HOST_HEADER ?? (req instanceof node_http2.Http2ServerRequest ? ":authority" : "host");
|
|
19
|
+
const host = headers[hostHeader];
|
|
20
|
+
return `${protocol}://${host}`;
|
|
21
|
+
}
|
|
22
|
+
function getUrl(req, origin) {
|
|
23
|
+
return normalizeUrl(req.originalUrl || req.url || "/", origin);
|
|
24
|
+
}
|
|
25
|
+
function isIgnoredError(message = "") {
|
|
26
|
+
const ignoredErrors = ["The stream has been destroyed", "write after end"];
|
|
27
|
+
return ignoredErrors.some((ignored) => message.includes(ignored));
|
|
28
|
+
}
|
|
29
|
+
const invalidHeadersPattern = /^:(method|scheme|authority|path)$/i;
|
|
30
|
+
function normalizeUrl(url, base) {
|
|
31
|
+
const DOUBLE_SLASH_REG = /\/\/|\\\\/g;
|
|
32
|
+
return new URL(url.replace(DOUBLE_SLASH_REG, "/"), base);
|
|
33
|
+
}
|
|
34
|
+
async function fromNodeHttp(url, req, res, mode, getClientConn) {
|
|
35
|
+
const requestHeaders = new Headers();
|
|
36
|
+
const nodeRequestHeaders = req.headers;
|
|
37
|
+
try {
|
|
38
|
+
for (const [key, value] of Object.entries(nodeRequestHeaders)) {
|
|
39
|
+
if (invalidHeadersPattern.test(key)) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (typeof value === "string") {
|
|
43
|
+
requestHeaders.set(key, value);
|
|
44
|
+
} else if (Array.isArray(value)) {
|
|
45
|
+
for (const v of value) {
|
|
46
|
+
requestHeaders.append(key, v);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} catch (err) {
|
|
51
|
+
console.error(err);
|
|
52
|
+
}
|
|
53
|
+
const getRequestBody = async function* () {
|
|
54
|
+
for await (const chunk of req) {
|
|
55
|
+
yield chunk;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
|
|
59
|
+
const controller = new AbortController();
|
|
60
|
+
const options = {
|
|
61
|
+
method: req.method,
|
|
62
|
+
headers: requestHeaders,
|
|
63
|
+
body,
|
|
64
|
+
signal: controller.signal,
|
|
65
|
+
duplex: "half"
|
|
66
|
+
};
|
|
67
|
+
res.on("close", () => {
|
|
68
|
+
controller.abort();
|
|
69
|
+
});
|
|
70
|
+
const serverRequestEv = {
|
|
71
|
+
mode,
|
|
72
|
+
url,
|
|
73
|
+
request: new Request(url.href, options),
|
|
74
|
+
env: {
|
|
75
|
+
get(key) {
|
|
76
|
+
return process.env[key];
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
getWritableStream: (status, headers, cookies) => {
|
|
80
|
+
res.statusCode = status;
|
|
81
|
+
try {
|
|
82
|
+
for (const [key, value] of headers) {
|
|
83
|
+
if (invalidHeadersPattern.test(key)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
res.setHeader(key, value);
|
|
87
|
+
}
|
|
88
|
+
const cookieHeaders = cookies.headers();
|
|
89
|
+
if (cookieHeaders.length > 0) {
|
|
90
|
+
res.setHeader("Set-Cookie", cookieHeaders);
|
|
91
|
+
}
|
|
92
|
+
} catch (err) {
|
|
93
|
+
console.error(err);
|
|
94
|
+
}
|
|
95
|
+
return new WritableStream({
|
|
96
|
+
write(chunk) {
|
|
97
|
+
if (res.closed || res.destroyed) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
res.write(chunk, (error) => {
|
|
101
|
+
if (error && !isIgnoredError(error.message)) {
|
|
102
|
+
console.error(error);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
close() {
|
|
107
|
+
res.end();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
getClientConn: () => {
|
|
112
|
+
return getClientConn ? getClientConn(req) : {
|
|
113
|
+
ip: req.socket.remoteAddress
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
platform: {
|
|
117
|
+
ssr: true,
|
|
118
|
+
incomingMessage: req,
|
|
119
|
+
node: process.versions.node
|
|
120
|
+
// Weirdly needed to make typecheck of insights happy
|
|
121
|
+
},
|
|
122
|
+
locale: void 0
|
|
123
|
+
};
|
|
124
|
+
return serverRequestEv;
|
|
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
|
+
server.setServerPlatform(opts.manifest);
|
|
133
|
+
}
|
|
134
|
+
const staticFolder = opts.static?.root ?? path.join(node_url.fileURLToPath(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("middleware/node/index.cjs", document.baseURI).href), "..", "..", "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
|
+
const handled = await requestHandler.requestHandler(serverRequestEv, opts);
|
|
146
|
+
if (handled) {
|
|
147
|
+
const err = await handled.completion;
|
|
148
|
+
if (err) {
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
if (handled.requestEv.headersSent) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
next();
|
|
156
|
+
} catch (e) {
|
|
157
|
+
console.error(e);
|
|
158
|
+
next(e);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const notFound = async (req, res, next) => {
|
|
162
|
+
try {
|
|
163
|
+
if (!res.headersSent) {
|
|
164
|
+
const origin = computeOrigin(req, opts);
|
|
165
|
+
const url = getUrl(req, origin);
|
|
166
|
+
const notFoundHtml = !req.headers.accept?.includes("text/html") || requestHandler.isStaticPath(req.method || "GET", url) ? "Not Found" : requestHandler.getNotFound(url.pathname);
|
|
167
|
+
res.writeHead(404, {
|
|
168
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
169
|
+
"X-Not-Found": url.pathname
|
|
170
|
+
});
|
|
171
|
+
res.end(notFoundHtml);
|
|
172
|
+
}
|
|
173
|
+
} catch (e) {
|
|
174
|
+
console.error(e);
|
|
175
|
+
next(e);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
const staticFile = async (req, res, next) => {
|
|
179
|
+
try {
|
|
180
|
+
const origin = computeOrigin(req, opts);
|
|
181
|
+
const url = getUrl(req, origin);
|
|
182
|
+
if (requestHandler.isStaticPath(req.method || "GET", url)) {
|
|
183
|
+
const pathname = url.pathname;
|
|
184
|
+
let filePath;
|
|
185
|
+
if (path.basename(pathname).includes(".")) {
|
|
186
|
+
filePath = path.join(staticFolder, pathname);
|
|
187
|
+
} else if (!globalThis.__NO_TRAILING_SLASH__) {
|
|
188
|
+
filePath = path.join(staticFolder, pathname + "index.html");
|
|
189
|
+
} else {
|
|
190
|
+
filePath = path.join(staticFolder, pathname, "index.html");
|
|
191
|
+
}
|
|
192
|
+
const ext = path.extname(filePath).replace(/^\./, "");
|
|
193
|
+
const stream = fs.createReadStream(filePath);
|
|
194
|
+
stream.on("error", next);
|
|
195
|
+
const contentType = mimeTypes.MIME_TYPES[ext];
|
|
196
|
+
if (contentType) {
|
|
197
|
+
res.setHeader("Content-Type", contentType);
|
|
198
|
+
}
|
|
199
|
+
if (opts.static?.cacheControl) {
|
|
200
|
+
res.setHeader("Cache-Control", opts.static.cacheControl);
|
|
201
|
+
}
|
|
202
|
+
stream.pipe(res);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
return next();
|
|
206
|
+
} catch (e) {
|
|
207
|
+
console.error(e);
|
|
208
|
+
next(e);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
return {
|
|
212
|
+
router,
|
|
213
|
+
notFound,
|
|
214
|
+
staticFile
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
const createQwikCity = createQwikRouter;
|
|
218
|
+
exports.createQwikCity = createQwikCity;
|
|
219
|
+
exports.createQwikRouter = createQwikRouter;
|
|
@@ -1,205 +1,218 @@
|
|
|
1
|
-
import { setServerPlatform
|
|
2
|
-
import {
|
|
3
|
-
import { createReadStream
|
|
4
|
-
import { join
|
|
5
|
-
import { fileURLToPath
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 { setServerPlatform } from "@qwik.dev/core/server";
|
|
2
|
+
import { isStaticPath, getNotFound, requestHandler } from "@qwik.dev/router/middleware/request-handler";
|
|
3
|
+
import { createReadStream } from "node:fs";
|
|
4
|
+
import { join, basename, extname } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { M as MIME_TYPES } from "../../chunks/mime-types.mjs";
|
|
7
|
+
import { Http2ServerRequest } from "node:http2";
|
|
8
|
+
function computeOrigin(req, opts) {
|
|
9
|
+
return opts?.getOrigin?.(req) ?? opts?.origin ?? process.env.ORIGIN ?? fallbackOrigin(req);
|
|
59
10
|
}
|
|
60
|
-
function
|
|
61
|
-
const { PROTOCOL_HEADER
|
|
62
|
-
|
|
11
|
+
function fallbackOrigin(req) {
|
|
12
|
+
const { PROTOCOL_HEADER, HOST_HEADER } = process.env;
|
|
13
|
+
const headers = req.headers;
|
|
14
|
+
const protocol = PROTOCOL_HEADER && headers[PROTOCOL_HEADER] || (req.socket.encrypted || req.connection.encrypted ? "https" : "http");
|
|
15
|
+
const hostHeader = HOST_HEADER ?? (req instanceof Http2ServerRequest ? ":authority" : "host");
|
|
16
|
+
const host = headers[hostHeader];
|
|
17
|
+
return `${protocol}://${host}`;
|
|
63
18
|
}
|
|
64
|
-
function
|
|
65
|
-
return
|
|
19
|
+
function getUrl(req, origin) {
|
|
20
|
+
return normalizeUrl(req.originalUrl || req.url || "/", origin);
|
|
66
21
|
}
|
|
67
|
-
function
|
|
68
|
-
|
|
22
|
+
function isIgnoredError(message = "") {
|
|
23
|
+
const ignoredErrors = ["The stream has been destroyed", "write after end"];
|
|
24
|
+
return ignoredErrors.some((ignored) => message.includes(ignored));
|
|
69
25
|
}
|
|
70
|
-
const
|
|
71
|
-
function
|
|
72
|
-
const
|
|
73
|
-
return new URL(
|
|
26
|
+
const invalidHeadersPattern = /^:(method|scheme|authority|path)$/i;
|
|
27
|
+
function normalizeUrl(url, base) {
|
|
28
|
+
const DOUBLE_SLASH_REG = /\/\/|\\\\/g;
|
|
29
|
+
return new URL(url.replace(DOUBLE_SLASH_REG, "/"), base);
|
|
74
30
|
}
|
|
75
|
-
async function
|
|
76
|
-
const
|
|
31
|
+
async function fromNodeHttp(url, req, res, mode, getClientConn) {
|
|
32
|
+
const requestHeaders = new Headers();
|
|
33
|
+
const nodeRequestHeaders = req.headers;
|
|
77
34
|
try {
|
|
78
|
-
for (const [
|
|
79
|
-
if (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
35
|
+
for (const [key, value] of Object.entries(nodeRequestHeaders)) {
|
|
36
|
+
if (invalidHeadersPattern.test(key)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (typeof value === "string") {
|
|
40
|
+
requestHeaders.set(key, value);
|
|
41
|
+
} else if (Array.isArray(value)) {
|
|
42
|
+
for (const v of value) {
|
|
43
|
+
requestHeaders.append(key, v);
|
|
44
|
+
}
|
|
85
45
|
}
|
|
86
|
-
|
|
87
|
-
|
|
46
|
+
}
|
|
47
|
+
} catch (err) {
|
|
48
|
+
console.error(err);
|
|
88
49
|
}
|
|
89
|
-
const
|
|
90
|
-
for await (const
|
|
91
|
-
yield
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
50
|
+
const getRequestBody = async function* () {
|
|
51
|
+
for await (const chunk of req) {
|
|
52
|
+
yield chunk;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const body = req.method === "HEAD" || req.method === "GET" ? void 0 : getRequestBody();
|
|
56
|
+
const controller = new AbortController();
|
|
57
|
+
const options = {
|
|
58
|
+
method: req.method,
|
|
59
|
+
headers: requestHeaders,
|
|
60
|
+
body,
|
|
61
|
+
signal: controller.signal,
|
|
97
62
|
duplex: "half"
|
|
98
63
|
};
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
64
|
+
res.on("close", () => {
|
|
65
|
+
controller.abort();
|
|
66
|
+
});
|
|
67
|
+
const serverRequestEv = {
|
|
68
|
+
mode,
|
|
69
|
+
url,
|
|
70
|
+
request: new Request(url.href, options),
|
|
105
71
|
env: {
|
|
106
|
-
get(
|
|
107
|
-
return process.env[
|
|
72
|
+
get(key) {
|
|
73
|
+
return process.env[key];
|
|
108
74
|
}
|
|
109
75
|
},
|
|
110
|
-
getWritableStream: (
|
|
111
|
-
|
|
76
|
+
getWritableStream: (status, headers, cookies) => {
|
|
77
|
+
res.statusCode = status;
|
|
112
78
|
try {
|
|
113
|
-
for (const [
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
79
|
+
for (const [key, value] of headers) {
|
|
80
|
+
if (invalidHeadersPattern.test(key)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
res.setHeader(key, value);
|
|
84
|
+
}
|
|
85
|
+
const cookieHeaders = cookies.headers();
|
|
86
|
+
if (cookieHeaders.length > 0) {
|
|
87
|
+
res.setHeader("Set-Cookie", cookieHeaders);
|
|
88
|
+
}
|
|
89
|
+
} catch (err) {
|
|
90
|
+
console.error(err);
|
|
119
91
|
}
|
|
120
92
|
return new WritableStream({
|
|
121
|
-
write(
|
|
122
|
-
|
|
123
|
-
|
|
93
|
+
write(chunk) {
|
|
94
|
+
if (res.closed || res.destroyed) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
res.write(chunk, (error) => {
|
|
98
|
+
if (error && !isIgnoredError(error.message)) {
|
|
99
|
+
console.error(error);
|
|
100
|
+
}
|
|
124
101
|
});
|
|
125
102
|
},
|
|
126
103
|
close() {
|
|
127
|
-
|
|
104
|
+
res.end();
|
|
128
105
|
}
|
|
129
106
|
});
|
|
130
107
|
},
|
|
131
|
-
getClientConn: () =>
|
|
132
|
-
|
|
108
|
+
getClientConn: () => {
|
|
109
|
+
return getClientConn ? getClientConn(req) : {
|
|
110
|
+
ip: req.socket.remoteAddress
|
|
111
|
+
};
|
|
133
112
|
},
|
|
134
113
|
platform: {
|
|
135
|
-
ssr:
|
|
136
|
-
incomingMessage:
|
|
114
|
+
ssr: true,
|
|
115
|
+
incomingMessage: req,
|
|
137
116
|
node: process.versions.node
|
|
138
117
|
// Weirdly needed to make typecheck of insights happy
|
|
139
118
|
},
|
|
140
119
|
locale: void 0
|
|
141
120
|
};
|
|
121
|
+
return serverRequestEv;
|
|
142
122
|
}
|
|
143
|
-
function
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
123
|
+
function createQwikRouter(opts) {
|
|
124
|
+
if (opts.qwikCityPlan && !opts.qwikRouterConfig) {
|
|
125
|
+
console.warn("qwikCityPlan is deprecated. Simply remove it.");
|
|
126
|
+
opts.qwikRouterConfig = opts.qwikCityPlan;
|
|
127
|
+
}
|
|
128
|
+
if (opts.manifest) {
|
|
129
|
+
setServerPlatform(opts.manifest);
|
|
130
|
+
}
|
|
131
|
+
const staticFolder = opts.static?.root ?? join(fileURLToPath(import.meta.url), "..", "..", "dist");
|
|
132
|
+
const router = async (req, res, next) => {
|
|
133
|
+
try {
|
|
134
|
+
const origin = computeOrigin(req, opts);
|
|
135
|
+
const serverRequestEv = await fromNodeHttp(
|
|
136
|
+
getUrl(req, origin),
|
|
137
|
+
req,
|
|
138
|
+
res,
|
|
139
|
+
"server",
|
|
140
|
+
opts.getClientConn
|
|
141
|
+
);
|
|
142
|
+
const handled = await requestHandler(serverRequestEv, opts);
|
|
143
|
+
if (handled) {
|
|
144
|
+
const err = await handled.completion;
|
|
145
|
+
if (err) {
|
|
146
|
+
throw err;
|
|
162
147
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
console.error(i), m(i);
|
|
166
|
-
}
|
|
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
|
+
if (handled.requestEv.headersSent) {
|
|
149
|
+
return;
|
|
176
150
|
}
|
|
177
|
-
} catch (i) {
|
|
178
|
-
console.error(i), m(i);
|
|
179
151
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
152
|
+
next();
|
|
153
|
+
} catch (e) {
|
|
154
|
+
console.error(e);
|
|
155
|
+
next(e);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
const notFound = async (req, res, next) => {
|
|
159
|
+
try {
|
|
160
|
+
if (!res.headersSent) {
|
|
161
|
+
const origin = computeOrigin(req, opts);
|
|
162
|
+
const url = getUrl(req, origin);
|
|
163
|
+
const notFoundHtml = !req.headers.accept?.includes("text/html") || isStaticPath(req.method || "GET", url) ? "Not Found" : getNotFound(url.pathname);
|
|
164
|
+
res.writeHead(404, {
|
|
165
|
+
"Content-Type": "text/html; charset=utf-8",
|
|
166
|
+
"X-Not-Found": url.pathname
|
|
167
|
+
});
|
|
168
|
+
res.end(notFoundHtml);
|
|
169
|
+
}
|
|
170
|
+
} catch (e) {
|
|
171
|
+
console.error(e);
|
|
172
|
+
next(e);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const staticFile = async (req, res, next) => {
|
|
176
|
+
try {
|
|
177
|
+
const origin = computeOrigin(req, opts);
|
|
178
|
+
const url = getUrl(req, origin);
|
|
179
|
+
if (isStaticPath(req.method || "GET", url)) {
|
|
180
|
+
const pathname = url.pathname;
|
|
181
|
+
let filePath;
|
|
182
|
+
if (basename(pathname).includes(".")) {
|
|
183
|
+
filePath = join(staticFolder, pathname);
|
|
184
|
+
} else if (!globalThis.__NO_TRAILING_SLASH__) {
|
|
185
|
+
filePath = join(staticFolder, pathname + "index.html");
|
|
186
|
+
} else {
|
|
187
|
+
filePath = join(staticFolder, pathname, "index.html");
|
|
188
|
+
}
|
|
189
|
+
const ext = extname(filePath).replace(/^\./, "");
|
|
190
|
+
const stream = createReadStream(filePath);
|
|
191
|
+
stream.on("error", next);
|
|
192
|
+
const contentType = MIME_TYPES[ext];
|
|
193
|
+
if (contentType) {
|
|
194
|
+
res.setHeader("Content-Type", contentType);
|
|
193
195
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
196
|
+
if (opts.static?.cacheControl) {
|
|
197
|
+
res.setHeader("Cache-Control", opts.static.cacheControl);
|
|
198
|
+
}
|
|
199
|
+
stream.pipe(res);
|
|
200
|
+
return;
|
|
197
201
|
}
|
|
202
|
+
return next();
|
|
203
|
+
} catch (e) {
|
|
204
|
+
console.error(e);
|
|
205
|
+
next(e);
|
|
198
206
|
}
|
|
199
207
|
};
|
|
208
|
+
return {
|
|
209
|
+
router,
|
|
210
|
+
notFound,
|
|
211
|
+
staticFile
|
|
212
|
+
};
|
|
200
213
|
}
|
|
201
|
-
const
|
|
214
|
+
const createQwikCity = createQwikRouter;
|
|
202
215
|
export {
|
|
203
|
-
|
|
204
|
-
|
|
216
|
+
createQwikCity,
|
|
217
|
+
createQwikRouter
|
|
205
218
|
};
|