@kubb/cli 1.1.9 → 1.1.11

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/index.cjs CHANGED
@@ -4,11 +4,12 @@
4
4
  var pathParser = require('path');
5
5
  var commander = require('commander');
6
6
  var ora = require('ora');
7
- var pc2 = require('picocolors');
7
+ var pc3 = require('picocolors');
8
8
  var core = require('@kubb/core');
9
9
  var execa = require('execa');
10
10
  var PrettyError = require('pretty-error');
11
11
  var stringArgv = require('string-argv');
12
+ var stream = require('stream');
12
13
  var mod = require('module');
13
14
  var url = require('url');
14
15
  var cosmiconfig = require('cosmiconfig');
@@ -19,7 +20,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
20
 
20
21
  var pathParser__default = /*#__PURE__*/_interopDefault(pathParser);
21
22
  var ora__default = /*#__PURE__*/_interopDefault(ora);
22
- var pc2__default = /*#__PURE__*/_interopDefault(pc2);
23
+ var pc3__default = /*#__PURE__*/_interopDefault(pc3);
23
24
  var PrettyError__default = /*#__PURE__*/_interopDefault(PrettyError);
24
25
  var mod__default = /*#__PURE__*/_interopDefault(mod);
25
26
  var tsNode__default = /*#__PURE__*/_interopDefault(tsNode);
@@ -34,7 +35,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
34
35
  });
35
36
 
36
37
  // package.json
