@qwik.dev/router 2.0.0-beta.1 → 2.0.0-beta.11
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/adapters/static/vite.d.ts +1 -1
- package/lib/adapters/azure-swa/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/azure-swa/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/azure-swa/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/azure-swa/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/azure-swa/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/azure-swa/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/azure-swa/vite/index.cjs +5 -96
- package/lib/adapters/azure-swa/vite/index.d.ts +2 -2
- package/lib/adapters/azure-swa/vite/index.mjs +205 -26
- package/lib/adapters/bun-server/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/bun-server/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/bun-server/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/bun-server/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/bun-server/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/bun-server/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/bun-server/vite/index.cjs +5 -50
- package/lib/adapters/bun-server/vite/index.d.ts +2 -2
- package/lib/adapters/bun-server/vite/index.mjs +200 -12
- package/lib/adapters/cloud-run/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/cloud-run/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/cloud-run/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/cloud-run/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/cloud-run/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/cloud-run/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/cloud-run/vite/index.cjs +5 -47
- package/lib/adapters/cloud-run/vite/index.d.ts +2 -2
- package/lib/adapters/cloud-run/vite/index.mjs +199 -11
- package/lib/adapters/cloudflare-pages/vite/index-Bg_9YkM5.js +22 -0
- package/lib/adapters/cloudflare-pages/vite/index-C1aDmh1S.cjs +1 -0
- package/lib/adapters/cloudflare-pages/vite/index-CHT9Y93A.js +254 -0
- package/lib/adapters/cloudflare-pages/vite/index-Ck7KvpK1.cjs +11 -0
- package/lib/adapters/cloudflare-pages/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/cloudflare-pages/vite/index-Cp1cjAds.js +645 -0
- package/lib/adapters/cloudflare-pages/vite/index-D9RL9dvJ.cjs +5 -0
- package/lib/adapters/cloudflare-pages/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/cloudflare-pages/vite/index.cjs +1 -115
- package/lib/adapters/cloudflare-pages/vite/index.d.ts +2 -2
- package/lib/adapters/cloudflare-pages/vite/index.mjs +4 -78
- package/lib/adapters/deno-server/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/deno-server/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/deno-server/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/deno-server/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/deno-server/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/deno-server/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/deno-server/vite/index.cjs +5 -62
- package/lib/adapters/deno-server/vite/index.d.ts +2 -2
- package/lib/adapters/deno-server/vite/index.mjs +202 -14
- package/lib/adapters/netlify-edge/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/netlify-edge/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/netlify-edge/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/netlify-edge/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/netlify-edge/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/netlify-edge/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/netlify-edge/vite/index.cjs +6 -129
- package/lib/adapters/netlify-edge/vite/index.d.ts +2 -2
- package/lib/adapters/netlify-edge/vite/index.mjs +244 -60
- package/lib/adapters/node-server/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/node-server/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/node-server/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/node-server/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/node-server/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/node-server/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/node-server/vite/index.cjs +5 -50
- package/lib/adapters/node-server/vite/index.d.ts +2 -2
- package/lib/adapters/node-server/vite/index.mjs +200 -12
- package/lib/adapters/shared/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/shared/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/shared/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/shared/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/shared/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/shared/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/shared/vite/index.cjs +2 -375
- package/lib/adapters/shared/vite/index.d.ts +9 -15
- package/lib/adapters/shared/vite/index.mjs +159 -292
- package/lib/adapters/ssg/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/ssg/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/ssg/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/ssg/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/ssg/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/ssg/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/ssg/vite/index.cjs +5 -0
- package/lib/adapters/ssg/vite/index.d.ts +13 -0
- package/lib/adapters/ssg/vite/index.mjs +205 -0
- package/lib/adapters/vercel-edge/vite/index-BqUeglYs.cjs +1 -0
- package/lib/adapters/vercel-edge/vite/index-CBIchDYq.js +651 -0
- package/lib/adapters/vercel-edge/vite/index-ClHGw5z1.js +6 -0
- package/lib/adapters/vercel-edge/vite/index-CrwlB95_.js +22 -0
- package/lib/adapters/vercel-edge/vite/index-DTIOTwZo.cjs +11 -0
- package/lib/adapters/vercel-edge/vite/index-vQuPcef3.cjs +1 -0
- package/lib/adapters/vercel-edge/vite/index.cjs +5 -118
- package/lib/adapters/vercel-edge/vite/index.d.ts +2 -2
- package/lib/adapters/vercel-edge/vite/index.mjs +234 -51
- package/lib/index.d.ts +172 -50
- package/lib/index.qwik.cjs +370 -191
- package/lib/index.qwik.mjs +372 -193
- package/lib/middleware/aws-lambda/index.cjs +1 -0
- package/lib/middleware/aws-lambda/index.d.ts +3 -2
- package/lib/middleware/aws-lambda/index.mjs +27 -41
- package/lib/middleware/azure-swa/index.cjs +1 -0
- package/lib/middleware/azure-swa/index.mjs +46 -269
- package/lib/middleware/bun/index.cjs +1 -0
- package/lib/middleware/bun/index.mjs +68 -120
- package/lib/middleware/cloudflare-pages/index.cjs +1 -0
- package/lib/middleware/cloudflare-pages/index.mjs +48 -80
- package/lib/middleware/deno/index.cjs +1 -0
- package/lib/middleware/deno/index.mjs +63 -110
- package/lib/middleware/firebase/index.cjs +1 -0
- package/lib/middleware/firebase/index.mjs +16 -28
- package/lib/middleware/netlify-edge/index.cjs +1 -0
- package/lib/middleware/netlify-edge/index.mjs +36 -64
- package/lib/middleware/node/index.cjs +1 -314
- package/lib/middleware/node/index.mjs +116 -198
- package/lib/middleware/request-handler/index.cjs +11 -1607
- package/lib/middleware/request-handler/index.d.ts +63 -62
- package/lib/middleware/request-handler/index.mjs +890 -1333
- package/lib/middleware/vercel-edge/index.cjs +1 -0
- package/lib/middleware/vercel-edge/index.mjs +47 -82
- package/lib/modules.d.ts +4 -12
- package/lib/service-worker.cjs +1 -17
- package/lib/service-worker.mjs +5 -15
- package/lib/ssg/deno.cjs +1 -0
- package/lib/ssg/deno.mjs +6 -0
- package/lib/ssg/index-CBIchDYq.js +651 -0
- package/lib/ssg/index-ClHGw5z1.js +6 -0
- package/lib/ssg/index-DTIOTwZo.cjs +11 -0
- package/lib/ssg/index-vQuPcef3.cjs +1 -0
- package/lib/ssg/index.cjs +1 -0
- package/lib/{static → ssg}/index.d.ts +17 -17
- package/lib/ssg/index.mjs +22 -0
- package/lib/ssg/node.cjs +11 -0
- package/lib/ssg/node.mjs +651 -0
- package/lib/vite/index.cjs +28 -27431
- package/lib/vite/index.d.ts +19 -3
- package/lib/vite/index.mjs +1425 -27227
- package/modules.d.ts +4 -12
- package/package.json +50 -39
- package/ssg.d.ts +2 -0
- package/static.d.ts +1 -1
- package/lib/adapters/static/vite/index.cjs +0 -368
- package/lib/adapters/static/vite/index.d.ts +0 -10
- package/lib/adapters/static/vite/index.mjs +0 -331
- package/lib/static/deno.mjs +0 -8
- package/lib/static/index.cjs +0 -67
- package/lib/static/index.mjs +0 -48
- package/lib/static/node.cjs +0 -1124
- package/lib/static/node.mjs +0 -1086
- package/middleware/request-handler/generated/not-found-paths.ts +0 -7
- package/middleware/request-handler/generated/static-paths.ts +0 -35
package/lib/static/node.mjs
DELETED
|
@@ -1,1086 +0,0 @@
|
|
|
1
|
-
// packages/qwik-router/src/static/node/node-system.ts
|
|
2
|
-
import fs2 from "node:fs";
|
|
3
|
-
import { dirname as dirname2, join } from "node:path";
|
|
4
|
-
|
|
5
|
-
// packages/qwik-router/src/static/node/node-main.ts
|
|
6
|
-
import fs from "node:fs";
|
|
7
|
-
import { cpus as nodeCpus } from "node:os";
|
|
8
|
-
import { Worker } from "node:worker_threads";
|
|
9
|
-
import { isAbsolute, resolve } from "node:path";
|
|
10
|
-
|
|
11
|
-
// packages/qwik-router/src/utils/fs.ts
|
|
12
|
-
import { basename, dirname, normalize, relative } from "node:path";
|
|
13
|
-
|
|
14
|
-
// packages/qwik-router/src/utils/format.ts
|
|
15
|
-
function msToString(ms) {
|
|
16
|
-
if (ms < 1) {
|
|
17
|
-
return ms.toFixed(2) + " ms";
|
|
18
|
-
}
|
|
19
|
-
if (ms < 1e3) {
|
|
20
|
-
return ms.toFixed(1) + " ms";
|
|
21
|
-
}
|
|
22
|
-
if (ms < 6e4) {
|
|
23
|
-
return (ms / 1e3).toFixed(1) + " s";
|
|
24
|
-
}
|
|
25
|
-
return (ms / 6e4).toFixed(1) + " m";
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// packages/qwik-router/src/utils/pathname.ts
|
|
29
|
-
function getPathnameForDynamicRoute(originalPathname, paramNames, params) {
|
|
30
|
-
let pathname = originalPathname;
|
|
31
|
-
if (paramNames && params) {
|
|
32
|
-
for (const paramName of paramNames) {
|
|
33
|
-
const paramKey = `[${paramName}]`;
|
|
34
|
-
const restParamKey = `[...${paramName}]`;
|
|
35
|
-
const paramValue = params[paramName];
|
|
36
|
-
pathname = pathname.replace(restParamKey, paramValue);
|
|
37
|
-
pathname = pathname.replace(paramKey, paramValue);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return pathname;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// packages/qwik-router/src/utils/fs.ts
|
|
44
|
-
function normalizePath(path) {
|
|
45
|
-
return normalizePathSlash(normalize(path));
|
|
46
|
-
}
|
|
47
|
-
function normalizePathSlash(path) {
|
|
48
|
-
const isExtendedLengthPath = /^\\\\\?\\/.test(path);
|
|
49
|
-
const hasNonAscii = /[^\u0000-\u0080]+/.test(path);
|
|
50
|
-
if (isExtendedLengthPath || hasNonAscii) {
|
|
51
|
-
return path;
|
|
52
|
-
}
|
|
53
|
-
path = path.replace(/\\/g, "/");
|
|
54
|
-
if (path.endsWith("/")) {
|
|
55
|
-
path = path.slice(0, path.length - 1);
|
|
56
|
-
}
|
|
57
|
-
return path;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// packages/qwik-router/src/static/worker-thread.ts
|
|
61
|
-
import { _deserialize, _serialize, _verifySerializable } from "@qwik.dev/core/internal";
|
|
62
|
-
import { requestHandler } from "../middleware/request-handler/index.mjs";
|
|
63
|
-
import { WritableStream } from "node:stream/web";
|
|
64
|
-
import { pathToFileURL } from "node:url";
|
|
65
|
-
async function workerThread(sys) {
|
|
66
|
-
const ssgOpts = sys.getOptions();
|
|
67
|
-
const pendingPromises = /* @__PURE__ */ new Set();
|
|
68
|
-
const opts = {
|
|
69
|
-
...ssgOpts,
|
|
70
|
-
render: (await import(pathToFileURL(ssgOpts.renderModulePath).href)).default,
|
|
71
|
-
qwikRouterConfig: (await import(pathToFileURL(ssgOpts.qwikRouterConfigModulePath).href)).default
|
|
72
|
-
};
|
|
73
|
-
sys.createWorkerProcess(async (msg) => {
|
|
74
|
-
switch (msg.type) {
|
|
75
|
-
case "render": {
|
|
76
|
-
return new Promise((resolve2) => {
|
|
77
|
-
workerRender(sys, opts, msg, pendingPromises, resolve2);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
case "close": {
|
|
81
|
-
const promises = Array.from(pendingPromises);
|
|
82
|
-
pendingPromises.clear();
|
|
83
|
-
await Promise.all(promises);
|
|
84
|
-
return { type: "close" };
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
async function createSingleThreadWorker(sys) {
|
|
90
|
-
const ssgOpts = sys.getOptions();
|
|
91
|
-
const pendingPromises = /* @__PURE__ */ new Set();
|
|
92
|
-
const opts = {
|
|
93
|
-
...ssgOpts,
|
|
94
|
-
render: (await import(pathToFileURL(ssgOpts.renderModulePath).href)).default,
|
|
95
|
-
qwikRouterConfig: (await import(pathToFileURL(ssgOpts.qwikRouterConfigModulePath).href)).default
|
|
96
|
-
};
|
|
97
|
-
return (staticRoute) => {
|
|
98
|
-
return new Promise((resolve2) => {
|
|
99
|
-
workerRender(sys, opts, staticRoute, pendingPromises, resolve2);
|
|
100
|
-
});
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
async function workerRender(sys, opts, staticRoute, pendingPromises, callback) {
|
|
104
|
-
const qwikSerializer = {
|
|
105
|
-
_deserialize,
|
|
106
|
-
_serialize,
|
|
107
|
-
_verifySerializable
|
|
108
|
-
};
|
|
109
|
-
const url = new URL(staticRoute.pathname, opts.origin);
|
|
110
|
-
const result = {
|
|
111
|
-
type: "render",
|
|
112
|
-
pathname: staticRoute.pathname,
|
|
113
|
-
url: url.href,
|
|
114
|
-
ok: false,
|
|
115
|
-
error: null,
|
|
116
|
-
filePath: null,
|
|
117
|
-
contentType: null,
|
|
118
|
-
resourceType: null
|
|
119
|
-
};
|
|
120
|
-
try {
|
|
121
|
-
let routeWriter = null;
|
|
122
|
-
let closeResolved;
|
|
123
|
-
const closePromise = new Promise((closePromiseResolve) => {
|
|
124
|
-
closeResolved = closePromiseResolve;
|
|
125
|
-
});
|
|
126
|
-
const request = new Request(url);
|
|
127
|
-
const requestCtx = {
|
|
128
|
-
mode: "static",
|
|
129
|
-
locale: void 0,
|
|
130
|
-
url,
|
|
131
|
-
request,
|
|
132
|
-
env: {
|
|
133
|
-
get(key) {
|
|
134
|
-
return sys.getEnv(key);
|
|
135
|
-
}
|
|
136
|
-
},
|
|
137
|
-
platform: sys.platform,
|
|
138
|
-
getClientConn: () => {
|
|
139
|
-
return {};
|
|
140
|
-
},
|
|
141
|
-
getWritableStream: (status, headers, _, _r, requestEv) => {
|
|
142
|
-
result.ok = status >= 200 && status < 300;
|
|
143
|
-
if (!result.ok) {
|
|
144
|
-
return noopWritableStream;
|
|
145
|
-
}
|
|
146
|
-
result.contentType = (headers.get("Content-Type") || "").toLowerCase();
|
|
147
|
-
const isHtml = result.contentType.includes("text/html");
|
|
148
|
-
const is404ErrorPage = url.pathname.endsWith("/404.html");
|
|
149
|
-
const routeFilePath = sys.getRouteFilePath(url.pathname, isHtml);
|
|
150
|
-
if (is404ErrorPage) {
|
|
151
|
-
result.resourceType = "404";
|
|
152
|
-
} else if (isHtml) {
|
|
153
|
-
result.resourceType = "page";
|
|
154
|
-
}
|
|
155
|
-
const hasRouteWriter = isHtml ? opts.emitHtml !== false : true;
|
|
156
|
-
const writeQDataEnabled = isHtml && opts.emitData !== false;
|
|
157
|
-
const stream = new WritableStream({
|
|
158
|
-
async start() {
|
|
159
|
-
try {
|
|
160
|
-
if (hasRouteWriter || writeQDataEnabled) {
|
|
161
|
-
await sys.ensureDir(routeFilePath);
|
|
162
|
-
}
|
|
163
|
-
if (hasRouteWriter) {
|
|
164
|
-
routeWriter = sys.createWriteStream(routeFilePath);
|
|
165
|
-
routeWriter.on("error", (e) => {
|
|
166
|
-
console.error(e);
|
|
167
|
-
routeWriter = null;
|
|
168
|
-
result.error = {
|
|
169
|
-
message: e.message,
|
|
170
|
-
stack: e.stack
|
|
171
|
-
};
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
} catch (e) {
|
|
175
|
-
routeWriter = null;
|
|
176
|
-
result.error = {
|
|
177
|
-
message: String(e),
|
|
178
|
-
stack: e.stack || ""
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
},
|
|
182
|
-
write(chunk) {
|
|
183
|
-
try {
|
|
184
|
-
if (routeWriter) {
|
|
185
|
-
routeWriter.write(Buffer.from(chunk.buffer));
|
|
186
|
-
}
|
|
187
|
-
} catch (e) {
|
|
188
|
-
routeWriter = null;
|
|
189
|
-
result.error = {
|
|
190
|
-
message: String(e),
|
|
191
|
-
stack: e.stack || ""
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
},
|
|
195
|
-
async close() {
|
|
196
|
-
const writePromises = [];
|
|
197
|
-
try {
|
|
198
|
-
if (writeQDataEnabled) {
|
|
199
|
-
const qData = requestEv.sharedMap.get("qData");
|
|
200
|
-
if (qData && !is404ErrorPage) {
|
|
201
|
-
const qDataFilePath = sys.getDataFilePath(url.pathname);
|
|
202
|
-
const dataWriter = sys.createWriteStream(qDataFilePath);
|
|
203
|
-
dataWriter.on("error", (e) => {
|
|
204
|
-
console.error(e);
|
|
205
|
-
result.error = {
|
|
206
|
-
message: e.message,
|
|
207
|
-
stack: e.stack
|
|
208
|
-
};
|
|
209
|
-
});
|
|
210
|
-
const serialized = await _serialize([qData]);
|
|
211
|
-
dataWriter.write(serialized);
|
|
212
|
-
writePromises.push(
|
|
213
|
-
new Promise((resolve2) => {
|
|
214
|
-
result.filePath = routeFilePath;
|
|
215
|
-
dataWriter.end(resolve2);
|
|
216
|
-
})
|
|
217
|
-
);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
if (routeWriter) {
|
|
221
|
-
writePromises.push(
|
|
222
|
-
new Promise((resolve2) => {
|
|
223
|
-
result.filePath = routeFilePath;
|
|
224
|
-
routeWriter.end(resolve2);
|
|
225
|
-
}).finally(closeResolved)
|
|
226
|
-
);
|
|
227
|
-
}
|
|
228
|
-
if (writePromises.length > 0) {
|
|
229
|
-
await Promise.all(writePromises);
|
|
230
|
-
}
|
|
231
|
-
} catch (e) {
|
|
232
|
-
routeWriter = null;
|
|
233
|
-
result.error = {
|
|
234
|
-
message: String(e),
|
|
235
|
-
stack: e.stack || ""
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
return stream;
|
|
241
|
-
}
|
|
242
|
-
};
|
|
243
|
-
const promise = requestHandler(requestCtx, opts, qwikSerializer).then((rsp) => {
|
|
244
|
-
if (rsp != null) {
|
|
245
|
-
return rsp.completion.then((r) => {
|
|
246
|
-
if (routeWriter) {
|
|
247
|
-
return closePromise.then(() => r);
|
|
248
|
-
}
|
|
249
|
-
return r;
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}).then((e) => {
|
|
253
|
-
if (e !== void 0) {
|
|
254
|
-
if (e instanceof Error) {
|
|
255
|
-
result.error = {
|
|
256
|
-
message: e.message,
|
|
257
|
-
stack: e.stack
|
|
258
|
-
};
|
|
259
|
-
} else {
|
|
260
|
-
result.error = {
|
|
261
|
-
message: String(e),
|
|
262
|
-
stack: void 0
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}).finally(() => {
|
|
267
|
-
pendingPromises.delete(promise);
|
|
268
|
-
callback(result);
|
|
269
|
-
});
|
|
270
|
-
pendingPromises.add(promise);
|
|
271
|
-
} catch (e) {
|
|
272
|
-
if (e instanceof Error) {
|
|
273
|
-
result.error = {
|
|
274
|
-
message: e.message,
|
|
275
|
-
stack: e.stack
|
|
276
|
-
};
|
|
277
|
-
} else {
|
|
278
|
-
result.error = {
|
|
279
|
-
message: String(e),
|
|
280
|
-
stack: void 0
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
callback(result);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
var noopWriter = {
|
|
287
|
-
closed: Promise.resolve(void 0),
|
|
288
|
-
ready: Promise.resolve(void 0),
|
|
289
|
-
desiredSize: 0,
|
|
290
|
-
async close() {
|
|
291
|
-
},
|
|
292
|
-
async abort() {
|
|
293
|
-
},
|
|
294
|
-
async write() {
|
|
295
|
-
},
|
|
296
|
-
releaseLock() {
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
var noopWritableStream = {
|
|
300
|
-
get locked() {
|
|
301
|
-
return false;
|
|
302
|
-
},
|
|
303
|
-
set locked(_) {
|
|
304
|
-
},
|
|
305
|
-
async abort() {
|
|
306
|
-
},
|
|
307
|
-
async close() {
|
|
308
|
-
},
|
|
309
|
-
getWriter() {
|
|
310
|
-
return noopWriter;
|
|
311
|
-
}
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
// packages/qwik-router/src/static/node/node-main.ts
|
|
315
|
-
async function createNodeMainProcess(sys, opts) {
|
|
316
|
-
const ssgWorkers = [];
|
|
317
|
-
const sitemapBuffer = [];
|
|
318
|
-
let sitemapPromise = null;
|
|
319
|
-
opts = { ...opts };
|
|
320
|
-
let outDir = opts.outDir;
|
|
321
|
-
if (typeof outDir !== "string") {
|
|
322
|
-
throw new Error(`Missing "outDir" option`);
|
|
323
|
-
}
|
|
324
|
-
if (!isAbsolute(outDir)) {
|
|
325
|
-
throw new Error(`"outDir" must be an absolute file path, received: ${outDir}`);
|
|
326
|
-
}
|
|
327
|
-
outDir = normalizePath(outDir);
|
|
328
|
-
let maxWorkers = nodeCpus().length;
|
|
329
|
-
if (typeof opts.maxWorkers === "number") {
|
|
330
|
-
maxWorkers = Math.max(1, Math.min(opts.maxWorkers, maxWorkers));
|
|
331
|
-
}
|
|
332
|
-
let maxTasksPerWorker = 20;
|
|
333
|
-
if (typeof opts.maxTasksPerWorker === "number") {
|
|
334
|
-
maxTasksPerWorker = Math.max(1, Math.min(opts.maxTasksPerWorker, 50));
|
|
335
|
-
}
|
|
336
|
-
let sitemapOutFile = opts.sitemapOutFile;
|
|
337
|
-
if (sitemapOutFile !== null) {
|
|
338
|
-
if (typeof sitemapOutFile !== "string") {
|
|
339
|
-
sitemapOutFile = "sitemap.xml";
|
|
340
|
-
}
|
|
341
|
-
if (!isAbsolute(sitemapOutFile)) {
|
|
342
|
-
sitemapOutFile = resolve(outDir, sitemapOutFile);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
const singleThreadWorker = await createSingleThreadWorker(sys);
|
|
346
|
-
const createWorker = (workerIndex) => {
|
|
347
|
-
if (workerIndex === 0) {
|
|
348
|
-
const ssgSameThreadWorker = {
|
|
349
|
-
activeTasks: 0,
|
|
350
|
-
totalTasks: 0,
|
|
351
|
-
render: async (staticRoute) => {
|
|
352
|
-
ssgSameThreadWorker.activeTasks++;
|
|
353
|
-
ssgSameThreadWorker.totalTasks++;
|
|
354
|
-
const result = await singleThreadWorker(staticRoute);
|
|
355
|
-
ssgSameThreadWorker.activeTasks--;
|
|
356
|
-
return result;
|
|
357
|
-
},
|
|
358
|
-
terminate: async () => {
|
|
359
|
-
}
|
|
360
|
-
};
|
|
361
|
-
return ssgSameThreadWorker;
|
|
362
|
-
}
|
|
363
|
-
let terminateResolve = null;
|
|
364
|
-
const mainTasks = /* @__PURE__ */ new Map();
|
|
365
|
-
let workerFilePath;
|
|
366
|
-
if (typeof __filename === "string") {
|
|
367
|
-
workerFilePath = __filename;
|
|
368
|
-
} else {
|
|
369
|
-
workerFilePath = import.meta.url;
|
|
370
|
-
}
|
|
371
|
-
if (typeof workerFilePath === "string" && workerFilePath.startsWith("file://")) {
|
|
372
|
-
workerFilePath = new URL(workerFilePath);
|
|
373
|
-
}
|
|
374
|
-
const nodeWorker = new Worker(workerFilePath, { workerData: opts });
|
|
375
|
-
const ssgWorker = {
|
|
376
|
-
activeTasks: 0,
|
|
377
|
-
totalTasks: 0,
|
|
378
|
-
render: (staticRoute) => {
|
|
379
|
-
return new Promise((resolve2, reject) => {
|
|
380
|
-
try {
|
|
381
|
-
ssgWorker.activeTasks++;
|
|
382
|
-
ssgWorker.totalTasks++;
|
|
383
|
-
mainTasks.set(staticRoute.pathname, resolve2);
|
|
384
|
-
nodeWorker.postMessage(staticRoute);
|
|
385
|
-
} catch (e) {
|
|
386
|
-
ssgWorker.activeTasks--;
|
|
387
|
-
mainTasks.delete(staticRoute.pathname);
|
|
388
|
-
reject(e);
|
|
389
|
-
}
|
|
390
|
-
});
|
|
391
|
-
},
|
|
392
|
-
terminate: async () => {
|
|
393
|
-
mainTasks.clear();
|
|
394
|
-
const msg = { type: "close" };
|
|
395
|
-
await new Promise((resolve2) => {
|
|
396
|
-
terminateResolve = resolve2;
|
|
397
|
-
nodeWorker.postMessage(msg);
|
|
398
|
-
});
|
|
399
|
-
await nodeWorker.terminate();
|
|
400
|
-
}
|
|
401
|
-
};
|
|
402
|
-
nodeWorker.on("message", (msg) => {
|
|
403
|
-
switch (msg.type) {
|
|
404
|
-
case "render": {
|
|
405
|
-
const mainTask = mainTasks.get(msg.pathname);
|
|
406
|
-
if (mainTask) {
|
|
407
|
-
mainTasks.delete(msg.pathname);
|
|
408
|
-
ssgWorker.activeTasks--;
|
|
409
|
-
mainTask(msg);
|
|
410
|
-
}
|
|
411
|
-
break;
|
|
412
|
-
}
|
|
413
|
-
case "close": {
|
|
414
|
-
if (terminateResolve) {
|
|
415
|
-
terminateResolve();
|
|
416
|
-
terminateResolve = null;
|
|
417
|
-
}
|
|
418
|
-
break;
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
nodeWorker.on("error", (e) => {
|
|
423
|
-
console.error(`worker error`, e);
|
|
424
|
-
});
|
|
425
|
-
nodeWorker.on("exit", (code) => {
|
|
426
|
-
if (code !== 1) {
|
|
427
|
-
console.error(`worker exit ${code}`);
|
|
428
|
-
}
|
|
429
|
-
});
|
|
430
|
-
return ssgWorker;
|
|
431
|
-
};
|
|
432
|
-
const getNextWorker = () => ssgWorkers.sort(ssgWorkerCompare)[0];
|
|
433
|
-
const hasAvailableWorker = () => {
|
|
434
|
-
const ssgWorker = getNextWorker();
|
|
435
|
-
return ssgWorker.activeTasks < maxTasksPerWorker;
|
|
436
|
-
};
|
|
437
|
-
const render = async (staticRoute) => {
|
|
438
|
-
const ssgWorker = getNextWorker();
|
|
439
|
-
const result = await ssgWorker.render(staticRoute);
|
|
440
|
-
if (sitemapOutFile && result.ok && result.resourceType === "page") {
|
|
441
|
-
sitemapBuffer.push(`<url><loc>${result.url}</loc></url>`);
|
|
442
|
-
if (sitemapBuffer.length > 50) {
|
|
443
|
-
if (sitemapPromise) {
|
|
444
|
-
await sitemapPromise;
|
|
445
|
-
}
|
|
446
|
-
const siteMapUrls = sitemapBuffer.join("\n") + "\n";
|
|
447
|
-
sitemapBuffer.length = 0;
|
|
448
|
-
sitemapPromise = fs.promises.appendFile(sitemapOutFile, siteMapUrls);
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
return result;
|
|
452
|
-
};
|
|
453
|
-
const close = async () => {
|
|
454
|
-
const promises = [];
|
|
455
|
-
if (sitemapOutFile) {
|
|
456
|
-
if (sitemapPromise) {
|
|
457
|
-
await sitemapPromise;
|
|
458
|
-
}
|
|
459
|
-
sitemapBuffer.push(`</urlset>`);
|
|
460
|
-
promises.push(fs.promises.appendFile(sitemapOutFile, sitemapBuffer.join("\n")));
|
|
461
|
-
sitemapBuffer.length = 0;
|
|
462
|
-
}
|
|
463
|
-
for (const ssgWorker of ssgWorkers) {
|
|
464
|
-
try {
|
|
465
|
-
promises.push(ssgWorker.terminate());
|
|
466
|
-
} catch (e) {
|
|
467
|
-
console.error(e);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
ssgWorkers.length = 0;
|
|
471
|
-
await Promise.all(promises);
|
|
472
|
-
};
|
|
473
|
-
if (sitemapOutFile) {
|
|
474
|
-
await ensureDir(sitemapOutFile);
|
|
475
|
-
await fs.promises.writeFile(
|
|
476
|
-
sitemapOutFile,
|
|
477
|
-
`<?xml version="1.0" encoding="UTF-8"?>
|
|
478
|
-
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
479
|
-
`
|
|
480
|
-
);
|
|
481
|
-
}
|
|
482
|
-
for (let i = 0; i < maxWorkers; i++) {
|
|
483
|
-
ssgWorkers.push(createWorker(i));
|
|
484
|
-
}
|
|
485
|
-
const mainCtx = {
|
|
486
|
-
hasAvailableWorker,
|
|
487
|
-
render,
|
|
488
|
-
close
|
|
489
|
-
};
|
|
490
|
-
return mainCtx;
|
|
491
|
-
}
|
|
492
|
-
function ssgWorkerCompare(a, b) {
|
|
493
|
-
if (a.activeTasks < b.activeTasks) {
|
|
494
|
-
return -1;
|
|
495
|
-
}
|
|
496
|
-
if (a.activeTasks > b.activeTasks) {
|
|
497
|
-
return 1;
|
|
498
|
-
}
|
|
499
|
-
return a.totalTasks < b.totalTasks ? -1 : 1;
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
// packages/qwik-router/src/static/node/node-worker.ts
|
|
503
|
-
import { parentPort } from "node:worker_threads";
|
|
504
|
-
async function createNodeWorkerProcess(onMessage) {
|
|
505
|
-
var _a;
|
|
506
|
-
(_a = parentPort) == null ? void 0 : _a.on("message", async (msg) => {
|
|
507
|
-
var _a2;
|
|
508
|
-
(_a2 = parentPort) == null ? void 0 : _a2.postMessage(await onMessage(msg));
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
// packages/qwik-router/src/static/node/node-system.ts
|
|
513
|
-
async function createSystem(opts) {
|
|
514
|
-
const createWriteStream = (filePath) => {
|
|
515
|
-
return fs2.createWriteStream(filePath, {
|
|
516
|
-
flags: "w"
|
|
517
|
-
});
|
|
518
|
-
};
|
|
519
|
-
const NS_PER_SEC = 1e9;
|
|
520
|
-
const MS_PER_NS = 1e-6;
|
|
521
|
-
const createTimer = () => {
|
|
522
|
-
const start = process.hrtime();
|
|
523
|
-
return () => {
|
|
524
|
-
const diff = process.hrtime(start);
|
|
525
|
-
return (diff[0] * NS_PER_SEC + diff[1]) * MS_PER_NS;
|
|
526
|
-
};
|
|
527
|
-
};
|
|
528
|
-
const createLogger = async () => {
|
|
529
|
-
return {
|
|
530
|
-
debug: opts.log === "debug" ? console.debug.bind(console) : () => {
|
|
531
|
-
},
|
|
532
|
-
error: console.error.bind(console),
|
|
533
|
-
info: console.info.bind(console)
|
|
534
|
-
};
|
|
535
|
-
};
|
|
536
|
-
const outDir = normalizePath(opts.outDir);
|
|
537
|
-
const basePathname = opts.basePathname || "/";
|
|
538
|
-
const basenameLen = basePathname.length;
|
|
539
|
-
const getRouteFilePath = (pathname, isHtml) => {
|
|
540
|
-
pathname = pathname.slice(basenameLen);
|
|
541
|
-
if (isHtml) {
|
|
542
|
-
if (!pathname.endsWith(".html")) {
|
|
543
|
-
if (pathname.endsWith("/")) {
|
|
544
|
-
pathname += "index.html";
|
|
545
|
-
} else {
|
|
546
|
-
pathname += "/index.html";
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
} else {
|
|
550
|
-
if (pathname.endsWith("/")) {
|
|
551
|
-
pathname = pathname.slice(0, -1);
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
return join(outDir, pathname);
|
|
555
|
-
};
|
|
556
|
-
const getDataFilePath = (pathname) => {
|
|
557
|
-
pathname = pathname.slice(basenameLen);
|
|
558
|
-
if (pathname.endsWith("/")) {
|
|
559
|
-
pathname += "q-data.json";
|
|
560
|
-
} else {
|
|
561
|
-
pathname += "/q-data.json";
|
|
562
|
-
}
|
|
563
|
-
return join(outDir, pathname);
|
|
564
|
-
};
|
|
565
|
-
const sys = {
|
|
566
|
-
createMainProcess: null,
|
|
567
|
-
createWorkerProcess: createNodeWorkerProcess,
|
|
568
|
-
createLogger,
|
|
569
|
-
getOptions: () => opts,
|
|
570
|
-
ensureDir,
|
|
571
|
-
createWriteStream,
|
|
572
|
-
createTimer,
|
|
573
|
-
access,
|
|
574
|
-
getRouteFilePath,
|
|
575
|
-
getDataFilePath,
|
|
576
|
-
getEnv: (key) => process.env[key],
|
|
577
|
-
platform: {
|
|
578
|
-
static: true,
|
|
579
|
-
node: process.versions.node
|
|
580
|
-
}
|
|
581
|
-
};
|
|
582
|
-
sys.createMainProcess = () => createNodeMainProcess(sys, opts);
|
|
583
|
-
return sys;
|
|
584
|
-
}
|
|
585
|
-
var ensureDir = async (filePath) => {
|
|
586
|
-
await fs2.promises.mkdir(dirname2(filePath), { recursive: true });
|
|
587
|
-
};
|
|
588
|
-
var access = async (path) => {
|
|
589
|
-
try {
|
|
590
|
-
await fs2.promises.access(path);
|
|
591
|
-
return true;
|
|
592
|
-
} catch {
|
|
593
|
-
return false;
|
|
594
|
-
}
|
|
595
|
-
};
|
|
596
|
-
|
|
597
|
-
// packages/qwik-router/src/static/node/index.ts
|
|
598
|
-
import { isMainThread, workerData } from "node:worker_threads";
|
|
599
|
-
|
|
600
|
-
// node_modules/.pnpm/kleur@4.1.5/node_modules/kleur/colors.mjs
|
|
601
|
-
var FORCE_COLOR;
|
|
602
|
-
var NODE_DISABLE_COLORS;
|
|
603
|
-
var NO_COLOR;
|
|
604
|
-
var TERM;
|
|
605
|
-
var isTTY = true;
|
|
606
|
-
if (typeof process !== "undefined") {
|
|
607
|
-
({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {});
|
|
608
|
-
isTTY = process.stdout && process.stdout.isTTY;
|
|
609
|
-
}
|
|
610
|
-
var $ = {
|
|
611
|
-
enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== "dumb" && (FORCE_COLOR != null && FORCE_COLOR !== "0" || isTTY)
|
|
612
|
-
};
|
|
613
|
-
function init(x, y) {
|
|
614
|
-
let rgx = new RegExp(`\\x1b\\[${y}m`, "g");
|
|
615
|
-
let open = `\x1B[${x}m`, close = `\x1B[${y}m`;
|
|
616
|
-
return function(txt) {
|
|
617
|
-
if (!$.enabled || txt == null) return txt;
|
|
618
|
-
return open + (!!~("" + txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) + close;
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
var reset = init(0, 0);
|
|
622
|
-
var bold = init(1, 22);
|
|
623
|
-
var dim = init(2, 22);
|
|
624
|
-
var italic = init(3, 23);
|
|
625
|
-
var underline = init(4, 24);
|
|
626
|
-
var inverse = init(7, 27);
|
|
627
|
-
var hidden = init(8, 28);
|
|
628
|
-
var strikethrough = init(9, 29);
|
|
629
|
-
var black = init(30, 39);
|
|
630
|
-
var red = init(31, 39);
|
|
631
|
-
var green = init(32, 39);
|
|
632
|
-
var yellow = init(33, 39);
|
|
633
|
-
var blue = init(34, 39);
|
|
634
|
-
var magenta = init(35, 39);
|
|
635
|
-
var cyan = init(36, 39);
|
|
636
|
-
var white = init(37, 39);
|
|
637
|
-
var gray = init(90, 39);
|
|
638
|
-
var grey = init(90, 39);
|
|
639
|
-
var bgBlack = init(40, 49);
|
|
640
|
-
var bgRed = init(41, 49);
|
|
641
|
-
var bgGreen = init(42, 49);
|
|
642
|
-
var bgYellow = init(43, 49);
|
|
643
|
-
var bgBlue = init(44, 49);
|
|
644
|
-
var bgMagenta = init(45, 49);
|
|
645
|
-
var bgCyan = init(46, 49);
|
|
646
|
-
var bgWhite = init(47, 49);
|
|
647
|
-
|
|
648
|
-
// packages/qwik-router/src/static/main-thread.ts
|
|
649
|
-
import { relative as relative2 } from "node:path";
|
|
650
|
-
import { pathToFileURL as pathToFileURL2 } from "node:url";
|
|
651
|
-
import { buildErrorMessage } from "vite";
|
|
652
|
-
|
|
653
|
-
// packages/qwik/src/optimizer/src/plugins/vite-utils.ts
|
|
654
|
-
var findLocation = (e) => {
|
|
655
|
-
const stack = e.stack;
|
|
656
|
-
if (typeof stack === "string") {
|
|
657
|
-
const lines = stack.split("\n").filter((l) => !l.includes("/node_modules/") && !l.includes("(node:"));
|
|
658
|
-
for (let i = 1; i < lines.length; i++) {
|
|
659
|
-
const line = lines[i].replace("file:///", "/");
|
|
660
|
-
if (/^\s+at/.test(line)) {
|
|
661
|
-
const start = line.indexOf("/");
|
|
662
|
-
const end = line.lastIndexOf(")", start);
|
|
663
|
-
if (start > 0) {
|
|
664
|
-
const path = line.slice(start, end);
|
|
665
|
-
const parts = path.split(":");
|
|
666
|
-
const nu0 = safeParseInt(parts[parts.length - 1]);
|
|
667
|
-
const nu1 = safeParseInt(parts[parts.length - 2]);
|
|
668
|
-
if (typeof nu0 === "number" && typeof nu1 === "number") {
|
|
669
|
-
parts.length -= 2;
|
|
670
|
-
return {
|
|
671
|
-
file: parts.join(":"),
|
|
672
|
-
line: nu1,
|
|
673
|
-
column: nu0
|
|
674
|
-
};
|
|
675
|
-
} else if (typeof nu0 === "number") {
|
|
676
|
-
parts.length -= 1;
|
|
677
|
-
return {
|
|
678
|
-
file: parts.join(":"),
|
|
679
|
-
line: nu0,
|
|
680
|
-
column: void 0
|
|
681
|
-
};
|
|
682
|
-
} else {
|
|
683
|
-
return {
|
|
684
|
-
file: parts.join(":"),
|
|
685
|
-
line: void 0,
|
|
686
|
-
column: void 0
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
return void 0;
|
|
694
|
-
};
|
|
695
|
-
var safeParseInt = (nu) => {
|
|
696
|
-
try {
|
|
697
|
-
return parseInt(nu, 10);
|
|
698
|
-
} catch {
|
|
699
|
-
return void 0;
|
|
700
|
-
}
|
|
701
|
-
};
|
|
702
|
-
var splitRE = /\r?\n/;
|
|
703
|
-
var range = 2;
|
|
704
|
-
function posToNumber(source, pos) {
|
|
705
|
-
if (typeof pos === "number") {
|
|
706
|
-
return pos;
|
|
707
|
-
}
|
|
708
|
-
if (pos.lo != null) {
|
|
709
|
-
return pos.lo;
|
|
710
|
-
}
|
|
711
|
-
const lines = source.split(splitRE);
|
|
712
|
-
const { line, column } = pos;
|
|
713
|
-
let start = 0;
|
|
714
|
-
for (let i = 0; i < line - 1 && i < lines.length; i++) {
|
|
715
|
-
start += lines[i].length + 1;
|
|
716
|
-
}
|
|
717
|
-
return start + column;
|
|
718
|
-
}
|
|
719
|
-
function generateCodeFrame(source, start = 0, end) {
|
|
720
|
-
start = posToNumber(source, start);
|
|
721
|
-
end = end || start;
|
|
722
|
-
const lines = source.split(splitRE);
|
|
723
|
-
let count = 0;
|
|
724
|
-
const res = [];
|
|
725
|
-
for (let i = 0; i < lines.length; i++) {
|
|
726
|
-
count += lines[i].length + 1;
|
|
727
|
-
if (count >= start) {
|
|
728
|
-
for (let j = i - range; j <= i + range || end > count; j++) {
|
|
729
|
-
if (j < 0 || j >= lines.length) {
|
|
730
|
-
continue;
|
|
731
|
-
}
|
|
732
|
-
const line = j + 1;
|
|
733
|
-
res.push(`${line}${" ".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`);
|
|
734
|
-
const lineLength = lines[j].length;
|
|
735
|
-
if (j === i) {
|
|
736
|
-
const pad = Math.max(start - (count - lineLength) + 1, 0);
|
|
737
|
-
const length = Math.max(1, end > count ? lineLength - pad : end - start);
|
|
738
|
-
res.push(` | ` + " ".repeat(pad) + "^".repeat(length));
|
|
739
|
-
} else if (j > i) {
|
|
740
|
-
if (end > count) {
|
|
741
|
-
const length = Math.max(Math.min(end - count, lineLength), 1);
|
|
742
|
-
res.push(` | ` + "^".repeat(length));
|
|
743
|
-
}
|
|
744
|
-
count += lineLength + 1;
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
break;
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
return res.join("\n");
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
// packages/qwik-router/src/buildtime/vite/format-error.ts
|
|
754
|
-
import fs3 from "node:fs";
|
|
755
|
-
function formatError(e) {
|
|
756
|
-
if (e instanceof Error) {
|
|
757
|
-
const err = e;
|
|
758
|
-
let loc = err.loc;
|
|
759
|
-
if (!err.frame && !err.plugin) {
|
|
760
|
-
if (!loc) {
|
|
761
|
-
loc = findLocation(err);
|
|
762
|
-
}
|
|
763
|
-
if (loc) {
|
|
764
|
-
err.loc = loc;
|
|
765
|
-
if (loc.file) {
|
|
766
|
-
err.id = normalizePath(err.loc.file);
|
|
767
|
-
try {
|
|
768
|
-
const code = fs3.readFileSync(err.loc.file, "utf-8");
|
|
769
|
-
err.frame = generateCodeFrame(code, err.loc);
|
|
770
|
-
} catch {
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
return e;
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
// packages/qwik-router/src/static/extract-params.ts
|
|
780
|
-
function extractParamNames(routeName) {
|
|
781
|
-
const params = [];
|
|
782
|
-
let idx = 0;
|
|
783
|
-
while (idx < routeName.length) {
|
|
784
|
-
const start = routeName.indexOf("[", idx);
|
|
785
|
-
if (start !== -1) {
|
|
786
|
-
const end = routeName.indexOf("]", start);
|
|
787
|
-
const param = routeName.slice(start + 1, end);
|
|
788
|
-
params.push(param.startsWith("...") ? param.substring(3) : param);
|
|
789
|
-
idx = end + 1;
|
|
790
|
-
} else {
|
|
791
|
-
idx = routeName.length;
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
return params;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
// packages/qwik-router/src/static/not-found.ts
|
|
798
|
-
import { getErrorHtml } from "../middleware/request-handler/index.mjs";
|
|
799
|
-
async function generateNotFoundPages(sys, opts, routes) {
|
|
800
|
-
if (opts.emit404Pages !== false) {
|
|
801
|
-
const basePathname = opts.basePathname || "/";
|
|
802
|
-
const rootNotFoundPathname = basePathname + "404.html";
|
|
803
|
-
const hasRootNotFound = routes.some((r) => r[2] === rootNotFoundPathname);
|
|
804
|
-
if (!hasRootNotFound) {
|
|
805
|
-
const filePath = sys.getRouteFilePath(rootNotFoundPathname, true);
|
|
806
|
-
const html = getErrorHtml(404, "Resource Not Found");
|
|
807
|
-
await sys.ensureDir(filePath);
|
|
808
|
-
return new Promise((resolve2) => {
|
|
809
|
-
const writer = sys.createWriteStream(filePath);
|
|
810
|
-
writer.write(html);
|
|
811
|
-
writer.end(resolve2);
|
|
812
|
-
});
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
// packages/qwik-router/src/static/routes.ts
|
|
818
|
-
function createRouteTester(basePathname, includeRoutes, excludeRoutes) {
|
|
819
|
-
const includes = routesToRegExps(includeRoutes);
|
|
820
|
-
const excludes = routesToRegExps(excludeRoutes);
|
|
821
|
-
return (pathname) => {
|
|
822
|
-
if (pathname.endsWith("404.html")) {
|
|
823
|
-
return true;
|
|
824
|
-
}
|
|
825
|
-
if (basePathname !== "/") {
|
|
826
|
-
pathname = pathname.slice(basePathname.length - 1);
|
|
827
|
-
}
|
|
828
|
-
for (const exclude of excludes) {
|
|
829
|
-
if (exclude.test(pathname)) {
|
|
830
|
-
return false;
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
for (const include of includes) {
|
|
834
|
-
if (include.test(pathname)) {
|
|
835
|
-
return true;
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
return false;
|
|
839
|
-
};
|
|
840
|
-
}
|
|
841
|
-
function routesToRegExps(routes) {
|
|
842
|
-
if (!Array.isArray(routes)) {
|
|
843
|
-
return [];
|
|
844
|
-
}
|
|
845
|
-
return routes.filter((r) => typeof r === "string").map(routeToRegExp);
|
|
846
|
-
}
|
|
847
|
-
function routeToRegExp(rule) {
|
|
848
|
-
let transformedRule;
|
|
849
|
-
if (rule === "/" || rule === "/*") {
|
|
850
|
-
transformedRule = rule;
|
|
851
|
-
} else if (rule.endsWith("/*")) {
|
|
852
|
-
transformedRule = `${rule.substring(0, rule.length - 2)}(/*)?`;
|
|
853
|
-
} else if (rule.endsWith("/")) {
|
|
854
|
-
transformedRule = `${rule.substring(0, rule.length - 1)}(/)?`;
|
|
855
|
-
} else if (rule.endsWith("*")) {
|
|
856
|
-
transformedRule = rule;
|
|
857
|
-
} else {
|
|
858
|
-
transformedRule = `${rule}(/)?`;
|
|
859
|
-
}
|
|
860
|
-
transformedRule = `^${transformedRule.replace(/\*/g, ".*")}$`;
|
|
861
|
-
return new RegExp(transformedRule);
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
// packages/qwik-router/src/static/main-thread.ts
|
|
865
|
-
async function mainThread(sys) {
|
|
866
|
-
const opts = sys.getOptions();
|
|
867
|
-
validateOptions(opts);
|
|
868
|
-
const main = await sys.createMainProcess();
|
|
869
|
-
const log = await sys.createLogger();
|
|
870
|
-
log.info("\n" + bold(green("Starting Qwik Router SSG...")));
|
|
871
|
-
const qwikRouterConfig = (await import(pathToFileURL2(opts.qwikRouterConfigModulePath).href)).default;
|
|
872
|
-
const queue = [];
|
|
873
|
-
const active = /* @__PURE__ */ new Set();
|
|
874
|
-
const routes = qwikRouterConfig.routes || [];
|
|
875
|
-
const trailingSlash = !!qwikRouterConfig.trailingSlash;
|
|
876
|
-
const includeRoute = createRouteTester(opts.basePathname || "/", opts.include, opts.exclude);
|
|
877
|
-
return new Promise((resolve2, reject) => {
|
|
878
|
-
try {
|
|
879
|
-
const timer = sys.createTimer();
|
|
880
|
-
const generatorResult = {
|
|
881
|
-
duration: 0,
|
|
882
|
-
rendered: 0,
|
|
883
|
-
errors: 0,
|
|
884
|
-
staticPaths: []
|
|
885
|
-
};
|
|
886
|
-
let isCompleted = false;
|
|
887
|
-
let isRoutesLoaded = false;
|
|
888
|
-
const completed = async () => {
|
|
889
|
-
const closePromise = main.close();
|
|
890
|
-
await generateNotFoundPages(sys, opts, routes);
|
|
891
|
-
generatorResult.duration = timer();
|
|
892
|
-
if (generatorResult.errors === 0) {
|
|
893
|
-
log.info(`
|
|
894
|
-
${green("SSG results")}`);
|
|
895
|
-
if (generatorResult.rendered > 0) {
|
|
896
|
-
log.info(
|
|
897
|
-
`- Generated: ${dim(
|
|
898
|
-
`${generatorResult.rendered} page${generatorResult.rendered === 1 ? "" : "s"}`
|
|
899
|
-
)}`
|
|
900
|
-
);
|
|
901
|
-
}
|
|
902
|
-
log.info(`- Duration: ${dim(msToString(generatorResult.duration))}`);
|
|
903
|
-
const total = generatorResult.rendered + generatorResult.errors;
|
|
904
|
-
if (total > 0) {
|
|
905
|
-
log.info(
|
|
906
|
-
`- Average: ${dim(msToString(generatorResult.duration / total) + " per page")}`
|
|
907
|
-
);
|
|
908
|
-
}
|
|
909
|
-
log.info(``);
|
|
910
|
-
}
|
|
911
|
-
closePromise.then(() => {
|
|
912
|
-
setTimeout(() => resolve2(generatorResult));
|
|
913
|
-
}).catch(reject);
|
|
914
|
-
};
|
|
915
|
-
const next = () => {
|
|
916
|
-
while (!isCompleted && main.hasAvailableWorker() && queue.length > 0) {
|
|
917
|
-
const staticRoute = queue.shift();
|
|
918
|
-
if (staticRoute) {
|
|
919
|
-
render(staticRoute);
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
if (!isCompleted && isRoutesLoaded && queue.length === 0 && active.size === 0) {
|
|
923
|
-
isCompleted = true;
|
|
924
|
-
completed();
|
|
925
|
-
}
|
|
926
|
-
};
|
|
927
|
-
let isPendingDrain = false;
|
|
928
|
-
const flushQueue = () => {
|
|
929
|
-
if (!isPendingDrain) {
|
|
930
|
-
isPendingDrain = true;
|
|
931
|
-
setTimeout(() => {
|
|
932
|
-
isPendingDrain = false;
|
|
933
|
-
next();
|
|
934
|
-
});
|
|
935
|
-
}
|
|
936
|
-
};
|
|
937
|
-
const render = async (staticRoute) => {
|
|
938
|
-
try {
|
|
939
|
-
active.add(staticRoute.pathname);
|
|
940
|
-
const result = await main.render({ type: "render", ...staticRoute });
|
|
941
|
-
active.delete(staticRoute.pathname);
|
|
942
|
-
if (result.error) {
|
|
943
|
-
const err = new Error(result.error.message);
|
|
944
|
-
err.stack = result.error.stack;
|
|
945
|
-
log.error(`
|
|
946
|
-
${bold(red(`!!! ${result.pathname}: Error during SSG`))}`);
|
|
947
|
-
log.error(red(err.message));
|
|
948
|
-
log.error(` Pathname: ${magenta(staticRoute.pathname)}`);
|
|
949
|
-
Object.assign(formatError(err), {
|
|
950
|
-
plugin: "qwik-ssg"
|
|
951
|
-
});
|
|
952
|
-
log.error(buildErrorMessage(err));
|
|
953
|
-
generatorResult.errors++;
|
|
954
|
-
}
|
|
955
|
-
if (result.filePath != null) {
|
|
956
|
-
generatorResult.rendered++;
|
|
957
|
-
generatorResult.staticPaths.push(result.pathname);
|
|
958
|
-
const base = opts.rootDir ?? opts.outDir;
|
|
959
|
-
const path = relative2(base, result.filePath);
|
|
960
|
-
const lastSlash = path.lastIndexOf("/");
|
|
961
|
-
log.info(`${dim(path.slice(0, lastSlash + 1))}${path.slice(lastSlash + 1)}`);
|
|
962
|
-
}
|
|
963
|
-
flushQueue();
|
|
964
|
-
} catch (e) {
|
|
965
|
-
isCompleted = true;
|
|
966
|
-
reject(e);
|
|
967
|
-
}
|
|
968
|
-
};
|
|
969
|
-
const addToQueue = (pathname, params) => {
|
|
970
|
-
if (pathname) {
|
|
971
|
-
pathname = new URL(pathname, `https://qwik.dev`).pathname;
|
|
972
|
-
if (pathname !== opts.basePathname) {
|
|
973
|
-
if (trailingSlash) {
|
|
974
|
-
if (!pathname.endsWith("/")) {
|
|
975
|
-
const segments = pathname.split("/");
|
|
976
|
-
const lastSegment = segments[segments.length - 1];
|
|
977
|
-
if (!lastSegment.includes(".")) {
|
|
978
|
-
pathname += "/";
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
} else {
|
|
982
|
-
if (pathname.endsWith("/")) {
|
|
983
|
-
pathname = pathname.slice(0, pathname.length - 1);
|
|
984
|
-
}
|
|
985
|
-
}
|
|
986
|
-
}
|
|
987
|
-
if (includeRoute(pathname) && !queue.some((s) => s.pathname === pathname)) {
|
|
988
|
-
queue.push({
|
|
989
|
-
pathname,
|
|
990
|
-
params
|
|
991
|
-
});
|
|
992
|
-
flushQueue();
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
};
|
|
996
|
-
const loadStaticRoute = async (route) => {
|
|
997
|
-
const [routeName, loaders, originalPathname] = route;
|
|
998
|
-
const modules = await Promise.all(loaders.map((loader) => loader()));
|
|
999
|
-
const pageModule = modules[modules.length - 1];
|
|
1000
|
-
const paramNames = extractParamNames(routeName);
|
|
1001
|
-
const isValidStaticModule = pageModule && (pageModule.default || pageModule.onRequest || pageModule.onGet);
|
|
1002
|
-
if (isValidStaticModule) {
|
|
1003
|
-
if (Array.isArray(paramNames) && paramNames.length > 0) {
|
|
1004
|
-
if (typeof pageModule.onStaticGenerate === "function" && paramNames.length > 0) {
|
|
1005
|
-
const staticGenerate = await pageModule.onStaticGenerate({
|
|
1006
|
-
env: {
|
|
1007
|
-
get(key) {
|
|
1008
|
-
return sys.getEnv(key);
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
});
|
|
1012
|
-
if (Array.isArray(staticGenerate.params)) {
|
|
1013
|
-
for (const params of staticGenerate.params) {
|
|
1014
|
-
const pathname = getPathnameForDynamicRoute(
|
|
1015
|
-
originalPathname,
|
|
1016
|
-
paramNames,
|
|
1017
|
-
params
|
|
1018
|
-
);
|
|
1019
|
-
addToQueue(pathname, params);
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
} else {
|
|
1024
|
-
addToQueue(originalPathname, void 0);
|
|
1025
|
-
}
|
|
1026
|
-
}
|
|
1027
|
-
};
|
|
1028
|
-
const loadStaticRoutes = async () => {
|
|
1029
|
-
await Promise.all(routes.map(loadStaticRoute));
|
|
1030
|
-
isRoutesLoaded = true;
|
|
1031
|
-
flushQueue();
|
|
1032
|
-
};
|
|
1033
|
-
loadStaticRoutes();
|
|
1034
|
-
} catch (e) {
|
|
1035
|
-
reject(e);
|
|
1036
|
-
}
|
|
1037
|
-
});
|
|
1038
|
-
}
|
|
1039
|
-
function validateOptions(opts) {
|
|
1040
|
-
if (!opts.qwikRouterConfigModulePath) {
|
|
1041
|
-
if (!opts.qwikCityPlanModulePath) {
|
|
1042
|
-
throw new Error(`Missing "qwikRouterConfigModulePath" option`);
|
|
1043
|
-
} else {
|
|
1044
|
-
console.warn(
|
|
1045
|
-
"`qwikCityPlanModulePath` is deprecated. Use `qwikRouterConfigModulePath` instead."
|
|
1046
|
-
);
|
|
1047
|
-
}
|
|
1048
|
-
}
|
|
1049
|
-
if (!opts.renderModulePath) {
|
|
1050
|
-
throw new Error(`Missing "renderModulePath" option`);
|
|
1051
|
-
}
|
|
1052
|
-
let siteOrigin = opts.origin;
|
|
1053
|
-
if (typeof siteOrigin !== "string" || siteOrigin.trim().length === 0) {
|
|
1054
|
-
throw new Error(`Missing "origin" option`);
|
|
1055
|
-
}
|
|
1056
|
-
siteOrigin = siteOrigin.trim();
|
|
1057
|
-
if (!/:\/\//.test(siteOrigin) || siteOrigin.startsWith("://")) {
|
|
1058
|
-
throw new Error(
|
|
1059
|
-
`"origin" must start with a valid protocol, such as "https://" or "http://", received "${siteOrigin}"`
|
|
1060
|
-
);
|
|
1061
|
-
}
|
|
1062
|
-
try {
|
|
1063
|
-
new URL(siteOrigin);
|
|
1064
|
-
} catch (e) {
|
|
1065
|
-
throw new Error(`Invalid "origin": ${e}`);
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
|
|
1069
|
-
// packages/qwik-router/src/static/node/index.ts
|
|
1070
|
-
async function generate(opts) {
|
|
1071
|
-
if (isMainThread) {
|
|
1072
|
-
const sys = await createSystem(opts);
|
|
1073
|
-
const result = await mainThread(sys);
|
|
1074
|
-
return result;
|
|
1075
|
-
}
|
|
1076
|
-
throw new Error(`generate() cannot be called from a worker thread`);
|
|
1077
|
-
}
|
|
1078
|
-
if (!isMainThread && workerData) {
|
|
1079
|
-
(async () => {
|
|
1080
|
-
const sys = await createSystem(workerData);
|
|
1081
|
-
await workerThread(sys);
|
|
1082
|
-
})();
|
|
1083
|
-
}
|
|
1084
|
-
export {
|
|
1085
|
-
generate
|
|
1086
|
-
};
|