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.
Files changed (151) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/esm/src/constant.d.ts +2 -0
  3. package/dist/esm/src/constant.js +2 -0
  4. package/dist/esm/src/core.d.ts +30 -0
  5. package/dist/esm/src/core.js +162 -53
  6. package/dist/esm/src/exception/abort.exception.d.ts +3 -0
  7. package/dist/esm/src/exception/abort.exception.js +6 -0
  8. package/dist/esm/src/index.d.ts +1 -0
  9. package/dist/esm/src/index.js +1 -0
  10. package/dist/esm/src/is/is-abort-signal.d.ts +1 -0
  11. package/dist/esm/src/is/is-abort-signal.js +8 -0
  12. package/dist/esm/src/middlewares/fetch-arguments-middleware.js +5 -1
  13. package/dist/esm/src/middlewares/retry-middleware.js +20 -3
  14. package/dist/esm/src/middlewares/timeout-middleware.js +3 -1
  15. package/dist/esm/src/types/keq-context.d.ts +10 -1
  16. package/dist/esm/src/types/keq-context.js +1 -1
  17. package/dist/umd/src/constant.d.ts +2 -0
  18. package/dist/umd/src/constant.js +3 -1
  19. package/dist/umd/src/core.d.ts +30 -0
  20. package/dist/umd/src/core.js +162 -53
  21. package/dist/umd/src/exception/abort.exception.d.ts +3 -0
  22. package/dist/umd/src/exception/abort.exception.js +20 -0
  23. package/dist/umd/src/index.d.ts +1 -0
  24. package/dist/umd/src/index.js +4 -2
  25. package/dist/umd/src/is/is-abort-signal.d.ts +1 -0
  26. package/dist/umd/src/is/is-abort-signal.js +22 -0
  27. package/dist/umd/src/middlewares/fetch-arguments-middleware.js +4 -0
  28. package/dist/umd/src/middlewares/retry-middleware.js +21 -4
  29. package/dist/umd/src/middlewares/timeout-middleware.js +4 -2
  30. package/dist/umd/src/types/keq-context.d.ts +10 -1
  31. package/package.json +10 -13
  32. package/.claude/settings.local.json +0 -26
  33. package/packages/cache/.turbo/turbo-build.log +0 -29
  34. package/packages/cache/dist/index.d.mts +0 -354
  35. package/packages/cache/dist/index.d.mts.map +0 -1
  36. package/packages/cache/dist/index.d.ts +0 -353
  37. package/packages/cache/dist/index.d.ts.map +0 -1
  38. package/packages/cache/dist/index.js +0 -1271
  39. package/packages/cache/dist/index.js.map +0 -1
  40. package/packages/cache/dist/index.mjs +0 -1237
  41. package/packages/cache/dist/index.mjs.map +0 -1
  42. package/packages/cli/.turbo/turbo-build.log +0 -91
  43. package/packages/cli/dist/cli.cjs +0 -1364
  44. package/packages/cli/dist/cli.cjs.map +0 -1
  45. package/packages/cli/dist/cli.d.cts +0 -1
  46. package/packages/cli/dist/cli.d.mts +0 -1
  47. package/packages/cli/dist/cli.mjs +0 -1359
  48. package/packages/cli/dist/cli.mjs.map +0 -1
  49. package/packages/cli/dist/compiler-0Kli6UCr.cjs +0 -738
  50. package/packages/cli/dist/compiler-0Kli6UCr.cjs.map +0 -1
  51. package/packages/cli/dist/compiler-C3AE8j54.mjs +0 -715
  52. package/packages/cli/dist/compiler-C3AE8j54.mjs.map +0 -1
  53. package/packages/cli/dist/index.cjs +0 -20
  54. package/packages/cli/dist/index.cjs.map +0 -1
  55. package/packages/cli/dist/index.d.cts +0 -17
  56. package/packages/cli/dist/index.d.cts.map +0 -1
  57. package/packages/cli/dist/index.d.mts +0 -17
  58. package/packages/cli/dist/index.d.mts.map +0 -1
  59. package/packages/cli/dist/index.mjs +0 -10
  60. package/packages/cli/dist/index.mjs.map +0 -1
  61. package/packages/cli/dist/init-BNhD2oCI.mjs +0 -168
  62. package/packages/cli/dist/init-BNhD2oCI.mjs.map +0 -1
  63. package/packages/cli/dist/init-DqxLcRSQ.cjs +0 -170
  64. package/packages/cli/dist/init-DqxLcRSQ.cjs.map +0 -1
  65. package/packages/cli/dist/logger-D7PyVZo3.cjs +0 -46
  66. package/packages/cli/dist/logger-D7PyVZo3.cjs.map +0 -1
  67. package/packages/cli/dist/logger-QLBHySQ3.mjs +0 -12
  68. package/packages/cli/dist/logger-QLBHySQ3.mjs.map +0 -1
  69. package/packages/cli/dist/micro-function.translator-BmJZzkKh.cjs +0 -16
  70. package/packages/cli/dist/micro-function.translator-BmJZzkKh.cjs.map +0 -1
  71. package/packages/cli/dist/micro-function.translator-CDfkj4Tt.mjs +0 -11
  72. package/packages/cli/dist/micro-function.translator-CDfkj4Tt.mjs.map +0 -1
  73. package/packages/cli/dist/mock-command-Bp1LxSls.mjs +0 -350
  74. package/packages/cli/dist/mock-command-Bp1LxSls.mjs.map +0 -1
  75. package/packages/cli/dist/mock-command-WZcfy5Iq.cjs +0 -353
  76. package/packages/cli/dist/mock-command-WZcfy5Iq.cjs.map +0 -1
  77. package/packages/cli/dist/plugins-CgMhaNZq.cjs +0 -3558
  78. package/packages/cli/dist/plugins-CgMhaNZq.cjs.map +0 -1
  79. package/packages/cli/dist/plugins-DCvJ8iHR.mjs +0 -3280
  80. package/packages/cli/dist/plugins-DCvJ8iHR.mjs.map +0 -1
  81. package/packages/cli/dist/plugins.cjs +0 -36
  82. package/packages/cli/dist/plugins.d.cts +0 -2
  83. package/packages/cli/dist/plugins.d.mts +0 -2
  84. package/packages/cli/dist/plugins.mjs +0 -2
  85. package/packages/cli/dist/runtime-config-BWQlPhiB.d.cts +0 -780
  86. package/packages/cli/dist/runtime-config-BWQlPhiB.d.cts.map +0 -1
  87. package/packages/cli/dist/runtime-config-CrzK-Ucf.d.mts +0 -780
  88. package/packages/cli/dist/runtime-config-CrzK-Ucf.d.mts.map +0 -1
  89. package/packages/cli/dist/translators.cjs +0 -14
  90. package/packages/cli/dist/translators.cjs.map +0 -1
  91. package/packages/cli/dist/translators.d.cts +0 -14
  92. package/packages/cli/dist/translators.d.cts.map +0 -1
  93. package/packages/cli/dist/translators.d.mts +0 -14
  94. package/packages/cli/dist/translators.d.mts.map +0 -1
  95. package/packages/cli/dist/translators.mjs +0 -12
  96. package/packages/cli/dist/translators.mjs.map +0 -1
  97. package/packages/cli/node_modules/.bin/eslint +0 -21
  98. package/packages/cli/node_modules/.bin/jiti +0 -21
  99. package/packages/cli/node_modules/.bin/js-yaml +0 -21
  100. package/packages/cli/node_modules/.bin/jsf +0 -21
  101. package/packages/cli/node_modules/.bin/jsonpath +0 -21
  102. package/packages/cli/node_modules/.bin/jsonpath-plus +0 -21
  103. package/packages/cli/node_modules/.bin/semver +0 -21
  104. package/packages/cli/node_modules/.bin/tsc +0 -21
  105. package/packages/cli/node_modules/.bin/tsserver +0 -21
  106. package/packages/exception/.turbo/turbo-build.log +0 -29
  107. package/packages/exception/dist/index.d.mts +0 -21
  108. package/packages/exception/dist/index.d.mts.map +0 -1
  109. package/packages/exception/dist/index.d.ts +0 -21
  110. package/packages/exception/dist/index.d.ts.map +0 -1
  111. package/packages/exception/dist/index.js +0 -104
  112. package/packages/exception/dist/index.js.map +0 -1
  113. package/packages/exception/dist/index.mjs +0 -99
  114. package/packages/exception/dist/index.mjs.map +0 -1
  115. package/packages/headers/.turbo/turbo-build.log +0 -29
  116. package/packages/headers/dist/index.d.mts +0 -46
  117. package/packages/headers/dist/index.d.mts.map +0 -1
  118. package/packages/headers/dist/index.d.ts +0 -46
  119. package/packages/headers/dist/index.d.ts.map +0 -1
  120. package/packages/headers/dist/index.js +0 -81
  121. package/packages/headers/dist/index.js.map +0 -1
  122. package/packages/headers/dist/index.mjs +0 -75
  123. package/packages/headers/dist/index.mjs.map +0 -1
  124. package/packages/keq/.turbo/turbo-build.log +0 -29
  125. package/packages/keq/dist/index.d.mts +0 -962
  126. package/packages/keq/dist/index.d.mts.map +0 -1
  127. package/packages/keq/dist/index.d.ts +0 -962
  128. package/packages/keq/dist/index.d.ts.map +0 -1
  129. package/packages/keq/dist/index.js +0 -1876
  130. package/packages/keq/dist/index.js.map +0 -1
  131. package/packages/keq/dist/index.mjs +0 -1814
  132. package/packages/keq/dist/index.mjs.map +0 -1
  133. package/packages/nestjs/.turbo/turbo-build.log +0 -29
  134. package/packages/nestjs/dist/index.d.mts +0 -52
  135. package/packages/nestjs/dist/index.d.mts.map +0 -1
  136. package/packages/nestjs/dist/index.d.ts +0 -52
  137. package/packages/nestjs/dist/index.d.ts.map +0 -1
  138. package/packages/nestjs/dist/index.js +0 -166
  139. package/packages/nestjs/dist/index.js.map +0 -1
  140. package/packages/nestjs/dist/index.mjs +0 -136
  141. package/packages/nestjs/dist/index.mjs.map +0 -1
  142. package/packages/test/.turbo/turbo-build.log +0 -6
  143. package/packages/url/.turbo/turbo-build.log +0 -29
  144. package/packages/url/dist/index.d.mts +0 -9
  145. package/packages/url/dist/index.d.mts.map +0 -1
  146. package/packages/url/dist/index.d.ts +0 -9
  147. package/packages/url/dist/index.d.ts.map +0 -1
  148. package/packages/url/dist/index.js +0 -43
  149. package/packages/url/dist/index.js.map +0 -1
  150. package/packages/url/dist/index.mjs +0 -40
  151. 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":";;;;;;AAQA,IAAa,gBAAb,MAA2B;CACzB;CACA;CAEA,YAAY,UAA2B,SAA8B;AACnE,OAAK,WAAW;AAChB,OAAK,UAAU;;CAGjB,eAAe,WAAqD;EAClE,MAAM,YAAY,UAAU,UAAU,aAAa,EAAE;EACrD,MAAM,SAA8B,EAAE;AAEtC,OAAK,MAAM,CAAC,YAAY,kBAAkB,OAAO,QAAQ,UAAU,EAAE;GACnE,MAAM,WAAW,KAAK,gBAAgB,cAAc;AACpD,OAAI,CAAC,SAAU;GAEf,MAAM,UAAU,SAAS;AACzB,OAAI,CAAC,SAAS;AACZ,WAAO,KAAK;KAAE;KAAY,aAAa;KAAoB,CAAC;AAC5D;;AAGF,QAAK,MAAM,CAAC,aAAa,cAAc,OAAO,QAAQ,QAAQ,EAAE;IAC9D,MAAM,eAAkC;KACtC;KACA;KACA,QAAQ,UAAU;KACnB;AAED,QAAI,UAAU,YAAY,KAAA,EACxB,cAAa,UAAU,UAAU;AAGnC,QAAI,UAAU,SACZ,cAAa,WAAW,OAAO,YAC7B,OAAO,QAAQ,UAAU,SAAS,CAC/B,KAAK,CAAC,MAAM,kBAAqC;AAChD,SAAI,UAAU,aAAc,QAAO,CAAC,MAAM,KAAA,EAAU;AACpD,YAAO,CAAC,MAAM,aAAa,MAAM;MACjC,CACD,QAAQ,GAAG,OAAO,MAAM,KAAA,EAAU,CACtC;AAGH,WAAO,KAAK,aAAa;;;AAI7B,SAAO;;CAGT,MAAM,aAAa,UAA6B,aAAwC;AACtF,MAAI,eAAe,SAAS,WAAW,iBAAiB,KAAA,EACtD,QAAO,SAAS,SAAS;AAG3B,MAAI,SAAS,YAAY,KAAA,EACvB,QAAO,SAAS;AAGlB,MAAI,SAAS,UAAU;GACrB,MAAM,eAAe,OAAO,OAAO,SAAS,SAAS,CAAC;AACtD,OAAI,iBAAiB,KAAA,EAAW,QAAO;;AAGzC,MAAI,CAAC,SAAS,OAAQ,QAAO;EAE7B,MAAM,SAAS,KAAK,cAAc,SAAS,OAAO;EAClD,MAAM,EAAE,aAAa,MAAM,OAAO;AAClC,SAAO,SAAS,QAAQ;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,UAAU,KAAK,QAAQ;GACvB,aAAa,KAAK,QAAQ;GAC1B,cAAc,QAAQ,KAAK,WAAW,IAAI;GAC3C,CAAC;;CAGJ,gBAAwB,eAAiH;AACvI,MAAI,UAAU,eAAe;GAC3B,MAAM,aAAa,KAAK,SAAS,YAAY,cAAc,KAAK;AAChE,OAAI,CAAC,WAAY,QAAO,KAAA;AACxB,OAAI,cAAc,WAAY,QAAO,WAAW;AAChD;;AAEF,SAAO;;CAGT,cAAsB,QAA0F;AAC9G,MAAI,UAAU,QAAQ;GACpB,MAAM,UAAU,OAAO,KAAK,QAAQ,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,mBAAmB;GAChF,IAAI,WAAoB,KAAK,SAAS;AACtC,QAAK,MAAM,WAAW,QACpB,YAAY,WAAuC;AAErD,OAAI,CAAC,SACH,QAAO,KAAK,kCAAkC,OAAO,OAAO;AAE9D,UAAQ,YAAyC,EAAE;;AAErD,SAAO;;CAGT,WAAmB,KAAyB;EAC1C,MAAM,UAAU,IAAI,QAAQ,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,mBAAmB;EACxE,IAAI,WAAoB,KAAK,SAAS;AACtC,OAAK,MAAM,WAAW,QACpB,YAAY,WAAuC;AAErD,MAAI,CAAC,SACH,QAAO,KAAK,2BAA2B,MAAM;AAE/C,SAAQ,YAA2B,EAAE;;;;;ACjHzC,IAAa,aAAb,MAAwB;CACtB,SAAqC;CACrC;CACA;CACA;CAEA,YACE,QACA,YACA,SACA;AACA,OAAK,SAAS;AACd,OAAK,aAAa;AAClB,OAAK,UAAU;;CAGjB,MAAM,QAAuB;AAC3B,OAAK,SAAS,KAAK,cAAc,KAAK,QAAQ;AACvC,QAAK,cAAc,KAAK,IAAI;IACjC;AAEF,SAAO,IAAI,SAAS,SAAS,WAAW;AACtC,QAAK,OAAQ,OAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,YAAY;AAC9D,aAAS;KACT;AACF,QAAK,OAAQ,GAAG,SAAS,OAAO;IAChC;;CAGJ,OAAsB;AACpB,SAAO,IAAI,SAAS,YAAY;AAC9B,OAAI,KAAK,OACP,MAAK,OAAO,YAAY,SAAS,CAAC;OAElC,UAAS;IAEX;;CAGJ,MAAc,cAAc,KAA2B,KAAyC;EAC9F,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,QAAQ,cAAc;AAEhF,MAAI,KAAK,QAAQ,MAAM;AACrB,OAAI,UAAU,+BAA+B,IAAI;AACjD,OAAI,UAAU,gCAAgC,IAAI;AAClD,OAAI,UAAU,gCAAgC,IAAI;AAElD,OAAI,IAAI,WAAW,WAAW;AAC5B,QAAI,aAAa;AACjB,QAAI,KAAK;AACT;;;EAIJ,MAAM,QAAQ,KAAK,OAAO,KACxB,IAAI,QACJ,IAAI,SACL;AAED,MAAI,CAAC,OAAO;AACV,OAAI,aAAa;AACjB,OAAI,UAAU,gBAAgB,mBAAmB;AACjD,OAAI,IAAI,KAAK,UAAU;IAAE,OAAO;IAAa,SAAS;IAA0B,CAAC,CAAC;AAClF;;EAGF,MAAM,QAAQ,MAAM;EACpB,MAAM,YAAY,KAAK,WAAW,IAAI,MAAM,WAAW;AACvD,MAAI,CAAC,WAAW;AACd,OAAI,aAAa;AACjB,OAAI,UAAU,gBAAgB,mBAAmB;AACjD,OAAI,IAAI,KAAK,UAAU;IAAE,OAAO;IAAkB,SAAS,mCAAmC,MAAM;IAAc,CAAC,CAAC;AACpH;;EAGF,MAAM,eAAe,IAAI,aAAa,IAAI,WAAW;EACrD,MAAM,cAAc,IAAI,aAAa,IAAI,YAAY,IAAI,KAAA;EACzD,MAAM,gBAAgB,IAAI,aAAa,IAAI,UAAU;EAErD,MAAM,WAAW,KAAK,eAAe,OAAO,aAAa;AACzD,MAAI,CAAC,UAAU;AACb,OAAI,aAAa;AACjB,OAAI,UAAU,gBAAgB,mBAAmB;AACjD,OAAI,IAAI,KAAK,UAAU;IAAE,OAAO;IAAkB,SAAS;IAAgC,CAAC,CAAC;AAC7F;;EAGF,MAAM,QAAQ,gBACV,SAAS,eAAe,GAAG,GAC3B,KAAK,cAAc;AAEvB,MAAI,QAAQ,EACV,OAAM,IAAI,SAAS,YAAY,WAAW,SAAS,MAAM,CAAC;EAG5D,IAAI;AACJ,MAAI;AACF,UAAO,MAAM,UAAU,aAAa,UAAU,YAAY;WACnD,KAAK;GACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,UAAO,MAAM,oCAAoC,IAAI,OAAO,GAAG,IAAI,SAAS,IAAI,UAAU;AAC1F,OAAI,aAAa;AACjB,OAAI,UAAU,gBAAgB,mBAAmB;AACjD,OAAI,IAAI,KAAK,UAAU;IACrB,OAAO;IACP,SAAS,iCAAiC;IAC3C,CAAC,CAAC;AACH;;EAGF,MAAM,aAAa,SAAS,SAAS,YAAY,GAAG,IAAI;AAExD,MAAI,aAAa;EACjB,MAAM,cAAe,CAAC,SAAS,eAAe,SAAS,YAAY,SAAS,IAAI,GAC5E,qBACA,SAAS;AACb,MAAI,UAAU,gBAAgB,YAAY;AAC1C,MAAI,IAAI,KAAK,UAAU,KAAK,CAAC;AAE7B,SAAO,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,SAAS,MAAM,aAAa;;CAG9D,eAAuB,OAAuB,cAA4D;AACxG,MAAI,aACF,QAAO,MAAM,UAAU,MAAM,MAAM,EAAE,eAAe,aAAa,IAC5D,MAAM,UAAU;AAIvB,SADgB,MAAM,UAAU,MAAM,MAAM,EAAE,WAAW,WAAW,IAAI,CAC1D,IAAI,MAAM,UAAU;;CAGpC,eAA+B;AAC7B,MAAI,CAAC,KAAK,QAAQ,MAAO,QAAO;AAEhC,MAAI,OAAO,KAAK,QAAQ,UAAU,SAChC,QAAO,KAAK,QAAQ;EAGtB,MAAM,EAAE,KAAK,QAAQ,KAAK,QAAQ;AAClC,SAAO,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM,MAAM,GAAG,GAAG;;;;;AC7IzD,SAAgB,mBAA+B;AAC7C,QAAO,OAAO,EACZ,aAAa,MAAuB,KAAqB;AACvD,MAAI,aAAa;AACjB,MAAI,UAAU,gBAAgB,mBAAmB;AACjD,MAAI,IAAI,KAAK,UAAU;GAAE,OAAO;GAAa,SAAS;GAA0B,CAAC,CAAC;IAErF,CAAC;;AAGJ,SAAgB,mBAAmB,aAA6B;AAC9D,QAAO,YAAY,QAAQ,eAAe,MAAM;;AAGlD,SAAgB,cACd,QACA,QACA,aACA,OACM;CACN,MAAM,OAAO,mBAAmB,YAAY;CAC5C,MAAM,aAAa,OAAO,aAAa;AAEvC,QAAO,GAAG,YAAY,OAAO,MAAM,MAAM,SAAS,MAAsB,GAAG,MAAM;;;;AC1BnF,MAAM,gBAAuD;CAC3D,KAAK,MAAM;CACX,MAAM,MAAM;CACZ,KAAK,MAAM;CACX,QAAQ,MAAM;CACd,OAAO,MAAM;CACb,MAAM,MAAM;CACZ,SAAS,MAAM;CAChB;AAED,MAAM,eAAe;CAAC;CAAO;CAAQ;CAAO;CAAS;CAAU;CAAQ;CAAU;AAEjF,SAAS,YAAY,QAAwB;AAE3C,SADc,cAAc,WAAW,MAAM,OAChC,OAAO,OAAO,EAAE,CAAC;;AAGhC,SAAgB,iBAAiB,SAAoC;AACnE,KAAI,QAAQ,WAAW,EAAG,QAAO;CAEjC,MAAM,0BAAU,IAAI,KAAgC;AACpD,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,QAAQ,QAAQ,IAAI,MAAM,WAAW,IAAI,EAAE;AACjD,QAAM,KAAK,MAAM;AACjB,UAAQ,IAAI,MAAM,YAAY,MAAM;;CAGtC,MAAM,aAAa,KAAK,IAAI,GAAG,QAAQ,KAAK,MAAM,EAAE,SAAS,OAAO,CAAC;CAErE,MAAM,QAAkB,EAAE;AAE1B,MAAK,MAAM,CAAC,YAAY,UAAU,SAAS;AACzC,QAAM,MAAM,GAAG,MAAM;GACnB,MAAM,UAAU,EAAE,SAAS,cAAc,EAAE,SAAS;AACpD,OAAI,YAAY,EAAG,QAAO;AAC1B,UAAO,aAAa,QAAQ,EAAE,OAAO,GAAG,aAAa,QAAQ,EAAE,OAAO;IACtE;AAEF,QAAM,KAAK,KAAK,MAAM,KAAK,WAAW,CAAC,GAAG;AAE1C,OAAK,MAAM,SAAS,OAAO;GACzB,MAAM,SAAS,YAAY,MAAM,OAAO;GACxC,MAAM,OAAO,MAAM,SAAS,OAAO,aAAa,EAAE;GAClD,MAAM,OAAO,MAAM,cAAc,MAAM,IAAI,MAAM,YAAY,GAAG;AAChE,SAAM,KAAK,OAAO,OAAO,GAAG,KAAK,GAAG,OAAO;;AAG7C,QAAM,KAAK,GAAG;;AAGhB,QAAO,MAAM,KAAK,KAAK;;;;AChCzB,SAAS,WAAW,OAA4C;AAC9D,KAAI,CAAC,MAAO,QAAO,KAAA;AAEnB,KAAI,MAAM,SAAS,IAAI,EAAE;EACvB,MAAM,CAAC,KAAK,OAAO,MAAM,MAAM,IAAI,CAAC,IAAI,OAAO;AAC/C,MAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,CAAE,QAAO;GAAE;GAAK;GAAK;;CAGrD,MAAM,KAAK,SAAS,OAAO,GAAG;AAC9B,KAAI,CAAC,MAAM,GAAG,CAAE,QAAO;;AAKzB,eAAsB,YAAY,SAA4C;CAC5E,MAAM,WAAW,IAAI,SAAS;EAC5B,OAAO;EACP,SAAS;EACT,QAAQ;EACR,QAAQ,QAAQ;EAChB,OAAO,CAAC,CAAC,QAAQ;EACjB,UAAU,CAAC,CAAC,QAAQ;EACrB,CAAC;AAEF,OAAM,SAAS,KAAK;CAEpB,MAAM,YAAY,SAAS,QAAQ,aAAa,EAAE;AAElD,KAAI,UAAU,WAAW,EACvB,OAAM,IAAI,MAAM,wDAAwD;CAG1E,MAAM,SAAS,kBAAkB;CACjC,MAAM,6BAAa,IAAI,KAA4B;CACnD,MAAM,eAAkC,EAAE;CAC1C,IAAI,aAAa;CAEjB,MAAM,kBAAuC;EAC3C,UAAU,SAAS,QAAQ,YAAY,MAAM,GAAG;EAChD,aAAa,SAAS,QAAQ,YAAY,KAAK,GAAG;EACnD;CAED,MAAM,UAAU,SAAS,QAAQ;AAEjC,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,aAAa,SAAS,OAAO;AAEnC,MAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO,SAAS,WAAW,CACxD;EAGF,MAAM,YAAY,IAAI,cAAc,UAAU,gBAAgB;AAC9D,aAAW,IAAI,YAAY,UAAU;AAErC,OAAK,MAAM,aAAa,SAAS,YAAY;AAC3C,OAAI,SAAS,kBAAkB,UAAU,CAAE;GAE3C,MAAM,YAAY,UAAU,eAAe,UAAU;AACrD,OAAI,UAAU,WAAW,EAAG;AAE5B,iBAAc,QAAQ,UAAU,QAAQ,UAAU,UAAU;IAC1D;IACA,aAAa,UAAU;IACvB;IACD,CAAC;AACF,gBAAa,KAAK;IAChB;IACA,QAAQ,UAAU,OAAO,aAAa;IACtC,UAAU,UAAU;IACpB,aAAa,UAAU;IACxB,CAAC;AACF;;;AAIJ,KAAI,eAAe,EACjB,OAAM,IAAI,MAAM,uDAAuD;CAGzE,MAAM,gBAAmC;EACvC,MAAM,SAAS,QAAQ,MAAM,GAAG;EAChC,MAAM,QAAQ;EACd,MAAM,QAAQ;EACd,OAAO,WAAW,QAAQ,MAAM;EACjC;CAED,MAAM,SAAS,IAAI,WAAW,QAAQ,YAAY,cAAc;AAChE,OAAM,OAAO,OAAO;AAEpB,QAAO,IAAI,GAAG,WAAW,0BAA0B,WAAW,KAAK,YAAY;AAC/E,QAAO,IAAI,GAAG;AACd,QAAO,IAAI,iBAAiB,aAAa,CAAC;AAC1C,QAAO,IAAI,iCAAiC,cAAc,KAAK,GAAG,cAAc,OAAO;AAEvF,SAAQ,GAAG,gBAAgB;AACzB,SAAO,IAAI,iCAAiC;AACvC,SAAO,MAAM,CAAC,WAAW,QAAQ,KAAK,EAAE,CAAC;GAC9C;AAEF,SAAQ,GAAG,iBAAiB;AACrB,SAAO,MAAM,CAAC,WAAW,QAAQ,KAAK,EAAE,CAAC;GAC9C"}