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

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-BCuaVkEd.cjs} +5 -5
  2. package/dist/{agent-EkZmkNy6.cjs.map → agent-BCuaVkEd.cjs.map} +1 -1
  3. package/dist/{agent-L50VNhXv.js → agent-DTyw-mt7.js} +4 -4
  4. package/dist/{agent-L50VNhXv.js.map → agent-DTyw-mt7.js.map} +1 -1
  5. package/dist/{agent-C6o_6GSJ.cjs → agent-DpzeyN1s.cjs} +4 -4
  6. package/dist/{agent-C6o_6GSJ.cjs.map → agent-DpzeyN1s.cjs.map} +1 -1
  7. package/dist/{agent-C0bAlvWn.js → agent-a8pLjRwh.js} +5 -5
  8. package/dist/{agent-C0bAlvWn.js.map → agent-a8pLjRwh.js.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-B1et6yyL.cjs → generate-BMkY2JhZ.cjs} +3 -3
  22. package/dist/{generate-B1et6yyL.cjs.map → generate-BMkY2JhZ.cjs.map} +1 -1
  23. package/dist/{generate-C0Lnz3VU.cjs → generate-C-gO_6QU.cjs} +187 -88
  24. package/dist/generate-C-gO_6QU.cjs.map +1 -0
  25. package/dist/{generate-DnmnwWSE.js → generate-CPY_n5OL.js} +3 -3
  26. package/dist/{generate-DnmnwWSE.js.map → generate-CPY_n5OL.js.map} +1 -1
  27. package/dist/{generate-vf3X_h_u.js → generate-D7w3tiCk.js} +188 -89
  28. package/dist/generate-D7w3tiCk.js.map +1 -0
  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-hmolV6B4.cjs → init-BlriFVH6.cjs} +19 -4
  35. package/dist/init-BlriFVH6.cjs.map +1 -0
  36. package/dist/{init-CMu6JTPI.js → init-Bxv30QR0.js} +4 -4
  37. package/dist/{init-CMu6JTPI.js.map → init-Bxv30QR0.js.map} +1 -1
  38. package/dist/{init-BvVLmKcJ.cjs → init-IVpqf3Ks.cjs} +4 -4
  39. package/dist/{init-BvVLmKcJ.cjs.map → init-IVpqf3Ks.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-BwXRVY1N.js → mcp-Cjovctp3.js} +4 -4
  43. package/dist/{mcp-BwXRVY1N.js.map → mcp-Cjovctp3.js.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-DPU081OK.cjs → mcp-DFxGUufs.cjs} +4 -4
  47. package/dist/{mcp-DPU081OK.cjs.map → mcp-DFxGUufs.cjs.map} +1 -1
  48. package/dist/{mcp-ChHFPRzD.cjs → mcp-jMZ56bqT.cjs} +3 -3
  49. package/dist/{mcp-ChHFPRzD.cjs.map → mcp-jMZ56bqT.cjs.map} +1 -1
  50. package/dist/{package-BsZ_vsP1.cjs → package-DApgJdUF.cjs} +2 -2
  51. package/dist/package-DApgJdUF.cjs.map +1 -0
  52. package/dist/package-DajRuqoe.js +6 -0
  53. package/dist/package-DajRuqoe.js.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--6d6ZZTO.js → validate-BiC3bzBI.js} +4 -4
  65. package/dist/{validate--6d6ZZTO.js.map → validate-BiC3bzBI.js.map} +1 -1
  66. package/dist/{validate-BSaNWrhu.cjs → validate-BmlSA_cw.cjs} +4 -4
  67. package/dist/{validate-BSaNWrhu.cjs.map → validate-BmlSA_cw.cjs.map} +1 -1
  68. package/dist/{validate-l8vLmwKA.js → validate-CIS8nJdd.js} +3 -3
  69. package/dist/{validate-l8vLmwKA.js.map → validate-CIS8nJdd.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 +22 -23
  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
@@ -0,0 +1,43 @@
1
+ import "./chunk--u3MIqq1.js";
2
+ //#region ../../internals/utils/src/errors.ts
3
+ /**
4
+ * Coerces an unknown thrown value to an `Error` instance.
5
+ * Returns the value as-is when it is already an `Error`; otherwise wraps it with `String(value)`.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * try { ... } catch(err) {
10
+ * throw new BuildError('Build failed', { cause: toError(err), errors: [] })
11
+ * }
12
+ * ```
13
+ */
14
+ function toError(value) {
15
+ return value instanceof Error ? value : new Error(String(value));
16
+ }
17
+ /**
18
+ * Extracts a human-readable message from any thrown value.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * getErrorMessage(new Error('oops')) // 'oops'
23
+ * getErrorMessage('plain string') // 'plain string'
24
+ * ```
25
+ */
26
+ function getErrorMessage(value) {
27
+ return value instanceof Error ? value.message : String(value);
28
+ }
29
+ /**
30
+ * Extracts the `.cause` of an `Error` as an `Error`, or `undefined` when absent or not an `Error`.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const cause = toCause(buildError) // Error | undefined
35
+ * ```
36
+ */
37
+ function toCause(error) {
38
+ return error.cause instanceof Error ? error.cause : void 0;
39
+ }
40
+ //#endregion
41
+ export { toCause as n, toError as r, getErrorMessage as t };
42
+
43
+ //# sourceMappingURL=errors-CjPmyZHy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors-CjPmyZHy.js","names":[],"sources":["../../../internals/utils/src/errors.ts"],"sourcesContent":["/** Thrown when a plugin's configuration or input fails validation.\n *\n * @example\n * ```ts\n * throw new ValidationPluginError('Invalid config: \"output.path\" is required')\n * ```\n */\nexport class ValidationPluginError extends Error {}\n\n/**\n * Thrown when one or more errors occur during a Kubb build.\n * Carries the full list of underlying errors on `errors`.\n *\n * @example\n * ```ts\n * throw new BuildError('Build failed', { errors: [err1, err2] })\n * ```\n */\nexport class BuildError extends Error {\n errors: Array<Error>\n\n constructor(message: string, options: { cause?: Error; errors: Array<Error> }) {\n super(message, { cause: options.cause })\n this.name = 'BuildError'\n this.errors = options.errors\n }\n}\n\n/**\n * Coerces an unknown thrown value to an `Error` instance.\n * Returns the value as-is when it is already an `Error`; otherwise wraps it with `String(value)`.\n *\n * @example\n * ```ts\n * try { ... } catch(err) {\n * throw new BuildError('Build failed', { cause: toError(err), errors: [] })\n * }\n * ```\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Extracts a human-readable message from any thrown value.\n *\n * @example\n * ```ts\n * getErrorMessage(new Error('oops')) // 'oops'\n * getErrorMessage('plain string') // 'plain string'\n * ```\n */\nexport function getErrorMessage(value: unknown): string {\n return value instanceof Error ? value.message : String(value)\n}\n\n/**\n * Extracts the `.cause` of an `Error` as an `Error`, or `undefined` when absent or not an `Error`.\n *\n * @example\n * ```ts\n * const cause = toCause(buildError) // Error | undefined\n * ```\n */\nexport function toCause(error: Error): Error | undefined {\n return error.cause instanceof Error ? error.cause : undefined\n}\n"],"mappings":";;;;;;;;;;;;;AAuCA,SAAgB,QAAQ,OAAuB;AAC7C,QAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;;;;;;;;;;;AAYlE,SAAgB,gBAAgB,OAAwB;AACtD,QAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;;;;;;;;;AAW/D,SAAgB,QAAQ,OAAiC;AACvD,QAAO,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,KAAA"}
@@ -1,6 +1,6 @@
1
1
  require("./chunk-ByKO4r7w.cjs");
2
2
  //#region src/commands/generate.ts
3
- const command = require("./define-D6Kfm7-Z.cjs").defineCommand({
3
+ const command = require("./define-Bdn8j5VM.cjs").defineCommand({
4
4
  name: "generate",
5
5
  description: "[input] Generate files based on a 'kubb.config.ts' file",
6
6
  arguments: ["[input]"],
@@ -50,7 +50,7 @@ const command = require("./define-D6Kfm7-Z.cjs").defineCommand({
50
50
  },
51
51
  async run({ values, positionals }) {
52
52
  const logLevel = values.debug ? "debug" : values.verbose ? "verbose" : values.silent ? "silent" : values.logLevel;
53
- const { runGenerateCommand } = await Promise.resolve().then(() => require("./generate-C0Lnz3VU.cjs"));
53
+ const { runGenerateCommand } = await Promise.resolve().then(() => require("./generate-C-gO_6QU.cjs"));
54
54
  await runGenerateCommand({
55
55
  input: positionals[0],
56
56
  configPath: values.config,
@@ -62,4 +62,4 @@ const command = require("./define-D6Kfm7-Z.cjs").defineCommand({
62
62
  //#endregion
63
63
  exports.command = command;
64
64
 
65
- //# sourceMappingURL=generate-B1et6yyL.cjs.map
65
+ //# sourceMappingURL=generate-BMkY2JhZ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-B1et6yyL.cjs","names":["defineCommand"],"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\n\nexport const command = defineCommand({\n name: 'generate',\n description: \"[input] Generate files based on a 'kubb.config.ts' file\",\n arguments: ['[input]'],\n options: {\n config: { type: 'string', description: 'Path to the Kubb config', short: 'c' },\n logLevel: {\n type: 'string',\n description: 'Info, silent, verbose or debug',\n short: 'l',\n default: 'info',\n hint: 'silent|info|verbose|debug',\n enum: ['silent', 'info', 'verbose', 'debug'],\n },\n watch: { type: 'boolean', description: 'Watch mode based on the input file', short: 'w', default: false },\n debug: { type: 'boolean', description: 'Override logLevel to debug', short: 'd', default: false },\n verbose: { type: 'boolean', description: 'Override logLevel to verbose', short: 'v', default: false },\n silent: { type: 'boolean', description: 'Override logLevel to silent', short: 's', default: false },\n },\n async run({ values, positionals }) {\n const logLevel = values.debug ? 'debug' : values.verbose ? 'verbose' : values.silent ? 'silent' : values.logLevel\n const { runGenerateCommand } = await import('../runners/generate.ts')\n\n await runGenerateCommand({ input: positionals[0], configPath: values.config, logLevel, watch: values.watch })\n },\n})\n"],"mappings":";;AAEA,MAAa,2CAAUA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,WAAW,CAAC,UAAU;CACtB,SAAS;EACP,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA2B,OAAO;GAAK;EAC9E,UAAU;GACR,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,MAAM;GACN,MAAM;IAAC;IAAU;IAAQ;IAAW;IAAQ;GAC7C;EACD,OAAO;GAAE,MAAM;GAAW,aAAa;GAAsC,OAAO;GAAK,SAAS;GAAO;EACzG,OAAO;GAAE,MAAM;GAAW,aAAa;GAA8B,OAAO;GAAK,SAAS;GAAO;EACjG,SAAS;GAAE,MAAM;GAAW,aAAa;GAAgC,OAAO;GAAK,SAAS;GAAO;EACrG,QAAQ;GAAE,MAAM;GAAW,aAAa;GAA+B,OAAO;GAAK,SAAS;GAAO;EACpG;CACD,MAAM,IAAI,EAAE,QAAQ,eAAe;EACjC,MAAM,WAAW,OAAO,QAAQ,UAAU,OAAO,UAAU,YAAY,OAAO,SAAS,WAAW,OAAO;EACzG,MAAM,EAAE,uBAAuB,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,0BAAA,CAAA;AAErC,QAAM,mBAAmB;GAAE,OAAO,YAAY;GAAI,YAAY,OAAO;GAAQ;GAAU,OAAO,OAAO;GAAO,CAAC;;CAEhH,CAAC"}
1
+ {"version":3,"file":"generate-BMkY2JhZ.cjs","names":["defineCommand"],"sources":["../src/commands/generate.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\n\nexport const command = defineCommand({\n name: 'generate',\n description: \"[input] Generate files based on a 'kubb.config.ts' file\",\n arguments: ['[input]'],\n options: {\n config: { type: 'string', description: 'Path to the Kubb config', short: 'c' },\n logLevel: {\n type: 'string',\n description: 'Info, silent, verbose or debug',\n short: 'l',\n default: 'info',\n hint: 'silent|info|verbose|debug',\n enum: ['silent', 'info', 'verbose', 'debug'],\n },\n watch: { type: 'boolean', description: 'Watch mode based on the input file', short: 'w', default: false },\n debug: { type: 'boolean', description: 'Override logLevel to debug', short: 'd', default: false },\n verbose: { type: 'boolean', description: 'Override logLevel to verbose', short: 'v', default: false },\n silent: { type: 'boolean', description: 'Override logLevel to silent', short: 's', default: false },\n },\n async run({ values, positionals }) {\n const logLevel = values.debug ? 'debug' : values.verbose ? 'verbose' : values.silent ? 'silent' : values.logLevel\n const { runGenerateCommand } = await import('../runners/generate.ts')\n\n await runGenerateCommand({ input: positionals[0], configPath: values.config, logLevel, watch: values.watch })\n },\n})\n"],"mappings":";;AAEA,MAAa,2CAAUA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,WAAW,CAAC,UAAU;CACtB,SAAS;EACP,QAAQ;GAAE,MAAM;GAAU,aAAa;GAA2B,OAAO;GAAK;EAC9E,UAAU;GACR,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,MAAM;GACN,MAAM;IAAC;IAAU;IAAQ;IAAW;IAAQ;GAC7C;EACD,OAAO;GAAE,MAAM;GAAW,aAAa;GAAsC,OAAO;GAAK,SAAS;GAAO;EACzG,OAAO;GAAE,MAAM;GAAW,aAAa;GAA8B,OAAO;GAAK,SAAS;GAAO;EACjG,SAAS;GAAE,MAAM;GAAW,aAAa;GAAgC,OAAO;GAAK,SAAS;GAAO;EACrG,QAAQ;GAAE,MAAM;GAAW,aAAa;GAA+B,OAAO;GAAK,SAAS;GAAO;EACpG;CACD,MAAM,IAAI,EAAE,QAAQ,eAAe;EACjC,MAAM,WAAW,OAAO,QAAQ,UAAU,OAAO,UAAU,YAAY,OAAO,SAAS,WAAW,OAAO;EACzG,MAAM,EAAE,uBAAuB,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,0BAAA,CAAA;AAErC,QAAM,mBAAmB;GAAE,OAAO,YAAY;GAAI,YAAY,OAAO;GAAQ;GAAU,OAAO,OAAO;GAAO,CAAC;;CAEhH,CAAC"}
@@ -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-DApgJdUF.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[33mpetstore\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,9 +1401,11 @@ 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
1410
  async function generate({ input, config: userConfig, events, logLevel }) {
1303
1411
  const inputPath = input ?? ("path" in userConfig.input ? userConfig.input.path : void 0);
@@ -1319,7 +1427,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1319
1427
  };
1320
1428
  await events.emit("generation:start", config);
1321
1429
  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)({
1430
+ const { sources, fabric, driver } = await (0, _kubb_core.setup)({
1323
1431
  config,
1324
1432
  events
1325
1433
  });
@@ -1328,7 +1436,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1328
1436
  config,
1329
1437
  events
1330
1438
  }, {
1331
- pluginManager,
1439
+ driver,
1332
1440
  fabric,
1333
1441
  events,
1334
1442
  sources
@@ -1348,7 +1456,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1348
1456
  await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
1349
1457
  command: "generate",
1350
1458
  kubbVersion: require_package.version,
1351
- plugins: pluginManager.plugins.map((p) => ({
1459
+ plugins: Array.from(driver.plugins.values(), (p) => ({
1352
1460
  name: p.name,
1353
1461
  options: p.options
1354
1462
  })),
@@ -1407,7 +1515,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1407
1515
  await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
1408
1516
  command: "generate",
1409
1517
  kubbVersion: require_package.version,
1410
- plugins: pluginManager.plugins.map((p) => ({
1518
+ plugins: Array.from(driver.plugins.values(), (p) => ({
1411
1519
  name: p.name,
1412
1520
  options: p.options
1413
1521
  })),
@@ -1419,7 +1527,6 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1419
1527
  async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, watch }) {
1420
1528
  const logLevel = _kubb_core.logLevel[logLevelKey] ?? _kubb_core.logLevel.info;
1421
1529
  const events = new AsyncEventEmitter();
1422
- const promiseManager = new _kubb_core.PromiseManager();
1423
1530
  await setupLogger(events, { logLevel });
1424
1531
  await require_telemetry.executeIfOnline(async () => {
1425
1532
  try {
@@ -1435,30 +1542,22 @@ async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, wa
1435
1542
  await events.emit("success", "Config loaded successfully", node_path.default.relative(node_process.default.cwd(), result.filepath));
1436
1543
  await events.emit("config:end", configs);
1437
1544
  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
- };
1545
+ for (const config of configs) if ((0, _kubb_core.isInputPath)(config) && watch) await startWatcher([input || config.input.path], async (paths) => {
1546
+ events.removeAll();
1547
+ await generate({
1548
+ input,
1549
+ config,
1550
+ logLevel,
1551
+ events
1552
+ });
1553
+ _clack_prompts.log.step((0, node_util.styleText)("yellow", `Watching for changes in ${paths.join(" and ")}`));
1554
+ });
1555
+ else await generate({
1556
+ input,
1557
+ config,
1558
+ logLevel,
1559
+ events
1460
1560
  });
1461
- await promiseManager.run("seq", promises);
1462
1561
  await events.emit("lifecycle:end");
1463
1562
  } catch (error) {
1464
1563
  await events.emit("error", require_errors.toError(error));
@@ -1468,4 +1567,4 @@ async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, wa
1468
1567
  //#endregion
1469
1568
  exports.runGenerateCommand = runGenerateCommand;
1470
1569
 
1471
- //# sourceMappingURL=generate-C0Lnz3VU.cjs.map
1570
+ //# sourceMappingURL=generate-C-gO_6QU.cjs.map