@kubb/cli 4.11.3 → 4.12.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.
Files changed (52) hide show
  1. package/dist/generate-BfIvo80v.js +1249 -0
  2. package/dist/generate-BfIvo80v.js.map +1 -0
  3. package/dist/generate-BoZaeXSl.cjs +1256 -0
  4. package/dist/generate-BoZaeXSl.cjs.map +1 -0
  5. package/dist/index.cjs +9 -35
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.js +7 -30
  8. package/dist/index.js.map +1 -1
  9. package/dist/{mcp-BIRDY8xn.js → mcp-LLlOFV3c.js} +5 -6
  10. package/dist/mcp-LLlOFV3c.js.map +1 -0
  11. package/dist/{mcp-BQjDRDXR.cjs → mcp-N1IVyiXf.cjs} +5 -7
  12. package/dist/mcp-N1IVyiXf.cjs.map +1 -0
  13. package/dist/package-B1rQiz1w.js +6 -0
  14. package/dist/package-B1rQiz1w.js.map +1 -0
  15. package/dist/package-CngLazMY.cjs +12 -0
  16. package/dist/package-CngLazMY.cjs.map +1 -0
  17. package/dist/{validate-0i6Q9eIy.js → validate-BptoQ-63.js} +5 -6
  18. package/dist/validate-BptoQ-63.js.map +1 -0
  19. package/dist/{validate-6F-VPZR7.cjs → validate-Dn6hZ7Z4.cjs} +5 -7
  20. package/dist/validate-Dn6hZ7Z4.cjs.map +1 -0
  21. package/package.json +7 -7
  22. package/src/commands/generate.ts +52 -65
  23. package/src/commands/mcp.ts +4 -5
  24. package/src/commands/validate.ts +4 -5
  25. package/src/index.ts +8 -23
  26. package/src/loggers/clackLogger.ts +433 -0
  27. package/src/loggers/envDetection.ts +28 -0
  28. package/src/loggers/fileSystemLogger.ts +79 -0
  29. package/src/loggers/githubActionsLogger.ts +310 -0
  30. package/src/loggers/index.ts +5 -0
  31. package/src/loggers/plainLogger.ts +274 -0
  32. package/src/loggers/types.ts +1 -0
  33. package/src/loggers/utils.ts +43 -0
  34. package/src/runners/generate.ts +196 -208
  35. package/src/utils/Writables.ts +12 -8
  36. package/src/utils/executeHooks.ts +11 -18
  37. package/src/utils/getCosmiConfig.ts +6 -1
  38. package/src/utils/getSummary.ts +20 -42
  39. package/src/utils/randomColour.ts +26 -0
  40. package/src/utils/watcher.ts +2 -4
  41. package/dist/generate-CYBFB3tU.js +0 -221
  42. package/dist/generate-CYBFB3tU.js.map +0 -1
  43. package/dist/generate-CpBJ2Y-n.js +0 -342
  44. package/dist/generate-CpBJ2Y-n.js.map +0 -1
  45. package/dist/generate-DpHvARzf.cjs +0 -345
  46. package/dist/generate-DpHvARzf.cjs.map +0 -1
  47. package/dist/generate-KUqCSnZp.cjs +0 -225
  48. package/dist/generate-KUqCSnZp.cjs.map +0 -1
  49. package/dist/mcp-BIRDY8xn.js.map +0 -1
  50. package/dist/mcp-BQjDRDXR.cjs.map +0 -1
  51. package/dist/validate-0i6Q9eIy.js.map +0 -1
  52. package/dist/validate-6F-VPZR7.cjs.map +0 -1
