keq 2.9.0 → 2.10.0
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/CHANGELOG.md +7 -0
- package/dist/esm/src/constant.d.ts +2 -0
- package/dist/esm/src/constant.js +2 -0
- package/dist/esm/src/core.d.ts +30 -0
- package/dist/esm/src/core.js +162 -53
- package/dist/esm/src/exception/abort.exception.d.ts +3 -0
- package/dist/esm/src/exception/abort.exception.js +6 -0
- package/dist/esm/src/index.d.ts +1 -0
- package/dist/esm/src/index.js +1 -0
- package/dist/esm/src/is/is-abort-signal.d.ts +1 -0
- package/dist/esm/src/is/is-abort-signal.js +8 -0
- package/dist/esm/src/middlewares/fetch-arguments-middleware.js +5 -1
- package/dist/esm/src/middlewares/retry-middleware.js +20 -3
- package/dist/esm/src/middlewares/timeout-middleware.js +3 -1
- package/dist/esm/src/types/keq-context.d.ts +10 -1
- package/dist/esm/src/types/keq-context.js +1 -1
- package/dist/umd/src/constant.d.ts +2 -0
- package/dist/umd/src/constant.js +3 -1
- package/dist/umd/src/core.d.ts +30 -0
- package/dist/umd/src/core.js +162 -53
- package/dist/umd/src/exception/abort.exception.d.ts +3 -0
- package/dist/umd/src/exception/abort.exception.js +20 -0
- package/dist/umd/src/index.d.ts +1 -0
- package/dist/umd/src/index.js +4 -2
- package/dist/umd/src/is/is-abort-signal.d.ts +1 -0
- package/dist/umd/src/is/is-abort-signal.js +22 -0
- package/dist/umd/src/middlewares/fetch-arguments-middleware.js +4 -0
- package/dist/umd/src/middlewares/retry-middleware.js +21 -4
- package/dist/umd/src/middlewares/timeout-middleware.js +4 -2
- package/dist/umd/src/types/keq-context.d.ts +10 -1
- package/package.json +10 -13
- package/.claude/settings.local.json +0 -26
- package/packages/cache/.turbo/turbo-build.log +0 -29
- package/packages/cache/dist/index.d.mts +0 -354
- package/packages/cache/dist/index.d.mts.map +0 -1
- package/packages/cache/dist/index.d.ts +0 -353
- package/packages/cache/dist/index.d.ts.map +0 -1
- package/packages/cache/dist/index.js +0 -1271
- package/packages/cache/dist/index.js.map +0 -1
- package/packages/cache/dist/index.mjs +0 -1237
- package/packages/cache/dist/index.mjs.map +0 -1
- package/packages/cli/.turbo/turbo-build.log +0 -91
- package/packages/cli/dist/cli.cjs +0 -1364
- package/packages/cli/dist/cli.cjs.map +0 -1
- package/packages/cli/dist/cli.d.cts +0 -1
- package/packages/cli/dist/cli.d.mts +0 -1
- package/packages/cli/dist/cli.mjs +0 -1359
- package/packages/cli/dist/cli.mjs.map +0 -1
- package/packages/cli/dist/compiler-0Kli6UCr.cjs +0 -738
- package/packages/cli/dist/compiler-0Kli6UCr.cjs.map +0 -1
- package/packages/cli/dist/compiler-C3AE8j54.mjs +0 -715
- package/packages/cli/dist/compiler-C3AE8j54.mjs.map +0 -1
- package/packages/cli/dist/index.cjs +0 -20
- package/packages/cli/dist/index.cjs.map +0 -1
- package/packages/cli/dist/index.d.cts +0 -17
- package/packages/cli/dist/index.d.cts.map +0 -1
- package/packages/cli/dist/index.d.mts +0 -17
- package/packages/cli/dist/index.d.mts.map +0 -1
- package/packages/cli/dist/index.mjs +0 -10
- package/packages/cli/dist/index.mjs.map +0 -1
- package/packages/cli/dist/init-BNhD2oCI.mjs +0 -168
- package/packages/cli/dist/init-BNhD2oCI.mjs.map +0 -1
- package/packages/cli/dist/init-DqxLcRSQ.cjs +0 -170
- package/packages/cli/dist/init-DqxLcRSQ.cjs.map +0 -1
- package/packages/cli/dist/logger-D7PyVZo3.cjs +0 -46
- package/packages/cli/dist/logger-D7PyVZo3.cjs.map +0 -1
- package/packages/cli/dist/logger-QLBHySQ3.mjs +0 -12
- package/packages/cli/dist/logger-QLBHySQ3.mjs.map +0 -1
- package/packages/cli/dist/micro-function.translator-BmJZzkKh.cjs +0 -16
- package/packages/cli/dist/micro-function.translator-BmJZzkKh.cjs.map +0 -1
- package/packages/cli/dist/micro-function.translator-CDfkj4Tt.mjs +0 -11
- package/packages/cli/dist/micro-function.translator-CDfkj4Tt.mjs.map +0 -1
- package/packages/cli/dist/mock-command-Bp1LxSls.mjs +0 -350
- package/packages/cli/dist/mock-command-Bp1LxSls.mjs.map +0 -1
- package/packages/cli/dist/mock-command-WZcfy5Iq.cjs +0 -353
- package/packages/cli/dist/mock-command-WZcfy5Iq.cjs.map +0 -1
- package/packages/cli/dist/plugins-CgMhaNZq.cjs +0 -3558
- package/packages/cli/dist/plugins-CgMhaNZq.cjs.map +0 -1
- package/packages/cli/dist/plugins-DCvJ8iHR.mjs +0 -3280
- package/packages/cli/dist/plugins-DCvJ8iHR.mjs.map +0 -1
- package/packages/cli/dist/plugins.cjs +0 -36
- package/packages/cli/dist/plugins.d.cts +0 -2
- package/packages/cli/dist/plugins.d.mts +0 -2
- package/packages/cli/dist/plugins.mjs +0 -2
- package/packages/cli/dist/runtime-config-BWQlPhiB.d.cts +0 -780
- package/packages/cli/dist/runtime-config-BWQlPhiB.d.cts.map +0 -1
- package/packages/cli/dist/runtime-config-CrzK-Ucf.d.mts +0 -780
- package/packages/cli/dist/runtime-config-CrzK-Ucf.d.mts.map +0 -1
- package/packages/cli/dist/translators.cjs +0 -14
- package/packages/cli/dist/translators.cjs.map +0 -1
- package/packages/cli/dist/translators.d.cts +0 -14
- package/packages/cli/dist/translators.d.cts.map +0 -1
- package/packages/cli/dist/translators.d.mts +0 -14
- package/packages/cli/dist/translators.d.mts.map +0 -1
- package/packages/cli/dist/translators.mjs +0 -12
- package/packages/cli/dist/translators.mjs.map +0 -1
- package/packages/cli/node_modules/.bin/eslint +0 -21
- package/packages/cli/node_modules/.bin/jiti +0 -21
- package/packages/cli/node_modules/.bin/js-yaml +0 -21
- package/packages/cli/node_modules/.bin/jsf +0 -21
- package/packages/cli/node_modules/.bin/jsonpath +0 -21
- package/packages/cli/node_modules/.bin/jsonpath-plus +0 -21
- package/packages/cli/node_modules/.bin/semver +0 -21
- package/packages/cli/node_modules/.bin/tsc +0 -21
- package/packages/cli/node_modules/.bin/tsserver +0 -21
- package/packages/exception/.turbo/turbo-build.log +0 -29
- package/packages/exception/dist/index.d.mts +0 -21
- package/packages/exception/dist/index.d.mts.map +0 -1
- package/packages/exception/dist/index.d.ts +0 -21
- package/packages/exception/dist/index.d.ts.map +0 -1
- package/packages/exception/dist/index.js +0 -104
- package/packages/exception/dist/index.js.map +0 -1
- package/packages/exception/dist/index.mjs +0 -99
- package/packages/exception/dist/index.mjs.map +0 -1
- package/packages/headers/.turbo/turbo-build.log +0 -29
- package/packages/headers/dist/index.d.mts +0 -46
- package/packages/headers/dist/index.d.mts.map +0 -1
- package/packages/headers/dist/index.d.ts +0 -46
- package/packages/headers/dist/index.d.ts.map +0 -1
- package/packages/headers/dist/index.js +0 -81
- package/packages/headers/dist/index.js.map +0 -1
- package/packages/headers/dist/index.mjs +0 -75
- package/packages/headers/dist/index.mjs.map +0 -1
- package/packages/keq/.turbo/turbo-build.log +0 -29
- package/packages/keq/dist/index.d.mts +0 -962
- package/packages/keq/dist/index.d.mts.map +0 -1
- package/packages/keq/dist/index.d.ts +0 -962
- package/packages/keq/dist/index.d.ts.map +0 -1
- package/packages/keq/dist/index.js +0 -1876
- package/packages/keq/dist/index.js.map +0 -1
- package/packages/keq/dist/index.mjs +0 -1814
- package/packages/keq/dist/index.mjs.map +0 -1
- package/packages/nestjs/.turbo/turbo-build.log +0 -29
- package/packages/nestjs/dist/index.d.mts +0 -52
- package/packages/nestjs/dist/index.d.mts.map +0 -1
- package/packages/nestjs/dist/index.d.ts +0 -52
- package/packages/nestjs/dist/index.d.ts.map +0 -1
- package/packages/nestjs/dist/index.js +0 -166
- package/packages/nestjs/dist/index.js.map +0 -1
- package/packages/nestjs/dist/index.mjs +0 -136
- package/packages/nestjs/dist/index.mjs.map +0 -1
- package/packages/test/.turbo/turbo-build.log +0 -6
- package/packages/url/.turbo/turbo-build.log +0 -29
- package/packages/url/dist/index.d.mts +0 -9
- package/packages/url/dist/index.d.mts.map +0 -1
- package/packages/url/dist/index.d.ts +0 -9
- package/packages/url/dist/index.d.ts.map +0 -1
- package/packages/url/dist/index.js +0 -43
- package/packages/url/dist/index.js.map +0 -1
- package/packages/url/dist/index.mjs +0 -40
- package/packages/url/dist/index.mjs.map +0 -1
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
//#region src/utils/logger.ts
|
|
3
|
-
const logger = {
|
|
4
|
-
log: (str) => console.log(chalk.green(str)),
|
|
5
|
-
raw: (str) => console.log(str),
|
|
6
|
-
warn: (str) => console.warn(chalk.yellow(str)),
|
|
7
|
-
error: (str) => console.error(chalk.red(str))
|
|
8
|
-
};
|
|
9
|
-
//#endregion
|
|
10
|
-
export { logger as t };
|
|
11
|
-
|
|
12
|
-
//# sourceMappingURL=logger-QLBHySQ3.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger-QLBHySQ3.mjs","names":[],"sources":["../src/utils/logger.ts"],"sourcesContent":["import chalk from 'chalk'\n\n\nexport const logger = {\n log: (str: string) => console.log(chalk.green(str)),\n raw: (str: string) => console.log(str),\n warn: (str: string) => console.warn(chalk.yellow(str)),\n error: (str: string) => console.error(chalk.red(str)),\n}\n"],"mappings":";;AAGA,MAAa,SAAS;CACpB,MAAM,QAAgB,QAAQ,IAAI,MAAM,MAAM,IAAI,CAAC;CACnD,MAAM,QAAgB,QAAQ,IAAI,IAAI;CACtC,OAAO,QAAgB,QAAQ,KAAK,MAAM,OAAO,IAAI,CAAC;CACtD,QAAQ,QAAgB,QAAQ,MAAM,MAAM,IAAI,IAAI,CAAC;CACtD"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const require_plugins = require("./plugins-CgMhaNZq.cjs");
|
|
2
|
-
//#region src/translators/micro-function.translator.ts
|
|
3
|
-
var MicroFunctionTranslator = class {
|
|
4
|
-
apply() {
|
|
5
|
-
return [new require_plugins.GenerateDeclarationPlugin(), new require_plugins.GenerateMicroFunctionPlugin()];
|
|
6
|
-
}
|
|
7
|
-
};
|
|
8
|
-
//#endregion
|
|
9
|
-
Object.defineProperty(exports, "MicroFunctionTranslator", {
|
|
10
|
-
enumerable: true,
|
|
11
|
-
get: function() {
|
|
12
|
-
return MicroFunctionTranslator;
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
//# sourceMappingURL=micro-function.translator-BmJZzkKh.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"micro-function.translator-BmJZzkKh.cjs","names":["GenerateDeclarationPlugin","GenerateMicroFunctionPlugin"],"sources":["../src/translators/micro-function.translator.ts"],"sourcesContent":["import { GenerateDeclarationPlugin, GenerateMicroFunctionPlugin } from '~/plugins/index.js'\nimport { Translator, Plugin } from '~/types/index.js'\n\n\nexport class MicroFunctionTranslator implements Translator {\n apply(): Plugin[] {\n return [\n new GenerateDeclarationPlugin(),\n new GenerateMicroFunctionPlugin(),\n ]\n }\n}\n"],"mappings":";;AAIA,IAAa,0BAAb,MAA2D;CACzD,QAAkB;AAChB,SAAO,CACL,IAAIA,gBAAAA,2BAA2B,EAC/B,IAAIC,gBAAAA,6BAA6B,CAClC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { E as GenerateDeclarationPlugin, b as GenerateMicroFunctionPlugin } from "./plugins-DCvJ8iHR.mjs";
|
|
2
|
-
//#region src/translators/micro-function.translator.ts
|
|
3
|
-
var MicroFunctionTranslator = class {
|
|
4
|
-
apply() {
|
|
5
|
-
return [new GenerateDeclarationPlugin(), new GenerateMicroFunctionPlugin()];
|
|
6
|
-
}
|
|
7
|
-
};
|
|
8
|
-
//#endregion
|
|
9
|
-
export { MicroFunctionTranslator as t };
|
|
10
|
-
|
|
11
|
-
//# sourceMappingURL=micro-function.translator-CDfkj4Tt.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"micro-function.translator-CDfkj4Tt.mjs","names":[],"sources":["../src/translators/micro-function.translator.ts"],"sourcesContent":["import { GenerateDeclarationPlugin, GenerateMicroFunctionPlugin } from '~/plugins/index.js'\nimport { Translator, Plugin } from '~/types/index.js'\n\n\nexport class MicroFunctionTranslator implements Translator {\n apply(): Plugin[] {\n return [\n new GenerateDeclarationPlugin(),\n new GenerateMicroFunctionPlugin(),\n ]\n }\n}\n"],"mappings":";;AAIA,IAAa,0BAAb,MAA2D;CACzD,QAAkB;AAChB,SAAO,CACL,IAAI,2BAA2B,EAC/B,IAAI,6BAA6B,CAClC"}
|
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
import { t as Compiler } from "./compiler-C3AE8j54.mjs";
|
|
2
|
-
import { t as logger } from "./logger-QLBHySQ3.mjs";
|
|
3
|
-
import chalk from "chalk";
|
|
4
|
-
import * as http from "http";
|
|
5
|
-
import Router from "find-my-way";
|
|
6
|
-
//#region src/mock/mock-generator.ts
|
|
7
|
-
var MockGenerator = class {
|
|
8
|
-
document;
|
|
9
|
-
options;
|
|
10
|
-
constructor(document, options) {
|
|
11
|
-
this.document = document;
|
|
12
|
-
this.options = options;
|
|
13
|
-
}
|
|
14
|
-
buildResponses(operation) {
|
|
15
|
-
const responses = operation.operation.responses || {};
|
|
16
|
-
const result = [];
|
|
17
|
-
for (const [statusCode, responseOrRef] of Object.entries(responses)) {
|
|
18
|
-
const response = this.resolveResponse(responseOrRef);
|
|
19
|
-
if (!response) continue;
|
|
20
|
-
const content = response.content;
|
|
21
|
-
if (!content) {
|
|
22
|
-
result.push({
|
|
23
|
-
statusCode,
|
|
24
|
-
contentType: "application/json"
|
|
25
|
-
});
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
for (const [contentType, mediaType] of Object.entries(content)) {
|
|
29
|
-
const mockResponse = {
|
|
30
|
-
statusCode,
|
|
31
|
-
contentType,
|
|
32
|
-
schema: mediaType.schema
|
|
33
|
-
};
|
|
34
|
-
if (mediaType.example !== void 0) mockResponse.example = mediaType.example;
|
|
35
|
-
if (mediaType.examples) mockResponse.examples = Object.fromEntries(Object.entries(mediaType.examples).map(([name, exampleOrRef]) => {
|
|
36
|
-
if ("$ref" in exampleOrRef) return [name, void 0];
|
|
37
|
-
return [name, exampleOrRef.value];
|
|
38
|
-
}).filter(([, v]) => v !== void 0));
|
|
39
|
-
result.push(mockResponse);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
async generateData(response, exampleName) {
|
|
45
|
-
if (exampleName && response.examples?.[exampleName] !== void 0) return response.examples[exampleName];
|
|
46
|
-
if (response.example !== void 0) return response.example;
|
|
47
|
-
if (response.examples) {
|
|
48
|
-
const firstExample = Object.values(response.examples)[0];
|
|
49
|
-
if (firstExample !== void 0) return firstExample;
|
|
50
|
-
}
|
|
51
|
-
if (!response.schema) return null;
|
|
52
|
-
const schema = this.resolveSchema(response.schema);
|
|
53
|
-
const { generate } = await import("json-schema-faker");
|
|
54
|
-
return generate(schema, {
|
|
55
|
-
alwaysFakeOptionals: true,
|
|
56
|
-
useExamplesValue: true,
|
|
57
|
-
maxDepth: this.options.maxDepth,
|
|
58
|
-
refDepthMax: this.options.refDepthMax,
|
|
59
|
-
refResolver: (ref) => this.resolveRef(ref)
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
resolveResponse(responseOrRef) {
|
|
63
|
-
if ("$ref" in responseOrRef) {
|
|
64
|
-
const definition = this.document.dereference(responseOrRef.$ref);
|
|
65
|
-
if (!definition) return void 0;
|
|
66
|
-
if ("response" in definition) return definition.response;
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
return responseOrRef;
|
|
70
|
-
}
|
|
71
|
-
resolveSchema(schema) {
|
|
72
|
-
if ("$ref" in schema) {
|
|
73
|
-
const refPath = schema.$ref.replace("#/", "").split("/").map(decodeURIComponent);
|
|
74
|
-
let resolved = this.document.specification;
|
|
75
|
-
for (const segment of refPath) resolved = resolved?.[segment];
|
|
76
|
-
if (!resolved) logger.warn(`Unable to resolve schema $ref: ${schema.$ref}`);
|
|
77
|
-
return resolved || {};
|
|
78
|
-
}
|
|
79
|
-
return schema;
|
|
80
|
-
}
|
|
81
|
-
resolveRef(ref) {
|
|
82
|
-
const refPath = ref.replace("#/", "").split("/").map(decodeURIComponent);
|
|
83
|
-
let resolved = this.document.specification;
|
|
84
|
-
for (const segment of refPath) resolved = resolved?.[segment];
|
|
85
|
-
if (!resolved) logger.warn(`Unable to resolve $ref: ${ref}`);
|
|
86
|
-
return resolved || {};
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
//#endregion
|
|
90
|
-
//#region src/mock/mock-server.ts
|
|
91
|
-
var MockServer = class {
|
|
92
|
-
server = null;
|
|
93
|
-
router;
|
|
94
|
-
generators;
|
|
95
|
-
options;
|
|
96
|
-
constructor(router, generators, options) {
|
|
97
|
-
this.router = router;
|
|
98
|
-
this.generators = generators;
|
|
99
|
-
this.options = options;
|
|
100
|
-
}
|
|
101
|
-
async start() {
|
|
102
|
-
this.server = http.createServer((req, res) => {
|
|
103
|
-
this.handleRequest(req, res);
|
|
104
|
-
});
|
|
105
|
-
return new Promise((resolve, reject) => {
|
|
106
|
-
this.server.listen(this.options.port, this.options.host, () => {
|
|
107
|
-
resolve();
|
|
108
|
-
});
|
|
109
|
-
this.server.on("error", reject);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
stop() {
|
|
113
|
-
return new Promise((resolve) => {
|
|
114
|
-
if (this.server) this.server.close(() => resolve());
|
|
115
|
-
else resolve();
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
async handleRequest(req, res) {
|
|
119
|
-
const url = new URL(req.url || "/", `http://${req.headers.host || "localhost"}`);
|
|
120
|
-
if (this.options.cors) {
|
|
121
|
-
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
122
|
-
res.setHeader("Access-Control-Allow-Methods", "*");
|
|
123
|
-
res.setHeader("Access-Control-Allow-Headers", "*");
|
|
124
|
-
if (req.method === "OPTIONS") {
|
|
125
|
-
res.statusCode = 204;
|
|
126
|
-
res.end();
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
const found = this.router.find(req.method, url.pathname);
|
|
131
|
-
if (!found) {
|
|
132
|
-
res.statusCode = 404;
|
|
133
|
-
res.setHeader("Content-Type", "application/json");
|
|
134
|
-
res.end(JSON.stringify({
|
|
135
|
-
error: "Not Found",
|
|
136
|
-
message: "No matching mock route"
|
|
137
|
-
}));
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
const store = found.store;
|
|
141
|
-
const generator = this.generators.get(store.moduleName);
|
|
142
|
-
if (!generator) {
|
|
143
|
-
res.statusCode = 500;
|
|
144
|
-
res.setHeader("Content-Type", "application/json");
|
|
145
|
-
res.end(JSON.stringify({
|
|
146
|
-
error: "Internal Error",
|
|
147
|
-
message: `Generator not found for module: ${store.moduleName}`
|
|
148
|
-
}));
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const targetStatus = url.searchParams.get("__status");
|
|
152
|
-
const exampleName = url.searchParams.get("__example") || void 0;
|
|
153
|
-
const delayOverride = url.searchParams.get("__delay");
|
|
154
|
-
const response = this.selectResponse(store, targetStatus);
|
|
155
|
-
if (!response) {
|
|
156
|
-
res.statusCode = 500;
|
|
157
|
-
res.setHeader("Content-Type", "application/json");
|
|
158
|
-
res.end(JSON.stringify({
|
|
159
|
-
error: "Internal Error",
|
|
160
|
-
message: "No response definition found"
|
|
161
|
-
}));
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
const delay = delayOverride ? parseInt(delayOverride, 10) : this.computeDelay();
|
|
165
|
-
if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay));
|
|
166
|
-
let body;
|
|
167
|
-
try {
|
|
168
|
-
body = await generator.generateData(response, exampleName);
|
|
169
|
-
} catch (err) {
|
|
170
|
-
const message = err instanceof Error ? err.message : "Unknown error generating mock data";
|
|
171
|
-
logger.error(`Failed to generate mock data for ${req.method} ${url.pathname}: ${message}`);
|
|
172
|
-
res.statusCode = 500;
|
|
173
|
-
res.setHeader("Content-Type", "application/json");
|
|
174
|
-
res.end(JSON.stringify({
|
|
175
|
-
error: "Mock Generation Error",
|
|
176
|
-
message: `Failed to generate mock data: ${message}`
|
|
177
|
-
}));
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const statusCode = parseInt(response.statusCode, 10) || 200;
|
|
181
|
-
res.statusCode = statusCode;
|
|
182
|
-
const contentType = !response.contentType || response.contentType.includes("*") ? "application/json" : response.contentType;
|
|
183
|
-
res.setHeader("Content-Type", contentType);
|
|
184
|
-
res.end(JSON.stringify(body));
|
|
185
|
-
logger.log(`${req.method} ${url.pathname} -> ${statusCode}`);
|
|
186
|
-
}
|
|
187
|
-
selectResponse(store, targetStatus) {
|
|
188
|
-
if (targetStatus) return store.responses.find((r) => r.statusCode === targetStatus) || store.responses[0];
|
|
189
|
-
return store.responses.find((r) => r.statusCode.startsWith("2")) || store.responses[0];
|
|
190
|
-
}
|
|
191
|
-
computeDelay() {
|
|
192
|
-
if (!this.options.delay) return 0;
|
|
193
|
-
if (typeof this.options.delay === "number") return this.options.delay;
|
|
194
|
-
const { min, max } = this.options.delay;
|
|
195
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
196
|
-
}
|
|
197
|
-
};
|
|
198
|
-
//#endregion
|
|
199
|
-
//#region src/mock/mock-router.ts
|
|
200
|
-
function createMockRouter() {
|
|
201
|
-
return Router({ defaultRoute(_req, res) {
|
|
202
|
-
res.statusCode = 404;
|
|
203
|
-
res.setHeader("Content-Type", "application/json");
|
|
204
|
-
res.end(JSON.stringify({
|
|
205
|
-
error: "Not Found",
|
|
206
|
-
message: "No matching mock route"
|
|
207
|
-
}));
|
|
208
|
-
} });
|
|
209
|
-
}
|
|
210
|
-
function convertOpenApiPath(openapiPath) {
|
|
211
|
-
return openapiPath.replace(/\{([^}]+)}/g, ":$1");
|
|
212
|
-
}
|
|
213
|
-
function registerRoute(router, method, openapiPath, store) {
|
|
214
|
-
const path = convertOpenApiPath(openapiPath);
|
|
215
|
-
const httpMethod = method.toUpperCase();
|
|
216
|
-
router.on(httpMethod, path, (_req, _res, _params, s) => s, store);
|
|
217
|
-
}
|
|
218
|
-
//#endregion
|
|
219
|
-
//#region src/mock/format-route-table.ts
|
|
220
|
-
const METHOD_COLORS = {
|
|
221
|
-
GET: chalk.green,
|
|
222
|
-
POST: chalk.blue,
|
|
223
|
-
PUT: chalk.yellow,
|
|
224
|
-
DELETE: chalk.red,
|
|
225
|
-
PATCH: chalk.cyan,
|
|
226
|
-
HEAD: chalk.magenta,
|
|
227
|
-
OPTIONS: chalk.gray
|
|
228
|
-
};
|
|
229
|
-
const METHOD_ORDER = [
|
|
230
|
-
"GET",
|
|
231
|
-
"POST",
|
|
232
|
-
"PUT",
|
|
233
|
-
"PATCH",
|
|
234
|
-
"DELETE",
|
|
235
|
-
"HEAD",
|
|
236
|
-
"OPTIONS"
|
|
237
|
-
];
|
|
238
|
-
function colorMethod(method) {
|
|
239
|
-
return (METHOD_COLORS[method] || chalk.white)(method.padEnd(7));
|
|
240
|
-
}
|
|
241
|
-
function formatRouteTable(entries) {
|
|
242
|
-
if (entries.length === 0) return "";
|
|
243
|
-
const grouped = /* @__PURE__ */ new Map();
|
|
244
|
-
for (const entry of entries) {
|
|
245
|
-
const group = grouped.get(entry.moduleName) || [];
|
|
246
|
-
group.push(entry);
|
|
247
|
-
grouped.set(entry.moduleName, group);
|
|
248
|
-
}
|
|
249
|
-
const maxPathLen = Math.max(...entries.map((e) => e.pathname.length));
|
|
250
|
-
const lines = [];
|
|
251
|
-
for (const [moduleName, group] of grouped) {
|
|
252
|
-
group.sort((a, b) => {
|
|
253
|
-
const pathCmp = a.pathname.localeCompare(b.pathname);
|
|
254
|
-
if (pathCmp !== 0) return pathCmp;
|
|
255
|
-
return METHOD_ORDER.indexOf(a.method) - METHOD_ORDER.indexOf(b.method);
|
|
256
|
-
});
|
|
257
|
-
lines.push(` ${chalk.bold(moduleName)}:`);
|
|
258
|
-
for (const entry of group) {
|
|
259
|
-
const method = colorMethod(entry.method);
|
|
260
|
-
const path = entry.pathname.padEnd(maxPathLen + 2);
|
|
261
|
-
const opId = entry.operationId ? chalk.dim(entry.operationId) : "";
|
|
262
|
-
lines.push(` ${method} ${path} ${opId}`);
|
|
263
|
-
}
|
|
264
|
-
lines.push("");
|
|
265
|
-
}
|
|
266
|
-
return lines.join("\n");
|
|
267
|
-
}
|
|
268
|
-
//#endregion
|
|
269
|
-
//#region src/mock/mock-command.ts
|
|
270
|
-
function parseDelay(delay) {
|
|
271
|
-
if (!delay) return void 0;
|
|
272
|
-
if (delay.includes("-")) {
|
|
273
|
-
const [min, max] = delay.split("-").map(Number);
|
|
274
|
-
if (!isNaN(min) && !isNaN(max)) return {
|
|
275
|
-
min,
|
|
276
|
-
max
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
const ms = parseInt(delay, 10);
|
|
280
|
-
if (!isNaN(ms)) return ms;
|
|
281
|
-
}
|
|
282
|
-
async function mockCommand(options) {
|
|
283
|
-
const compiler = new Compiler({
|
|
284
|
-
build: false,
|
|
285
|
-
persist: false,
|
|
286
|
-
silent: true,
|
|
287
|
-
config: options.config,
|
|
288
|
-
debug: !!options.debug,
|
|
289
|
-
tolerant: !!options.tolerant
|
|
290
|
-
});
|
|
291
|
-
await compiler.run();
|
|
292
|
-
const documents = compiler.context.documents || [];
|
|
293
|
-
if (documents.length === 0) throw new Error("No API documents found. Check your keq configuration.");
|
|
294
|
-
const router = createMockRouter();
|
|
295
|
-
const generators = /* @__PURE__ */ new Map();
|
|
296
|
-
const routeEntries = [];
|
|
297
|
-
let routeCount = 0;
|
|
298
|
-
const generateOptions = {
|
|
299
|
-
maxDepth: parseInt(options.maxDepth || "10", 10),
|
|
300
|
-
refDepthMax: parseInt(options.refDepth || "3", 10)
|
|
301
|
-
};
|
|
302
|
-
const matcher = compiler.context.matcher;
|
|
303
|
-
for (const document of documents) {
|
|
304
|
-
const moduleName = document.module.name;
|
|
305
|
-
if (options.module && !options.module.includes(moduleName)) continue;
|
|
306
|
-
const generator = new MockGenerator(document, generateOptions);
|
|
307
|
-
generators.set(moduleName, generator);
|
|
308
|
-
for (const operation of document.operations) {
|
|
309
|
-
if (matcher?.isOperationDenied(operation)) continue;
|
|
310
|
-
const responses = generator.buildResponses(operation);
|
|
311
|
-
if (responses.length === 0) continue;
|
|
312
|
-
registerRoute(router, operation.method, operation.pathname, {
|
|
313
|
-
moduleName,
|
|
314
|
-
operationId: operation.operationId,
|
|
315
|
-
responses
|
|
316
|
-
});
|
|
317
|
-
routeEntries.push({
|
|
318
|
-
moduleName,
|
|
319
|
-
method: operation.method.toUpperCase(),
|
|
320
|
-
pathname: operation.pathname,
|
|
321
|
-
operationId: operation.operationId
|
|
322
|
-
});
|
|
323
|
-
routeCount++;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
if (routeCount === 0) throw new Error("No routes registered. Check your API specifications.");
|
|
327
|
-
const serverOptions = {
|
|
328
|
-
port: parseInt(options.port, 10),
|
|
329
|
-
host: options.host,
|
|
330
|
-
cors: options.cors,
|
|
331
|
-
delay: parseDelay(options.delay)
|
|
332
|
-
};
|
|
333
|
-
const server = new MockServer(router, generators, serverOptions);
|
|
334
|
-
await server.start();
|
|
335
|
-
logger.log(`${routeCount} routes registered from ${generators.size} module(s)`);
|
|
336
|
-
logger.log("");
|
|
337
|
-
logger.raw(formatRouteTable(routeEntries));
|
|
338
|
-
logger.log(`Mock server running at http://${serverOptions.host}:${serverOptions.port}`);
|
|
339
|
-
process.on("SIGINT", () => {
|
|
340
|
-
logger.log("\nShutting down mock server...");
|
|
341
|
-
server.stop().then(() => process.exit(0));
|
|
342
|
-
});
|
|
343
|
-
process.on("SIGTERM", () => {
|
|
344
|
-
server.stop().then(() => process.exit(0));
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
//#endregion
|
|
348
|
-
export { mockCommand };
|
|
349
|
-
|
|
350
|
-
//# sourceMappingURL=mock-command-Bp1LxSls.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mock-command-Bp1LxSls.mjs","names":[],"sources":["../src/mock/mock-generator.ts","../src/mock/mock-server.ts","../src/mock/mock-router.ts","../src/mock/format-route-table.ts","../src/mock/mock-command.ts"],"sourcesContent":["import type { JsonSchema } from 'json-schema-faker'\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types'\nimport type { ApiDocumentV3_1 } from '~/models/api-document_v3_1.js'\nimport type { OperationDefinition } from '~/models/operation-definition.js'\nimport type { MockGenerateOptions, MockRouteResponse } from './types.js'\nimport { logger } from '~/utils/logger.js'\n\n\nexport class MockGenerator {\n private document: ApiDocumentV3_1\n private options: MockGenerateOptions\n\n constructor(document: ApiDocumentV3_1, options: MockGenerateOptions) {\n this.document = document\n this.options = options\n }\n\n buildResponses(operation: OperationDefinition): MockRouteResponse[] {\n const responses = operation.operation.responses || {}\n const result: MockRouteResponse[] = []\n\n for (const [statusCode, responseOrRef] of Object.entries(responses)) {\n const response = this.resolveResponse(responseOrRef)\n if (!response) continue\n\n const content = response.content\n if (!content) {\n result.push({ statusCode, contentType: 'application/json' })\n continue\n }\n\n for (const [contentType, mediaType] of Object.entries(content)) {\n const mockResponse: MockRouteResponse = {\n statusCode,\n contentType,\n schema: mediaType.schema,\n }\n\n if (mediaType.example !== undefined) {\n mockResponse.example = mediaType.example\n }\n\n if (mediaType.examples) {\n mockResponse.examples = Object.fromEntries(\n Object.entries(mediaType.examples)\n .map(([name, exampleOrRef]): [string, unknown] => {\n if ('$ref' in exampleOrRef) return [name, undefined]\n return [name, exampleOrRef.value]\n })\n .filter(([, v]) => v !== undefined),\n )\n }\n\n result.push(mockResponse)\n }\n }\n\n return result\n }\n\n async generateData(response: MockRouteResponse, exampleName?: string): Promise<unknown> {\n if (exampleName && response.examples?.[exampleName] !== undefined) {\n return response.examples[exampleName]\n }\n\n if (response.example !== undefined) {\n return response.example\n }\n\n if (response.examples) {\n const firstExample = Object.values(response.examples)[0]\n if (firstExample !== undefined) return firstExample\n }\n\n if (!response.schema) return null\n\n const schema = this.resolveSchema(response.schema)\n const { generate } = await import('json-schema-faker')\n return generate(schema, {\n alwaysFakeOptionals: true,\n useExamplesValue: true,\n maxDepth: this.options.maxDepth,\n refDepthMax: this.options.refDepthMax,\n refResolver: (ref) => this.resolveRef(ref),\n })\n }\n\n private resolveResponse(responseOrRef: OpenAPIV3_1.ResponseObject | OpenAPIV3_1.ReferenceObject): OpenAPIV3_1.ResponseObject | undefined {\n if ('$ref' in responseOrRef) {\n const definition = this.document.dereference(responseOrRef.$ref)\n if (!definition) return undefined\n if ('response' in definition) return definition.response\n return undefined\n }\n return responseOrRef\n }\n\n private resolveSchema(schema: OpenAPIV3_1.SchemaObject | OpenAPIV3_1.ReferenceObject): OpenAPIV3_1.SchemaObject {\n if ('$ref' in schema) {\n const refPath = schema.$ref.replace('#/', '').split('/').map(decodeURIComponent)\n let resolved: unknown = this.document.specification\n for (const segment of refPath) {\n resolved = (resolved as Record<string, unknown>)?.[segment]\n }\n if (!resolved) {\n logger.warn(`Unable to resolve schema $ref: ${schema.$ref}`)\n }\n return (resolved as OpenAPIV3_1.SchemaObject) || {}\n }\n return schema\n }\n\n private resolveRef(ref: string): JsonSchema {\n const refPath = ref.replace('#/', '').split('/').map(decodeURIComponent)\n let resolved: unknown = this.document.specification\n for (const segment of refPath) {\n resolved = (resolved as Record<string, unknown>)?.[segment]\n }\n if (!resolved) {\n logger.warn(`Unable to resolve $ref: ${ref}`)\n }\n return (resolved as JsonSchema) || {}\n }\n}\n","import * as http from 'http'\nimport type Router from 'find-my-way'\nimport type { MockServerOptions, MockRouteStore, MockRouteResponse } from './types.js'\nimport type { MockRouter } from './mock-router.js'\nimport type { MockGenerator } from './mock-generator.js'\nimport { logger } from '~/utils/logger.js'\n\n\nexport class MockServer {\n private server: http.Server | null = null\n private router: MockRouter\n private generators: Map<string, MockGenerator>\n private options: MockServerOptions\n\n constructor(\n router: MockRouter,\n generators: Map<string, MockGenerator>,\n options: MockServerOptions,\n ) {\n this.router = router\n this.generators = generators\n this.options = options\n }\n\n async start(): Promise<void> {\n this.server = http.createServer((req, res) => {\n void this.handleRequest(req, res)\n })\n\n return new Promise((resolve, reject) => {\n this.server!.listen(this.options.port, this.options.host, () => {\n resolve()\n })\n this.server!.on('error', reject)\n })\n }\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n if (this.server) {\n this.server.close(() => resolve())\n } else {\n resolve()\n }\n })\n }\n\n private async handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {\n const url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`)\n\n if (this.options.cors) {\n res.setHeader('Access-Control-Allow-Origin', '*')\n res.setHeader('Access-Control-Allow-Methods', '*')\n res.setHeader('Access-Control-Allow-Headers', '*')\n\n if (req.method === 'OPTIONS') {\n res.statusCode = 204\n res.end()\n return\n }\n }\n\n const found = this.router.find(\n req.method as Router.HTTPMethod,\n url.pathname,\n )\n\n if (!found) {\n res.statusCode = 404\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({ error: 'Not Found', message: 'No matching mock route' }))\n return\n }\n\n const store = found.store as MockRouteStore\n const generator = this.generators.get(store.moduleName)\n if (!generator) {\n res.statusCode = 500\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({ error: 'Internal Error', message: `Generator not found for module: ${store.moduleName}` }))\n return\n }\n\n const targetStatus = url.searchParams.get('__status')\n const exampleName = url.searchParams.get('__example') || undefined\n const delayOverride = url.searchParams.get('__delay')\n\n const response = this.selectResponse(store, targetStatus)\n if (!response) {\n res.statusCode = 500\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({ error: 'Internal Error', message: 'No response definition found' }))\n return\n }\n\n const delay = delayOverride\n ? parseInt(delayOverride, 10)\n : this.computeDelay()\n\n if (delay > 0) {\n await new Promise((resolve) => setTimeout(resolve, delay))\n }\n\n let body: unknown\n try {\n body = await generator.generateData(response, exampleName)\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error generating mock data'\n logger.error(`Failed to generate mock data for ${req.method} ${url.pathname}: ${message}`)\n res.statusCode = 500\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({\n error: 'Mock Generation Error',\n message: `Failed to generate mock data: ${message}`,\n }))\n return\n }\n\n const statusCode = parseInt(response.statusCode, 10) || 200\n\n res.statusCode = statusCode\n const contentType = (!response.contentType || response.contentType.includes('*'))\n ? 'application/json'\n : response.contentType\n res.setHeader('Content-Type', contentType)\n res.end(JSON.stringify(body))\n\n logger.log(`${req.method} ${url.pathname} -> ${statusCode}`)\n }\n\n private selectResponse(store: MockRouteStore, targetStatus: string | null): MockRouteResponse | undefined {\n if (targetStatus) {\n return store.responses.find((r) => r.statusCode === targetStatus)\n || store.responses[0]\n }\n\n const success = store.responses.find((r) => r.statusCode.startsWith('2'))\n return success || store.responses[0]\n }\n\n private computeDelay(): number {\n if (!this.options.delay) return 0\n\n if (typeof this.options.delay === 'number') {\n return this.options.delay\n }\n\n const { min, max } = this.options.delay\n return Math.floor(Math.random() * (max - min + 1)) + min\n }\n}\n","import Router from 'find-my-way'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport type { MockRouteStore } from './types.js'\n\n\nexport type MockRouter = Router.Instance<Router.HTTPVersion.V1>\n\nexport function createMockRouter(): MockRouter {\n return Router({\n defaultRoute(_req: IncomingMessage, res: ServerResponse) {\n res.statusCode = 404\n res.setHeader('Content-Type', 'application/json')\n res.end(JSON.stringify({ error: 'Not Found', message: 'No matching mock route' }))\n },\n })\n}\n\nexport function convertOpenApiPath(openapiPath: string): string {\n return openapiPath.replace(/\\{([^}]+)}/g, ':$1')\n}\n\nexport function registerRoute(\n router: MockRouter,\n method: string,\n openapiPath: string,\n store: MockRouteStore,\n): void {\n const path = convertOpenApiPath(openapiPath)\n const httpMethod = method.toUpperCase() as Router.HTTPMethod\n\n router.on(httpMethod, path, (_req, _res, _params, s: MockRouteStore) => s, store)\n}\n","import chalk from 'chalk'\nimport type { RouteTableEntry } from './types.js'\n\n\nconst METHOD_COLORS: Record<string, (s: string) => string> = {\n GET: chalk.green,\n POST: chalk.blue,\n PUT: chalk.yellow,\n DELETE: chalk.red,\n PATCH: chalk.cyan,\n HEAD: chalk.magenta,\n OPTIONS: chalk.gray,\n}\n\nconst METHOD_ORDER = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']\n\nfunction colorMethod(method: string): string {\n const color = METHOD_COLORS[method] || chalk.white\n return color(method.padEnd(7))\n}\n\nexport function formatRouteTable(entries: RouteTableEntry[]): string {\n if (entries.length === 0) return ''\n\n const grouped = new Map<string, RouteTableEntry[]>()\n for (const entry of entries) {\n const group = grouped.get(entry.moduleName) || []\n group.push(entry)\n grouped.set(entry.moduleName, group)\n }\n\n const maxPathLen = Math.max(...entries.map((e) => e.pathname.length))\n\n const lines: string[] = []\n\n for (const [moduleName, group] of grouped) {\n group.sort((a, b) => {\n const pathCmp = a.pathname.localeCompare(b.pathname)\n if (pathCmp !== 0) return pathCmp\n return METHOD_ORDER.indexOf(a.method) - METHOD_ORDER.indexOf(b.method)\n })\n\n lines.push(` ${chalk.bold(moduleName)}:`)\n\n for (const entry of group) {\n const method = colorMethod(entry.method)\n const path = entry.pathname.padEnd(maxPathLen + 2)\n const opId = entry.operationId ? chalk.dim(entry.operationId) : ''\n lines.push(` ${method} ${path} ${opId}`)\n }\n\n lines.push('')\n }\n\n return lines.join('\\n')\n}\n","import { Compiler } from '~/compiler/compiler.js'\nimport { MockGenerator } from './mock-generator.js'\nimport { MockServer } from './mock-server.js'\nimport { createMockRouter, registerRoute } from './mock-router.js'\nimport { formatRouteTable } from './format-route-table.js'\nimport type { MockGenerateOptions, MockServerOptions, RouteTableEntry } from './types.js'\nimport { logger } from '~/utils/logger.js'\n\n\ninterface MockCommandOptions {\n config?: string\n port: string\n host: string\n module?: string[]\n cors: boolean\n delay?: string\n debug?: boolean\n tolerant?: boolean\n maxDepth?: string\n refDepth?: string\n}\n\nfunction parseDelay(delay?: string): MockServerOptions['delay'] {\n if (!delay) return undefined\n\n if (delay.includes('-')) {\n const [min, max] = delay.split('-').map(Number)\n if (!isNaN(min) && !isNaN(max)) return { min, max }\n }\n\n const ms = parseInt(delay, 10)\n if (!isNaN(ms)) return ms\n\n return undefined\n}\n\nexport async function mockCommand(options: MockCommandOptions): Promise<void> {\n const compiler = new Compiler({\n build: false,\n persist: false,\n silent: true,\n config: options.config,\n debug: !!options.debug,\n tolerant: !!options.tolerant,\n })\n\n await compiler.run()\n\n const documents = compiler.context.documents || []\n\n if (documents.length === 0) {\n throw new Error('No API documents found. Check your keq configuration.')\n }\n\n const router = createMockRouter()\n const generators = new Map<string, MockGenerator>()\n const routeEntries: RouteTableEntry[] = []\n let routeCount = 0\n\n const generateOptions: MockGenerateOptions = {\n maxDepth: parseInt(options.maxDepth || '10', 10),\n refDepthMax: parseInt(options.refDepth || '3', 10),\n }\n\n const matcher = compiler.context.matcher\n\n for (const document of documents) {\n const moduleName = document.module.name\n\n if (options.module && !options.module.includes(moduleName)) {\n continue\n }\n\n const generator = new MockGenerator(document, generateOptions)\n generators.set(moduleName, generator)\n\n for (const operation of document.operations) {\n if (matcher?.isOperationDenied(operation)) continue\n\n const responses = generator.buildResponses(operation)\n if (responses.length === 0) continue\n\n registerRoute(router, operation.method, operation.pathname, {\n moduleName,\n operationId: operation.operationId,\n responses,\n })\n routeEntries.push({\n moduleName,\n method: operation.method.toUpperCase(),\n pathname: operation.pathname,\n operationId: operation.operationId,\n })\n routeCount++\n }\n }\n\n if (routeCount === 0) {\n throw new Error('No routes registered. Check your API specifications.')\n }\n\n const serverOptions: MockServerOptions = {\n port: parseInt(options.port, 10),\n host: options.host,\n cors: options.cors,\n delay: parseDelay(options.delay),\n }\n\n const server = new MockServer(router, generators, serverOptions)\n await server.start()\n\n logger.log(`${routeCount} routes registered from ${generators.size} module(s)`)\n logger.log('')\n logger.raw(formatRouteTable(routeEntries))\n logger.log(`Mock server running at http://${serverOptions.host}:${serverOptions.port}`)\n\n process.on('SIGINT', () => {\n logger.log('\\nShutting down mock server...')\n void server.stop().then(() => process.exit(0))\n })\n\n process.on('SIGTERM', () => {\n void server.stop().then(() => process.exit(0))\n })\n}\n"],"mappings":"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"}
|