37
- var version = "1.1.9";
38
+ var version = "1.1.11";
38
39
  var presets = {
39
40
  simple: {
40
41
  "kubb.config": `
@@ -67,15 +68,15 @@ async function init({ spinner: spinner2, preset = "simple", logLevel = "silent",
67
68
  const presetMeta = presets[preset];
68
69
  const path = pathParser__default.default.resolve(process.cwd(), "./kubb.config.js");
69
70
  const installCommand = packageManager === "npm" ? "install" : "add";
70
- spinner2.start(`\u{1F4C0} Writing \`kubb.config.js\` ${pc2__default.default.dim(path)}`);
71
+ spinner2.start(`\u{1F4C0} Writing \`kubb.config.js\` ${pc3__default.default.dim(path)}`);
71
72
  await core.write(presetMeta["kubb.config"], path);
72
- spinner2.succeed(`\u{1F4C0} Wrote \`kubb.config.js\` ${pc2__default.default.dim(path)}`);
73
+ spinner2.succeed(`\u{1F4C0} Wrote \`kubb.config.js\` ${pc3__default.default.dim(path)}`);
73
74
  const data = await Promise.all([
74
75
  execa.$`npm init es6 -y`,
75
76
  ...presetMeta.packages.map(async (pack) => {
76
- spinner2.start(`\u{1F4C0} Installing ${pc2__default.default.dim(pack)}`);
77
+ spinner2.start(`\u{1F4C0} Installing ${pc3__default.default.dim(pack)}`);
77
78
  const { stdout } = await execa.$({ preferLocal: false })`${packageManager} ${installCommand} ${pack}`;
78
- spinner2.succeed(`\u{1F4C0} Installed ${pc2__default.default.dim(pack)}`);
79
+ spinner2.succeed(`\u{1F4C0} Installed ${pc3__default.default.dim(pack)}`);
79
80
  return stdout;
80
81
  })
81
82
  ]);
@@ -83,7 +84,7 @@ async function init({ spinner: spinner2, preset = "simple", logLevel = "silent",
83
84
  data.forEach((text) => console.log(text));
84
85
  }
85
86
  } catch (error) {
86
- spinner2.fail(pc2__default.default.red(`Something went wrong
87
+ spinner2.fail(pc3__default.default.red(`Something went wrong
87
88
 
88
89
  ${error?.message}`));
89
90
  }
@@ -99,18 +100,42 @@ function parseHrtimeToSeconds(hrtime) {
99
100
  function parseText(baseText, config, logLevel = "silent") {
100
101
  return `${baseText}${config[logLevel] || ""}`;
101
102
  }
103
+ var OraWritable = class extends stream.Writable {
104
+ command;
105
+ spinner;
106
+ constructor(spinner2, command, opts) {
107
+ super(opts);
108
+ this.command = command;
109
+ this.spinner = spinner2;
110
+ }
111
+ _write(chunk, _encoding, callback) {
112
+ this.spinner.suffixText = `
113
+
114
+ ${pc3__default.default.bold(pc3__default.default.blue(this.command))}: ${chunk?.toString()}`;
115
+ callback();
116
+ }
117
+ };
102
118
 
103
119
  // src/run.ts
104
120
  async function run({ config, options, spinner: spinner2 }) {
105
121
  const hrstart = process.hrtime();
106
- const logger = {
107
- log(message, logLevel) {
108
- if (logLevel === "error") {
109
- spinner2.fail(message);
122
+ const [log] = core.throttle((message, { logLevel, params }) => {
123
+ if (logLevel === "error") {
124
+ spinner2.fail(pc3__default.default.red(`${message}
125
+
126
+ ` || `Something went wrong
127
+
128
+ `));
129
+ } else if (logLevel === "info") {
130
+ if (message) {
131
+ spinner2.text = message;
110
132
  } else {
111
- spinner2.info(message);
133
+ spinner2.text = `\u{1FA82} Executing ${params?.hookName || "unknown"}(${pc3__default.default.yellow(params?.pluginName || "unknown")})`;
112
134
  }
113
- },
135
+ }
136
+ }, 100);
137
+ const logger = {
138
+ log,
114
139
  spinner: spinner2
115
140
  };
116
141
  const onDone = async (hooks, logLevel) => {
@@ -124,15 +149,21 @@ async function run({ config, options, spinner: spinner2 }) {
124
149
  commands = hooks.done;
125
150
  }
126
151
  const promises = commands.map(async (command) => {
152
+ const oraWritable = new OraWritable(spinner2, command);
127
153
  const [cmd, ..._args] = [...stringArgv.parseArgsStringToArgv(command)];
128
- spinner2.start(parseText(`\u{1FA82} Executing hooks(${pc2__default.default.yellow("done")})`, { info: ` ${pc2__default.default.dim(command)}` }, logLevel));
129
- const { stdout } = await execa.execa(cmd, _args);
130
- spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc2__default.default.yellow("done")})`, { info: ` ${pc2__default.default.dim(command)}` }, logLevel));
154
+ spinner2.start(parseText(`\u{1FA82} Executing hooks(${pc3__default.default.yellow("done")})`, { info: ` ${pc3__default.default.dim(command)}` }, logLevel));
155
+ const { stdout } = await execa.execa(cmd, _args, {}).pipeStdout(oraWritable);
156
+ spinner2.suffixText = "";
157
+ oraWritable.destroy();
131
158
  if (logLevel === "info") {
159
+ spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc3__default.default.yellow("done")})`, { info: ` ${pc3__default.default.dim(command)}` }, logLevel));
132
160
  console.log(stdout);
133
161
  }
134
162
  });
135
163
  await Promise.all(promises);
164
+ if (logLevel === "silent") {
165
+ spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc3__default.default.yellow("done")})`, {}, logLevel));
166
+ }
136
167
  };
137
168
  const printSummary = (pluginManager, status) => {
138
169
  const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrstart));
@@ -153,26 +184,26 @@ async function run({ config, options, spinner: spinner2 }) {
153
184
  return 0;
154
185
  });
155
186
  const meta = {
156
- plugins: status === "success" ? `${pc2__default.default.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total` : `${pc2__default.default.red(`${pluginsCount - buildStartPlugins.length} failed`)}, ${pluginsCount} total`,
187
+ plugins: status === "success" ? `${pc3__default.default.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total` : `${pc3__default.default.red(`${pluginsCount - buildStartPlugins.length} failed`)}, ${pluginsCount} total`,
157
188
  filesCreated: files.length,
158
- time: pc2__default.default.yellow(`${elapsedSeconds}s`),
189
+ time: pc3__default.default.yellow(`${elapsedSeconds}s`),
159
190
  output: pathParser__default.default.resolve(config.root, config.output.path)
160
191
  };
