@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.
Files changed (41) hide show
  1. package/lib/adapters/cloudflare-pages/vite/index.mjs +3 -5
  2. package/lib/adapters/shared/vite/index.d.ts +3 -4
  3. package/lib/adapters/shared/vite/index.mjs +167 -155
  4. package/lib/chunks/dev-preloaded-route-loader.mjs +3 -0
  5. package/lib/chunks/format.mjs +31 -0
  6. package/lib/chunks/fs.mjs +10 -8
  7. package/lib/chunks/head.qwik.mjs +1425 -0
  8. package/lib/chunks/http-error.qwik.mjs +2 -2
  9. package/lib/chunks/pathname.mjs +3 -32
  10. package/lib/chunks/request-body-limit.mjs +37 -0
  11. package/lib/chunks/request-path.mjs +60 -0
  12. package/lib/chunks/routes.mjs +47 -0
  13. package/lib/chunks/server-error.mjs +19 -0
  14. package/lib/chunks/system.mjs +8 -8
  15. package/lib/chunks/use-functions.qwik.mjs +3 -12
  16. package/lib/chunks/user-response.mjs +1875 -0
  17. package/lib/chunks/worker-thread.mjs +317 -0
  18. package/lib/index.d.ts +251 -44
  19. package/lib/index.qwik.mjs +734 -485
  20. package/lib/middleware/aws-lambda/index.mjs +2 -1
  21. package/lib/middleware/azure-swa/index.mjs +13 -9
  22. package/lib/middleware/cloudflare-pages/index.mjs +2 -2
  23. package/lib/middleware/deno/index.d.ts +2 -0
  24. package/lib/middleware/deno/index.mjs +2 -1
  25. package/lib/middleware/netlify-edge/index.mjs +2 -2
  26. package/lib/middleware/node/index.d.ts +9 -1
  27. package/lib/middleware/node/index.mjs +28 -3
  28. package/lib/middleware/request-handler/index.d.ts +65 -26
  29. package/lib/middleware/request-handler/index.mjs +38 -1679
  30. package/lib/middleware/vercel-edge/index.mjs +2 -2
  31. package/lib/ssg/index.d.ts +5 -13
  32. package/lib/ssg/index.mjs +14 -53
  33. package/lib/vite/index.d.ts +23 -0
  34. package/lib/vite/index.mjs +533 -122
  35. package/package.json +4 -3
  36. package/lib/chunks/deepFreeze.qwik.mjs +0 -18
  37. package/lib/chunks/error-handler.mjs +0 -57
  38. package/lib/chunks/not-found-wrapper.qwik.mjs +0 -25
  39. package/lib/chunks/redirect-handler.mjs +0 -6
  40. package/lib/chunks/routing.qwik.mjs +0 -821
  41. 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 };