@@ -1,342 +0,0 @@
1
- import path from "node:path";
2
- import * as process$2 from "node:process";
3
- import process$1 from "node:process";
4
- import { safeBuild, setup } from "@kubb/core";
5
- import { LogMapper, createLogger, randomCliColour } from "@kubb/core/logger";
6
- import pc from "picocolors";
7
- import { Presets, SingleBar } from "cli-progress";
8
- import { execa } from "execa";
9
- import { parseArgsStringToArgv } from "string-argv";
10
- import { Writable } from "node:stream";
11
-
12
- //#region src/utils/Writables.ts
13
- var ConsolaWritable = class extends Writable {
14
- consola;
15
- command;
16
- constructor(consola, command, opts) {
17
- super(opts);
18
- this.command = command;
19
- this.consola = consola;
20
- }
21
- _write(chunk, _encoding, callback) {
22
- process$2.stdout.write(`${pc.dim(chunk?.toString())}`);
23
- callback();
24
- }
25
- };
26
-
27
- //#endregion
28
- //#region src/utils/executeHooks.ts
29
- async function executeHooks({ hooks, logger }) {
30
- const commands = Array.isArray(hooks.done) ? hooks.done : [hooks.done].filter(Boolean);
31
- for (const command of commands) {
32
- const consolaWritable = new ConsolaWritable(logger.consola, command);
33
- const [cmd, ..._args] = [...parseArgsStringToArgv(command)];
34
- if (!cmd) continue;
35
- logger?.emit("start", `Executing hook ${logger.logLevel !== LogMapper.silent ? pc.dim(command) : ""}`);
36
- await execa(cmd, _args, {
37
- detached: true,
38
- stdout: logger?.logLevel === LogMapper.silent ? void 0 : ["pipe", consolaWritable],
39
- stripFinalNewline: true
40
- });
41
- logger?.emit("success", `Executed hook ${logger.logLevel !== LogMapper.silent ? pc.dim(command) : ""}`);
42
- }
43
- logger?.emit("success", "Executed hooks");
44
- }
45
-
46
- //#endregion
47
- //#region src/utils/parseHrtimeToSeconds.ts
48
- function parseHrtimeToSeconds(hrtime) {
49
- return (hrtime[0] + hrtime[1] / 1e9).toFixed(3);
50
- }
51
-
52
- //#endregion
53
- //#region src/utils/getSummary.ts
54
- function getSummary({ failedPlugins, filesCreated, status, hrStart, config, pluginTimings }) {
55
- const logs = /* @__PURE__ */ new Set();
56
- const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrStart));
57
- const pluginsCount = config.plugins?.length || 0;
58
- const successCount = pluginsCount - failedPlugins.size;
59
- const meta = {
60
- plugins: status === "success" ? `${pc.green(`${successCount} successful`)}, ${pluginsCount} total` : `${pc.green(`${successCount} successful`)}, ${pc.red(`${failedPlugins.size} failed`)}, ${pluginsCount} total`,
61
- pluginsFailed: status === "failed" ? [...failedPlugins]?.map(({ plugin }) => randomCliColour(plugin.name))?.join(", ") : void 0,
62
- filesCreated,
63
- time: `${pc.yellow(`${elapsedSeconds}s`)}`,
64
- output: path.isAbsolute(config.root) ? path.resolve(config.root, config.output.path) : config.root
65
- };
66
- const labels = {
67
- plugins: "Plugins:",
68
- failed: "Failed:",
69
- generated: "Generated:",
70
- output: "Output:"
71
- };
72
- const maxLabelLength = Math.max(...Object.values(labels).map((l) => l.length));
73
- const summaryLines = [
74
- [`${pc.bold(labels.plugins.padEnd(maxLabelLength))} ${meta.plugins}`, true],
75
- [`${pc.dim(labels.failed.padEnd(maxLabelLength))} ${meta.pluginsFailed || "none"}`, !!meta.pluginsFailed],
76
- [`${pc.bold(labels.generated.padEnd(maxLabelLength))} ${meta.filesCreated} files in ${meta.time}`, true]
77
- ];
78
- if (pluginTimings && pluginTimings.size > 0) {
79
- const MAX_TOP_PLUGINS = 5;
80
- const TIME_SCALE_DIVISOR = 100;
81
- const MAX_BAR_LENGTH = 20;
82
- const sortedTimings = Array.from(pluginTimings.entries()).sort((a, b) => b[1] - a[1]).slice(0, MAX_TOP_PLUGINS);
83
- if (sortedTimings.length > 0) {
84
- summaryLines.push(["Plugin Timings:", true]);
85
- const maxNameLength = Math.max(...sortedTimings.map(([name]) => name.length));
86
- const indent = " ".repeat(maxLabelLength + 1);
87
- sortedTimings.forEach(([name, time]) => {
88
- const timeStr = time >= 1e3 ? `${(time / 1e3).toFixed(2)}s` : `${Math.round(time)}ms`;
89
- const barLength = Math.min(Math.ceil(time / TIME_SCALE_DIVISOR), MAX_BAR_LENGTH);
90
- const bar = "█".repeat(barLength);
91
- const paddedName = name.padStart(maxNameLength, " ");
92
- summaryLines.push([`${indent}${randomCliColour(paddedName)} ${pc.dim(bar)} ${pc.yellow(timeStr)}`, true]);
93
- });
94
- }
95
- }
96
- summaryLines.push([`${pc.bold(labels.output.padEnd(maxLabelLength))} ${meta.output}`, true]);
97
- logs.add(summaryLines.map((item) => {
98
- if (item.at(1)) return item.at(0);
99
- }).filter(Boolean).join("\n"));
100
- return [...logs];
101
- }
102
-
103
- //#endregion
104
- //#region src/runners/generate.ts
105
- async function generate({ input, config, progressCache, args }) {
106
- const hrStart = process$1.hrtime();
107
- const logger = createLogger({
108
- logLevel: LogMapper[args.logLevel] || 3,
109
- name: config.name
110
- });
111
- const { root = process$1.cwd(), ...userConfig } = config;
112
- const inputPath = input ?? ("path" in userConfig.input ? userConfig.input.path : void 0);
113
- if (logger.logLevel !== LogMapper.debug) {
114
- logger.on("progress_start", ({ id, size, message = "" }) => {
115
- logger.consola?.pauseLogs();
116
- const payload = {
117
- id,
118
- message
119
- };
120
- const progressBar = new SingleBar({
121
- format: "{percentage}% {bar} {value}/{total} | {message}",
122
- barsize: 30,
123
- clearOnComplete: true,
124
- emptyOnZero: true
125
- }, Presets.shades_grey);
126
- if (!progressCache.has(id)) {
127
- progressCache.set(id, progressBar);
128
- progressBar.start(size, 1, payload);
129
- }
130
- });
131
- logger.on("progress_stop", ({ id }) => {
132
- progressCache.get(id)?.stop();
133
- logger.consola?.resumeLogs();
134
- });
135
- logger.on("progressed", ({ id, message = "" }) => {
136
- const payload = {
137
- id,
138
- message
139
- };
140
- progressCache.get(id)?.increment(1, payload);
141
- });
142
- }
143
- const definedConfig = {
144
- root,
145
- ...userConfig,
146
- input: inputPath ? {
147
- ...userConfig.input,
148
- path: inputPath
149
- } : userConfig.input,
150
- output: {
151
- write: true,
152
- barrelType: "named",
153
- extension: { ".ts": ".ts" },
154
- format: "prettier",
155
- ...userConfig.output
156
- }
157
- };
158
- const { fabric, pluginManager } = await setup({
159
- config: definedConfig,
160
- logger
161
- });
162
- logger.emit("start", `Building ${logger.logLevel !== LogMapper.silent ? pc.dim(inputPath) : ""}`);
163
- const { files, failedPlugins, pluginTimings, error } = await safeBuild({
164
- config: definedConfig,
165
- logger
166
- }, {
167
- pluginManager,
168
- fabric,
169
- logger
170
- });
171
- if (logger.logLevel >= LogMapper.debug) {
172
- logger.consola?.start("Writing logs");
173
- await logger.writeLogs();
174
- logger.consola?.success("Written logs");
175
- }
176
- const summary = getSummary({
177
- failedPlugins,
178
- filesCreated: files.length,
179
- config: definedConfig,
180
- status: failedPlugins.size > 0 || error ? "failed" : "success",
181
- hrStart,
182
- pluginTimings: logger.logLevel >= LogMapper.verbose ? pluginTimings : void 0
183
- });
184
- if ((failedPlugins.size > 0 || error) && logger.consola) {
185
- logger.consola?.resumeLogs();
186
- logger.consola?.log(`✗ Build failed ${logger.logLevel !== LogMapper.silent ? pc.dim(inputPath) : ""}`);
187
- [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
188
- if (logger.logLevel >= LogMapper.debug && err.cause) logger.consola?.error(err.cause);
189
- logger.consola?.error(err);
190
- });
191
- logger.consola?.box({
192
- title: `${config.name || ""}`,
193
- message: summary.join(""),
194
- style: {
195
- padding: 2,
196
- borderColor: "red",
197
- borderStyle: "rounded"
198
- }
199
- });
200
- process$1.exit(1);
201
- }
202
- if (config.output.format === "prettier") {
203
- logger?.emit("start", `Formatting with ${config.output.format}`);
204
- logger?.emit("debug", {
205
- date: /* @__PURE__ */ new Date(),
206
- logs: [`Running prettier on ${path.resolve(definedConfig.root, definedConfig.output.path)}`]
207
- });
208
- try {
209
- await execa("prettier", [
210
- "--ignore-unknown",
211
- "--write",
212
- path.resolve(definedConfig.root, definedConfig.output.path)
213
- ]);
214
- logger?.emit("debug", {
215
- date: /* @__PURE__ */ new Date(),
216
- logs: ["Prettier formatting completed successfully"]
217
- });
218
- } catch (e) {
219
- logger.consola?.warn("Prettier not found");
220
- logger.consola?.error(e);
221
- logger?.emit("debug", {
222
- date: /* @__PURE__ */ new Date(),
223
- logs: [`Prettier formatting failed: ${e.message}`]
224
- });
225
- }
226
- logger?.emit("success", `Formatted with ${config.output.format}`);
227
- }
228
- if (config.output.format === "biome") {
229
- logger?.emit("start", `Formatting with ${config.output.format}`);
230
- logger?.emit("debug", {
231
- date: /* @__PURE__ */ new Date(),
232
- logs: [`Running biome format on ${path.resolve(definedConfig.root, definedConfig.output.path)}`]
233
- });
234
- try {
235
- await execa("biome", [
236
- "format",
237
- "--write",
238
- path.resolve(definedConfig.root, definedConfig.output.path)
239
- ]);
240
- logger?.emit("debug", {
241
- date: /* @__PURE__ */ new Date(),
242
- logs: ["Biome formatting completed successfully"]
243
- });
244
- } catch (e) {
245
- logger.consola?.warn("Biome not found");
246
- logger.consola?.error(e);
247
- logger?.emit("debug", {
248
- date: /* @__PURE__ */ new Date(),
249
- logs: [`Biome formatting failed: ${e.message}`]
250
- });
251
- }
252
- logger?.emit("success", `Formatted with ${config.output.format}`);
253
- }
254
- if (config.output.lint === "eslint") {
255
- logger?.emit("start", `Linting with ${config.output.lint}`);
256
- logger?.emit("debug", {
257
- date: /* @__PURE__ */ new Date(),
258
- logs: [`Running eslint on ${path.resolve(definedConfig.root, definedConfig.output.path)}`]
259
- });
260
- try {
261
- await execa("eslint", [path.resolve(definedConfig.root, definedConfig.output.path), "--fix"]);
262
- logger?.emit("debug", {
263
- date: /* @__PURE__ */ new Date(),
264
- logs: ["ESLint linting completed successfully"]
265
- });
266
- } catch (e) {
267
- logger.consola?.warn("Eslint not found");
268
- logger.consola?.error(e);
269
- logger?.emit("debug", {
270
- date: /* @__PURE__ */ new Date(),
271
- logs: [`ESLint linting failed: ${e.message}`]
272
- });
273
- }
274
- logger?.emit("success", `Linted with ${config.output.lint}`);
275
- }
276
- if (config.output.lint === "biome") {
277
- logger?.emit("start", `Linting with ${config.output.lint}`);
278
- logger?.emit("debug", {
279
- date: /* @__PURE__ */ new Date(),
280
- logs: [`Running biome lint on ${path.resolve(definedConfig.root, definedConfig.output.path)}`]
281
- });
282
- try {
283
- await execa("biome", [
284
- "lint",
285
- "--fix",
286
- path.resolve(definedConfig.root, definedConfig.output.path)
287
- ]);
288
- logger?.emit("debug", {
289
- date: /* @__PURE__ */ new Date(),
290
- logs: ["Biome linting completed successfully"]
291
- });
292
- } catch (e) {
293
- logger.consola?.warn("Biome not found");
294
- logger.consola?.error(e);
295
- logger?.emit("debug", {
296
- date: /* @__PURE__ */ new Date(),
297
- logs: [`✗ Biome linting failed: ${e.message}`]
298
- });
299
- }
300
- logger?.emit("success", `Linted with ${config.output.lint}`);
301
- }
302
- if (config.output.lint === "oxlint") {
303
- logger?.emit("start", `Linting with ${config.output.lint}`);
304
- logger?.emit("debug", {
305
- date: /* @__PURE__ */ new Date(),
306
- logs: [`Running oxlint on ${path.resolve(definedConfig.root, definedConfig.output.path)}`]
307
- });
308
- try {
309
- await execa("oxlint", ["--fix", path.resolve(definedConfig.root, definedConfig.output.path)]);
310
- logger?.emit("debug", {
311
- date: /* @__PURE__ */ new Date(),
312
- logs: ["Oxlint linting completed successfully"]
313
- });
314
- } catch (e) {
315
- logger.consola?.warn("Oxlint not found");
316
- logger.consola?.error(e);
317
- logger?.emit("debug", {
318
- date: /* @__PURE__ */ new Date(),
319
- logs: [`✗ Oxlint linting failed: ${e.message}`]
320
- });
321
- }
322
- logger?.emit("success", `Linted with ${config.output.lint}`);
323
- }
324
- if (config.hooks) await executeHooks({
325
- hooks: config.hooks,
326
- logger
327
- });
328
- logger.consola?.log(`⚡ Build completed ${logger.logLevel !== LogMapper.silent ? pc.dim(inputPath) : ""}`);
329
- logger.consola?.box({
330
- title: `${config.name || ""}`,
331
- message: summary.join(""),
332
- style: {
333
- padding: 2,
334
- borderColor: "green",
335
- borderStyle: "rounded"
336
- }
337
- });
338
- }
339
-
340
- //#endregion
341
- export { generate };
342
- //# sourceMappingURL=generate-CpBJ2Y-n.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-CpBJ2Y-n.js","names":["summaryLines: Array<[string, boolean]>","process","definedConfig: Config"],"sources":["../src/utils/Writables.ts","../src/utils/executeHooks.ts","../src/utils/parseHrtimeToSeconds.ts","../src/utils/getSummary.ts","../src/runners/generate.ts"],"sourcesContent":["import * as process from 'node:process'\nimport type { WritableOptions } from 'node:stream'\nimport { Writable } from 'node:stream'\nimport type { ConsolaInstance } from 'consola'\nimport pc from 'picocolors'\n\nexport class ConsolaWritable extends Writable {\n consola: ConsolaInstance | undefined\n command: string\n constructor(consola: ConsolaInstance | undefined, command: string, opts?: WritableOptions) {\n super(opts)\n\n this.command = command\n this.consola = consola\n }\n _write(chunk: any, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n process.stdout.write(`${pc.dim(chunk?.toString())}`)\n\n callback()\n }\n}\n","import type { Config } from '@kubb/core'\nimport type { Logger } from '@kubb/core/logger'\nimport { LogMapper } from '@kubb/core/logger'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\nimport { parseArgsStringToArgv } from 'string-argv'\nimport { ConsolaWritable } from './Writables.ts'\n\ntype ExecutingHooksProps = {\n hooks: NonNullable<Config['hooks']>\n logger: Logger\n}\n\nexport async function executeHooks({ hooks, logger }: ExecutingHooksProps): Promise<void> {\n const commands = Array.isArray(hooks.done) ? hooks.done : [hooks.done].filter(Boolean)\n\n for (const command of commands) {\n const consolaWritable = new ConsolaWritable(logger.consola!, command)\n const [cmd, ..._args] = [...parseArgsStringToArgv(command)]\n\n if (!cmd) {\n continue\n }\n\n logger?.emit('start', `Executing hook ${logger.logLevel !== LogMapper.silent ? pc.dim(command) : ''}`)\n\n await execa(cmd, _args, {\n detached: true,\n stdout: logger?.logLevel === LogMapper.silent ? undefined : ['pipe', consolaWritable],\n stripFinalNewline: true,\n })\n\n logger?.emit('success', `Executed hook ${logger.logLevel !== LogMapper.silent ? pc.dim(command) : ''}`)\n }\n\n logger?.emit('success', 'Executed hooks')\n}\n","export function parseHrtimeToSeconds(hrtime: [number, number]): string {\n const seconds = (hrtime[0] + hrtime[1] / 1e9).toFixed(3)\n return seconds\n}\n","import path from 'node:path'\nimport type { Config, Plugin } from '@kubb/core'\nimport { randomCliColour } from '@kubb/core/logger'\nimport pc from 'picocolors'\nimport { parseHrtimeToSeconds } from './parseHrtimeToSeconds.ts'\n\ntype SummaryProps = {\n failedPlugins: Set<{ plugin: Plugin; error: Error }>\n status: 'success' | 'failed'\n hrStart: [number, number]\n filesCreated: number\n config: Config\n pluginTimings?: Map<string, number>\n}\n\nexport function getSummary({ failedPlugins, filesCreated, status, hrStart, config, pluginTimings }: SummaryProps): string[] {\n const logs = new Set<string>()\n const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrStart))\n\n const pluginsCount = config.plugins?.length || 0\n const successCount = pluginsCount - failedPlugins.size\n\n const meta = {\n plugins:\n status === 'success'\n ? `${pc.green(`${successCount} successful`)}, ${pluginsCount} total`\n : `${pc.green(`${successCount} successful`)}, ${pc.red(`${failedPlugins.size} failed`)}, ${pluginsCount} total`,\n pluginsFailed: status === 'failed' ? [...failedPlugins]?.map(({ plugin }) => randomCliColour(plugin.name))?.join(', ') : undefined,\n filesCreated: filesCreated,\n time: `${pc.yellow(`${elapsedSeconds}s`)}`,\n output: path.isAbsolute(config.root) ? path.resolve(config.root, config.output.path) : config.root,\n } as const\n\n // Calculate label padding for perfect alignment\n const labels = {\n plugins: 'Plugins:',\n failed: 'Failed:',\n generated: 'Generated:',\n output: 'Output:',\n }\n const maxLabelLength = Math.max(...Object.values(labels).map((l) => l.length))\n\n const summaryLines: Array<[string, boolean]> = [\n [`${pc.bold(labels.plugins.padEnd(maxLabelLength))} ${meta.plugins}`, true],\n [`${pc.dim(labels.failed.padEnd(maxLabelLength))} ${meta.pluginsFailed || 'none'}`, !!meta.pluginsFailed],\n [`${pc.bold(labels.generated.padEnd(maxLabelLength))} ${meta.filesCreated} files in ${meta.time}`, true],\n ]\n\n // Add plugin timing breakdown if available\n if (pluginTimings && pluginTimings.size > 0) {\n const MAX_TOP_PLUGINS = 5\n const TIME_SCALE_DIVISOR = 100 // Each 100ms = 1 bar character\n const MAX_BAR_LENGTH = 20\n\n const sortedTimings = Array.from(pluginTimings.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, MAX_TOP_PLUGINS)\n\n if (sortedTimings.length > 0) {\n summaryLines.push(['Plugin Timings:', true])\n\n // Find the longest plugin name for alignment\n const maxNameLength = Math.max(...sortedTimings.map(([name]) => name.length))\n\n // Indent plugin timing bars to align with summary values (e.g., \"7 successful\", \"60 files\")\n const indent = ' '.repeat(maxLabelLength + 1)\n\n sortedTimings.forEach(([name, time]) => {\n const timeStr = time >= 1000 ? `${(time / 1000).toFixed(2)}s` : `${Math.round(time)}ms`\n const barLength = Math.min(Math.ceil(time / TIME_SCALE_DIVISOR), MAX_BAR_LENGTH)\n const bar = '█'.repeat(barLength)\n\n // Right-align plugin names, left-align bars, with consistent spacing\n const paddedName = name.padStart(maxNameLength, ' ')\n summaryLines.push([`${indent}${randomCliColour(paddedName)} ${pc.dim(bar)} ${pc.yellow(timeStr)}`, true])\n })\n }\n }\n\n summaryLines.push([`${pc.bold(labels.output.padEnd(maxLabelLength))} ${meta.output}`, true])\n\n logs.add(\n summaryLines\n .map((item) => {\n if (item.at(1)) {\n return item.at(0)\n }\n return undefined\n })\n .filter(Boolean)\n .join('\\n'),\n )\n\n return [...logs]\n}\n","import path from 'node:path'\nimport process from 'node:process'\nimport { type Config, safeBuild, setup } from '@kubb/core'\nimport { createLogger, LogMapper } from '@kubb/core/logger'\nimport { Presets, SingleBar } from 'cli-progress'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\nimport type { Args } from '../commands/generate.ts'\nimport { executeHooks } from '../utils/executeHooks.ts'\nimport { getSummary } from '../utils/getSummary.ts'\n\ntype GenerateProps = {\n input?: string\n config: Config\n args: Args\n progressCache: Map<string, SingleBar>\n}\n\nexport async function generate({ input, config, progressCache, args }: GenerateProps): Promise<void> {\n const hrStart = process.hrtime()\n const logLevel = LogMapper[args.logLevel as keyof typeof LogMapper] || 3\n\n const logger = createLogger({\n logLevel,\n name: config.name,\n })\n\n const { root = process.cwd(), ...userConfig } = config\n const inputPath = input ?? ('path' in userConfig.input ? userConfig.input.path : undefined)\n\n if (logger.logLevel !== LogMapper.debug) {\n logger.on('progress_start', ({ id, size, message = '' }) => {\n logger.consola?.pauseLogs()\n const payload = { id, message }\n const progressBar = new SingleBar(\n {\n format: '{percentage}% {bar} {value}/{total} | {message}',\n barsize: 30,\n clearOnComplete: true,\n emptyOnZero: true,\n },\n Presets.shades_grey,\n )\n\n if (!progressCache.has(id)) {\n progressCache.set(id, progressBar)\n progressBar.start(size, 1, payload)\n }\n })\n\n logger.on('progress_stop', ({ id }) => {\n progressCache.get(id)?.stop()\n logger.consola?.resumeLogs()\n })\n\n logger.on('progressed', ({ id, message = '' }) => {\n const payload = { id, message }\n\n progressCache.get(id)?.increment(1, payload)\n })\n }\n\n const definedConfig: Config = {\n root,\n ...userConfig,\n input: inputPath\n ? {\n ...userConfig.input,\n path: inputPath,\n }\n : userConfig.input,\n output: {\n write: true,\n barrelType: 'named',\n extension: {\n '.ts': '.ts',\n },\n format: 'prettier',\n ...userConfig.output,\n },\n }\n\n const { fabric, pluginManager } = await setup({\n config: definedConfig,\n logger,\n })\n\n logger.emit('start', `Building ${logger.logLevel !== LogMapper.silent ? pc.dim(inputPath!) : ''}`)\n\n const { files, failedPlugins, pluginTimings, error } = await safeBuild(\n {\n config: definedConfig,\n logger,\n },\n { pluginManager, fabric, logger },\n )\n\n if (logger.logLevel >= LogMapper.debug) {\n logger.consola?.start('Writing logs')\n\n await logger.writeLogs()\n\n logger.consola?.success('Written logs')\n }\n\n const summary = getSummary({\n failedPlugins,\n filesCreated: files.length,\n config: definedConfig,\n status: failedPlugins.size > 0 || error ? 'failed' : 'success',\n hrStart,\n pluginTimings: logger.logLevel >= LogMapper.verbose ? pluginTimings : undefined,\n })\n\n // Handle build failures (either from failed plugins or general errors)\n const hasFailures = failedPlugins.size > 0 || error\n\n if (hasFailures && logger.consola) {\n logger.consola?.resumeLogs()\n logger.consola?.log(`✗ Build failed ${logger.logLevel !== LogMapper.silent ? pc.dim(inputPath!) : ''}`)\n\n // Collect all errors from failed plugins and general error\n const allErrors: Error[] = [\n error,\n ...Array.from(failedPlugins)\n .filter((it) => it.error)\n .map((it) => it.error),\n ].filter(Boolean)\n\n allErrors.forEach((err) => {\n // Display error causes in debug mode\n if (logger.logLevel >= LogMapper.debug && err.cause) {\n logger.consola?.error(err.cause)\n }\n\n logger.consola?.error(err)\n })\n\n logger.consola?.box({\n title: `${config.name || ''}`,\n message: summary.join(''),\n style: {\n padding: 2,\n borderColor: 'red',\n borderStyle: 'rounded',\n },\n })\n\n process.exit(1)\n }\n\n // formatting\n if (config.output.format === 'prettier') {\n logger?.emit('start', `Formatting with ${config.output.format}`)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Running prettier on ${path.resolve(definedConfig.root, definedConfig.output.path)}`],\n })\n\n try {\n await execa('prettier', ['--ignore-unknown', '--write', path.resolve(definedConfig.root, definedConfig.output.path)])\n logger?.emit('debug', {\n date: new Date(),\n logs: ['Prettier formatting completed successfully'],\n })\n } catch (e) {\n logger.consola?.warn('Prettier not found')\n logger.consola?.error(e)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Prettier formatting failed: ${(e as Error).message}`],\n })\n }\n\n logger?.emit('success', `Formatted with ${config.output.format}`)\n }\n\n if (config.output.format === 'biome') {\n logger?.emit('start', `Formatting with ${config.output.format}`)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Running biome format on ${path.resolve(definedConfig.root, definedConfig.output.path)}`],\n })\n\n try {\n await execa('biome', ['format', '--write', path.resolve(definedConfig.root, definedConfig.output.path)])\n logger?.emit('debug', {\n date: new Date(),\n logs: ['Biome formatting completed successfully'],\n })\n } catch (e) {\n logger.consola?.warn('Biome not found')\n logger.consola?.error(e)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Biome formatting failed: ${(e as Error).message}`],\n })\n }\n\n logger?.emit('success', `Formatted with ${config.output.format}`)\n }\n\n // linting\n if (config.output.lint === 'eslint') {\n logger?.emit('start', `Linting with ${config.output.lint}`)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Running eslint on ${path.resolve(definedConfig.root, definedConfig.output.path)}`],\n })\n\n try {\n await execa('eslint', [path.resolve(definedConfig.root, definedConfig.output.path), '--fix'])\n logger?.emit('debug', {\n date: new Date(),\n logs: ['ESLint linting completed successfully'],\n })\n } catch (e) {\n logger.consola?.warn('Eslint not found')\n logger.consola?.error(e)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`ESLint linting failed: ${(e as Error).message}`],\n })\n }\n\n logger?.emit('success', `Linted with ${config.output.lint}`)\n }\n\n if (config.output.lint === 'biome') {\n logger?.emit('start', `Linting with ${config.output.lint}`)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Running biome lint on ${path.resolve(definedConfig.root, definedConfig.output.path)}`],\n })\n\n try {\n await execa('biome', ['lint', '--fix', path.resolve(definedConfig.root, definedConfig.output.path)])\n logger?.emit('debug', {\n date: new Date(),\n logs: ['Biome linting completed successfully'],\n })\n } catch (e) {\n logger.consola?.warn('Biome not found')\n logger.consola?.error(e)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`✗ Biome linting failed: ${(e as Error).message}`],\n })\n }\n\n logger?.emit('success', `Linted with ${config.output.lint}`)\n }\n\n if (config.output.lint === 'oxlint') {\n logger?.emit('start', `Linting with ${config.output.lint}`)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`Running oxlint on ${path.resolve(definedConfig.root, definedConfig.output.path)}`],\n })\n\n try {\n await execa('oxlint', ['--fix', path.resolve(definedConfig.root, definedConfig.output.path)])\n logger?.emit('debug', {\n date: new Date(),\n logs: ['Oxlint linting completed successfully'],\n })\n } catch (e) {\n logger.consola?.warn('Oxlint not found')\n logger.consola?.error(e)\n logger?.emit('debug', {\n date: new Date(),\n logs: [`✗ Oxlint linting failed: ${(e as Error).message}`],\n })\n }\n\n logger?.emit('success', `Linted with ${config.output.lint}`)\n }\n\n if (config.hooks) {\n await executeHooks({ hooks: config.hooks, logger })\n }\n\n logger.consola?.log(`⚡ Build completed ${logger.logLevel !== LogMapper.silent ? pc.dim(inputPath!) : ''}`)\n logger.consola?.box({\n title: `${config.name || ''}`,\n message: summary.join(''),\n style: {\n padding: 2,\n borderColor: 'green',\n borderStyle: 'rounded',\n },\n })\n}\n"],"mappings":";;;;;;;;;;;;AAMA,IAAa,kBAAb,cAAqC,SAAS;CAC5C;CACA;CACA,YAAY,SAAsC,SAAiB,MAAwB;AACzF,QAAM,KAAK;AAEX,OAAK,UAAU;AACf,OAAK,UAAU;;CAEjB,OAAO,OAAY,WAA2B,UAAgD;AAC5F,YAAQ,OAAO,MAAM,GAAG,GAAG,IAAI,OAAO,UAAU,CAAC,GAAG;AAEpD,YAAU;;;;;;ACLd,eAAsB,aAAa,EAAE,OAAO,UAA8C;CACxF,MAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,KAAK,CAAC,OAAO,QAAQ;AAEtF,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,kBAAkB,IAAI,gBAAgB,OAAO,SAAU,QAAQ;EACrE,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,sBAAsB,QAAQ,CAAC;AAE3D,MAAI,CAAC,IACH;AAGF,UAAQ,KAAK,SAAS,kBAAkB,OAAO,aAAa,UAAU,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK;AAEtG,QAAM,MAAM,KAAK,OAAO;GACtB,UAAU;GACV,QAAQ,QAAQ,aAAa,UAAU,SAAS,SAAY,CAAC,QAAQ,gBAAgB;GACrF,mBAAmB;GACpB,CAAC;AAEF,UAAQ,KAAK,WAAW,iBAAiB,OAAO,aAAa,UAAU,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK;;AAGzG,SAAQ,KAAK,WAAW,iBAAiB;;;;;ACnC3C,SAAgB,qBAAqB,QAAkC;AAErE,SADiB,OAAO,KAAK,OAAO,KAAK,KAAK,QAAQ,EAAE;;;;;ACc1D,SAAgB,WAAW,EAAE,eAAe,cAAc,QAAQ,SAAS,QAAQ,iBAAyC;CAC1H,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,iBAAiB,qBAAqB,QAAQ,OAAO,QAAQ,CAAC;CAEpE,MAAM,eAAe,OAAO,SAAS,UAAU;CAC/C,MAAM,eAAe,eAAe,cAAc;CAElD,MAAM,OAAO;EACX,SACE,WAAW,YACP,GAAG,GAAG,MAAM,GAAG,aAAa,aAAa,CAAC,IAAI,aAAa,UAC3D,GAAG,GAAG,MAAM,GAAG,aAAa,aAAa,CAAC,IAAI,GAAG,IAAI,GAAG,cAAc,KAAK,SAAS,CAAC,IAAI,aAAa;EAC5G,eAAe,WAAW,WAAW,CAAC,GAAG,cAAc,EAAE,KAAK,EAAE,aAAa,gBAAgB,OAAO,KAAK,CAAC,EAAE,KAAK,KAAK,GAAG;EAC3G;EACd,MAAM,GAAG,GAAG,OAAO,GAAG,eAAe,GAAG;EACxC,QAAQ,KAAK,WAAW,OAAO,KAAK,GAAG,KAAK,QAAQ,OAAO,MAAM,OAAO,OAAO,KAAK,GAAG,OAAO;EAC/F;CAGD,MAAM,SAAS;EACb,SAAS;EACT,QAAQ;EACR,WAAW;EACX,QAAQ;EACT;CACD,MAAM,iBAAiB,KAAK,IAAI,GAAG,OAAO,OAAO,OAAO,CAAC,KAAK,MAAM,EAAE,OAAO,CAAC;CAE9E,MAAMA,eAAyC;EAC7C,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,OAAO,eAAe,CAAC,CAAC,GAAG,KAAK,WAAW,KAAK;EAC3E,CAAC,GAAG,GAAG,IAAI,OAAO,OAAO,OAAO,eAAe,CAAC,CAAC,GAAG,KAAK,iBAAiB,UAAU,CAAC,CAAC,KAAK,cAAc;EACzG,CAAC,GAAG,GAAG,KAAK,OAAO,UAAU,OAAO,eAAe,CAAC,CAAC,GAAG,KAAK,aAAa,YAAY,KAAK,QAAQ,KAAK;EACzG;AAGD,KAAI,iBAAiB,cAAc,OAAO,GAAG;EAC3C,MAAM,kBAAkB;EACxB,MAAM,qBAAqB;EAC3B,MAAM,iBAAiB;EAEvB,MAAM,gBAAgB,MAAM,KAAK,cAAc,SAAS,CAAC,CACtD,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG,CAC3B,MAAM,GAAG,gBAAgB;AAE5B,MAAI,cAAc,SAAS,GAAG;AAC5B,gBAAa,KAAK,CAAC,mBAAmB,KAAK,CAAC;GAG5C,MAAM,gBAAgB,KAAK,IAAI,GAAG,cAAc,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC;GAG7E,MAAM,SAAS,IAAI,OAAO,iBAAiB,EAAE;AAE7C,iBAAc,SAAS,CAAC,MAAM,UAAU;IACtC,MAAM,UAAU,QAAQ,MAAO,IAAI,OAAO,KAAM,QAAQ,EAAE,CAAC,KAAK,GAAG,KAAK,MAAM,KAAK,CAAC;IACpF,MAAM,YAAY,KAAK,IAAI,KAAK,KAAK,OAAO,mBAAmB,EAAE,eAAe;IAChF,MAAM,MAAM,IAAI,OAAO,UAAU;IAGjC,MAAM,aAAa,KAAK,SAAS,eAAe,IAAI;AACpD,iBAAa,KAAK,CAAC,GAAG,SAAS,gBAAgB,WAAW,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,OAAO,QAAQ,IAAI,KAAK,CAAC;KACzG;;;AAIN,cAAa,KAAK,CAAC,GAAG,GAAG,KAAK,OAAO,OAAO,OAAO,eAAe,CAAC,CAAC,GAAG,KAAK,UAAU,KAAK,CAAC;AAE5F,MAAK,IACH,aACG,KAAK,SAAS;AACb,MAAI,KAAK,GAAG,EAAE,CACZ,QAAO,KAAK,GAAG,EAAE;GAGnB,CACD,OAAO,QAAQ,CACf,KAAK,KAAK,CACd;AAED,QAAO,CAAC,GAAG,KAAK;;;;;AC3ElB,eAAsB,SAAS,EAAE,OAAO,QAAQ,eAAe,QAAsC;CACnG,MAAM,UAAUC,UAAQ,QAAQ;CAGhC,MAAM,SAAS,aAAa;EAC1B,UAHe,UAAU,KAAK,aAAuC;EAIrE,MAAM,OAAO;EACd,CAAC;CAEF,MAAM,EAAE,OAAOA,UAAQ,KAAK,EAAE,GAAG,eAAe;CAChD,MAAM,YAAY,UAAU,UAAU,WAAW,QAAQ,WAAW,MAAM,OAAO;AAEjF,KAAI,OAAO,aAAa,UAAU,OAAO;AACvC,SAAO,GAAG,mBAAmB,EAAE,IAAI,MAAM,UAAU,SAAS;AAC1D,UAAO,SAAS,WAAW;GAC3B,MAAM,UAAU;IAAE;IAAI;IAAS;GAC/B,MAAM,cAAc,IAAI,UACtB;IACE,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,aAAa;IACd,EACD,QAAQ,YACT;AAED,OAAI,CAAC,cAAc,IAAI,GAAG,EAAE;AAC1B,kBAAc,IAAI,IAAI,YAAY;AAClC,gBAAY,MAAM,MAAM,GAAG,QAAQ;;IAErC;AAEF,SAAO,GAAG,kBAAkB,EAAE,SAAS;AACrC,iBAAc,IAAI,GAAG,EAAE,MAAM;AAC7B,UAAO,SAAS,YAAY;IAC5B;AAEF,SAAO,GAAG,eAAe,EAAE,IAAI,UAAU,SAAS;GAChD,MAAM,UAAU;IAAE;IAAI;IAAS;AAE/B,iBAAc,IAAI,GAAG,EAAE,UAAU,GAAG,QAAQ;IAC5C;;CAGJ,MAAMC,gBAAwB;EAC5B;EACA,GAAG;EACH,OAAO,YACH;GACE,GAAG,WAAW;GACd,MAAM;GACP,GACD,WAAW;EACf,QAAQ;GACN,OAAO;GACP,YAAY;GACZ,WAAW,EACT,OAAO,OACR;GACD,QAAQ;GACR,GAAG,WAAW;GACf;EACF;CAED,MAAM,EAAE,QAAQ,kBAAkB,MAAM,MAAM;EAC5C,QAAQ;EACR;EACD,CAAC;AAEF,QAAO,KAAK,SAAS,YAAY,OAAO,aAAa,UAAU,SAAS,GAAG,IAAI,UAAW,GAAG,KAAK;CAElG,MAAM,EAAE,OAAO,eAAe,eAAe,UAAU,MAAM,UAC3D;EACE,QAAQ;EACR;EACD,EACD;EAAE;EAAe;EAAQ;EAAQ,CAClC;AAED,KAAI,OAAO,YAAY,UAAU,OAAO;AACtC,SAAO,SAAS,MAAM,eAAe;AAErC,QAAM,OAAO,WAAW;AAExB,SAAO,SAAS,QAAQ,eAAe;;CAGzC,MAAM,UAAU,WAAW;EACzB;EACA,cAAc,MAAM;EACpB,QAAQ;EACR,QAAQ,cAAc,OAAO,KAAK,QAAQ,WAAW;EACrD;EACA,eAAe,OAAO,YAAY,UAAU,UAAU,gBAAgB;EACvE,CAAC;AAKF,MAFoB,cAAc,OAAO,KAAK,UAE3B,OAAO,SAAS;AACjC,SAAO,SAAS,YAAY;AAC5B,SAAO,SAAS,IAAI,mBAAmB,OAAO,aAAa,UAAU,SAAS,GAAG,IAAI,UAAW,GAAG,KAAK;AAUxG,EAP2B,CACzB,OACA,GAAG,MAAM,KAAK,cAAc,CACzB,QAAQ,OAAO,GAAG,MAAM,CACxB,KAAK,OAAO,GAAG,MAAM,CACzB,CAAC,OAAO,QAAQ,CAEP,SAAS,QAAQ;AAEzB,OAAI,OAAO,YAAY,UAAU,SAAS,IAAI,MAC5C,QAAO,SAAS,MAAM,IAAI,MAAM;AAGlC,UAAO,SAAS,MAAM,IAAI;IAC1B;AAEF,SAAO,SAAS,IAAI;GAClB,OAAO,GAAG,OAAO,QAAQ;GACzB,SAAS,QAAQ,KAAK,GAAG;GACzB,OAAO;IACL,SAAS;IACT,aAAa;IACb,aAAa;IACd;GACF,CAAC;AAEF,YAAQ,KAAK,EAAE;;AAIjB,KAAI,OAAO,OAAO,WAAW,YAAY;AACvC,UAAQ,KAAK,SAAS,mBAAmB,OAAO,OAAO,SAAS;AAChE,UAAQ,KAAK,SAAS;GACpB,sBAAM,IAAI,MAAM;GAChB,MAAM,CAAC,uBAAuB,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,GAAG;GAC7F,CAAC;AAEF,MAAI;AACF,SAAM,MAAM,YAAY;IAAC;IAAoB;IAAW,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK;IAAC,CAAC;AACrH,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,6CAA6C;IACrD,CAAC;WACK,GAAG;AACV,UAAO,SAAS,KAAK,qBAAqB;AAC1C,UAAO,SAAS,MAAM,EAAE;AACxB,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,+BAAgC,EAAY,UAAU;IAC9D,CAAC;;AAGJ,UAAQ,KAAK,WAAW,kBAAkB,OAAO,OAAO,SAAS;;AAGnE,KAAI,OAAO,OAAO,WAAW,SAAS;AACpC,UAAQ,KAAK,SAAS,mBAAmB,OAAO,OAAO,SAAS;AAChE,UAAQ,KAAK,SAAS;GACpB,sBAAM,IAAI,MAAM;GAChB,MAAM,CAAC,2BAA2B,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,GAAG;GACjG,CAAC;AAEF,MAAI;AACF,SAAM,MAAM,SAAS;IAAC;IAAU;IAAW,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK;IAAC,CAAC;AACxG,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,0CAA0C;IAClD,CAAC;WACK,GAAG;AACV,UAAO,SAAS,KAAK,kBAAkB;AACvC,UAAO,SAAS,MAAM,EAAE;AACxB,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,4BAA6B,EAAY,UAAU;IAC3D,CAAC;;AAGJ,UAAQ,KAAK,WAAW,kBAAkB,OAAO,OAAO,SAAS;;AAInE,KAAI,OAAO,OAAO,SAAS,UAAU;AACnC,UAAQ,KAAK,SAAS,gBAAgB,OAAO,OAAO,OAAO;AAC3D,UAAQ,KAAK,SAAS;GACpB,sBAAM,IAAI,MAAM;GAChB,MAAM,CAAC,qBAAqB,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,GAAG;GAC3F,CAAC;AAEF,MAAI;AACF,SAAM,MAAM,UAAU,CAAC,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,EAAE,QAAQ,CAAC;AAC7F,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,wCAAwC;IAChD,CAAC;WACK,GAAG;AACV,UAAO,SAAS,KAAK,mBAAmB;AACxC,UAAO,SAAS,MAAM,EAAE;AACxB,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,0BAA2B,EAAY,UAAU;IACzD,CAAC;;AAGJ,UAAQ,KAAK,WAAW,eAAe,OAAO,OAAO,OAAO;;AAG9D,KAAI,OAAO,OAAO,SAAS,SAAS;AAClC,UAAQ,KAAK,SAAS,gBAAgB,OAAO,OAAO,OAAO;AAC3D,UAAQ,KAAK,SAAS;GACpB,sBAAM,IAAI,MAAM;GAChB,MAAM,CAAC,yBAAyB,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,GAAG;GAC/F,CAAC;AAEF,MAAI;AACF,SAAM,MAAM,SAAS;IAAC;IAAQ;IAAS,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK;IAAC,CAAC;AACpG,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,uCAAuC;IAC/C,CAAC;WACK,GAAG;AACV,UAAO,SAAS,KAAK,kBAAkB;AACvC,UAAO,SAAS,MAAM,EAAE;AACxB,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,2BAA4B,EAAY,UAAU;IAC1D,CAAC;;AAGJ,UAAQ,KAAK,WAAW,eAAe,OAAO,OAAO,OAAO;;AAG9D,KAAI,OAAO,OAAO,SAAS,UAAU;AACnC,UAAQ,KAAK,SAAS,gBAAgB,OAAO,OAAO,OAAO;AAC3D,UAAQ,KAAK,SAAS;GACpB,sBAAM,IAAI,MAAM;GAChB,MAAM,CAAC,qBAAqB,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,GAAG;GAC3F,CAAC;AAEF,MAAI;AACF,SAAM,MAAM,UAAU,CAAC,SAAS,KAAK,QAAQ,cAAc,MAAM,cAAc,OAAO,KAAK,CAAC,CAAC;AAC7F,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,wCAAwC;IAChD,CAAC;WACK,GAAG;AACV,UAAO,SAAS,KAAK,mBAAmB;AACxC,UAAO,SAAS,MAAM,EAAE;AACxB,WAAQ,KAAK,SAAS;IACpB,sBAAM,IAAI,MAAM;IAChB,MAAM,CAAC,4BAA6B,EAAY,UAAU;IAC3D,CAAC;;AAGJ,UAAQ,KAAK,WAAW,eAAe,OAAO,OAAO,OAAO;;AAG9D,KAAI,OAAO,MACT,OAAM,aAAa;EAAE,OAAO,OAAO;EAAO;EAAQ,CAAC;AAGrD,QAAO,SAAS,IAAI,qBAAqB,OAAO,aAAa,UAAU,SAAS,GAAG,IAAI,UAAW,GAAG,KAAK;AAC1G,QAAO,SAAS,IAAI;EAClB,OAAO,GAAG,OAAO,QAAQ;EACzB,SAAS,QAAQ,KAAK,GAAG;EACzB,OAAO;GACL,SAAS;GACT,aAAa;GACb,aAAa;GACd;EACF,CAAC"}