@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,333 +1,265 @@
1
- import fs from 'node:fs';
2
- import { isAbsolute, resolve, join, dirname } from 'node:path';
3
- import { cpus } from 'node:os';
4
- import { Worker } from 'node:worker_threads';
5
- import { k as normalizePath } from './fs.mjs';
6
- import { g as getLoaderName } from './request-path.mjs';
7
- import { e as ensureSlash } from './pathname.mjs';
8
-
1
+ import { t as ensureSlash } from "./pathname.mjs";
2
+ import { o as getLoaderName } from "./request-path.mjs";
3
+ import { _ as normalizePath } from "./fs.mjs";
4
+ import fs from "node:fs";
5
+ import { dirname, isAbsolute, join, resolve } from "node:path";
6
+ import { cpus } from "node:os";
7
+ import { Worker } from "node:worker_threads";
9
8
  function ssgWorkerCompare(a, b) {
10
- if (a.activeTasks < b.activeTasks) {
11
- return -1;
12
- }
13
- if (a.activeTasks > b.activeTasks) {
14
- return 1;
15
- }
16
- return a.totalTasks < b.totalTasks ? -1 : 1;
9
+ if (a.activeTasks < b.activeTasks) return -1;
10
+ if (a.activeTasks > b.activeTasks) return 1;
11
+ return a.totalTasks < b.totalTasks ? -1 : 1;
17
12
  }
