@mokup/server 1.1.8 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connect.cjs +1 -1
- package/dist/connect.mjs +1 -1
- package/dist/express.cjs +1 -1
- package/dist/express.mjs +1 -1
- package/dist/fastify.cjs +1 -1
- package/dist/fastify.mjs +1 -1
- package/dist/fetch-server.cjs +77 -559
- package/dist/fetch-server.d.cts +1 -1
- package/dist/fetch-server.d.mts +1 -1
- package/dist/fetch-server.d.ts +1 -1
- package/dist/fetch-server.mjs +73 -551
- package/dist/fetch.cjs +1 -1
- package/dist/fetch.mjs +1 -1
- package/dist/hono.cjs +1 -1
- package/dist/hono.mjs +1 -1
- package/dist/index.cjs +10 -33
- package/dist/index.d.cts +9 -37
- package/dist/index.d.mts +9 -37
- package/dist/index.d.ts +9 -37
- package/dist/index.mjs +9 -34
- package/dist/koa.cjs +1 -1
- package/dist/koa.mjs +1 -1
- package/dist/node.cjs +10 -6
- package/dist/node.d.cts +1 -1
- package/dist/node.d.mts +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.mjs +10 -6
- package/dist/shared/{server.LbftO9Jh.mjs → server.B5ThEHd_.mjs} +1 -1
- package/dist/shared/{server.aaygIV2Q.cjs → server.D0X6h49r.cjs} +1 -1
- package/dist/shared/{server.CyVIKPsp.d.cts → server.DLPB_I9q.d.cts} +11 -1
- package/dist/shared/{server.CyVIKPsp.d.mts → server.DLPB_I9q.d.mts} +11 -1
- package/dist/shared/{server.CyVIKPsp.d.ts → server.DLPB_I9q.d.ts} +11 -1
- package/dist/worker-node.cjs +1 -1
- package/dist/worker-node.mjs +1 -1
- package/dist/worker.cjs +1 -1
- package/dist/worker.mjs +1 -1
- package/package.json +6 -11
package/dist/fetch-server.cjs
CHANGED
|
@@ -5,20 +5,19 @@ const node_fs = require('node:fs');
|
|
|
5
5
|
const node_module = require('node:module');
|
|
6
6
|
const playgroundGrouping = require('@mokup/shared/playground-grouping');
|
|
7
7
|
const runtime = require('@mokup/runtime');
|
|
8
|
+
const routeUtils$1 = require('@mokup/shared/route-utils');
|
|
9
|
+
const configUtils = require('@mokup/shared/config-utils');
|
|
10
|
+
const moduleLoader = require('@mokup/shared/module-loader');
|
|
11
|
+
const routeConstants = require('@mokup/shared/route-constants');
|
|
12
|
+
const mockFiles = require('@mokup/shared/mock-files');
|
|
13
|
+
const loadRules$1 = require('@mokup/shared/load-rules');
|
|
14
|
+
const scanUtils = require('@mokup/shared/scan-utils');
|
|
8
15
|
const pathUtils = require('@mokup/shared/path-utils');
|
|
9
16
|
const timing = require('@mokup/shared/timing');
|
|
10
|
-
const node_buffer = require('node:buffer');
|
|
11
|
-
const node_url = require('node:url');
|
|
12
|
-
const esbuild = require('@mokup/shared/esbuild');
|
|
13
|
-
const process = require('node:process');
|
|
14
|
-
const jsoncParser = require('@mokup/shared/jsonc-parser');
|
|
15
17
|
const hono = require('@mokup/shared/hono');
|
|
18
|
+
const node_process = require('node:process');
|
|
16
19
|
|
|
17
20
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
18
|
-
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
19
|
-
|
|
20
|
-
const process__default = /*#__PURE__*/_interopDefaultCompat(process);
|
|
21
|
-
|
|
22
21
|
const silentLogger$1 = {
|
|
23
22
|
info: () => {
|
|
24
23
|
},
|
|
@@ -274,579 +273,98 @@ function registerPlaygroundRoutes(params) {
|
|
|
274
273
|
});
|
|
275
274
|
}
|
|
276
275
|
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
"PATCH",
|
|
282
|
-
"DELETE",
|
|
283
|
-
"OPTIONS",
|
|
284
|
-
"HEAD"
|
|
285
|
-
]);
|
|
286
|
-
const methodSuffixSet = new Set(
|
|
287
|
-
Array.from(methodSet, (method) => method.toLowerCase())
|
|
288
|
-
);
|
|
289
|
-
const supportedExtensions = /* @__PURE__ */ new Set([
|
|
290
|
-
".json",
|
|
291
|
-
".jsonc",
|
|
292
|
-
".ts",
|
|
293
|
-
".js",
|
|
294
|
-
".mjs",
|
|
295
|
-
".cjs"
|
|
296
|
-
]);
|
|
297
|
-
const configExtensions = [".ts", ".js", ".mjs", ".cjs"];
|
|
298
|
-
|
|
299
|
-
function normalizePrefix(prefix) {
|
|
300
|
-
if (!prefix) {
|
|
301
|
-
return "";
|
|
302
|
-
}
|
|
303
|
-
const normalized = prefix.startsWith("/") ? prefix : `/${prefix}`;
|
|
304
|
-
return normalized.endsWith("/") ? normalized.slice(0, -1) : normalized;
|
|
305
|
-
}
|
|
306
|
-
function resolveDirs(dir, root) {
|
|
307
|
-
const raw = typeof dir === "function" ? dir(root) : dir;
|
|
308
|
-
const resolved = Array.isArray(raw) ? raw : raw ? [raw] : ["mock"];
|
|
309
|
-
const normalized = resolved.map(
|
|
310
|
-
(entry) => pathe.isAbsolute(entry) ? entry : pathe.resolve(root, entry)
|
|
311
|
-
);
|
|
312
|
-
return Array.from(new Set(normalized));
|
|
313
|
-
}
|
|
314
|
-
function normalizeIgnorePrefix(value, fallback = ["."]) {
|
|
315
|
-
const list = typeof value === "undefined" ? fallback : Array.isArray(value) ? value : [value];
|
|
316
|
-
return list.filter((entry) => typeof entry === "string" && entry.length > 0);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
const jsonExtensions = /* @__PURE__ */ new Set([".json", ".jsonc"]);
|
|
320
|
-
function resolveTemplate(template, prefix) {
|
|
321
|
-
const normalized = template.startsWith("/") ? template : `/${template}`;
|
|
322
|
-
if (!prefix) {
|
|
323
|
-
return normalized;
|
|
324
|
-
}
|
|
325
|
-
const normalizedPrefix = normalizePrefix(prefix);
|
|
326
|
-
if (!normalizedPrefix) {
|
|
327
|
-
return normalized;
|
|
328
|
-
}
|
|
329
|
-
if (normalized === normalizedPrefix || normalized.startsWith(`${normalizedPrefix}/`)) {
|
|
330
|
-
return normalized;
|
|
331
|
-
}
|
|
332
|
-
if (normalized === "/") {
|
|
333
|
-
return `${normalizedPrefix}/`;
|
|
334
|
-
}
|
|
335
|
-
return `${normalizedPrefix}${normalized}`;
|
|
336
|
-
}
|
|
337
|
-
function stripMethodSuffix(base) {
|
|
338
|
-
const segments = base.split(".");
|
|
339
|
-
const last = segments.at(-1);
|
|
340
|
-
if (last && methodSuffixSet.has(last.toLowerCase())) {
|
|
341
|
-
segments.pop();
|
|
342
|
-
return {
|
|
343
|
-
name: segments.join("."),
|
|
344
|
-
method: last.toUpperCase()
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
return {
|
|
348
|
-
name: base,
|
|
349
|
-
method: void 0
|
|
350
|
-
};
|
|
351
|
-
}
|
|
276
|
+
const routeUtils = routeUtils$1.createRouteUtils({
|
|
277
|
+
parseRouteTemplate: runtime.parseRouteTemplate,
|
|
278
|
+
compareRouteScore: runtime.compareRouteScore
|
|
279
|
+
});
|
|
352
280
|
function deriveRouteFromFile(file, rootDir, logger) {
|
|
353
|
-
|
|
354
|
-
const ext = pathe.extname(rel);
|
|
355
|
-
const withoutExt = rel.slice(0, rel.length - ext.length);
|
|
356
|
-
const dir = pathe.dirname(withoutExt);
|
|
357
|
-
const base = pathe.basename(withoutExt);
|
|
358
|
-
const { name, method } = stripMethodSuffix(base);
|
|
359
|
-
const resolvedMethod = method ?? (jsonExtensions.has(ext) ? "GET" : void 0);
|
|
360
|
-
if (!resolvedMethod) {
|
|
361
|
-
logger.warn(`Skip mock without method suffix: ${file}`);
|
|
362
|
-
return null;
|
|
363
|
-
}
|
|
364
|
-
if (!name) {
|
|
365
|
-
logger.warn(`Skip mock with empty route name: ${file}`);
|
|
366
|
-
return null;
|
|
367
|
-
}
|
|
368
|
-
const joined = dir === "." ? name : pathe.join(dir, name);
|
|
369
|
-
const segments = pathUtils.toPosix(joined).split("/");
|
|
370
|
-
if (segments.at(-1) === "index") {
|
|
371
|
-
segments.pop();
|
|
372
|
-
}
|
|
373
|
-
const template = segments.length === 0 ? "/" : `/${segments.join("/")}`;
|
|
374
|
-
const parsed = runtime.parseRouteTemplate(template);
|
|
375
|
-
if (parsed.errors.length > 0) {
|
|
376
|
-
for (const error of parsed.errors) {
|
|
377
|
-
logger.warn(`${error} in ${file}`);
|
|
378
|
-
}
|
|
379
|
-
return null;
|
|
380
|
-
}
|
|
381
|
-
for (const warning of parsed.warnings) {
|
|
382
|
-
logger.warn(`${warning} in ${file}`);
|
|
383
|
-
}
|
|
384
|
-
return {
|
|
385
|
-
template: parsed.template,
|
|
386
|
-
method: resolvedMethod,
|
|
387
|
-
tokens: parsed.tokens,
|
|
388
|
-
score: parsed.score
|
|
389
|
-
};
|
|
281
|
+
return routeUtils.deriveRouteFromFile(file, rootDir, (message) => logger.warn(message));
|
|
390
282
|
}
|
|
391
283
|
function resolveRule(params) {
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
const template = resolveTemplate(params.derivedTemplate, params.prefix);
|
|
398
|
-
const parsed = runtime.parseRouteTemplate(template);
|
|
399
|
-
if (parsed.errors.length > 0) {
|
|
400
|
-
for (const error of parsed.errors) {
|
|
401
|
-
params.logger.warn(`${error} in ${params.file}`);
|
|
402
|
-
}
|
|
403
|
-
return null;
|
|
404
|
-
}
|
|
405
|
-
for (const warning of parsed.warnings) {
|
|
406
|
-
params.logger.warn(`${warning} in ${params.file}`);
|
|
407
|
-
}
|
|
408
|
-
const route = {
|
|
284
|
+
return routeUtils.resolveRule({
|
|
285
|
+
rule: params.rule,
|
|
286
|
+
derivedTemplate: params.derivedTemplate,
|
|
287
|
+
derivedMethod: params.derivedMethod,
|
|
288
|
+
prefix: params.prefix,
|
|
409
289
|
file: params.file,
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
if (typeof params.rule.delay === "number") {
|
|
423
|
-
route.delay = params.rule.delay;
|
|
424
|
-
}
|
|
425
|
-
return route;
|
|
426
|
-
}
|
|
427
|
-
function sortRoutes(routes) {
|
|
428
|
-
return routes.sort((a, b) => {
|
|
429
|
-
if (a.method !== b.method) {
|
|
430
|
-
return a.method.localeCompare(b.method);
|
|
431
|
-
}
|
|
432
|
-
const scoreCompare = runtime.compareRouteScore(a.score, b.score);
|
|
433
|
-
if (scoreCompare !== 0) {
|
|
434
|
-
return scoreCompare;
|
|
435
|
-
}
|
|
436
|
-
return a.template.localeCompare(b.template);
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
let registerPromise = null;
|
|
441
|
-
let hasLoggedFailure = false;
|
|
442
|
-
async function ensureTsxRegister(logger) {
|
|
443
|
-
if (registerPromise) {
|
|
444
|
-
return registerPromise;
|
|
445
|
-
}
|
|
446
|
-
registerPromise = (async () => {
|
|
447
|
-
try {
|
|
448
|
-
const mod = await import('tsx/esm/api');
|
|
449
|
-
const setSourceMapsEnabled = process__default.setSourceMapsEnabled;
|
|
450
|
-
if (typeof setSourceMapsEnabled === "function") {
|
|
451
|
-
setSourceMapsEnabled(true);
|
|
452
|
-
}
|
|
453
|
-
if (typeof mod.register === "function") {
|
|
454
|
-
mod.register();
|
|
290
|
+
warn: (message) => params.logger.warn(message),
|
|
291
|
+
build: (base, rule) => {
|
|
292
|
+
const route = {
|
|
293
|
+
file: params.file,
|
|
294
|
+
template: base.template,
|
|
295
|
+
method: base.method,
|
|
296
|
+
tokens: base.tokens,
|
|
297
|
+
score: base.score,
|
|
298
|
+
handler: rule.handler
|
|
299
|
+
};
|
|
300
|
+
if (typeof rule.status === "number") {
|
|
301
|
+
route.status = rule.status;
|
|
455
302
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
if (!hasLoggedFailure && logger) {
|
|
459
|
-
logger.warn(
|
|
460
|
-
"Failed to register tsx loader; falling back to bundled TS loader.",
|
|
461
|
-
error
|
|
462
|
-
);
|
|
463
|
-
hasLoggedFailure = true;
|
|
303
|
+
if (rule.headers) {
|
|
304
|
+
route.headers = rule.headers;
|
|
464
305
|
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
})();
|
|
468
|
-
return registerPromise;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
const middlewareSymbol = Symbol.for("mokup.config.middlewares");
|
|
472
|
-
function isUnknownFileExtensionError$1(error) {
|
|
473
|
-
if (!error || typeof error !== "object") {
|
|
474
|
-
return false;
|
|
475
|
-
}
|
|
476
|
-
const code = error.code;
|
|
477
|
-
if (code === "ERR_UNKNOWN_FILE_EXTENSION") {
|
|
478
|
-
return true;
|
|
479
|
-
}
|
|
480
|
-
const message = error.message;
|
|
481
|
-
return typeof message === "string" && message.includes("Unknown file extension");
|
|
482
|
-
}
|
|
483
|
-
async function loadTsModule$1(file, logger) {
|
|
484
|
-
const cacheBust = Date.now();
|
|
485
|
-
const fileUrl = `${node_url.pathToFileURL(file).href}?t=${cacheBust}`;
|
|
486
|
-
const registered = await ensureTsxRegister(logger);
|
|
487
|
-
if (registered) {
|
|
488
|
-
try {
|
|
489
|
-
return await import(fileUrl);
|
|
490
|
-
} catch (error) {
|
|
491
|
-
if (!isUnknownFileExtensionError$1(error)) {
|
|
492
|
-
throw error;
|
|
306
|
+
if (typeof rule.delay === "number") {
|
|
307
|
+
route.delay = rule.delay;
|
|
493
308
|
}
|
|
309
|
+
return route;
|
|
494
310
|
}
|
|
495
|
-
}
|
|
496
|
-
const result = await esbuild.build({
|
|
497
|
-
entryPoints: [file],
|
|
498
|
-
bundle: true,
|
|
499
|
-
format: "esm",
|
|
500
|
-
platform: "node",
|
|
501
|
-
sourcemap: "inline",
|
|
502
|
-
target: "es2020",
|
|
503
|
-
write: false
|
|
504
311
|
});
|
|
505
|
-
const output = result.outputFiles[0];
|
|
506
|
-
const code = output?.text ?? "";
|
|
507
|
-
const dataUrl = `data:text/javascript;base64,${node_buffer.Buffer.from(code).toString(
|
|
508
|
-
"base64"
|
|
509
|
-
)}`;
|
|
510
|
-
return import(`${dataUrl}#${cacheBust}`);
|
|
511
312
|
}
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
if (ext === ".cjs") {
|
|
515
|
-
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('fetch-server.cjs', document.baseURI).href)));
|
|
516
|
-
delete require$1.cache[file];
|
|
517
|
-
return require$1(file);
|
|
518
|
-
}
|
|
519
|
-
if (ext === ".js" || ext === ".mjs") {
|
|
520
|
-
return import(`${node_url.pathToFileURL(file).href}?t=${Date.now()}`);
|
|
521
|
-
}
|
|
522
|
-
if (ext === ".ts") {
|
|
523
|
-
return loadTsModule$1(file, logger);
|
|
524
|
-
}
|
|
525
|
-
return null;
|
|
526
|
-
}
|
|
527
|
-
function getConfigFileCandidates(dir) {
|
|
528
|
-
return configExtensions.map((extension) => pathe.join(dir, `index.config${extension}`));
|
|
529
|
-
}
|
|
530
|
-
async function findConfigFile(dir, cache) {
|
|
531
|
-
const cached = cache.get(dir);
|
|
532
|
-
if (cached !== void 0) {
|
|
533
|
-
return cached;
|
|
534
|
-
}
|
|
535
|
-
for (const candidate of getConfigFileCandidates(dir)) {
|
|
536
|
-
try {
|
|
537
|
-
await node_fs.promises.stat(candidate);
|
|
538
|
-
cache.set(dir, candidate);
|
|
539
|
-
return candidate;
|
|
540
|
-
} catch {
|
|
541
|
-
continue;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
cache.set(dir, null);
|
|
545
|
-
return null;
|
|
313
|
+
function sortRoutes(routes) {
|
|
314
|
+
return routeUtils.sortRoutes(routes);
|
|
546
315
|
}
|
|
547
|
-
|
|
548
|
-
|
|
316
|
+
|
|
317
|
+
const configExtensions = routeConstants.configExtensions;
|
|
318
|
+
|
|
319
|
+
async function loadConfig(file) {
|
|
320
|
+
const mod = await moduleLoader.loadModule(file);
|
|
549
321
|
if (!mod) {
|
|
550
322
|
return null;
|
|
551
323
|
}
|
|
552
|
-
const
|
|
324
|
+
const raw = mod?.default ?? mod;
|
|
325
|
+
const value = configUtils.isPromise(raw) ? await raw : raw;
|
|
553
326
|
if (!value || typeof value !== "object") {
|
|
554
327
|
return null;
|
|
555
328
|
}
|
|
556
329
|
return value;
|
|
557
330
|
}
|
|
558
|
-
function
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
handle: entry,
|
|
331
|
+
async function resolveDirectoryConfig(params) {
|
|
332
|
+
const { file, rootDir, logger, configCache, fileCache } = params;
|
|
333
|
+
const resolved = await configUtils.resolveDirectoryConfig({
|
|
334
|
+
file,
|
|
335
|
+
rootDir,
|
|
336
|
+
configExtensions,
|
|
337
|
+
configCache,
|
|
338
|
+
fileCache,
|
|
339
|
+
loadConfig,
|
|
340
|
+
warn: (message) => logger.warn(message),
|
|
341
|
+
mapMiddleware: (handler, index, position, source) => ({
|
|
342
|
+
handle: handler,
|
|
571
343
|
source,
|
|
572
344
|
index,
|
|
573
345
|
position
|
|
574
|
-
})
|
|
575
|
-
}
|
|
576
|
-
return middlewares;
|
|
577
|
-
}
|
|
578
|
-
function readMiddlewareMeta(config) {
|
|
579
|
-
const value = config[middlewareSymbol];
|
|
580
|
-
if (!value || typeof value !== "object") {
|
|
581
|
-
return null;
|
|
582
|
-
}
|
|
583
|
-
const meta = value;
|
|
584
|
-
return {
|
|
585
|
-
pre: Array.isArray(meta.pre) ? meta.pre : [],
|
|
586
|
-
normal: Array.isArray(meta.normal) ? meta.normal : [],
|
|
587
|
-
post: Array.isArray(meta.post) ? meta.post : []
|
|
588
|
-
};
|
|
589
|
-
}
|
|
590
|
-
async function resolveDirectoryConfig(params) {
|
|
591
|
-
const { file, rootDir, logger, configCache, fileCache } = params;
|
|
592
|
-
const resolvedRoot = pathe.normalize(rootDir);
|
|
593
|
-
const resolvedFileDir = pathe.normalize(pathe.dirname(file));
|
|
594
|
-
const chain = [];
|
|
595
|
-
let current = resolvedFileDir;
|
|
596
|
-
while (true) {
|
|
597
|
-
chain.push(current);
|
|
598
|
-
if (current === resolvedRoot) {
|
|
599
|
-
break;
|
|
600
|
-
}
|
|
601
|
-
const parent = pathe.dirname(current);
|
|
602
|
-
if (parent === current) {
|
|
603
|
-
break;
|
|
604
|
-
}
|
|
605
|
-
current = parent;
|
|
606
|
-
}
|
|
607
|
-
chain.reverse();
|
|
608
|
-
const merged = {};
|
|
609
|
-
const preMiddlewares = [];
|
|
610
|
-
const normalMiddlewares = [];
|
|
611
|
-
const postMiddlewares = [];
|
|
612
|
-
for (const dir of chain) {
|
|
613
|
-
const configPath = await findConfigFile(dir, fileCache);
|
|
614
|
-
if (!configPath) {
|
|
615
|
-
continue;
|
|
616
|
-
}
|
|
617
|
-
let config = configCache.get(configPath);
|
|
618
|
-
if (config === void 0) {
|
|
619
|
-
config = await loadConfig(configPath, logger);
|
|
620
|
-
configCache.set(configPath, config);
|
|
621
|
-
}
|
|
622
|
-
if (!config) {
|
|
623
|
-
logger.warn(`Invalid config in ${configPath}`);
|
|
624
|
-
continue;
|
|
625
|
-
}
|
|
626
|
-
if (config.headers) {
|
|
627
|
-
merged.headers = { ...merged.headers ?? {}, ...config.headers };
|
|
628
|
-
}
|
|
629
|
-
if (typeof config.status === "number") {
|
|
630
|
-
merged.status = config.status;
|
|
631
|
-
}
|
|
632
|
-
if (typeof config.delay === "number") {
|
|
633
|
-
merged.delay = config.delay;
|
|
634
|
-
}
|
|
635
|
-
if (typeof config.enabled === "boolean") {
|
|
636
|
-
merged.enabled = config.enabled;
|
|
637
|
-
}
|
|
638
|
-
if (typeof config.ignorePrefix !== "undefined") {
|
|
639
|
-
merged.ignorePrefix = config.ignorePrefix;
|
|
640
|
-
}
|
|
641
|
-
if (typeof config.include !== "undefined") {
|
|
642
|
-
merged.include = config.include;
|
|
643
|
-
}
|
|
644
|
-
if (typeof config.exclude !== "undefined") {
|
|
645
|
-
merged.exclude = config.exclude;
|
|
646
|
-
}
|
|
647
|
-
const meta = readMiddlewareMeta(config);
|
|
648
|
-
const normalizedPre = normalizeMiddlewares(
|
|
649
|
-
meta?.pre,
|
|
650
|
-
configPath,
|
|
651
|
-
logger,
|
|
652
|
-
"pre"
|
|
653
|
-
);
|
|
654
|
-
const normalizedNormal = normalizeMiddlewares(
|
|
655
|
-
meta?.normal,
|
|
656
|
-
configPath,
|
|
657
|
-
logger,
|
|
658
|
-
"normal"
|
|
659
|
-
);
|
|
660
|
-
const normalizedLegacy = normalizeMiddlewares(
|
|
661
|
-
config.middleware,
|
|
662
|
-
configPath,
|
|
663
|
-
logger,
|
|
664
|
-
"normal"
|
|
665
|
-
);
|
|
666
|
-
const normalizedPost = normalizeMiddlewares(
|
|
667
|
-
meta?.post,
|
|
668
|
-
configPath,
|
|
669
|
-
logger,
|
|
670
|
-
"post"
|
|
671
|
-
);
|
|
672
|
-
if (normalizedPre.length > 0) {
|
|
673
|
-
preMiddlewares.push(...normalizedPre);
|
|
674
|
-
}
|
|
675
|
-
if (normalizedNormal.length > 0) {
|
|
676
|
-
normalMiddlewares.push(...normalizedNormal);
|
|
677
|
-
}
|
|
678
|
-
if (normalizedLegacy.length > 0) {
|
|
679
|
-
normalMiddlewares.push(...normalizedLegacy);
|
|
680
|
-
}
|
|
681
|
-
if (normalizedPost.length > 0) {
|
|
682
|
-
postMiddlewares.push(...normalizedPost);
|
|
683
|
-
}
|
|
684
|
-
}
|
|
346
|
+
})
|
|
347
|
+
});
|
|
685
348
|
return {
|
|
686
|
-
|
|
687
|
-
|
|
349
|
+
headers: resolved.headers,
|
|
350
|
+
status: resolved.status,
|
|
351
|
+
delay: resolved.delay,
|
|
352
|
+
enabled: resolved.enabled,
|
|
353
|
+
ignorePrefix: resolved.ignorePrefix,
|
|
354
|
+
include: resolved.include,
|
|
355
|
+
exclude: resolved.exclude,
|
|
356
|
+
middlewares: resolved.middlewares
|
|
688
357
|
};
|
|
689
358
|
}
|
|
690
359
|
|
|
691
|
-
async function
|
|
692
|
-
|
|
693
|
-
for (const entry of entries) {
|
|
694
|
-
if (entry.name === "node_modules" || entry.name === ".git") {
|
|
695
|
-
continue;
|
|
696
|
-
}
|
|
697
|
-
const fullPath = pathe.join(dir, entry.name);
|
|
698
|
-
if (entry.isDirectory()) {
|
|
699
|
-
await walkDir(fullPath, rootDir, files);
|
|
700
|
-
continue;
|
|
701
|
-
}
|
|
702
|
-
if (entry.isFile()) {
|
|
703
|
-
files.push({ file: fullPath, rootDir });
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
async function exists(path) {
|
|
708
|
-
try {
|
|
709
|
-
await node_fs.promises.stat(path);
|
|
710
|
-
return true;
|
|
711
|
-
} catch {
|
|
712
|
-
return false;
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
async function collectFiles(dirs) {
|
|
716
|
-
const files = [];
|
|
717
|
-
for (const dir of dirs) {
|
|
718
|
-
if (!await exists(dir)) {
|
|
719
|
-
continue;
|
|
720
|
-
}
|
|
721
|
-
await walkDir(dir, dir, files);
|
|
722
|
-
}
|
|
723
|
-
return files;
|
|
724
|
-
}
|
|
725
|
-
function isConfigFile(file) {
|
|
726
|
-
if (file.endsWith(".d.ts")) {
|
|
727
|
-
return false;
|
|
728
|
-
}
|
|
729
|
-
const base = pathe.basename(file);
|
|
730
|
-
if (!base.startsWith("index.config.")) {
|
|
731
|
-
return false;
|
|
732
|
-
}
|
|
733
|
-
const ext = pathe.extname(file).toLowerCase();
|
|
734
|
-
return configExtensions.includes(ext);
|
|
735
|
-
}
|
|
736
|
-
function isSupportedFile(file) {
|
|
737
|
-
if (file.endsWith(".d.ts")) {
|
|
738
|
-
return false;
|
|
739
|
-
}
|
|
740
|
-
if (isConfigFile(file)) {
|
|
741
|
-
return false;
|
|
742
|
-
}
|
|
743
|
-
const ext = pathe.extname(file).toLowerCase();
|
|
744
|
-
return supportedExtensions.has(ext);
|
|
360
|
+
async function loadRules(file, logger) {
|
|
361
|
+
return loadRules$1.loadRules(file, { loadModule: moduleLoader.loadModule, logger });
|
|
745
362
|
}
|
|
746
363
|
|
|
747
|
-
function
|
|
748
|
-
|
|
749
|
-
return false;
|
|
750
|
-
}
|
|
751
|
-
const code = error.code;
|
|
752
|
-
if (code === "ERR_UNKNOWN_FILE_EXTENSION") {
|
|
753
|
-
return true;
|
|
754
|
-
}
|
|
755
|
-
const message = error.message;
|
|
756
|
-
return typeof message === "string" && message.includes("Unknown file extension");
|
|
757
|
-
}
|
|
758
|
-
async function loadTsModule(file, logger) {
|
|
759
|
-
const cacheBust = Date.now();
|
|
760
|
-
const fileUrl = `${node_url.pathToFileURL(file).href}?t=${cacheBust}`;
|
|
761
|
-
const registered = await ensureTsxRegister(logger);
|
|
762
|
-
if (registered) {
|
|
763
|
-
try {
|
|
764
|
-
return await import(fileUrl);
|
|
765
|
-
} catch (error) {
|
|
766
|
-
if (!isUnknownFileExtensionError(error)) {
|
|
767
|
-
throw error;
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
const result = await esbuild.build({
|
|
772
|
-
entryPoints: [file],
|
|
773
|
-
bundle: true,
|
|
774
|
-
format: "esm",
|
|
775
|
-
platform: "node",
|
|
776
|
-
sourcemap: "inline",
|
|
777
|
-
target: "es2020",
|
|
778
|
-
write: false
|
|
779
|
-
});
|
|
780
|
-
const output = result.outputFiles[0];
|
|
781
|
-
const code = output?.text ?? "";
|
|
782
|
-
const dataUrl = `data:text/javascript;base64,${node_buffer.Buffer.from(code).toString(
|
|
783
|
-
"base64"
|
|
784
|
-
)}`;
|
|
785
|
-
return import(`${dataUrl}#${cacheBust}`);
|
|
786
|
-
}
|
|
787
|
-
async function loadModule(file, logger) {
|
|
788
|
-
const ext = pathe.extname(file).toLowerCase();
|
|
789
|
-
if (ext === ".cjs") {
|
|
790
|
-
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('fetch-server.cjs', document.baseURI).href)));
|
|
791
|
-
delete require$1.cache[file];
|
|
792
|
-
return require$1(file);
|
|
793
|
-
}
|
|
794
|
-
if (ext === ".js" || ext === ".mjs") {
|
|
795
|
-
return import(`${node_url.pathToFileURL(file).href}?t=${Date.now()}`);
|
|
796
|
-
}
|
|
797
|
-
if (ext === ".ts") {
|
|
798
|
-
return loadTsModule(file, logger);
|
|
799
|
-
}
|
|
800
|
-
return null;
|
|
801
|
-
}
|
|
802
|
-
async function readJsonFile(file, logger) {
|
|
803
|
-
try {
|
|
804
|
-
const content = await node_fs.promises.readFile(file, "utf8");
|
|
805
|
-
const errors = [];
|
|
806
|
-
const data = jsoncParser.parse(content, errors, {
|
|
807
|
-
allowTrailingComma: true,
|
|
808
|
-
disallowComments: false
|
|
809
|
-
});
|
|
810
|
-
if (errors.length > 0) {
|
|
811
|
-
logger.warn(`Invalid JSONC in ${file}`);
|
|
812
|
-
return void 0;
|
|
813
|
-
}
|
|
814
|
-
return data;
|
|
815
|
-
} catch (error) {
|
|
816
|
-
logger.warn(`Failed to read ${file}: ${String(error)}`);
|
|
817
|
-
return void 0;
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
async function loadRules(file, logger) {
|
|
821
|
-
const ext = pathe.extname(file).toLowerCase();
|
|
822
|
-
if (ext === ".json" || ext === ".jsonc") {
|
|
823
|
-
const json = await readJsonFile(file, logger);
|
|
824
|
-
if (typeof json === "undefined") {
|
|
825
|
-
return [];
|
|
826
|
-
}
|
|
827
|
-
return [
|
|
828
|
-
{
|
|
829
|
-
handler: json
|
|
830
|
-
}
|
|
831
|
-
];
|
|
832
|
-
}
|
|
833
|
-
const mod = await loadModule(file, logger);
|
|
834
|
-
const value = mod?.default ?? mod;
|
|
835
|
-
if (!value) {
|
|
836
|
-
return [];
|
|
837
|
-
}
|
|
838
|
-
if (Array.isArray(value)) {
|
|
839
|
-
return value;
|
|
840
|
-
}
|
|
841
|
-
if (typeof value === "function") {
|
|
842
|
-
return [
|
|
843
|
-
{
|
|
844
|
-
handler: value
|
|
845
|
-
}
|
|
846
|
-
];
|
|
847
|
-
}
|
|
848
|
-
return [value];
|
|
364
|
+
function resolveDirs(dir, root) {
|
|
365
|
+
return scanUtils.resolveDirs(dir, root);
|
|
849
366
|
}
|
|
367
|
+
const normalizeIgnorePrefix = scanUtils.normalizeIgnorePrefix;
|
|
850
368
|
|
|
851
369
|
const silentLogger = {
|
|
852
370
|
info: () => {
|
|
@@ -890,7 +408,7 @@ function buildSkipInfo(file, reason, resolved) {
|
|
|
890
408
|
async function scanRoutes(params) {
|
|
891
409
|
const routes = [];
|
|
892
410
|
const seen = /* @__PURE__ */ new Set();
|
|
893
|
-
const files = await collectFiles(params.dirs);
|
|
411
|
+
const files = await mockFiles.collectFiles(params.dirs);
|
|
894
412
|
const globalIgnorePrefix = normalizeIgnorePrefix(params.ignorePrefix);
|
|
895
413
|
const configCache = /* @__PURE__ */ new Map();
|
|
896
414
|
const fileCache = /* @__PURE__ */ new Map();
|
|
@@ -898,7 +416,7 @@ async function scanRoutes(params) {
|
|
|
898
416
|
const shouldCollectIgnore = typeof params.onIgnore === "function";
|
|
899
417
|
const shouldCollectConfig = typeof params.onConfig === "function";
|
|
900
418
|
for (const fileInfo of files) {
|
|
901
|
-
if (isConfigFile(fileInfo.file)) {
|
|
419
|
+
if (mockFiles.isConfigFile(fileInfo.file)) {
|
|
902
420
|
if (shouldCollectConfig) {
|
|
903
421
|
const config2 = await resolveDirectoryConfig({
|
|
904
422
|
file: fileInfo.file,
|
|
@@ -919,7 +437,7 @@ async function scanRoutes(params) {
|
|
|
919
437
|
fileCache
|
|
920
438
|
});
|
|
921
439
|
if (config.enabled === false) {
|
|
922
|
-
if (shouldCollectSkip && isSupportedFile(fileInfo.file)) {
|
|
440
|
+
if (shouldCollectSkip && mockFiles.isSupportedFile(fileInfo.file)) {
|
|
923
441
|
const resolved = resolveSkipRoute({
|
|
924
442
|
file: fileInfo.file,
|
|
925
443
|
rootDir: fileInfo.rootDir,
|
|
@@ -931,7 +449,7 @@ async function scanRoutes(params) {
|
|
|
931
449
|
}
|
|
932
450
|
const effectiveIgnorePrefix = typeof config.ignorePrefix !== "undefined" ? normalizeIgnorePrefix(config.ignorePrefix, []) : globalIgnorePrefix;
|
|
933
451
|
if (pathUtils.hasIgnoredPrefix(fileInfo.file, fileInfo.rootDir, effectiveIgnorePrefix)) {
|
|
934
|
-
if (shouldCollectSkip && isSupportedFile(fileInfo.file)) {
|
|
452
|
+
if (shouldCollectSkip && mockFiles.isSupportedFile(fileInfo.file)) {
|
|
935
453
|
const resolved = resolveSkipRoute({
|
|
936
454
|
file: fileInfo.file,
|
|
937
455
|
rootDir: fileInfo.rootDir,
|
|
@@ -941,7 +459,7 @@ async function scanRoutes(params) {
|
|
|
941
459
|
}
|
|
942
460
|
continue;
|
|
943
461
|
}
|
|
944
|
-
if (!isSupportedFile(fileInfo.file)) {
|
|
462
|
+
if (!mockFiles.isSupportedFile(fileInfo.file)) {
|
|
945
463
|
if (shouldCollectIgnore) {
|
|
946
464
|
params.onIgnore?.({ file: fileInfo.file, reason: "unsupported" });
|
|
947
465
|
}
|
|
@@ -1235,7 +753,7 @@ function resolveRoot(list) {
|
|
|
1235
753
|
if (deno?.cwd) {
|
|
1236
754
|
return deno.cwd();
|
|
1237
755
|
}
|
|
1238
|
-
return
|
|
756
|
+
return node_process.cwd();
|
|
1239
757
|
}
|
|
1240
758
|
function resolveAllDirs(list, root) {
|
|
1241
759
|
const dirs = [];
|