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