18
13
  async function createWorkerPool(sys, opts) {
19
- const log = await sys.createLogger();
20
- const ssgWorkers = [];
21
- const sitemapBuffer = [];
22
- let sitemapStream = null;
23
- opts = {
24
- ...opts
25
- };
26
- let outDir = opts.outDir;
27
- if (typeof outDir !== "string") {
28
- throw new Error(`Missing "outDir" option`);
29
- }
30
- if (!isAbsolute(outDir)) {
31
- throw new Error(`"outDir" must be an absolute file path, received: ${outDir}`);
32
- }
33
- outDir = normalizePath(outDir);
34
- let maxWorkers = cpus().length;
35
- if (typeof opts.maxWorkers === "number") {
36
- maxWorkers = Math.max(1, Math.min(opts.maxWorkers, maxWorkers));
37
- }
38
- let maxTasksPerWorker = 20;
39
- if (typeof opts.maxTasksPerWorker === "number") {
40
- maxTasksPerWorker = Math.max(1, Math.min(opts.maxTasksPerWorker, 50));
41
- }
42
- let sitemapOutFile = opts.sitemapOutFile;
43
- if (sitemapOutFile !== null) {
44
- if (typeof sitemapOutFile !== "string") {
45
- sitemapOutFile = "sitemap.xml";
46
- }
47
- if (!isAbsolute(sitemapOutFile)) {
48
- sitemapOutFile = resolve(outDir, sitemapOutFile);
49
- }
50
- }
51
- if (!opts.workerFilePath) {
52
- throw new Error('Missing "workerFilePath" option for SSG worker creation');
53
- }
54
- const workerFilePath = typeof opts.workerFilePath === "string" && opts.workerFilePath.startsWith("file://") ? new URL(opts.workerFilePath) : opts.workerFilePath;
55
- const { render: _r, qwikRouterConfig: _c, workerFilePath: _w, ...workerData } = opts;
56
- const createWorker = () => {
57
- let terminateResolve = null;
58
- const mainTasks = /* @__PURE__ */ new Map();
59
- let terminateTimeout = null;
60
- const nodeWorker = new Worker(workerFilePath, {
61
- workerData
62
- });
63
- nodeWorker.unref();
64
- const ssgWorker = {
65
- activeTasks: 0,
66
- totalTasks: 0,
67
- render: (staticRoute) => {
68
- return new Promise((resolve2, reject) => {
69
- try {
70
- ssgWorker.activeTasks++;
71
- ssgWorker.totalTasks++;
72
- mainTasks.set(staticRoute.pathname, resolve2);
73
- nodeWorker.postMessage(staticRoute);
74
- } catch (e) {
75
- ssgWorker.activeTasks--;
76
- mainTasks.delete(staticRoute.pathname);
77
- reject(e);
78
- }
79
- });
80
- },
81
- terminate: async () => {
82
- mainTasks.clear();
83
- const msg = {
84
- type: "close"
85
- };
86
- await new Promise((resolve2) => {
87
- terminateResolve = () => {
88
- resolve2();
89
- };
90
- terminateTimeout = setTimeout(async () => {
91
- terminateTimeout = null;
92
- terminateResolve = null;
93
- await nodeWorker.terminate();
94
- resolve2();
95
- }, 1e3);
96
- nodeWorker.postMessage(msg);
97
- });
98
- if (terminateTimeout) {
99
- clearTimeout(terminateTimeout);
100
- terminateTimeout = null;
101
- }
102
- }
103
- };
104
- nodeWorker.on("message", (msg) => {
105
- switch (msg.type) {
106
- case "render": {
107
- const mainTask = mainTasks.get(msg.pathname);
108
- if (mainTask) {
109
- mainTasks.delete(msg.pathname);
110
- ssgWorker.activeTasks--;
111
- mainTask(msg);
112
- }
113
- break;
114
- }
115
- case "close": {
116
- if (terminateResolve) {
117
- terminateResolve();
118
- terminateResolve = null;
119
- }
120
- break;
121
- }
122
- }
123
- });
124
- nodeWorker.on("error", (e) => {
125
- log.error(`worker error`, e);
126
- });
127
- nodeWorker.on("exit", (code) => {
128
- log.debug(`worker exit code=${code}`);
129
- if (terminateTimeout) {
130
- clearTimeout(terminateTimeout);
131
- terminateTimeout = null;
132
- }
133
- if (mainTasks.size > 0) {
134
- for (const [pathname, resolve2] of mainTasks) {
135
- ssgWorker.activeTasks--;
136
- resolve2({
137
- type: "render",
138
- pathname,
139
- url: "",
140
- ok: false,
141
- error: {
142
- message: `Worker exited with code ${code}`,
143
- stack: void 0
144
- },
145
- filePath: null,
146
- contentType: null,
147
- resourceType: null
148
- });
149
- }
150
- mainTasks.clear();
151
- }
152
- if (terminateResolve) {
153
- terminateResolve();
154
- terminateResolve = null;
155
- }
156
- if (code !== 0) {
157
- console.error(`worker exit ${code}`);
158
- }
159
- });
160
- return ssgWorker;
161
- };
162
- const getNextWorker = () => ssgWorkers.sort(ssgWorkerCompare)[0];
163
- const hasAvailableWorker = () => {
164
- const ssgWorker = getNextWorker();
165
- return ssgWorker.activeTasks < maxTasksPerWorker;
166
- };
167
- const render = async (ssgRoute) => {
168
- const ssgWorker = getNextWorker();
169
- const result = await ssgWorker.render(ssgRoute);
170
- const isNotFoundPage = result.pathname.endsWith("/404.html");
171
- if (sitemapOutFile && result.ok && result.resourceType === "page" && !isNotFoundPage) {
172
- sitemapBuffer.push(`<url><loc>${result.url}</loc></url>`);
173
- if (sitemapBuffer.length > 50) {
174
- const siteMapUrls = sitemapBuffer.join("\n") + "\n";
175
- sitemapBuffer.length = 0;
176
- if (sitemapStream) {
177
- sitemapStream.write(siteMapUrls);
178
- }
179
- }
180
- }
181
- return result;
182
- };
183
- const close = async () => {
184
- const promises = [];
185
- if (sitemapStream) {
186
- sitemapBuffer.push(`</urlset>`);
187
- sitemapStream.write(sitemapBuffer.join("\n"));
188
- sitemapBuffer.length = 0;
189
- await new Promise((resolve2, reject) => {
190
- if (sitemapStream) {
191
- sitemapStream.end((err) => {
192
- if (err) {
193
- reject(err);
194
- } else {
195
- resolve2();
196
- }
197
- });
198
- } else {
199
- resolve2();
200
- }
201
- });
202
- sitemapStream = null;
203
- }
204
- for (const ssgWorker of ssgWorkers) {
205
- try {
206
- promises.push(ssgWorker.terminate());
207
- } catch (e) {
208
- console.error(e);
209
- }
210
- }
211
- await Promise.all(promises);
212
- ssgWorkers.length = 0;
213
- if (process.platform === "win32") {
214
- await new Promise((resolve2) => setTimeout(resolve2, 300));
215
- }
216
- };
217
- if (sitemapOutFile) {
218
- await sys.ensureDir(sitemapOutFile);
219
- sitemapStream = fs.createWriteStream(sitemapOutFile, {
220
- flags: "w"
221
- });
222
- sitemapStream.write(`<?xml version="1.0" encoding="UTF-8"?>
223
- <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
224
- `);
225
- }
226
- log.debug(`creating ${maxWorkers} workers, ${maxTasksPerWorker} tasks each`);
227
- for (let i = 0; i < maxWorkers; i++) {
228
- ssgWorkers.push(createWorker());
229
- if (process.platform === "win32" && i < maxWorkers - 1) {
230
- await new Promise((resolve2) => setTimeout(resolve2, 100));
231
- }
232
- }
233
- const mainCtx = {
234
- hasAvailableWorker,
235
- render,
236
- close
237
- };
238
- return mainCtx;
14
+ const log = await sys.createLogger();
15
+ const ssgWorkers = [];
16
+ const sitemapBuffer = [];
17
+ let sitemapStream = null;
18
+ opts = { ...opts };
19
+ let outDir = opts.outDir;
20
+ if (typeof outDir !== "string") throw new Error(`Missing "outDir" option`);
21
+ if (!isAbsolute(outDir)) throw new Error(`"outDir" must be an absolute file path, received: ${outDir}`);
22
+ outDir = normalizePath(outDir);
23
+ let maxWorkers = cpus().length;
24
+ if (typeof opts.maxWorkers === "number") maxWorkers = Math.max(1, Math.min(opts.maxWorkers, maxWorkers));
25
+ let maxTasksPerWorker = 20;
26
+ if (typeof opts.maxTasksPerWorker === "number") maxTasksPerWorker = Math.max(1, Math.min(opts.maxTasksPerWorker, 50));
27
+ let sitemapOutFile = opts.sitemapOutFile;
28
+ if (sitemapOutFile !== null) {
29
+ if (typeof sitemapOutFile !== "string") sitemapOutFile = "sitemap.xml";
30
+ if (!isAbsolute(sitemapOutFile)) sitemapOutFile = resolve(outDir, sitemapOutFile);
31
+ }
32
+ if (!opts.workerFilePath) throw new Error("Missing \"workerFilePath\" option for SSG worker creation");
33
+ const workerFilePath = typeof opts.workerFilePath === "string" && opts.workerFilePath.startsWith("file://") ? new URL(opts.workerFilePath) : opts.workerFilePath;
34
+ const { render: _r, qwikRouterConfig: _c, workerFilePath: _w, ...workerData } = opts;
35
+ const createWorker = () => {
36
+ let terminateResolve = null;
37
+ const mainTasks = /* @__PURE__ */ new Map();
38
+ let terminateTimeout = null;
39
+ const nodeWorker = new Worker(workerFilePath, { workerData });
40
+ nodeWorker.unref();
41
+ const ssgWorker = {
42
+ activeTasks: 0,
43
+ totalTasks: 0,
44
+ render: (staticRoute) => {
45
+ return new Promise((resolve, reject) => {
46
+ try {
47
+ ssgWorker.activeTasks++;
48
+ ssgWorker.totalTasks++;
49
+ mainTasks.set(staticRoute.pathname, resolve);
50
+ nodeWorker.postMessage(staticRoute);
51
+ } catch (e) {
52
+ ssgWorker.activeTasks--;
53
+ mainTasks.delete(staticRoute.pathname);
54
+ reject(e);
55
+ }
56
+ });
57
+ },
58
+ terminate: async () => {
59
+ mainTasks.clear();
60
+ const msg = { type: "close" };
61
+ await new Promise((resolve) => {
62
+ terminateResolve = () => {
63
+ resolve();
64
+ };
65
+ terminateTimeout = setTimeout(async () => {
66
+ terminateTimeout = null;
67
+ terminateResolve = null;
68
+ await nodeWorker.terminate();
69
+ resolve();
70
+ }, 1e3);
71
+ nodeWorker.postMessage(msg);
72
+ });
73
+ if (terminateTimeout) {
74
+ clearTimeout(terminateTimeout);
75
+ terminateTimeout = null;
76
+ }
77
+ }
78
+ };
79
+ nodeWorker.on("message", (msg) => {
80
+ switch (msg.type) {
81
+ case "render": {
82
+ const mainTask = mainTasks.get(msg.pathname);
83
+ if (mainTask) {
84
+ mainTasks.delete(msg.pathname);
85
+ ssgWorker.activeTasks--;
86
+ mainTask(msg);
87
+ }
88
+ break;
89
+ }
90
+ case "close": if (terminateResolve) {
91
+ terminateResolve();
92
+ terminateResolve = null;
93
+ }
94
+ }
95
+ });
96
+ nodeWorker.on("error", (e) => {
97
+ log.error(`worker error`, e);
98
+ });
99
+ nodeWorker.on("exit", (code) => {
100
+ log.debug(`worker exit code=${code}`);
101
+ if (terminateTimeout) {
102
+ clearTimeout(terminateTimeout);
103
+ terminateTimeout = null;
104
+ }
105
+ if (mainTasks.size > 0) {
106
+ for (const [pathname, resolve] of mainTasks) {
107
+ ssgWorker.activeTasks--;
108
+ resolve({
109
+ type: "render",
110
+ pathname,
111
+ url: "",
112
+ ok: false,
113
+ error: {
114
+ message: `Worker exited with code ${code}`,
115
+ stack: void 0
116
+ },
117
+ filePath: null,
118
+ contentType: null,
119
+ resourceType: null
120
+ });
121
+ }
122
+ mainTasks.clear();
123
+ }
124
+ if (terminateResolve) {
125
+ terminateResolve();
126
+ terminateResolve = null;
127
+ }
128
+ if (code !== 0) console.error(`worker exit ${code}`);
129
+ });
130
+ return ssgWorker;
131
+ };
132
+ const getNextWorker = () => ssgWorkers.sort(ssgWorkerCompare)[0];
133
+ const hasAvailableWorker = () => {
134
+ return getNextWorker().activeTasks < maxTasksPerWorker;
135
+ };
136
+ const render = async (ssgRoute) => {
137
+ const result = await getNextWorker().render(ssgRoute);
138
+ const isNotFoundPage = result.pathname.endsWith("/404.html");
139
+ if (sitemapOutFile && result.ok && result.resourceType === "page" && !isNotFoundPage) {
140
+ sitemapBuffer.push(`<url><loc>${result.url}</loc></url>`);
141
+ if (sitemapBuffer.length > 50) {
142
+ const siteMapUrls = sitemapBuffer.join("\n") + "\n";
143
+ sitemapBuffer.length = 0;
144
+ if (sitemapStream) sitemapStream.write(siteMapUrls);
145
+ }
146
+ }
147
+ return result;
148
+ };
149
+ const close = async () => {
150
+ const promises = [];
151
+ if (sitemapStream) {
152
+ sitemapBuffer.push(`</urlset>`);
153
+ sitemapStream.write(sitemapBuffer.join("\n"));
154
+ sitemapBuffer.length = 0;
155
+ await new Promise((resolve, reject) => {
156
+ if (sitemapStream) sitemapStream.end((err) => {
157
+ if (err) reject(err);
158
+ else resolve();
159
+ });
160
+ else resolve();
161
+ });
162
+ sitemapStream = null;
163
+ }
164
+ for (const ssgWorker of ssgWorkers) try {
165
+ promises.push(ssgWorker.terminate());
166
+ } catch (e) {
167
+ console.error(e);
168
+ }
169
+ await Promise.all(promises);
170
+ ssgWorkers.length = 0;
171
+ if (process.platform === "win32") await new Promise((resolve) => setTimeout(resolve, 300));
172
+ };
173
+ if (sitemapOutFile) {
174
+ await sys.ensureDir(sitemapOutFile);
175
+ sitemapStream = fs.createWriteStream(sitemapOutFile, { flags: "w" });
176
+ sitemapStream.write(`<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n`);
177
+ }
178
+ log.debug(`creating ${maxWorkers} workers, ${maxTasksPerWorker} tasks each`);
179
+ for (let i = 0; i < maxWorkers; i++) {
180
+ ssgWorkers.push(createWorker());
181
+ if (process.platform === "win32" && i < maxWorkers - 1) await new Promise((resolve) => setTimeout(resolve, 100));
182
+ }
183
+ return {
184
+ hasAvailableWorker,
185
+ render,
186
+ close
187
+ };
239
188
  }