161
192
  console.log(`
162
- ${pc2__default.default.bold("Plugins:")} ${meta.plugins}
163
- ${pc2__default.default.bold("Generated:")} ${meta.filesCreated} files
164
- ${pc2__default.default.bold("Time:")} ${meta.time}
165
- ${pc2__default.default.bold("Output:")} ${meta.output}
193
+ ${pc3__default.default.bold("Plugins:")} ${meta.plugins}
194
+ ${pc3__default.default.bold("Generated:")} ${meta.filesCreated} files
195
+ ${pc3__default.default.bold("Time:")} ${meta.time}
196
+ ${pc3__default.default.bold("Output:")} ${meta.output}
166
197
  `);
167
198
  if (options.debug) {
168
- console.log(`${pc2__default.default.bold("Generated files:")}`);
169
- console.log(`${files.map((file) => `${pc2__default.default.blue(file.meta?.pluginName)} ${file.path}`).join("\n")}`);
199
+ console.log(`${pc3__default.default.bold("Generated files:")}`);
200
+ console.log(`${files.map((file) => `${pc3__default.default.blue(file.meta?.pluginName)} ${file.path}`).join("\n")}`);
170
201
  }
171
202
  };
172
203
  const printErrors = (error) => {
173
204
  const pe = new PrettyError__default.default();
174
205
  if (options.debug) {
175
- spinner2.fail(pc2__default.default.red(`Something went wrong
206
+ spinner2.fail(pc3__default.default.red(`Something went wrong
176
207
 
177
208
  `));
178
209
  const causedError = error?.cause;
@@ -181,7 +212,7 @@ ${pc2__default.default.bold("Generated:")} ${meta.filesCreated} files
181
212
  console.log(pe.render(causedError));
182
213
  }
183
214
  } else {
184
- spinner2.fail(pc2__default.default.red(`Something went wrong
215
+ spinner2.fail(pc3__default.default.red(`Something went wrong
185
216
 
186
217
  ${error?.message}`));
187
218
  }
@@ -190,7 +221,7 @@ ${error?.message}`));
190
221
  const { root, ...userConfig } = config;
191
222
  const logLevel = options.logLevel ?? userConfig.logLevel ?? "silent";
192
223
  const inputPath = options.input ?? userConfig.input.path;
193
- spinner2.start(parseText(`\u{1F680} Building`, { info: `(${pc2__default.default.dim(inputPath)})` }, logLevel));
224
+ spinner2.start(parseText(`\u{1F680} Building`, { info: `(${pc3__default.default.dim(inputPath)})` }, logLevel));
194
225
  const output = await core.build({
195
226
  config: {
196
227
  root: process.cwd(),
@@ -207,7 +238,7 @@ ${error?.message}`));
207
238
  },
208
239
  logger
209
240
  });
210
- spinner2.succeed(parseText(`\u{1F680} Build completed`, { info: `(${pc2__default.default.dim(inputPath)})` }, logLevel));
241
+ spinner2.succeed(parseText(`\u{1F680} Build completed`, { info: `(${pc3__default.default.dim(inputPath)})` }, logLevel));
211
242
  await onDone(config.hooks, logLevel);
212
243
  printSummary(output.pluginManager, "success");
213
244
  } catch (error) {
@@ -296,12 +327,12 @@ async function startWatcher(cb, options) {
296
327
  ignored
297
328
  });
298
329
  watcher.on("all", (type, file) => {
299
- spinner2.succeed(pc2__default.default.yellow(pc2__default.default.bold(`Change detected: ${type} ${file}`)));
330
+ spinner2.succeed(pc3__default.default.yellow(pc3__default.default.bold(`Change detected: ${type} ${file}`)));
300
331
  spinner2.spinner = "clock";
301
332
  try {
302
333
  cb(options.path);
303
334
  } catch (e) {
304
- spinner2.warn(pc2__default.default.red("Watcher failed"));
335
+ spinner2.warn(pc3__default.default.red("Watcher failed"));
305
336
  }
306
337
  });
