@kubb/cli 5.0.0-alpha.3 → 5.0.0-alpha.31

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 (99) hide show
  1. package/dist/{agent-EkZmkNy6.cjs → agent-BB0QeA15.cjs} +5 -5
  2. package/dist/{agent-EkZmkNy6.cjs.map → agent-BB0QeA15.cjs.map} +1 -1
  3. package/dist/{agent-C0bAlvWn.js → agent-BVZM_vFr.js} +5 -5
  4. package/dist/{agent-C0bAlvWn.js.map → agent-BVZM_vFr.js.map} +1 -1
  5. package/dist/{agent-L50VNhXv.js → agent-DTyw-mt7.js} +4 -4
  6. package/dist/{agent-L50VNhXv.js.map → agent-DTyw-mt7.js.map} +1 -1
  7. package/dist/{agent-C6o_6GSJ.cjs → agent-DpzeyN1s.cjs} +4 -4
  8. package/dist/{agent-C6o_6GSJ.cjs.map → agent-DpzeyN1s.cjs.map} +1 -1
  9. package/dist/{constants-BTUap0zs.cjs → constants-D0XHAHeZ.cjs} +78 -8
  10. package/dist/constants-D0XHAHeZ.cjs.map +1 -0
  11. package/dist/{constants-CM3dJzjK.js → constants-DJM9zCXm.js} +73 -9
  12. package/dist/constants-DJM9zCXm.js.map +1 -0
  13. package/dist/define-Bdn8j5VM.cjs +54 -0
  14. package/dist/define-Bdn8j5VM.cjs.map +1 -0
  15. package/dist/define-Ctii4bel.js +43 -0
  16. package/dist/define-Ctii4bel.js.map +1 -0
  17. package/dist/{errors-DBW0N9w4.cjs → errors-CLCjoSg0.cjs} +22 -6
  18. package/dist/errors-CLCjoSg0.cjs.map +1 -0
  19. package/dist/errors-CjPmyZHy.js +43 -0
  20. package/dist/errors-CjPmyZHy.js.map +1 -0
  21. package/dist/{generate-vf3X_h_u.js → generate-BG0VC_Ui.js} +203 -110
  22. package/dist/generate-BG0VC_Ui.js.map +1 -0
  23. package/dist/{generate-C0Lnz3VU.cjs → generate-Bsie7eRa.cjs} +202 -109
  24. package/dist/generate-Bsie7eRa.cjs.map +1 -0
  25. package/dist/{generate-B1et6yyL.cjs → generate-CJimoNEf.cjs} +3 -3
  26. package/dist/{generate-B1et6yyL.cjs.map → generate-CJimoNEf.cjs.map} +1 -1
  27. package/dist/{generate-DnmnwWSE.js → generate-CUi9CASV.js} +3 -3
  28. package/dist/{generate-DnmnwWSE.js.map → generate-CUi9CASV.js.map} +1 -1
  29. package/dist/index.cjs +49 -21
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +49 -21
  33. package/dist/index.js.map +1 -1
  34. package/dist/{init-CMu6JTPI.js → init-BR3GdRMJ.js} +4 -4
  35. package/dist/{init-CMu6JTPI.js.map → init-BR3GdRMJ.js.map} +1 -1
  36. package/dist/{init-hmolV6B4.cjs → init-BlriFVH6.cjs} +19 -4
  37. package/dist/init-BlriFVH6.cjs.map +1 -0
  38. package/dist/{init-BvVLmKcJ.cjs → init-CgARwpTl.cjs} +4 -4
  39. package/dist/{init-BvVLmKcJ.cjs.map → init-CgARwpTl.cjs.map} +1 -1
  40. package/dist/{init-C-InrmSY.js → init-Y1TNCdzh.js} +19 -4
  41. package/dist/init-Y1TNCdzh.js.map +1 -0
  42. package/dist/{mcp-DPU081OK.cjs → mcp-ChTFDc4I.cjs} +4 -4
  43. package/dist/{mcp-DPU081OK.cjs.map → mcp-ChTFDc4I.cjs.map} +1 -1
  44. package/dist/{mcp-D2SHEg_d.js → mcp-CxuctqmK.js} +3 -3
  45. package/dist/{mcp-D2SHEg_d.js.map → mcp-CxuctqmK.js.map} +1 -1
  46. package/dist/{mcp-ChHFPRzD.cjs → mcp-jMZ56bqT.cjs} +3 -3
  47. package/dist/{mcp-ChHFPRzD.cjs.map → mcp-jMZ56bqT.cjs.map} +1 -1
  48. package/dist/{mcp-BwXRVY1N.js → mcp-r-ZJNccL.js} +4 -4
  49. package/dist/{mcp-BwXRVY1N.js.map → mcp-r-ZJNccL.js.map} +1 -1
  50. package/dist/package-A_drmC2H.js +6 -0
  51. package/dist/package-A_drmC2H.js.map +1 -0
  52. package/dist/{package-BsZ_vsP1.cjs → package-NYSJaof-.cjs} +2 -2
  53. package/dist/package-NYSJaof-.cjs.map +1 -0
  54. package/dist/{shell-7HPrTCJ5.cjs → shell-475fQKaX.cjs} +8 -3
  55. package/dist/shell-475fQKaX.cjs.map +1 -0
  56. package/dist/{shell-DqqWsHCD.js → shell-DLzN4fRo.js} +8 -3
  57. package/dist/shell-DLzN4fRo.js.map +1 -0
  58. package/dist/{telemetry-DxiR7clS.js → telemetry-CBISr5w4.js} +48 -6
  59. package/dist/telemetry-CBISr5w4.js.map +1 -0
  60. package/dist/{telemetry-Cn9X1I5B.cjs → telemetry-YO-uwAbf.cjs} +48 -6
  61. package/dist/telemetry-YO-uwAbf.cjs.map +1 -0
  62. package/dist/{validate-Bbrn3Q-A.cjs → validate-B-LfVNlS.cjs} +3 -3
  63. package/dist/{validate-Bbrn3Q-A.cjs.map → validate-B-LfVNlS.cjs.map} +1 -1
  64. package/dist/{validate-BSaNWrhu.cjs → validate-BTUmWQOM.cjs} +4 -4
  65. package/dist/{validate-BSaNWrhu.cjs.map → validate-BTUmWQOM.cjs.map} +1 -1
  66. package/dist/{validate-l8vLmwKA.js → validate-CIS8nJdd.js} +3 -3
  67. package/dist/{validate-l8vLmwKA.js.map → validate-CIS8nJdd.js.map} +1 -1
  68. package/dist/{validate--6d6ZZTO.js → validate-CyJP7vy1.js} +4 -4
  69. package/dist/{validate--6d6ZZTO.js.map → validate-CyJP7vy1.js.map} +1 -1
  70. package/package.json +6 -6
  71. package/src/constants.ts +57 -10
  72. package/src/index.ts +10 -12
  73. package/src/loggers/clackLogger.ts +30 -22
  74. package/src/loggers/fileSystemLogger.ts +3 -1
  75. package/src/runners/generate.ts +37 -44
  76. package/src/types.ts +11 -0
  77. package/src/utils/flags.ts +10 -0
  78. package/src/utils/getCosmiConfig.ts +6 -0
  79. package/dist/constants-BTUap0zs.cjs.map +0 -1
  80. package/dist/constants-CM3dJzjK.js.map +0 -1
  81. package/dist/define--M_JMcDC.js +0 -25
  82. package/dist/define--M_JMcDC.js.map +0 -1
  83. package/dist/define-D6Kfm7-Z.cjs +0 -36
  84. package/dist/define-D6Kfm7-Z.cjs.map +0 -1
  85. package/dist/errors-6mF_WKxg.js +0 -27
  86. package/dist/errors-6mF_WKxg.js.map +0 -1
  87. package/dist/errors-DBW0N9w4.cjs.map +0 -1
  88. package/dist/generate-C0Lnz3VU.cjs.map +0 -1
  89. package/dist/generate-vf3X_h_u.js.map +0 -1
  90. package/dist/init-C-InrmSY.js.map +0 -1
  91. package/dist/init-hmolV6B4.cjs.map +0 -1
  92. package/dist/package-BsZ_vsP1.cjs.map +0 -1
  93. package/dist/package-iZbDdtad.js +0 -6
  94. package/dist/package-iZbDdtad.js.map +0 -1
  95. package/dist/shell-7HPrTCJ5.cjs.map +0 -1
  96. package/dist/shell-DqqWsHCD.js.map +0 -1
  97. package/dist/telemetry-Cn9X1I5B.cjs.map +0 -1
  98. package/dist/telemetry-DxiR7clS.js.map +0 -1
  99. package/src/utils/getIntro.ts +0 -1