240
-
241
- const ensureDir = async (filePath) => {
242
- await fs.promises.mkdir(dirname(filePath), {
243
- recursive: true
244
- });
189
+ var ensureDir = async (filePath) => {
190
+ await fs.promises.mkdir(dirname(filePath), { recursive: true });
245
191
  };
246
- const access = async (path) => {
247
- try {
248
- await fs.promises.access(path);
249
- return true;
250
- } catch {
251
- return false;
252
- }
192
+ var access = async (path) => {
193
+ try {
194
+ await fs.promises.access(path);
195
+ return true;
196
+ } catch {
197
+ return false;
198
+ }
253
199
  };
254
- async function createSystem(opts, threadId) {
255
- const createWriteStream = (filePath) => {
256
- return fs.createWriteStream(filePath, {
257
- flags: "w"
258
- });
259
- };
260
- const NS_PER_SEC = 1e9;
261
- const MS_PER_NS = 1e-6;
262
- const createTimer = () => {
263
- const start = process.hrtime();
264
- return () => {
265
- const diff = process.hrtime(start);
266
- return (diff[0] * NS_PER_SEC + diff[1]) * MS_PER_NS;
267
- };
268
- };
269
- const noop = () => {
270
- };
271
- const createLogger = async () => {
272
- const isQuiet = opts.log === "quiet";
273
- const isDebug = opts.log === "debug";
274
- if (threadId !== void 0) {
275
- return {
276
- debug: isDebug ? console.debug.bind(console, `[${threadId}]`) : noop,
277
- error: console.error.bind(console, `[${threadId}]`),
278
- info: isQuiet ? noop : console.info.bind(console, `[${threadId}]`)
279
- };
280
- }
281
- return {
282
- debug: isDebug ? console.debug.bind(console) : noop,
283
- error: console.error.bind(console),
284
- info: isQuiet ? noop : console.info.bind(console)
285
- };
286
- };
287
- const outDir = normalizePath(opts.outDir);
288
- const basePathname = opts.basePathname || "/";
289
- const basenameLen = basePathname.length;
290
- const getRouteFilePath = (pathname, isHtml) => {
291
- pathname = decodeURIComponent(pathname.slice(basenameLen));
292
- if (isHtml) {
293
- if (!pathname.endsWith(".html")) {
294
- if (pathname.endsWith("/")) {
295
- pathname += "index.html";
296
- } else {
297
- pathname += "/index.html";
298
- }
299
- }
300
- } else {
301
- if (pathname.endsWith("/")) {
302
- pathname = pathname.slice(0, -1);
303
- }
304
- }
305
- return join(outDir, pathname);
306
- };
307
- const getLoaderFilePath = (pathname, loaderId, manifestHash) => {
308
- pathname = decodeURIComponent(pathname.slice(basenameLen));
309
- const suffix = getLoaderName(loaderId, manifestHash);
310
- pathname = ensureSlash(pathname) + suffix;
311
- return join(outDir, pathname);
312
- };
313
- const sys = {
314
- createMainProcess: null,
315
- createLogger,
316
- getOptions: () => opts,
317
- ensureDir,
318
- createWriteStream,
319
- createTimer,
320
- access,
321
- getRouteFilePath,
322
- getLoaderFilePath,
323
- getEnv: (key) => process.env[key],
324
- platform: {
325
- static: true,
326
- node: process.versions.node
327
- }
328
- };
329
- sys.createMainProcess = () => createWorkerPool(sys, opts);
330
- return sys;
200
+ /** @public */ async function createSystem(opts, threadId) {
201
+ const createWriteStream = (filePath) => {
202
+ return fs.createWriteStream(filePath, { flags: "w" });
203
+ };
204
+ const NS_PER_SEC = 1e9;
205
+ const MS_PER_NS = 1e-6;
206
+ const createTimer = () => {
207
+ const start = process.hrtime();
208
+ return () => {
209
+ const diff = process.hrtime(start);
210
+ return (diff[0] * NS_PER_SEC + diff[1]) * MS_PER_NS;
211
+ };
212
+ };
213
+ const noop = () => {};
214
+ const createLogger = async () => {
215
+ const isQuiet = opts.log === "quiet";
216
+ const isDebug = opts.log === "debug";
217
+ if (threadId !== void 0) return {
218
+ debug: isDebug ? console.debug.bind(console, `[${threadId}]`) : noop,
219
+ error: console.error.bind(console, `[${threadId}]`),
220
+ info: isQuiet ? noop : console.info.bind(console, `[${threadId}]`)
221
+ };
222
+ return {
223
+ debug: isDebug ? console.debug.bind(console) : noop,
224
+ error: console.error.bind(console),
225
+ info: isQuiet ? noop : console.info.bind(console)
226
+ };
227
+ };
228
+ const outDir = normalizePath(opts.outDir);
229
+ const basenameLen = (opts.basePathname || "/").length;
230
+ const getRouteFilePath = (pathname, isHtml) => {
231
+ pathname = decodeURIComponent(pathname.slice(basenameLen));
232
+ if (isHtml) {
233
+ if (!pathname.endsWith(".html")) {
234
+ if (pathname.endsWith("/")) pathname += "index.html";
235
+ else pathname += "/index.html";
236
+ }
237
+ } else if (pathname.endsWith("/")) pathname = pathname.slice(0, -1);
238
+ return join(outDir, pathname);
239
+ };
240
+ const getLoaderFilePath = (pathname, loaderId, manifestHash) => {
241
+ pathname = decodeURIComponent(pathname.slice(basenameLen));
242
+ const suffix = getLoaderName(loaderId, manifestHash);
243
+ pathname = ensureSlash(pathname) + suffix;
244
+ return join(outDir, pathname);
245
+ };
246
+ const sys = {
247
+ createMainProcess: null,
248
+ createLogger,
249
+ getOptions: () => opts,
250
+ ensureDir,
251
+ createWriteStream,
252
+ createTimer,
253
+ access,
254
+ getRouteFilePath,
255
+ getLoaderFilePath,
256
+ getEnv: (key) => process.env[key],
257
+ platform: {
258
+ static: true,
259
+ node: process.versions.node
260
+ }
261
+ };
262
+ sys.createMainProcess = () => createWorkerPool(sys, opts);
263
+ return sys;
331
264
  }
332
-
333
- export { access, createSystem, ensureDir };
265
+ export { createSystem };