@qwik.dev/router 2.0.0-beta.36 → 2.0.0-beta.38
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/cloudflare-pages/vite/index.mjs +3 -5
- package/lib/adapters/shared/vite/index.d.ts +3 -4
- package/lib/adapters/shared/vite/index.mjs +167 -155
- package/lib/chunks/dev-preloaded-route-loader.mjs +3 -0
- package/lib/chunks/format.mjs +31 -0
- package/lib/chunks/fs.mjs +10 -8
- package/lib/chunks/head.qwik.mjs +1425 -0
- package/lib/chunks/http-error.qwik.mjs +2 -2
- package/lib/chunks/pathname.mjs +3 -32
- package/lib/chunks/request-body-limit.mjs +37 -0
- package/lib/chunks/request-path.mjs +60 -0
- package/lib/chunks/routes.mjs +47 -0
- package/lib/chunks/server-error.mjs +19 -0
- package/lib/chunks/system.mjs +8 -8
- package/lib/chunks/use-functions.qwik.mjs +3 -12
- package/lib/chunks/user-response.mjs +1875 -0
- package/lib/chunks/worker-thread.mjs +317 -0
- package/lib/index.d.ts +251 -44
- package/lib/index.qwik.mjs +734 -485
- package/lib/middleware/aws-lambda/index.mjs +2 -1
- package/lib/middleware/azure-swa/index.mjs +13 -9
- package/lib/middleware/cloudflare-pages/index.mjs +2 -2
- package/lib/middleware/deno/index.d.ts +2 -0
- package/lib/middleware/deno/index.mjs +2 -1
- package/lib/middleware/netlify-edge/index.mjs +2 -2
- package/lib/middleware/node/index.d.ts +9 -1
- package/lib/middleware/node/index.mjs +28 -3
- package/lib/middleware/request-handler/index.d.ts +65 -26
- package/lib/middleware/request-handler/index.mjs +38 -1679
- package/lib/middleware/vercel-edge/index.mjs +2 -2
- package/lib/ssg/index.d.ts +5 -13
- package/lib/ssg/index.mjs +14 -53
- package/lib/vite/index.d.ts +23 -0
- package/lib/vite/index.mjs +533 -122
- package/package.json +4 -3
- package/lib/chunks/deepFreeze.qwik.mjs +0 -18
- package/lib/chunks/error-handler.mjs +0 -57
- package/lib/chunks/not-found-wrapper.qwik.mjs +0 -25
- package/lib/chunks/redirect-handler.mjs +0 -6
- package/lib/chunks/routing.qwik.mjs +0 -821
- package/lib/chunks/worker-thread.qwik.mjs +0 -2585
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { _serialize } from '@qwik.dev/core/internal';
|
|
2
|
+
import { parentPort } from 'node:worker_threads';
|
|
3
|
+
import { r as runQwikRouter, a as resolveRequestHandlers, b as renderQwikMiddleware } from './user-response.mjs';
|
|
4
|
+
import { b as trimInternalPathname } from './request-path.mjs';
|
|
5
|
+
import { A as getRouteLoaders, B as getRouteLoaderValues, l as loadRoute } from './head.qwik.mjs';
|
|
6
|
+
|
|
7
|
+
const staticWorkerThreadDeps = {
|
|
8
|
+
loadRoute,
|
|
9
|
+
renderQwikMiddleware,
|
|
10
|
+
resolveRequestHandlers,
|
|
11
|
+
trimInternalPathname,
|
|
12
|
+
runQwikRouter
|
|
13
|
+
};
|
|
14
|
+
const createNoopWritableStream = () => new WritableStream();
|
|
15
|
+
function isRedirectMessage(value) {
|
|
16
|
+
return typeof value === "object" && value !== null && value.constructor?.name === "RedirectMessage";
|
|
17
|
+
}
|
|
18
|
+
async function requestHandlerForSsg(serverRequestEv, opts, deps) {
|
|
19
|
+
const { render, checkOrigin, qwikRouterConfig } = opts;
|
|
20
|
+
if (!qwikRouterConfig) {
|
|
21
|
+
throw new Error("qwikRouterConfig is required.");
|
|
22
|
+
}
|
|
23
|
+
const pathname = deps.trimInternalPathname(serverRequestEv.url.pathname);
|
|
24
|
+
if (pathname === "/.well-known" || pathname.startsWith("/.well-known/")) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const { routes, serverPlugins, cacheModules } = qwikRouterConfig;
|
|
28
|
+
const loadedRoute = await deps.loadRoute(routes, cacheModules, pathname);
|
|
29
|
+
const requestHandlers = deps.resolveRequestHandlers(serverPlugins, loadedRoute, serverRequestEv.request.method, checkOrigin ?? true, deps.renderQwikMiddleware(render));
|
|
30
|
+
if (qwikRouterConfig.fallthrough && loadedRoute.$notFound$ && !pathname.endsWith("/404.html")) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const rebuildRouteInfo = async (url) => {
|
|
34
|
+
const cleanPathname = deps.trimInternalPathname(url.pathname);
|
|
35
|
+
const loadedRoute2 = await deps.loadRoute(routes, cacheModules, cleanPathname);
|
|
36
|
+
const requestHandlers2 = deps.resolveRequestHandlers(serverPlugins, loadedRoute2, serverRequestEv.request.method, checkOrigin ?? true, deps.renderQwikMiddleware(render));
|
|
37
|
+
return {
|
|
38
|
+
loadedRoute: loadedRoute2,
|
|
39
|
+
requestHandlers: requestHandlers2
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
return deps.runQwikRouter(serverRequestEv, loadedRoute, requestHandlers, rebuildRouteInfo, qwikRouterConfig.basePathname);
|
|
43
|
+
}
|
|
44
|
+
async function workerRender(sys, opts, staticRoute, pendingPromises, callback, deps) {
|
|
45
|
+
const url = new URL(staticRoute.pathname, opts.origin);
|
|
46
|
+
const result = {
|
|
47
|
+
type: "render",
|
|
48
|
+
pathname: staticRoute.pathname,
|
|
49
|
+
url: url.href,
|
|
50
|
+
ok: false,
|
|
51
|
+
error: null,
|
|
52
|
+
filePath: null,
|
|
53
|
+
contentType: null,
|
|
54
|
+
resourceType: null
|
|
55
|
+
};
|
|
56
|
+
try {
|
|
57
|
+
let routeWriter = null;
|
|
58
|
+
let closeResolved;
|
|
59
|
+
const closePromise = new Promise((closePromiseResolve) => {
|
|
60
|
+
closeResolved = closePromiseResolve;
|
|
61
|
+
});
|
|
62
|
+
const request = new Request(url);
|
|
63
|
+
const requestCtx = {
|
|
64
|
+
mode: "static",
|
|
65
|
+
locale: void 0,
|
|
66
|
+
url,
|
|
67
|
+
request,
|
|
68
|
+
env: {
|
|
69
|
+
get(key) {
|
|
70
|
+
return sys.getEnv(key);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
platform: sys.platform,
|
|
74
|
+
getClientConn: () => {
|
|
75
|
+
return {};
|
|
76
|
+
},
|
|
77
|
+
getWritableStream: (status, headers, _, _r, requestEv) => {
|
|
78
|
+
const isNotFoundPage = url.pathname.endsWith("/404.html");
|
|
79
|
+
result.ok = status >= 200 && status < 300 || isNotFoundPage && status === 404;
|
|
80
|
+
if (!result.ok) {
|
|
81
|
+
return createNoopWritableStream();
|
|
82
|
+
}
|
|
83
|
+
result.contentType = (headers.get("Content-Type") || "").toLowerCase();
|
|
84
|
+
const isHtml = result.contentType.includes("text/html");
|
|
85
|
+
const routeFilePath = sys.getRouteFilePath(url.pathname, isHtml);
|
|
86
|
+
if (isHtml) {
|
|
87
|
+
result.resourceType = "page";
|
|
88
|
+
}
|
|
89
|
+
const hasRouteWriter = isHtml ? opts.emitHtml !== false : true;
|
|
90
|
+
const writeLoaderDataEnabled = isHtml && opts.emitData !== false;
|
|
91
|
+
const stream = new WritableStream({
|
|
92
|
+
async start() {
|
|
93
|
+
try {
|
|
94
|
+
if (hasRouteWriter || writeLoaderDataEnabled) {
|
|
95
|
+
await sys.ensureDir(routeFilePath);
|
|
96
|
+
}
|
|
97
|
+
if (hasRouteWriter) {
|
|
98
|
+
routeWriter = sys.createWriteStream(routeFilePath);
|
|
99
|
+
routeWriter.on("error", (e) => {
|
|
100
|
+
console.error(e);
|
|
101
|
+
routeWriter = null;
|
|
102
|
+
result.error = {
|
|
103
|
+
message: e.message,
|
|
104
|
+
stack: e.stack
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
} catch (e) {
|
|
109
|
+
console.error("Error during stream start", staticRoute.pathname, e);
|
|
110
|
+
routeWriter = null;
|
|
111
|
+
result.error = {
|
|
112
|
+
message: String(e),
|
|
113
|
+
stack: e.stack || ""
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
write(chunk) {
|
|
118
|
+
try {
|
|
119
|
+
if (routeWriter) {
|
|
120
|
+
routeWriter.write(Buffer.from(chunk.buffer));
|
|
121
|
+
}
|
|
122
|
+
} catch (e) {
|
|
123
|
+
console.error("Error during stream write", staticRoute.pathname, e);
|
|
124
|
+
routeWriter = null;
|
|
125
|
+
result.error = {
|
|
126
|
+
message: String(e),
|
|
127
|
+
stack: e.stack || ""
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
async close() {
|
|
132
|
+
const writePromises = [];
|
|
133
|
+
try {
|
|
134
|
+
if (writeLoaderDataEnabled && !isNotFoundPage) {
|
|
135
|
+
const routeLoaders = getRouteLoaders(requestEv);
|
|
136
|
+
const loaderValues = getRouteLoaderValues(requestEv);
|
|
137
|
+
const manifestHash = opts.manifest?.manifestHash || "dev";
|
|
138
|
+
for (const loader of routeLoaders) {
|
|
139
|
+
if (loader.__expires !== 0) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const data = loaderValues[loader.__id];
|
|
143
|
+
if (data === void 0) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const loaderFilePath = sys.getLoaderFilePath(url.pathname, loader.__id, manifestHash);
|
|
147
|
+
const loaderWriter = sys.createWriteStream(loaderFilePath);
|
|
148
|
+
loaderWriter.on("error", (e) => {
|
|
149
|
+
console.error(e);
|
|
150
|
+
result.error = {
|
|
151
|
+
message: e.message,
|
|
152
|
+
stack: e.stack
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
const serialized = await deps.serialize({
|
|
156
|
+
d: data
|
|
157
|
+
});
|
|
158
|
+
loaderWriter.write(serialized);
|
|
159
|
+
writePromises.push(new Promise((resolve) => {
|
|
160
|
+
result.filePath = routeFilePath;
|
|
161
|
+
loaderWriter.end(resolve);
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (routeWriter) {
|
|
166
|
+
writePromises.push(new Promise((resolve) => {
|
|
167
|
+
result.filePath = routeFilePath;
|
|
168
|
+
routeWriter.end(resolve);
|
|
169
|
+
}).finally(closeResolved));
|
|
170
|
+
}
|
|
171
|
+
if (writePromises.length > 0) {
|
|
172
|
+
await Promise.all(writePromises);
|
|
173
|
+
}
|
|
174
|
+
} catch (e) {
|
|
175
|
+
console.error("Error during stream close", staticRoute.pathname, e);
|
|
176
|
+
routeWriter = null;
|
|
177
|
+
result.error = {
|
|
178
|
+
message: String(e),
|
|
179
|
+
stack: e.stack || ""
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return stream;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const promise = requestHandlerForSsg(requestCtx, opts, deps).then((rsp) => {
|
|
188
|
+
if (rsp != null) {
|
|
189
|
+
return rsp.completion.then((r) => {
|
|
190
|
+
if (routeWriter) {
|
|
191
|
+
return closePromise.then(() => r);
|
|
192
|
+
}
|
|
193
|
+
return r;
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}).then((e) => {
|
|
197
|
+
if (e !== void 0) {
|
|
198
|
+
if (isRedirectMessage(e)) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (e instanceof Error) {
|
|
202
|
+
result.error = {
|
|
203
|
+
message: e.message,
|
|
204
|
+
stack: e.stack
|
|
205
|
+
};
|
|
206
|
+
} else {
|
|
207
|
+
result.error = {
|
|
208
|
+
message: String(e),
|
|
209
|
+
stack: void 0
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
console.error("Error during request handling", staticRoute.pathname, e);
|
|
213
|
+
}
|
|
214
|
+
}).catch((e) => {
|
|
215
|
+
console.error("Unhandled error during request handling", staticRoute.pathname, e);
|
|
216
|
+
result.error = {
|
|
217
|
+
message: String(e),
|
|
218
|
+
stack: e.stack || ""
|
|
219
|
+
};
|
|
220
|
+
}).finally(() => {
|
|
221
|
+
pendingPromises.delete(promise);
|
|
222
|
+
callback(result);
|
|
223
|
+
});
|
|
224
|
+
pendingPromises.add(promise);
|
|
225
|
+
} catch (e) {
|
|
226
|
+
console.error("Error during render", staticRoute.pathname, e);
|
|
227
|
+
if (e instanceof Error) {
|
|
228
|
+
result.error = {
|
|
229
|
+
message: e.message,
|
|
230
|
+
stack: e.stack
|
|
231
|
+
};
|
|
232
|
+
} else {
|
|
233
|
+
result.error = {
|
|
234
|
+
message: String(e),
|
|
235
|
+
stack: void 0
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
callback(result);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async function workerThread(sys) {
|
|
242
|
+
const opts = sys.getOptions();
|
|
243
|
+
const pendingPromises = /* @__PURE__ */ new Set();
|
|
244
|
+
const deps = {
|
|
245
|
+
...staticWorkerThreadDeps,
|
|
246
|
+
serialize: _serialize
|
|
247
|
+
};
|
|
248
|
+
process.on("uncaughtException", (e) => {
|
|
249
|
+
console.error("Worker uncaught exception (suppressed):", e.message);
|
|
250
|
+
});
|
|
251
|
+
process.on("unhandledRejection", (e) => {
|
|
252
|
+
console.error("Worker unhandled rejection (suppressed):", e instanceof Error ? e.message : e);
|
|
253
|
+
});
|
|
254
|
+
const onMessage = async (msg) => {
|
|
255
|
+
switch (msg.type) {
|
|
256
|
+
case "render": {
|
|
257
|
+
return new Promise((resolve) => {
|
|
258
|
+
workerRender(sys, opts, msg, pendingPromises, resolve, deps).catch((e) => {
|
|
259
|
+
console.error("Error during render", msg.pathname, e);
|
|
260
|
+
resolve({
|
|
261
|
+
type: "render",
|
|
262
|
+
pathname: msg.pathname,
|
|
263
|
+
url: "",
|
|
264
|
+
ok: false,
|
|
265
|
+
error: {
|
|
266
|
+
message: e instanceof Error ? e.message : String(e),
|
|
267
|
+
stack: e instanceof Error ? e.stack : void 0
|
|
268
|
+
},
|
|
269
|
+
filePath: null,
|
|
270
|
+
contentType: null,
|
|
271
|
+
resourceType: null
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
case "close": {
|
|
277
|
+
if (pendingPromises.size) {
|
|
278
|
+
const promises = Array.from(pendingPromises);
|
|
279
|
+
pendingPromises.clear();
|
|
280
|
+
await Promise.all(promises);
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
type: "close"
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
parentPort?.on("message", async (msg) => {
|
|
289
|
+
try {
|
|
290
|
+
parentPort?.postMessage(await onMessage(msg));
|
|
291
|
+
} catch (e) {
|
|
292
|
+
if (msg.type === "render") {
|
|
293
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
294
|
+
parentPort?.postMessage({
|
|
295
|
+
type: "render",
|
|
296
|
+
pathname: msg.pathname,
|
|
297
|
+
url: "",
|
|
298
|
+
ok: false,
|
|
299
|
+
error: {
|
|
300
|
+
message: error.message,
|
|
301
|
+
stack: error.stack
|
|
302
|
+
},
|
|
303
|
+
filePath: null,
|
|
304
|
+
contentType: null,
|
|
305
|
+
resourceType: null
|
|
306
|
+
});
|
|
307
|
+
} else {
|
|
308
|
+
console.error("Worker message handler error", e);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (msg.type === "close") {
|
|
312
|
+
parentPort?.close();
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export { workerThread };
|