@@ -1,9 +1,9 @@
1
1
  const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
- const require_errors = require("./errors-DBW0N9w4.cjs");
3
- const require_telemetry = require("./telemetry-Cn9X1I5B.cjs");
4
- const require_shell = require("./shell-7HPrTCJ5.cjs");
5
- const require_package = require("./package-BsZ_vsP1.cjs");
6
- const require_constants = require("./constants-BTUap0zs.cjs");
2
+ const require_errors = require("./errors-CLCjoSg0.cjs");
3
+ const require_telemetry = require("./telemetry-YO-uwAbf.cjs");
4
+ const require_shell = require("./shell-475fQKaX.cjs");
5
+ const require_package = require("./package-NYSJaof-.cjs");
6
+ const require_constants = require("./constants-D0XHAHeZ.cjs");
7
7
  let node_util = require("node:util");
8
8
  let node_events = require("node:events");
9
9
  let node_crypto = require("node:crypto");
@@ -22,12 +22,19 @@ let cosmiconfig = require("cosmiconfig");
22
22
  let jiti = require("jiti");
23
23
  //#region ../../internals/utils/src/asyncEventEmitter.ts
24
24
  /**
25
- * A typed EventEmitter that awaits all async listeners before resolving.
25
+ * Typed `EventEmitter` that awaits all async listeners before resolving.
26
26
  * Wraps Node's `EventEmitter` with full TypeScript event-map inference.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const emitter = new AsyncEventEmitter<{ build: [name: string] }>()
31
+ * emitter.on('build', async (name) => { console.log(name) })
32
+ * await emitter.emit('build', 'petstore') // all listeners awaited
33
+ * ```
27
34
  */
