@qwik.dev/router 2.0.0-alpha.9 → 2.0.0-beta.10

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