@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.
- package/dist/generate-BfIvo80v.js +1249 -0
- package/dist/generate-BfIvo80v.js.map +1 -0
- package/dist/generate-BoZaeXSl.cjs +1256 -0
- package/dist/generate-BoZaeXSl.cjs.map +1 -0
- package/dist/index.cjs +9 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -30
- package/dist/index.js.map +1 -1
- package/dist/{mcp-BIRDY8xn.js → mcp-LLlOFV3c.js} +5 -6
- package/dist/mcp-LLlOFV3c.js.map +1 -0
- package/dist/{mcp-BQjDRDXR.cjs → mcp-N1IVyiXf.cjs} +5 -7
- package/dist/mcp-N1IVyiXf.cjs.map +1 -0
- package/dist/package-B1rQiz1w.js +6 -0
- package/dist/package-B1rQiz1w.js.map +1 -0
- package/dist/package-CngLazMY.cjs +12 -0
- package/dist/package-CngLazMY.cjs.map +1 -0
- package/dist/{validate-0i6Q9eIy.js → validate-BptoQ-63.js} +5 -6
- package/dist/validate-BptoQ-63.js.map +1 -0
- package/dist/{validate-6F-VPZR7.cjs → validate-Dn6hZ7Z4.cjs} +5 -7
- package/dist/validate-Dn6hZ7Z4.cjs.map +1 -0
- package/package.json +7 -7
- package/src/commands/generate.ts +52 -65
- package/src/commands/mcp.ts +4 -5
- package/src/commands/validate.ts +4 -5
- package/src/index.ts +8 -23
- package/src/loggers/clackLogger.ts +433 -0
- package/src/loggers/envDetection.ts +28 -0
- package/src/loggers/fileSystemLogger.ts +79 -0
- package/src/loggers/githubActionsLogger.ts +310 -0
- package/src/loggers/index.ts +5 -0
- package/src/loggers/plainLogger.ts +274 -0
- package/src/loggers/types.ts +1 -0
- package/src/loggers/utils.ts +43 -0
- package/src/runners/generate.ts +196 -208
- package/src/utils/Writables.ts +12 -8
- package/src/utils/executeHooks.ts +11 -18
- package/src/utils/getCosmiConfig.ts +6 -1
- package/src/utils/getSummary.ts +20 -42
- package/src/utils/randomColour.ts +26 -0
- package/src/utils/watcher.ts +2 -4
- package/dist/generate-CYBFB3tU.js +0 -221
- package/dist/generate-CYBFB3tU.js.map +0 -1
- package/dist/generate-CpBJ2Y-n.js +0 -342
- package/dist/generate-CpBJ2Y-n.js.map +0 -1
- package/dist/generate-DpHvARzf.cjs +0 -345
- package/dist/generate-DpHvARzf.cjs.map +0 -1
- package/dist/generate-KUqCSnZp.cjs +0 -225
- package/dist/generate-KUqCSnZp.cjs.map +0 -1
- package/dist/mcp-BIRDY8xn.js.map +0 -1
- package/dist/mcp-BQjDRDXR.cjs.map +0 -1
- package/dist/validate-0i6Q9eIy.js.map +0 -1
- 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":"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"}
|