28
35
  var AsyncEventEmitter = class {
29
36
  /**
30
- * `maxListener` controls the maximum number of listeners per event before Node emits a memory-leak warning.
37
+ * Maximum number of listeners per event before Node emits a memory-leak warning.
31
38
  * @default 10
32
39
  */
33
40
  constructor(maxListener = 10) {
@@ -35,31 +42,48 @@ var AsyncEventEmitter = class {
35
42
  }
36
43
  #emitter = new node_events.EventEmitter();
37
44
  /**
38
- * Emits an event and awaits all registered listeners in parallel.
45
+ * Emits `eventName` and awaits all registered listeners sequentially.
39
46
  * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * await emitter.emit('build', 'petstore')
51
+ * ```
40
52
  */
41
53
  async emit(eventName, ...eventArgs) {
42
54
  const listeners = this.#emitter.listeners(eventName);
43
55
  if (listeners.length === 0) return;
44
- await Promise.all(listeners.map(async (listener) => {
56
+ for (const listener of listeners) try {
57
+ await listener(...eventArgs);
58
+ } catch (err) {
59
+ let serializedArgs;
45
60
  try {
46
- return await listener(...eventArgs);
47
- } catch (err) {
48
- let serializedArgs;
49
- try {
50
- serializedArgs = JSON.stringify(eventArgs);
51
- } catch {
52
- serializedArgs = String(eventArgs);
53
- }
54
- throw new Error(`Error in async listener for "${eventName}" with eventArgs ${serializedArgs}`, { cause: require_errors.toError(err) });
61
+ serializedArgs = JSON.stringify(eventArgs);
62
+ } catch {
63
+ serializedArgs = String(eventArgs);
55
64
  }
56
- }));
65
+ throw new Error(`Error in async listener for "${eventName}" with eventArgs ${serializedArgs}`, { cause: require_errors.toError(err) });
66
+ }
57
67
  }
58
- /** Registers a persistent listener for the given event. */
68
+ /**
69
+ * Registers a persistent listener for `eventName`.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * emitter.on('build', async (name) => { console.log(name) })
74
+ * ```
75
+ */
59
76
  on(eventName, handler) {
60
77
  this.#emitter.on(eventName, handler);
61
78
  }
62
- /** Registers a one-shot listener that removes itself after the first invocation. */
79
+ /**
80
+ * Registers a one-shot listener that removes itself after the first invocation.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * emitter.onOnce('build', async (name) => { console.log(name) })
85
+ * ```
86
+ */
63
87
  onOnce(eventName, handler) {
64
88
  const wrapper = (...args) => {
65
89
  this.off(eventName, wrapper);
@@ -67,11 +91,25 @@ var AsyncEventEmitter = class {
67
91
  };
68
92
  this.on(eventName, wrapper);
69
93
  }
70
- /** Removes a previously registered listener. */
94
+ /**
95
+ * Removes a previously registered listener.
96
+ *
97
+ * @example
98
+ * ```ts
99
+ * emitter.off('build', handler)
100
+ * ```
101
+ */
71
102
  off(eventName, handler) {
72
103
  this.#emitter.off(eventName, handler);
73
104
  }
74
- /** Removes all listeners from every event channel. */
105
+ /**
106
+ * Removes all listeners from every event channel.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * emitter.removeAll()
111
+ * ```
112
+ */
75
113
  removeAll() {
76
114
  this.#emitter.removeAllListeners();
77
115
  }
@@ -79,8 +117,15 @@ var AsyncEventEmitter = class {
79
117
  //#endregion
80
118
  //#region ../../internals/utils/src/time.ts
81
119
  /**
82
- * Calculates elapsed time in milliseconds from a high-resolution start time.
83
- * Rounds to 2 decimal places to provide sub-millisecond precision without noise.
120
+ * Calculates elapsed time in milliseconds from a high-resolution `process.hrtime` start time.
121
+ * Rounds to 2 decimal places for sub-millisecond precision without noise.
122
+ *
123
+ * @example
124
+ * ```ts
125
+ * const start = process.hrtime()
126
+ * doWork()
127
+ * getElapsedMs(start) // 42.35
128
+ * ```
84
129
  */
85
130
  function getElapsedMs(hrStart) {
86
131
  const [seconds, nanoseconds] = process.hrtime(hrStart);
@@ -88,8 +133,14 @@ function getElapsedMs(hrStart) {
88
133
  return Math.round(ms * 100) / 100;
89
134
  }
90
135
  /**
91
- * Converts a millisecond duration into a human-readable string.
92
- * Adjusts units (ms, s, m s) based on the magnitude of the duration.
136
+ * Converts a millisecond duration into a human-readable string (`ms`, `s`, or `m s`).
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * formatMs(250) // '250ms'
141
+ * formatMs(1500) // '1.50s'
142
+ * formatMs(90000) // '1m 30.0s'
143
+ * ```
93
144
  */
94
145
  function formatMs(ms) {
95
146
  if (ms >= 6e4) return `${Math.floor(ms / 6e4)}m ${(ms % 6e4 / 1e3).toFixed(1)}s`;
@@ -97,7 +148,14 @@ function formatMs(ms) {
97
148
  return `${Math.round(ms)}ms`;
98
149
  }
99
150
  /**
100
- * Convenience helper: formats the elapsed time since `hrStart` in one step.
151
+ * Formats the elapsed time since `hrStart` as a human-readable string.
152
+ *
153
+ * @example
154
+ * ```ts
155
+ * const start = process.hrtime()
156
+ * doWork()
157
+ * formatHrtime(start) // '1.50s'
158
+ * ```
101
159
  */
102
160
  function formatHrtime(hrStart) {
103
161
  return formatMs(getElapsedMs(hrStart));
@@ -139,7 +197,9 @@ function gradient(colorStops, text) {
139
197
  return `\x1b[38;2;${Math.round(from.r + (to.r - from.r) * lt)};${Math.round(from.g + (to.g - from.g) * lt)};${Math.round(from.b + (to.b - from.b) * lt)}m${char}\x1b[0m`;
140
198
  }).join("");
141
199
  }
142
- /** ANSI color functions for each part of the Kubb mascot illustration. */
200
+ /**
201
+ * ANSI color functions for each part of the Kubb mascot illustration.
202
+ */
143
203
  const palette = {
144
204
  lid: hex("#F55A17"),
145
205
  woodTop: hex("#F5A217"),
@@ -150,7 +210,12 @@ const palette = {
150
210
  blush: hex("#FDA4AF")
151
211
  };
152
212
  /**
153
- * Generates the Kubb mascot welcome banner.
213
+ * Generates the Kubb mascot welcome banner as an ANSI-colored string.
214
+ *
215
+ * @example
216
+ * ```ts
217
+ * console.log(getIntro({ title: 'kubb.config.ts', description: 'generating…', version: '5.0.0', areEyesOpen: true }))
218
+ * ```
154
219
  */
155
220
  function getIntro({ title, description, version, areEyesOpen }) {
156
221
  const kubbVersion = gradient([
@@ -168,7 +233,13 @@ function getIntro({ title, description, version, areEyesOpen }) {
168
233
  ${palette.woodBase("▀▀▀▀▀▀▀▀▀▀▀▀▀")}
169
234
  `;
170
235
  }
171
- /** ANSI color names available for terminal output. */
236
+ /** ANSI color names available for deterministic terminal coloring.
237
+ *
238
+ * @example
239
+ * ```ts
240
+ * const color = randomColors[2] // 'green'
241
+ * ```
242
+ */
172
243
  const randomColors = [
173
244
  "black",
174
245
  "red",
@@ -181,15 +252,27 @@ const randomColors = [
181
252
  "gray"
182
253
  ];
183
254
  /**
184
- * Returns the text wrapped in a deterministic ANSI color derived from the text's SHA-256 hash.
255
+ * Wraps `text` in a deterministic ANSI color derived from the text's SHA-256 hash.
256
+ *
257
+ * @example
258
+ * ```ts
259
+ * randomCliColor('petstore') // '\x1b[33m' + 'petstore' + '\x1b[39m' (always the same color for 'petstore')
260
+ * ```
185
261
  */
186
262
  function randomCliColor(text) {
187
263
  if (!text) return "";
188
264
  return (0, node_util.styleText)(randomColors[(0, node_crypto.createHash)("sha256").update(text).digest().readUInt32BE(0) % randomColors.length] ?? "white", text);
189
265
  }
190
266
  /**
191
- * Formats a millisecond duration with an ANSI color based on thresholds:
192
- * green 500 ms · yellow 1 000 ms · red > 1 000 ms
267
+ * Formats a millisecond duration with a threshold-based ANSI color.
268
+ * `≤ 500 ms` → green · `≤ 1 000 ms` → yellow · `> 1 000 ms` → red.
269
+ *
270
+ * @example
271
+ * ```ts
272
+ * formatMsWithColor(200) // '\x1b[32m200ms\x1b[39m'
273
+ * formatMsWithColor(800) // '\x1b[33m800ms\x1b[39m'
274
+ * formatMsWithColor(1500) // '\x1b[31m1.50s\x1b[39m'
275
+ * ```
193
276
  */
194
277
  function formatMsWithColor(ms) {
195
278
  const formatted = formatMs(ms);
@@ -201,24 +284,29 @@ function formatMsWithColor(ms) {
201
284
  //#region ../../internals/utils/src/fs.ts
202
285
  /**
203
286
  * Writes `data` to `path`, trimming leading/trailing whitespace before saving.
204
- * Skips the write and returns `undefined` when the trimmed content is empty or
205
- * identical to what is already on disk.
287
+ * Skips the write when the trimmed content is empty or identical to what is already on disk.
206
288
  * Creates any missing parent directories automatically.
207
- * When `sanity` is `true`, re-reads the file after writing and throws if the
208
- * content does not match.
289
+ * When `sanity` is `true`, re-reads the file after writing and throws if the content does not match.
290
+ *
291
+ * @example
292
+ * ```ts
293
+ * await write('./src/Pet.ts', source) // writes and returns trimmed content
294
+ * await write('./src/Pet.ts', source) // null — file unchanged
295
+ * await write('./src/Pet.ts', ' ') // null — empty content skipped
296
+ * ```
209
297
  */
210
298
  async function write(path, data, options = {}) {
211
299
  const trimmed = data.trim();
212
- if (trimmed === "") return void 0;
300
+ if (trimmed === "") return null;
213
301
  const resolved = (0, node_path.resolve)(path);
214
302
  if (typeof Bun !== "undefined") {
215
303
  const file = Bun.file(resolved);
216
- if ((await file.exists() ? await file.text() : null) === trimmed) return void 0;
304
+ if ((await file.exists() ? await file.text() : null) === trimmed) return null;
217
305
  await Bun.write(resolved, trimmed);
218
306
  return trimmed;
219
307
  }
220
308
  try {
221
- if (await (0, node_fs_promises.readFile)(resolved, { encoding: "utf-8" }) === trimmed) return void 0;
309
+ if (await (0, node_fs_promises.readFile)(resolved, { encoding: "utf-8" }) === trimmed) return null;
222
310
  } catch {}
223
311
  await (0, node_fs_promises.mkdir)((0, node_path.dirname)(resolved), { recursive: true });
224
312
  await (0, node_fs_promises.writeFile)(resolved, trimmed, { encoding: "utf-8" });
@@ -435,15 +523,20 @@ const clackLogger = (0, _kubb_core.defineLogger)({
435
523
  });
436
524
  context.on("version:new", (version, latestVersion) => {
437
525
  if (logLevel <= _kubb_core.logLevel.silent) return;
438
- _clack_prompts.box(`\`v${version}\` → \`v${latestVersion}\`
526
+ try {
527
+ _clack_prompts.box(`\`v${version}\` → \`v${latestVersion}\`
439
528
  Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
440
- width: "auto",
441
- formatBorder: (s) => (0, node_util.styleText)("yellow", s),
442
- rounded: true,
443
- withGuide: false,
444
- contentAlign: "center",
445
- titleAlign: "center"
446
- });
529
+ width: "auto",
530
+ formatBorder: (s) => (0, node_util.styleText)("yellow", s),
531
+ rounded: true,
532
+ withGuide: false,
533
+ contentAlign: "center",
534
+ titleAlign: "center"
535
+ });
536
+ } catch {
537
+ console.log(`Update available for Kubb: v${version} → v${latestVersion}`);
538
+ console.log("Run `npm install -g @kubb/cli` to update");
539
+ }
447
540
  });
448
541
  context.on("lifecycle:start", async (version) => {
449
542
  console.log(`\n${getIntro({
@@ -613,14 +706,18 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
613
706
  summary.unshift("\n");
614
707
  summary.push("\n");
615
708
  const borderColor = status === "success" ? "green" : "red";
616
- _clack_prompts.box(summary.join("\n"), getMessage(title), {
617
- width: "auto",
618
- formatBorder: (s) => (0, node_util.styleText)(borderColor, s),
619
- rounded: true,
620
- withGuide: false,
621
- contentAlign: "left",
622
- titleAlign: "center"
623
- });
709
+ try {
710
+ _clack_prompts.box(summary.join("\n"), getMessage(title), {
711
+ width: "auto",
712
+ formatBorder: (s) => (0, node_util.styleText)(borderColor, s),
713
+ rounded: true,
714
+ withGuide: false,
715
+ contentAlign: "left",
716
+ titleAlign: "center"
717
+ });
718
+ } catch {
719
+ console.log(summary.join("\n"));
720
+ }
624
721
  });
625
722
  context.on("lifecycle:end", () => {
626
723
  reset();
@@ -663,7 +760,7 @@ const fileSystemLogger = (0, _kubb_core.defineLogger)({
663
760
  files[pathName].push(`[${timestamp}]\n${log.logs.join("\n")}`);
664
761
  }
665
762
  }
666
- await Promise.all(Object.entries(files).map(([fileName, logs]) => write(fileName, logs.join("\n\n"))));
763
+ for (const [fileName, logs] of Object.entries(files)) await write(fileName, logs.join("\n\n"));
667
764
  return Object.keys(files);
668
765
  }
669
766
  context.on("info", (message, info) => {
@@ -1207,10 +1304,14 @@ async function getCosmiConfig(moduleName, config) {
1207
1304
  `.${moduleName}rc.yaml`,
1208
1305
  `.${moduleName}rc.yml`,
1209
1306
  `.${moduleName}rc.ts`,
1307
+ `.${moduleName}rc.mts`,
1308
+ `.${moduleName}rc.cts`,
1210
1309
  `.${moduleName}rc.js`,
1211
1310
  `.${moduleName}rc.mjs`,
1212
1311
  `.${moduleName}rc.cjs`,
1213
1312
  `${moduleName}.config.ts`,
1313
+ `${moduleName}.config.mts`,
1314
+ `${moduleName}.config.cts`,
1214
1315
  `${moduleName}.config.js`,
1215
1316
  `${moduleName}.config.mjs`,
1216
1317
  `${moduleName}.config.cjs`
@@ -1226,7 +1327,11 @@ async function getCosmiConfig(moduleName, config) {
1226
1327
  }),
1227
1328
  ...searchPlaces
1228
1329
  ],
1229
- loaders: { ".ts": tsLoader }
1330
+ loaders: {
1331
+ ".ts": tsLoader,
1332
+ ".mts": tsLoader,
1333
+ ".cts": tsLoader
1334
+ }
1230
1335
  });
1231
1336
  try {
1232
1337
  result = config ? await explorer.load(config) : await explorer.search();
@@ -1265,6 +1370,7 @@ async function runToolPass({ toolValue, detect, toolMap, toolLabel, successPrefi
1265
1370
  await events.emit("info", `Auto-detected ${toolLabel}: ${(0, node_util.styleText)("dim", resolvedTool)}`);
1266
1371
  }
1267
1372
  }
1373
+ let toolError;
1268
1374
  if (resolvedTool && resolvedTool !== "auto" && resolvedTool in toolMap) {
1269
1375
  const toolConfig = toolMap[resolvedTool];
1270
1376
  try {
@@ -1295,43 +1401,39 @@ async function runToolPass({ toolValue, detect, toolMap, toolLabel, successPrefi
1295
1401
  const err = new Error(toolConfig.errorMessage);
1296
1402
  err.cause = caughtError;
1297
1403
  await events.emit("error", err);
1404
+ toolError = err;
1298
1405
  }
1299
1406
  }
1300
1407
  await onEnd();
1408
+ if (toolError) throw toolError;
1301
1409
  }
1302
- async function generate({ input, config: userConfig, events, logLevel }) {
1303
- const inputPath = input ?? ("path" in userConfig.input ? userConfig.input.path : void 0);
1410
+ async function generate(options) {
1411
+ const { input, events, logLevel } = options;
1304
1412
  const hrStart = node_process.default.hrtime();
1305
- const config = {
1306
- ...userConfig,
1307
- root: userConfig.root || node_process.default.cwd(),
1308
- input: inputPath ? {
1309
- ...userConfig.input,
1310
- path: inputPath
1311
- } : userConfig.input,
1312
- output: {
1313
- write: true,
1314
- barrelType: "named",
1315
- extension: { ".ts": ".ts" },
1316
- format: "prettier",
1317
- ...userConfig.output
1318
- }
1319
- };
1320
- await events.emit("generation:start", config);
1321
- await events.emit("info", config.name ? `Setup generation ${(0, node_util.styleText)("bold", config.name)}` : "Setup generation", inputPath);
1322
- const { sources, fabric, pluginManager } = await (0, _kubb_core.setup)({
1323
- config,
1413
+ const inputPath = input ?? ("path" in options.config.input ? options.config.input.path : void 0);
1414
+ const { sources, fabric, driver, config } = await (0, _kubb_core.setup)({
1415
+ config: {
1416
+ ...options.config,
1417
+ input: inputPath ? {
1418
+ ...options.config.input,
1419
+ path: inputPath
1420
+ } : options.config.input,
1421
+ ...options.config.output
1422
+ },
1324
1423
  events
1325
1424
  });
1425
+ await events.emit("generation:start", config);
1426
+ await events.emit("info", config.name ? `Setup generation ${(0, node_util.styleText)("bold", config.name)}` : "Setup generation", inputPath);
1326
1427
  await events.emit("info", config.name ? `Build generation ${(0, node_util.styleText)("bold", config.name)}` : "Build generation", inputPath);
1327
1428
  const { files, failedPlugins, pluginTimings, error } = await (0, _kubb_core.safeBuild)({
1328
1429
  config,
1329
1430
  events
1330
1431
  }, {
1331
- pluginManager,
1432
+ driver,
1332
1433
  fabric,
1333
1434
  events,
1334
- sources
1435
+ sources,
1436
+ config
1335
1437
  });
1336
1438
  await events.emit("info", "Load summary");
1337
1439
  if (failedPlugins.size > 0 || error) {
@@ -1348,7 +1450,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1348
1450
  await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
1349
1451
  command: "generate",
1350
1452
  kubbVersion: require_package.version,
1351
- plugins: pluginManager.plugins.map((p) => ({
1453
+ plugins: Array.from(driver.plugins.values(), (p) => ({
1352
1454
  name: p.name,
1353
1455
  options: p.options
1354
1456
  })),
@@ -1407,7 +1509,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1407
1509
  await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
1408
1510
  command: "generate",
1409
1511
  kubbVersion: require_package.version,
1410
- plugins: pluginManager.plugins.map((p) => ({
1512
+ plugins: Array.from(driver.plugins.values(), (p) => ({
1411
1513
  name: p.name,
1412
1514
  options: p.options
1413
1515
  })),
@@ -1419,7 +1521,6 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1419
1521
  async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, watch }) {
1420
1522
  const logLevel = _kubb_core.logLevel[logLevelKey] ?? _kubb_core.logLevel.info;
1421
1523
  const events = new AsyncEventEmitter();
1422
- const promiseManager = new _kubb_core.PromiseManager();
1423
1524
  await setupLogger(events, { logLevel });
1424
1525
  await require_telemetry.executeIfOnline(async () => {
1425
1526
  try {
@@ -1435,30 +1536,22 @@ async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, wa
1435
1536
  await events.emit("success", "Config loaded successfully", node_path.default.relative(node_process.default.cwd(), result.filepath));
1436
1537
  await events.emit("config:end", configs);
1437
1538
  await events.emit("lifecycle:start", require_package.version);
1438
- const promises = configs.map((config) => {
1439
- return async () => {
1440
- if ((0, _kubb_core.isInputPath)(config) && watch) {
1441
- await startWatcher([input || config.input.path], async (paths) => {
1442
- events.removeAll();
1443
- await generate({
1444
- input,
1445
- config,
1446
- logLevel,
1447
- events
1448
- });
1449
- _clack_prompts.log.step((0, node_util.styleText)("yellow", `Watching for changes in ${paths.join(" and ")}`));
1450
- });
1451
- return;
1452
- }
1453
- await generate({
1454
- input,
1455
- config,
1456
- logLevel,
1457
- events
1458
- });
1459
- };
1539
+ for (const config of configs) if ((0, _kubb_core.isInputPath)(config) && watch) await startWatcher([input || config.input.path], async (paths) => {
1540
+ events.removeAll();
1541
+ await generate({
1542
+ input,
1543
+ config,
1544
+ logLevel,
1545
+ events
1546
+ });
1547
+ _clack_prompts.log.step((0, node_util.styleText)("yellow", `Watching for changes in ${paths.join(" and ")}`));
1548
+ });
1549
+ else await generate({
1550
+ input,
1551
+ config,
1552
+ logLevel,
1553
+ events
1460
1554
  });
1461
- await promiseManager.run("seq", promises);
1462
1555
  await events.emit("lifecycle:end");
1463
1556
  } catch (error) {
1464
1557
  await events.emit("error", require_errors.toError(error));
@@ -1468,4 +1561,4 @@ async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, wa
1468
1561
  //#endregion
1469
1562
  exports.runGenerateCommand = runGenerateCommand;
1470
1563
 
1471
- //# sourceMappingURL=generate-C0Lnz3VU.cjs.map
1564
+ //# sourceMappingURL=generate-Bsie7eRa.cjs.map