307
338
  }
@@ -382,14 +413,14 @@ var program = new commander.Command(moduleName).description("Kubb").action(async
382
413
  }
383
414
  spinner.start("\u{1F4BE} Loading config");
384
415
  const result = await getCosmiConfig(moduleName, options.config);
385
- spinner.succeed(`\u{1F4BE} Config loaded(${pc2__default.default.dim(pathParser__default.default.relative(process.cwd(), result.filepath))})`);
416
+ spinner.succeed(`\u{1F4BE} Config loaded(${pc3__default.default.dim(pathParser__default.default.relative(process.cwd(), result.filepath))})`);
386
417
  if (options.watch) {
387
418
  const config = await getConfig(result, options);
388
419
  startWatcher(
389
420
  async (paths) => {
390
421
  await run({ config, spinner, options });
391
422
  spinner.spinner = "simpleDotsScrolling";
392
- spinner.start(pc2__default.default.yellow(pc2__default.default.bold(`Watching for changes in ${paths.join(" and ")}`)));
423
+ spinner.start(pc3__default.default.yellow(pc3__default.default.bold(`Watching for changes in ${paths.join(" and ")}`)));
393
424
  },
394
425
  {
395
426
  spinner,
package/dist/index.js CHANGED
@@ -3,11 +3,12 @@ import { createRequire } from 'module';
3
3
  import pathParser from 'node:path';
4
4
  import { Command, Option } from 'commander';
5
5
  import ora from 'ora';
6
- import pc2 from 'picocolors';
7
- import { write, build, ParallelPluginError, PluginError, isPromise } from '@kubb/core';
6
+ import pc3 from 'picocolors';
7
+ import { write, throttle, build, ParallelPluginError, PluginError, isPromise } from '@kubb/core';
8
8
  import { $, execa } from 'execa';
9
9
  import PrettyError from 'pretty-error';
10
10
  import { parseArgsStringToArgv } from 'string-argv';
11
+ import { Writable } from 'node:stream';
11
12
  import mod from 'node:module';
12
13
  import { pathToFileURL } from 'node:url';
13
14
  import { cosmiconfig } from 'cosmiconfig';
@@ -25,7 +26,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
25
26
  });
26
27
 
27
28
  // package.json
28
- var version = "1.1.9";
29
+ var version = "1.1.11";
29
30
  var presets = {
30
31
  simple: {
31
32
  "kubb.config": `
@@ -58,15 +59,15 @@ async function init({ spinner: spinner2, preset = "simple", logLevel = "silent",
58
59
  const presetMeta = presets[preset];
59
60
  const path = pathParser.resolve(process.cwd(), "./kubb.config.js");
60
61
  const installCommand = packageManager === "npm" ? "install" : "add";
61
- spinner2.start(`\u{1F4C0} Writing \`kubb.config.js\` ${pc2.dim(path)}`);
62
+ spinner2.start(`\u{1F4C0} Writing \`kubb.config.js\` ${pc3.dim(path)}`);
62
63
  await write(presetMeta["kubb.config"], path);
63
- spinner2.succeed(`\u{1F4C0} Wrote \`kubb.config.js\` ${pc2.dim(path)}`);
64
+ spinner2.succeed(`\u{1F4C0} Wrote \`kubb.config.js\` ${pc3.dim(path)}`);
64
65
  const data = await Promise.all([
65
66
  $`npm init es6 -y`,
66
67
  ...presetMeta.packages.map(async (pack) => {
67
- spinner2.start(`\u{1F4C0} Installing ${pc2.dim(pack)}`);
68
+ spinner2.start(`\u{1F4C0} Installing ${pc3.dim(pack)}`);
68
69
  const { stdout } = await $({ preferLocal: false })`${packageManager} ${installCommand} ${pack}`;
69
- spinner2.succeed(`\u{1F4C0} Installed ${pc2.dim(pack)}`);
70
+ spinner2.succeed(`\u{1F4C0} Installed ${pc3.dim(pack)}`);
70
71
  return stdout;
71
72
  })
72
73
  ]);
@@ -74,7 +75,7 @@ async function init({ spinner: spinner2, preset = "simple", logLevel = "silent",
74
75
  data.forEach((text) => console.log(text));
75
76
  }
76
77
  } catch (error) {
77
- spinner2.fail(pc2.red(`Something went wrong
78
+ spinner2.fail(pc3.red(`Something went wrong
78
79
 
79
80
  ${error?.message}`));
80
81
  }
@@ -90,18 +91,42 @@ function parseHrtimeToSeconds(hrtime) {
90
91
  function parseText(baseText, config, logLevel = "silent") {
91
92
  return `${baseText}${config[logLevel] || ""}`;
92
93
  }
94
+ var OraWritable = class extends Writable {
95
+ command;
96
+ spinner;
97
+ constructor(spinner2, command, opts) {
98
+ super(opts);
99
+ this.command = command;
100
+ this.spinner = spinner2;
101
+ }
102
+ _write(chunk, _encoding, callback) {
103
+ this.spinner.suffixText = `
104
+
105
+ ${pc3.bold(pc3.blue(this.command))}: ${chunk?.toString()}`;
106
+ callback();
107
+ }
108
+ };
93
109
 
94
110
  // src/run.ts
95
111
  async function run({ config, options, spinner: spinner2 }) {
96
112
  const hrstart = process.hrtime();
97
- const logger = {
98
- log(message, logLevel) {
99
- if (logLevel === "error") {
100
- spinner2.fail(message);
113
+ const [log] = throttle((message, { logLevel, params }) => {
114
+ if (logLevel === "error") {
115
+ spinner2.fail(pc3.red(`${message}
116
+
117
+ ` || `Something went wrong
118
+
119
+ `));
120
+ } else if (logLevel === "info") {
121
+ if (message) {
122
+ spinner2.text = message;
101
123
  } else {
102
- spinner2.info(message);
124
+ spinner2.text = `\u{1FA82} Executing ${params?.hookName || "unknown"}(${pc3.yellow(params?.pluginName || "unknown")})`;
103
125
  }
104
- },
126
+ }
127
+ }, 100);
128
+ const logger = {
129
+ log,
105
130
  spinner: spinner2
106
131
  };
107
132
  const onDone = async (hooks, logLevel) => {
@@ -115,15 +140,21 @@ async function run({ config, options, spinner: spinner2 }) {
115
140
  commands = hooks.done;
116
141
  }
117
142
  const promises = commands.map(async (command) => {
143
+ const oraWritable = new OraWritable(spinner2, command);
118
144
  const [cmd, ..._args] = [...parseArgsStringToArgv(command)];
119
- spinner2.start(parseText(`\u{1FA82} Executing hooks(${pc2.yellow("done")})`, { info: ` ${pc2.dim(command)}` }, logLevel));
120
- const { stdout } = await execa(cmd, _args);
121
- spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc2.yellow("done")})`, { info: ` ${pc2.dim(command)}` }, logLevel));
145
+ spinner2.start(parseText(`\u{1FA82} Executing hooks(${pc3.yellow("done")})`, { info: ` ${pc3.dim(command)}` }, logLevel));
146
+ const { stdout } = await execa(cmd, _args, {}).pipeStdout(oraWritable);
147
+ spinner2.suffixText = "";
148
+ oraWritable.destroy();
122
149
  if (logLevel === "info") {
150
+ spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc3.yellow("done")})`, { info: ` ${pc3.dim(command)}` }, logLevel));
123
151
  console.log(stdout);
124
152
  }
125
153
  });
126
154
  await Promise.all(promises);
155
+ if (logLevel === "silent") {
156
+ spinner2.succeed(parseText(`\u{1FA82} Executing hooks(${pc3.yellow("done")})`, {}, logLevel));
157
+ }
127
158
  };
128
159
  const printSummary = (pluginManager, status) => {
129
160
  const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrstart));
@@ -144,26 +175,26 @@ async function run({ config, options, spinner: spinner2 }) {
144
175
  return 0;
145
176
  });
146
177
  const meta = {
147
- plugins: status === "success" ? `${pc2.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total` : `${pc2.red(`${pluginsCount - buildStartPlugins.length} failed`)}, ${pluginsCount} total`,
178
+ plugins: status === "success" ? `${pc3.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total` : `${pc3.red(`${pluginsCount - buildStartPlugins.length} failed`)}, ${pluginsCount} total`,
148
179
  filesCreated: files.length,
149
- time: pc2.yellow(`${elapsedSeconds}s`),
180
+ time: pc3.yellow(`${elapsedSeconds}s`),
150
181
  output: pathParser.resolve(config.root, config.output.path)
151
182
  };
152
183
  console.log(`
153
- ${pc2.bold("Plugins:")} ${meta.plugins}
154
- ${pc2.bold("Generated:")} ${meta.filesCreated} files
155
- ${pc2.bold("Time:")} ${meta.time}
156
- ${pc2.bold("Output:")} ${meta.output}
184
+ ${pc3.bold("Plugins:")} ${meta.plugins}
185
+ ${pc3.bold("Generated:")} ${meta.filesCreated} files
186
+ ${pc3.bold("Time:")} ${meta.time}
187
+ ${pc3.bold("Output:")} ${meta.output}
157
188
  `);
158
189
  if (options.debug) {
159
- console.log(`${pc2.bold("Generated files:")}`);
160
- console.log(`${files.map((file) => `${pc2.blue(file.meta?.pluginName)} ${file.path}`).join("\n")}`);
190
+ console.log(`${pc3.bold("Generated files:")}`);
191
+ console.log(`${files.map((file) => `${pc3.blue(file.meta?.pluginName)} ${file.path}`).join("\n")}`);
161
192
  }
162
193
  };
163
194
  const printErrors = (error) => {
164
195
  const pe = new PrettyError();
165
196
  if (options.debug) {
166
- spinner2.fail(pc2.red(`Something went wrong
197
+ spinner2.fail(pc3.red(`Something went wrong
167
198
 
168
199
  `));
169
200
  const causedError = error?.cause;
@@ -172,7 +203,7 @@ ${pc2.bold("Generated:")} ${meta.filesCreated} files
172
203
  console.log(pe.render(causedError));
173
204
  }
174
205
  } else {
175
- spinner2.fail(pc2.red(`Something went wrong
206
+ spinner2.fail(pc3.red(`Something went wrong
176
207
 
177
208
  ${error?.message}`));
178
209
  }
@@ -181,7 +212,7 @@ ${error?.message}`));
181
212
  const { root, ...userConfig } = config;
182
213
  const logLevel = options.logLevel ?? userConfig.logLevel ?? "silent";
183
214
  const inputPath = options.input ?? userConfig.input.path;
184
- spinner2.start(parseText(`\u{1F680} Building`, { info: `(${pc2.dim(inputPath)})` }, logLevel));
215
+ spinner2.start(parseText(`\u{1F680} Building`, { info: `(${pc3.dim(inputPath)})` }, logLevel));
185
216
  const output = await build({
186
217
  config: {
187
218
  root: process.cwd(),
@@ -198,7 +229,7 @@ ${error?.message}`));
198
229
  },
199
230
  logger
200
231
  });
201
- spinner2.succeed(parseText(`\u{1F680} Build completed`, { info: `(${pc2.dim(inputPath)})` }, logLevel));
232
+ spinner2.succeed(parseText(`\u{1F680} Build completed`, { info: `(${pc3.dim(inputPath)})` }, logLevel));
202
233
  await onDone(config.hooks, logLevel);
203
234
  printSummary(output.pluginManager, "success");
204
235
  } catch (error) {
@@ -287,12 +318,12 @@ async function startWatcher(cb, options) {
287
318
  ignored
288
319
  });
289
320
  watcher.on("all", (type, file) => {
290
- spinner2.succeed(pc2.yellow(pc2.bold(`Change detected: ${type} ${file}`)));
321
+ spinner2.succeed(pc3.yellow(pc3.bold(`Change detected: ${type} ${file}`)));
291
322
  spinner2.spinner = "clock";
292
323
  try {
293
324
  cb(options.path);
294
325
  } catch (e) {
295
- spinner2.warn(pc2.red("Watcher failed"));
326
+ spinner2.warn(pc3.red("Watcher failed"));
296
327
  }
297
328
  });
298
329
  }
@@ -373,14 +404,14 @@ var program = new Command(moduleName).description("Kubb").action(async (options)
373
404
  }
374
405
  spinner.start("\u{1F4BE} Loading config");
375
406
  const result = await getCosmiConfig(moduleName, options.config);
376
- spinner.succeed(`\u{1F4BE} Config loaded(${pc2.dim(pathParser.relative(process.cwd(), result.filepath))})`);
407
+ spinner.succeed(`\u{1F4BE} Config loaded(${pc3.dim(pathParser.relative(process.cwd(), result.filepath))})`);
377
408
  if (options.watch) {
378
409
  const config = await getConfig(result, options);
379
410
  startWatcher(
380
411
  async (paths) => {
381
412
  await run({ config, spinner, options });
382
413
  spinner.spinner = "simpleDotsScrolling";
383
- spinner.start(pc2.yellow(pc2.bold(`Watching for changes in ${paths.join(" and ")}`)));
414
+ spinner.start(pc3.yellow(pc3.bold(`Watching for changes in ${paths.join(" and ")}`)));
384
415
  },
385
416
  {
386
417
  spinner,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/cli",
3
- "version": "1.1.9",
3
+ "version": "1.1.11",
4
4
  "description": "Generator cli",
5
5
  "keywords": [
6
6
  "typescript",
@@ -43,15 +43,15 @@
43
43
  "string-argv": "^0.3.2",
44
44
  "ts-node": "^10.9.1",
45
45
  "yaml": "^2.3.1",
46
- "@kubb/core": "1.1.9"
46
+ "@kubb/core": "1.1.11"
47
47
  },
48
48
  "devDependencies": {
49
- "@types/node": "^20.2.6",
49
+ "@types/node": "^20.3.0",
50
50
  "tsup": "^6.7.0",
51
51
  "typescript": "^5.1.3",
52
+ "@kubb/swagger": "1.1.11",
52
53
  "@kubb/ts-config": "0.1.0",
53
- "@kubb/tsup-config": "1.1.8",
54
- "@kubb/swagger": "1.1.9"
54
+ "@kubb/tsup-config": "1.1.8"
55
55
  },
56
56
  "packageManager": "pnpm@8.3.0",
57
57
  "engines": {
@@ -67,7 +67,7 @@
67
67
  "build": "tsup",
68
68
  "clean": "rimraf ./dist",
69
69
  "lint": "eslint \"**/*.{ts,tsx}\"",
70
- "lint-fix": "eslint \"**/*.{ts,tsx}\" --quiet --fix",
70
+ "lint-fix": "bun run lint --quiet --fix",
71
71
  "release": "pnpm publish --no-git-check",
72
72
  "start": "tsup --watch",
73
73
  "test": "vitest --passWithNoTests",
package/src/run.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import pathParser from 'node:path'
2
2
 
3
- import { build, ParallelPluginError, PluginError } from '@kubb/core'
3
+ import { build, throttle, ParallelPluginError, PluginError } from '@kubb/core'
4
4
 
5
5
  import { execa } from 'execa'
6
6
  import pc from 'picocolors'
@@ -12,6 +12,7 @@ import { parseText } from './utils/parseText.ts'
12
12
 
13
13
  import type { BuildOutput, CLIOptions, KubbConfig, Logger, LogLevel } from '@kubb/core'
14
14
  import type { Ora } from 'ora'
15
+ import { OraWritable } from './utils/OraWritable.ts'
15
16
 
16
17
  type RunProps = {
17
18
  config: KubbConfig
@@ -21,14 +22,20 @@ type RunProps = {
21
22
 
22
23
  export async function run({ config, options, spinner }: RunProps): Promise<void> {
23
24
  const hrstart = process.hrtime()
24
- const logger: Logger = {
25
- log(message, logLevel) {
26
- if (logLevel === 'error') {
27
- spinner.fail(message)
25
+ const [log] = throttle<void, Parameters<Logger['log']>>((message, { logLevel, params }) => {
26
+ if (logLevel === 'error') {
27
+ spinner.fail(pc.red(`${message}\n\n` || `Something went wrong\n\n`))
28
+ } else if (logLevel === 'info') {
29
+ if (message) {
30
+ spinner.text = message
28
31
  } else {
29
- spinner.info(message)
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
33
+ spinner.text = `🪂 Executing ${params?.hookName || 'unknown'}(${pc.yellow(params?.pluginName || 'unknown')})`
30
34
  }
31
- },
35
+ }
36
+ }, 100)
37
+ const logger: Logger = {
38
+ log,
32
39
  spinner,
33
40
  }
34
41
 
@@ -45,17 +52,26 @@ export async function run({ config, options, spinner }: RunProps): Promise<void>
45
52
  }
46
53
 
47
54
  const promises = commands.map(async (command) => {
55
+ const oraWritable = new OraWritable(spinner, command)
48
56
  const [cmd, ..._args] = [...parseArgsStringToArgv(command)]
49
57
  spinner.start(parseText(`🪂 Executing hooks(${pc.yellow('done')})`, { info: ` ${pc.dim(command)}` }, logLevel))
50
- const { stdout } = await execa(cmd, _args)
51
- spinner.succeed(parseText(`🪂 Executing hooks(${pc.yellow('done')})`, { info: ` ${pc.dim(command)}` }, logLevel))
58
+
59
+ const { stdout } = await execa(cmd, _args, {}).pipeStdout!(oraWritable)
60
+ spinner.suffixText = ''
61
+ oraWritable.destroy()
52
62
 
53
63
  if (logLevel === 'info') {
64
+ spinner.succeed(parseText(`🪂 Executing hooks(${pc.yellow('done')})`, { info: ` ${pc.dim(command)}` }, logLevel))
65
+
54
66
  console.log(stdout)
55
67
  }
56
68
  })
57
69
 
58
70
  await Promise.all(promises)
71
+
72
+ if (logLevel === 'silent') {
73
+ spinner.succeed(parseText(`🪂 Executing hooks(${pc.yellow('done')})`, {}, logLevel))
74
+ }
59
75
  }
60
76
 
61
77
  const printSummary = (pluginManager: BuildOutput['pluginManager'], status: 'success' | 'failed') => {
@@ -0,0 +1,20 @@
1
+ import type { WritableOptions } from 'node:stream'
2
+ import { Writable } from 'node:stream'
3
+ import type { Ora } from 'ora'
4
+ import pc from 'picocolors'
5
+
6
+ export class OraWritable extends Writable {
7
+ public command: string
8
+ public spinner: Ora
9
+ constructor(spinner: Ora, command: string, opts?: WritableOptions) {
10
+ super(opts)
11
+
12
+ this.command = command
13
+ this.spinner = spinner
14
+ }
15
+ _write(chunk: any, _encoding: NodeJS.BufferEncoding, callback: (error?: Error | null) => void) {
16
+ this.spinner.suffixText = `\n\n${pc.bold(pc.blue(this.command))}: ${chunk?.toString()}`
17
+
18
+ callback()
19
+ }
20
+ }
@@ -5,3 +5,4 @@ export * from './getCosmiConfig.ts'
5
5
  export * from './importModule.ts'
6
6
  export * from './parseHrtimeToSeconds.ts'
7
7
  export * from './parseText.ts'
8
+ export * from './OraWritable.ts'