@qwik.dev/router 2.0.0-beta.39 → 2.0.0-beta.40

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