@kubb/cli 4.33.0 → 4.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/{agent-CduUX7Ye.cjs → agent-Bd1QdPVV.cjs} +7 -7
  2. package/dist/agent-Bd1QdPVV.cjs.map +1 -0
  3. package/dist/{agent-DrnwQBZf.cjs → agent-D83d9Pud.cjs} +7 -7
  4. package/dist/agent-D83d9Pud.cjs.map +1 -0
  5. package/dist/{agent-D0A3RQho.js → agent-DgKQXSmR.js} +5 -5
  6. package/dist/agent-DgKQXSmR.js.map +1 -0
  7. package/dist/{agent-CJ69TqoO.js → agent-u_Ehwz6r.js} +5 -5
  8. package/dist/agent-u_Ehwz6r.js.map +1 -0
  9. package/dist/{constants-CnPOlsJq.cjs → constants-BTUap0zs.cjs} +1 -19
  10. package/dist/{constants-CnPOlsJq.cjs.map → constants-BTUap0zs.cjs.map} +1 -1
  11. package/dist/{constants-CEKRremI.js → constants-CM3dJzjK.js} +2 -14
  12. package/dist/{constants-CEKRremI.js.map → constants-CM3dJzjK.js.map} +1 -1
  13. package/dist/{types-CLtz0jem.js → define--M_JMcDC.js} +6 -6
  14. package/dist/define--M_JMcDC.js.map +1 -0
  15. package/dist/{types-Ck2lzFON.cjs → define-D6Kfm7-Z.cjs} +6 -6
  16. package/dist/define-D6Kfm7-Z.cjs.map +1 -0
  17. package/dist/{errors-bSLTEh4e.js → errors-6mF_WKxg.js} +5 -5
  18. package/dist/errors-6mF_WKxg.js.map +1 -0
  19. package/dist/{errors-BUjJsNoe.cjs → errors-DBW0N9w4.cjs} +5 -5
  20. package/dist/errors-DBW0N9w4.cjs.map +1 -0
  21. package/dist/{generate-CiUPO5ds.cjs → generate-Bn8n4w1O.cjs} +3 -3
  22. package/dist/generate-Bn8n4w1O.cjs.map +1 -0
  23. package/dist/{generate-HP5ySfjV.js → generate-CAsV9wSx.js} +271 -149
  24. package/dist/generate-CAsV9wSx.js.map +1 -0
  25. package/dist/{generate-DIIxtkWT.js → generate-D-59YK0L.js} +3 -3
  26. package/dist/generate-D-59YK0L.js.map +1 -0
  27. package/dist/{generate-ByMgAV76.cjs → generate-JC65igQh.cjs} +275 -153
  28. package/dist/generate-JC65igQh.cjs.map +1 -0
  29. package/dist/index.cjs +13 -13
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +12 -12
  32. package/dist/index.js.map +1 -1
  33. package/dist/{init-DyKK2fTp.js → init-C-InrmSY.js} +42 -31
  34. package/dist/init-C-InrmSY.js.map +1 -0
  35. package/dist/{init-DLNrkDF4.js → init-CXP8OfMe.js} +4 -4
  36. package/dist/init-CXP8OfMe.js.map +1 -0
  37. package/dist/{init-Df_aXezV.cjs → init-CbeE-L-0.cjs} +5 -4
  38. package/dist/init-CbeE-L-0.cjs.map +1 -0
  39. package/dist/{init-Cd1hCb7q.cjs → init-hmolV6B4.cjs} +47 -37
  40. package/dist/init-hmolV6B4.cjs.map +1 -0
  41. package/dist/{jiti-BdskUHhD.cjs → jiti-Cd3S0xwr.cjs} +1 -1
  42. package/dist/{jiti-BdskUHhD.cjs.map → jiti-Cd3S0xwr.cjs.map} +1 -1
  43. package/dist/{jiti-Cl7t20dO.js → jiti-e08mD2Ph.js} +1 -1
  44. package/dist/{jiti-Cl7t20dO.js.map → jiti-e08mD2Ph.js.map} +1 -1
  45. package/dist/{mcp-Clg-Qnkr.cjs → mcp-BDxg2oJm.cjs} +5 -4
  46. package/dist/mcp-BDxg2oJm.cjs.map +1 -0
  47. package/dist/{mcp-B73FC8dF.cjs → mcp-ChHFPRzD.cjs} +4 -4
  48. package/dist/mcp-ChHFPRzD.cjs.map +1 -0
  49. package/dist/{mcp-Cf-1dsB-.js → mcp-D2SHEg_d.js} +4 -4
  50. package/dist/mcp-D2SHEg_d.js.map +1 -0
  51. package/dist/{mcp-Bd9LITaI.js → mcp-MSoE4vNA.js} +4 -4
  52. package/dist/mcp-MSoE4vNA.js.map +1 -0
  53. package/dist/{package-aKgzEJtp.cjs → package-CUVyeIbt.cjs} +2 -2
  54. package/dist/package-CUVyeIbt.cjs.map +1 -0
  55. package/dist/package-Cbd8OC6q.js +6 -0
  56. package/dist/package-Cbd8OC6q.js.map +1 -0
  57. package/dist/shell-7HPrTCJ5.cjs +57 -0
  58. package/dist/shell-7HPrTCJ5.cjs.map +1 -0
  59. package/dist/shell-DqqWsHCD.js +46 -0
  60. package/dist/shell-DqqWsHCD.js.map +1 -0
  61. package/dist/{telemetry-T5IA2dWA.cjs → telemetry-Cn9X1I5B.cjs} +46 -9
  62. package/dist/telemetry-Cn9X1I5B.cjs.map +1 -0
  63. package/dist/{telemetry-C4gOKX2x.js → telemetry-DxiR7clS.js} +40 -9
  64. package/dist/telemetry-DxiR7clS.js.map +1 -0
  65. package/dist/{validate-DURmg-2Q.cjs → validate-BG8A3aQS.cjs} +5 -4
  66. package/dist/validate-BG8A3aQS.cjs.map +1 -0
  67. package/dist/{validate-Cr26q5xX.js → validate-BZ1UFkwA.js} +4 -4
  68. package/dist/validate-BZ1UFkwA.js.map +1 -0
  69. package/dist/{validate-Dqi9T_c4.cjs → validate-Bbrn3Q-A.cjs} +4 -4
  70. package/dist/validate-Bbrn3Q-A.cjs.map +1 -0
  71. package/dist/{validate-Chjg23AE.js → validate-l8vLmwKA.js} +4 -4
  72. package/dist/validate-l8vLmwKA.js.map +1 -0
  73. package/package.json +6 -5
  74. package/src/commands/agent/start.ts +1 -1
  75. package/src/commands/agent.ts +1 -1
  76. package/src/commands/generate.ts +1 -1
  77. package/src/commands/init.ts +1 -1
  78. package/src/commands/mcp.ts +1 -1
  79. package/src/commands/validate.ts +1 -1
  80. package/src/constants.ts +0 -1
  81. package/src/index.ts +1 -1
  82. package/src/loggers/clackLogger.ts +26 -28
  83. package/src/loggers/fileSystemLogger.ts +1 -2
  84. package/src/loggers/githubActionsLogger.ts +26 -28
  85. package/src/loggers/plainLogger.ts +25 -26
  86. package/src/loggers/utils.ts +4 -5
  87. package/src/runners/agent.ts +1 -1
  88. package/src/runners/generate.ts +20 -7
  89. package/src/runners/init.ts +2 -1
  90. package/src/runners/mcp.ts +1 -1
  91. package/src/runners/validate.ts +1 -1
  92. package/src/utils/executeHooks.ts +2 -2
  93. package/src/utils/getIntro.ts +1 -80
  94. package/src/utils/getSummary.ts +1 -2
  95. package/src/utils/packageManager.ts +2 -2
  96. package/src/utils/runHook.ts +2 -2
  97. package/src/utils/telemetry.ts +1 -2
  98. package/dist/agent-CJ69TqoO.js.map +0 -1
  99. package/dist/agent-CduUX7Ye.cjs.map +0 -1
  100. package/dist/agent-D0A3RQho.js.map +0 -1
  101. package/dist/agent-DrnwQBZf.cjs.map +0 -1
  102. package/dist/errors-BUjJsNoe.cjs.map +0 -1
  103. package/dist/errors-bSLTEh4e.js.map +0 -1
  104. package/dist/generate-ByMgAV76.cjs.map +0 -1
  105. package/dist/generate-CiUPO5ds.cjs.map +0 -1
  106. package/dist/generate-DIIxtkWT.js.map +0 -1
  107. package/dist/generate-HP5ySfjV.js.map +0 -1
  108. package/dist/init-Cd1hCb7q.cjs.map +0 -1
  109. package/dist/init-DLNrkDF4.js.map +0 -1
  110. package/dist/init-Df_aXezV.cjs.map +0 -1
  111. package/dist/init-DyKK2fTp.js.map +0 -1
  112. package/dist/mcp-B73FC8dF.cjs.map +0 -1
  113. package/dist/mcp-Bd9LITaI.js.map +0 -1
  114. package/dist/mcp-Cf-1dsB-.js.map +0 -1
  115. package/dist/mcp-Clg-Qnkr.cjs.map +0 -1
  116. package/dist/package-681jTtCk.js +0 -6
  117. package/dist/package-681jTtCk.js.map +0 -1
  118. package/dist/package-aKgzEJtp.cjs.map +0 -1
  119. package/dist/telemetry-C4gOKX2x.js.map +0 -1
  120. package/dist/telemetry-T5IA2dWA.cjs.map +0 -1
  121. package/dist/types-CLtz0jem.js.map +0 -1
  122. package/dist/types-Ck2lzFON.cjs.map +0 -1
  123. package/dist/validate-Chjg23AE.js.map +0 -1
  124. package/dist/validate-Cr26q5xX.js.map +0 -1
  125. package/dist/validate-DURmg-2Q.cjs.map +0 -1
  126. package/dist/validate-Dqi9T_c4.cjs.map +0 -1
  127. package/src/cli/adapters/nodeAdapter.ts +0 -159
  128. package/src/cli/help.ts +0 -36
  129. package/src/cli/index.ts +0 -16
  130. package/src/cli/parse.ts +0 -18
  131. package/src/cli/schema.ts +0 -38
  132. package/src/cli/types.ts +0 -95
  133. package/src/utils/envDetection.ts +0 -34
  134. package/src/utils/errors.ts +0 -23
  135. package/src/utils/formatMsWithColor.ts +0 -22
  136. package/src/utils/randomColor.ts +0 -14
  137. package/src/utils/spawnAsync.ts +0 -47
@@ -1,77 +1,146 @@
1
1
  const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
- const require_package = require("./package-aKgzEJtp.cjs");
3
- const require_constants = require("./constants-CnPOlsJq.cjs");
4
- const require_telemetry = require("./telemetry-T5IA2dWA.cjs");
5
- const require_errors = require("./errors-BUjJsNoe.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-CUVyeIbt.cjs");
6
+ const require_constants = require("./constants-BTUap0zs.cjs");
6
7
  let node_util = require("node:util");
8
+ let node_events = require("node:events");
7
9
  let node_crypto = require("node:crypto");
8
- let node_process = require("node:process");
9
- node_process = require_chunk.__toESM(node_process);
10
- let _kubb_core_utils = require("@kubb/core/utils");
10
+ require("node:fs");
11
+ let node_fs_promises = require("node:fs/promises");
11
12
  let node_path = require("node:path");
12
13
  node_path = require_chunk.__toESM(node_path);
14
+ let node_process = require("node:process");
15
+ node_process = require_chunk.__toESM(node_process);
13
16
  let _clack_prompts = require("@clack/prompts");
14
17
  _clack_prompts = require_chunk.__toESM(_clack_prompts);
15
18
  let _kubb_core = require("@kubb/core");
16
19
  let tinyexec = require("tinyexec");
17
20
  let node_stream = require("node:stream");
18
- let _kubb_core_fs = require("@kubb/core/fs");
19
21
  let cosmiconfig = require("cosmiconfig");
20
22
  let jiti = require("jiti");
21
- //#region src/utils/formatMsWithColor.ts
23
+ //#region ../../internals/utils/src/asyncEventEmitter.ts
22
24
  /**
23
- * Formats milliseconds with color based on duration thresholds:
24
- * - Green: <= 500ms
25
- * - Yellow: > 500ms and <= 1000ms
26
- * - Red: > 1000ms
25
+ * A typed EventEmitter that awaits all async listeners before resolving.
26
+ * Wraps Node's `EventEmitter` with full TypeScript event-map inference.
27
27
  */
28
- function formatMsWithColor(ms) {
29
- const formatted = (0, _kubb_core_utils.formatMs)(ms);
30
- if (ms <= 500) return (0, node_util.styleText)("green", formatted);
31
- if (ms <= 1e3) return (0, node_util.styleText)("yellow", formatted);
32
- return (0, node_util.styleText)("red", formatted);
28
+ var AsyncEventEmitter = class {
29
+ /**
30
+ * `maxListener` controls the maximum number of listeners per event before Node emits a memory-leak warning.
31
+ * @default 10
32
+ */
33
+ constructor(maxListener = 10) {
34
+ this.#emitter.setMaxListeners(maxListener);
35
+ }
36
+ #emitter = new node_events.EventEmitter();
37
+ /**
38
+ * Emits an event and awaits all registered listeners in parallel.
39
+ * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.
40
+ */
41
+ async emit(eventName, ...eventArgs) {
42
+ const listeners = this.#emitter.listeners(eventName);
43
+ if (listeners.length === 0) return;
44
+ await Promise.all(listeners.map(async (listener) => {
45
+ 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) });
55
+ }
56
+ }));
57
+ }
58
+ /** Registers a persistent listener for the given event. */
59
+ on(eventName, handler) {
60
+ this.#emitter.on(eventName, handler);
61
+ }
62
+ /** Registers a one-shot listener that removes itself after the first invocation. */
63
+ onOnce(eventName, handler) {
64
+ const wrapper = (...args) => {
65
+ this.off(eventName, wrapper);
66
+ return handler(...args);
67
+ };
68
+ this.on(eventName, wrapper);
69
+ }
70
+ /** Removes a previously registered listener. */
71
+ off(eventName, handler) {
72
+ this.#emitter.off(eventName, handler);
73
+ }
74
+ /** Removes all listeners from every event channel. */
75
+ removeAll() {
76
+ this.#emitter.removeAllListeners();
77
+ }
78
+ };
79
+ //#endregion
80
+ //#region ../../internals/utils/src/time.ts
81
+ /**
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.
84
+ */
85
+ function getElapsedMs(hrStart) {
86
+ const [seconds, nanoseconds] = process.hrtime(hrStart);
87
+ const ms = seconds * 1e3 + nanoseconds / 1e6;
88
+ return Math.round(ms * 100) / 100;
89
+ }
90
+ /**
91
+ * Converts a millisecond duration into a human-readable string.
92
+ * Adjusts units (ms, s, m s) based on the magnitude of the duration.
93
+ */
94
+ function formatMs(ms) {
95
+ if (ms >= 6e4) return `${Math.floor(ms / 6e4)}m ${(ms % 6e4 / 1e3).toFixed(1)}s`;
96
+ if (ms >= 1e3) return `${(ms / 1e3).toFixed(2)}s`;
97
+ return `${Math.round(ms)}ms`;
98
+ }
99
+ /**
100
+ * Convenience helper: formats the elapsed time since `hrStart` in one step.
101
+ */
102
+ function formatHrtime(hrStart) {
103
+ return formatMs(getElapsedMs(hrStart));
33
104
  }
34
105
  //#endregion
35
- //#region src/utils/getIntro.ts
106
+ //#region ../../internals/utils/src/colors.ts
36
107
  /**
37
- * ANSI True Color (24-bit) utilities for terminal output
38
- * Supports hex color codes without external dependencies like chalk
108
+ * Parses a CSS hex color string (`#RGB`) into its RGB channels.
109
+ * Falls back to `255` for any channel that cannot be parsed.
39
110
  */
40
- /** Parse a hex color string into RGB components, defaulting to 255 on invalid input. */
41
111
  function parseHex(color) {
42
- const c = color.replace("#", "");
43
- const r = Number.parseInt(c.slice(0, 2), 16);
44
- const g = Number.parseInt(c.slice(2, 4), 16);
45
- const b = Number.parseInt(c.slice(4, 6), 16);
46
- return {
47
- r: Number.isNaN(r) ? 255 : r,
48
- g: Number.isNaN(g) ? 255 : g,
49
- b: Number.isNaN(b) ? 255 : b
112
+ const int = Number.parseInt(color.replace("#", ""), 16);
113
+ return Number.isNaN(int) ? {
114
+ r: 255,
115
+ g: 255,
116
+ b: 255
117
+ } : {
118
+ r: int >> 16 & 255,
119
+ g: int >> 8 & 255,
120
+ b: int & 255
50
121
  };
51
122
  }
52
123
  /**
53
- * Convert hex color to ANSI 24-bit true color escape sequence
54
- * @param color - Hex color code (with or without #), e.g., '#FF5500' or 'FF5500'
55
- * @returns Function that wraps text with the color
124
+ * Returns a function that wraps a string in a 24-bit ANSI true-color escape sequence
125
+ * for the given hex color.
56
126
  */
57
127
  function hex(color) {
58
128
  const { r, g, b } = parseHex(color);
59
129
  return (text) => `\x1b[38;2;${r};${g};${b}m${text}\x1b[0m`;
60
130
  }
61
- function gradient(colors) {
62
- return (text) => {
63
- const chars = [...text];
64
- return chars.map((char, i) => {
65
- const t = chars.length <= 1 ? 0 : i / (chars.length - 1);
66
- const seg = Math.min(Math.floor(t * (colors.length - 1)), colors.length - 2);
67
- const lt = t * (colors.length - 1) - seg;
68
- const from = parseHex(colors[seg]);
69
- const to = parseHex(colors[seg + 1]);
70
- 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`;
71
- }).join("");
72
- };
131
+ function gradient(colorStops, text) {
132
+ const chars = text.split("");
133
+ return chars.map((char, i) => {
134
+ const t = chars.length <= 1 ? 0 : i / (chars.length - 1);
135
+ const seg = Math.min(Math.floor(t * (colorStops.length - 1)), colorStops.length - 2);
136
+ const lt = t * (colorStops.length - 1) - seg;
137
+ const from = parseHex(colorStops[seg]);
138
+ const to = parseHex(colorStops[seg + 1]);
139
+ 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
+ }).join("");
73
141
  }
74
- const colors = {
142
+ /** ANSI color functions for each part of the Kubb mascot illustration. */
143
+ const palette = {
75
144
  lid: hex("#F55A17"),
76
145
  woodTop: hex("#F5A217"),
77
146
  woodMid: hex("#F58517"),
@@ -81,36 +150,89 @@ const colors = {
81
150
  blush: hex("#FDA4AF")
82
151
  };
83
152
  /**
84
- * Generates the Kubb mascot face welcome message
85
- * @param version - The version string to display
86
- * @returns Formatted mascot face string
153
+ * Generates the Kubb mascot welcome banner.
87
154
  */
88
155
  function getIntro({ title, description, version, areEyesOpen }) {
89
156
  const kubbVersion = gradient([
90
157
  "#F58517",
91
158
  "#F5A217",
92
159
  "#F55A17"
93
- ])(`KUBB v${version}`);
94
- const eyeTop = areEyesOpen ? colors.eye("█▀█") : colors.eye("───");
95
- const eyeBottom = areEyesOpen ? colors.eye("▀▀▀") : colors.eye("───");
160
+ ], `KUBB v${version}`);
161
+ const eyeTop = areEyesOpen ? palette.eye("█▀█") : palette.eye("───");
162
+ const eyeBottom = areEyesOpen ? palette.eye("▀▀▀") : palette.eye("───");
96
163
  return `
97
- ${colors.lid("▄▄▄▄▄▄▄▄▄▄▄▄▄")}
98
- ${colors.woodTop("█ ")}${colors.highlight("▄▄")}${colors.woodTop(" ")}${colors.highlight("▄▄")}${colors.woodTop(" █")} ${kubbVersion}
99
- ${colors.woodMid("█ ")}${eyeTop}${colors.woodMid(" ")}${eyeTop}${colors.woodMid(" █")} ${(0, node_util.styleText)("gray", title)}
100
- ${colors.woodMid("█ ")}${eyeBottom}${colors.woodMid(" ")}${colors.blush("◡")}${colors.woodMid(" ")}${eyeBottom}${colors.woodMid(" █")} ${(0, node_util.styleText)("yellow", "➜")} ${(0, node_util.styleText)("white", description)}
101
- ${colors.woodBase("▀▀▀▀▀▀▀▀▀▀▀▀▀")}
164
+ ${palette.lid("▄▄▄▄▄▄▄▄▄▄▄▄▄")}
165
+ ${palette.woodTop("█ ")}${palette.highlight("▄▄")}${palette.woodTop(" ")}${palette.highlight("▄▄")}${palette.woodTop(" █")} ${kubbVersion}
166
+ ${palette.woodMid("█ ")}${eyeTop}${palette.woodMid(" ")}${eyeTop}${palette.woodMid(" █")} ${(0, node_util.styleText)("gray", title)}
167
+ ${palette.woodMid("█ ")}${eyeBottom}${palette.woodMid(" ")}${palette.blush("◡")}${palette.woodMid(" ")}${eyeBottom}${palette.woodMid(" █")} ${(0, node_util.styleText)("yellow", "➜")} ${(0, node_util.styleText)("white", description)}
168
+ ${palette.woodBase("▀▀▀▀▀▀▀▀▀▀▀▀▀")}
102
169
  `;
103
170
  }
104
- //#endregion
105
- //#region src/utils/randomColor.ts
171
+ /** ANSI color names available for terminal output. */
172
+ const randomColors = [
173
+ "black",
174
+ "red",
175
+ "green",
176
+ "yellow",
177
+ "blue",
178
+ "white",
179
+ "magenta",
180
+ "cyan",
181
+ "gray"
182
+ ];
183
+ /**
184
+ * Returns the text wrapped in a deterministic ANSI color derived from the text's SHA-256 hash.
185
+ */
106
186
  function randomCliColor(text) {
107
187
  if (!text) return "";
108
- return (0, node_util.styleText)(require_constants.randomColors[(0, node_crypto.createHash)("sha256").update(text).digest().readUInt32BE(0) % require_constants.randomColors.length] ?? "white", text);
188
+ return (0, node_util.styleText)(randomColors[(0, node_crypto.createHash)("sha256").update(text).digest().readUInt32BE(0) % randomColors.length] ?? "white", text);
189
+ }
190
+ /**
191
+ * Formats a millisecond duration with an ANSI color based on thresholds:
192
+ * green ≤ 500 ms · yellow ≤ 1 000 ms · red > 1 000 ms
193
+ */
194
+ function formatMsWithColor(ms) {
195
+ const formatted = formatMs(ms);
196
+ if (ms <= 500) return (0, node_util.styleText)("green", formatted);
197
+ if (ms <= 1e3) return (0, node_util.styleText)("yellow", formatted);
198
+ return (0, node_util.styleText)("red", formatted);
199
+ }
200
+ //#endregion
201
+ //#region ../../internals/utils/src/fs.ts
202
+ /**
203
+ * 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.
206
+ * 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 — useful for catching write failures on unreliable file systems.
209
+ */
210
+ async function write(path, data, options = {}) {
211
+ const trimmed = data.trim();
212
+ if (trimmed === "") return void 0;
213
+ const resolved = (0, node_path.resolve)(path);
214
+ if (typeof Bun !== "undefined") {
215
+ const file = Bun.file(resolved);
216
+ if ((await file.exists() ? await file.text() : null) === trimmed) return void 0;
217
+ await Bun.write(resolved, trimmed);
218
+ return trimmed;
219
+ }
220
+ try {
221
+ if (await (0, node_fs_promises.readFile)(resolved, { encoding: "utf-8" }) === trimmed) return void 0;
222
+ } catch {}
223
+ await (0, node_fs_promises.mkdir)((0, node_path.dirname)(resolved), { recursive: true });
224
+ await (0, node_fs_promises.writeFile)(resolved, trimmed, { encoding: "utf-8" });
225
+ if (options.sanity) {
226
+ const savedData = await (0, node_fs_promises.readFile)(resolved, { encoding: "utf-8" });
227
+ if (savedData !== trimmed) throw new Error(`Sanity check failed for ${path}\n\nData[${data.length}]:\n${data}\n\nSaved[${savedData.length}]:\n${savedData}\n`);
228
+ return savedData;
229
+ }
230
+ return trimmed;
109
231
  }
110
232
  //#endregion
111
233
  //#region src/utils/getSummary.ts
112
234
  function getSummary({ failedPlugins, filesCreated, status, hrStart, config, pluginTimings }) {
113
- const duration = (0, _kubb_core_utils.formatHrtime)(hrStart);
235
+ const duration = formatHrtime(hrStart);
114
236
  const pluginsCount = config.plugins?.length ?? 0;
115
237
  const successCount = pluginsCount - failedPlugins.size;
116
238
  const meta = {
@@ -224,7 +346,7 @@ var ClackWritable = class extends node_stream.Writable {
224
346
  const clackLogger = (0, _kubb_core.defineLogger)({
225
347
  name: "clack",
226
348
  install(context, options) {
227
- const logLevel = options?.logLevel ?? _kubb_core.LogLevel.info;
349
+ const logLevel = options?.logLevel ?? _kubb_core.logLevel.info;
228
350
  const state = {
229
351
  totalPlugins: 0,
230
352
  completedPlugins: 0,
@@ -252,7 +374,7 @@ const clackLogger = (0, _kubb_core.defineLogger)({
252
374
  state.activeProgress.clear();
253
375
  }
254
376
  function showProgressStep() {
255
- if (logLevel <= _kubb_core.LogLevel.silent) return;
377
+ if (logLevel <= _kubb_core.logLevel.silent) return;
256
378
  const line = buildProgressLine(state);
257
379
  if (line) _clack_prompts.log.step(getMessage(line));
258
380
  }
@@ -268,7 +390,7 @@ const clackLogger = (0, _kubb_core.defineLogger)({
268
390
  state.isSpinning = false;
269
391
  }
270
392
  context.on("info", (message, info = "") => {
271
- if (logLevel <= _kubb_core.LogLevel.silent) return;
393
+ if (logLevel <= _kubb_core.logLevel.silent) return;
272
394
  const text = getMessage([
273
395
  (0, node_util.styleText)("blue", "ℹ"),
274
396
  message,
@@ -278,21 +400,21 @@ const clackLogger = (0, _kubb_core.defineLogger)({
278
400
  else _clack_prompts.log.info(text);
279
401
  });
280
402
  context.on("success", (message, info = "") => {
281
- if (logLevel <= _kubb_core.LogLevel.silent) return;
403
+ if (logLevel <= _kubb_core.logLevel.silent) return;
282
404
  const text = getMessage([
283
405
  (0, node_util.styleText)("blue", "✓"),
284
406
  message,
285
- logLevel >= _kubb_core.LogLevel.info ? (0, node_util.styleText)("dim", info) : void 0
407
+ logLevel >= _kubb_core.logLevel.info ? (0, node_util.styleText)("dim", info) : void 0
286
408
  ].filter(Boolean).join(" "));
287
409
  if (state.isSpinning) stopSpinner(text);
288
410
  else _clack_prompts.log.success(text);
289
411
  });
290
412
  context.on("warn", (message, info) => {
291
- if (logLevel < _kubb_core.LogLevel.warn) return;
413
+ if (logLevel < _kubb_core.logLevel.warn) return;
292
414
  const text = getMessage([
293
415
  (0, node_util.styleText)("yellow", "⚠"),
294
416
  message,
295
- logLevel >= _kubb_core.LogLevel.info && info ? (0, node_util.styleText)("dim", info) : void 0
417
+ logLevel >= _kubb_core.logLevel.info && info ? (0, node_util.styleText)("dim", info) : void 0
296
418
  ].filter(Boolean).join(" "));
297
419
  _clack_prompts.log.warn(text);
298
420
  });
@@ -301,7 +423,7 @@ const clackLogger = (0, _kubb_core.defineLogger)({
301
423
  const text = [(0, node_util.styleText)("red", "✗"), error.message].join(" ");
302
424
  if (state.isSpinning) stopSpinner(getMessage(text));
303
425
  else _clack_prompts.log.error(getMessage(text));
304
- if (logLevel >= _kubb_core.LogLevel.debug && error.stack) {
426
+ if (logLevel >= _kubb_core.logLevel.debug && error.stack) {
305
427
  const frames = error.stack.split("\n").slice(1, 4);
306
428
  for (const frame of frames) _clack_prompts.log.message(getMessage((0, node_util.styleText)("dim", frame.trim())));
307
429
  if (caused?.stack) {
@@ -312,7 +434,7 @@ const clackLogger = (0, _kubb_core.defineLogger)({
312
434
  }
313
435
  });
314
436
  context.on("version:new", (version, latestVersion) => {
315
- if (logLevel <= _kubb_core.LogLevel.silent) return;
437
+ if (logLevel <= _kubb_core.logLevel.silent) return;
316
438
  _clack_prompts.box(`\`v${version}\` → \`v${latestVersion}\`
317
439
  Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
318
440
  width: "auto",
@@ -333,13 +455,13 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
333
455
  reset();
334
456
  });
335
457
  context.on("config:start", () => {
336
- if (logLevel <= _kubb_core.LogLevel.silent) return;
458
+ if (logLevel <= _kubb_core.logLevel.silent) return;
337
459
  const text = getMessage("Configuration started");
338
460
  _clack_prompts.intro(text);
339
461
  startSpinner(getMessage("Configuration loading"));
340
462
  });
341
463
  context.on("config:end", (_configs) => {
342
- if (logLevel <= _kubb_core.LogLevel.silent) return;
464
+ if (logLevel <= _kubb_core.logLevel.silent) return;
343
465
  const text = getMessage("Configuration completed");
344
466
  _clack_prompts.outro(text);
345
467
  });
@@ -350,7 +472,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
350
472
  _clack_prompts.intro(text);
351
473
  });
352
474
  context.on("plugin:start", (plugin) => {
353
- if (logLevel <= _kubb_core.LogLevel.silent) return;
475
+ if (logLevel <= _kubb_core.logLevel.silent) return;
354
476
  stopSpinner();
355
477
  const progressBar = _clack_prompts.progress({
356
478
  style: "block",
@@ -370,18 +492,18 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
370
492
  context.on("plugin:end", (plugin, { duration, success }) => {
371
493
  stopSpinner();
372
494
  const active = state.activeProgress.get(plugin.name);
373
- if (!active || logLevel === _kubb_core.LogLevel.silent) return;
495
+ if (!active || logLevel === _kubb_core.logLevel.silent) return;
374
496
  clearInterval(active.interval);
375
497
  if (success) state.completedPlugins++;
376
498
  else state.failedPlugins++;
377
499
  const durationStr = formatMsWithColor(duration);
378
- const text = getMessage(success ? `${(0, node_util.styleText)("bold", plugin.name)} completed in ${durationStr}` : `${(0, node_util.styleText)("bold", plugin.name)} failed in ${(0, node_util.styleText)("red", (0, _kubb_core_utils.formatMs)(duration))}`);
500
+ const text = getMessage(success ? `${(0, node_util.styleText)("bold", plugin.name)} completed in ${durationStr}` : `${(0, node_util.styleText)("bold", plugin.name)} failed in ${(0, node_util.styleText)("red", formatMs(duration))}`);
379
501
  active.progressBar.stop(text);
380
502
  state.activeProgress.delete(plugin.name);
381
503
  showProgressStep();
382
504
  });
383
505
  context.on("files:processing:start", (files) => {
384
- if (logLevel <= _kubb_core.LogLevel.silent) return;
506
+ if (logLevel <= _kubb_core.logLevel.silent) return;
385
507
  stopSpinner();
386
508
  state.totalFiles = files.length;
387
509
  state.processedFiles = 0;
@@ -396,7 +518,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
396
518
  state.activeProgress.set("files", { progressBar });
397
519
  });
398
520
  context.on("file:processing:update", ({ file, config }) => {
399
- if (logLevel <= _kubb_core.LogLevel.silent) return;
521
+ if (logLevel <= _kubb_core.logLevel.silent) return;
400
522
  stopSpinner();
401
523
  state.processedFiles++;
402
524
  const text = `Writing ${(0, node_path.relative)(config.root, file.path)}`;
@@ -405,7 +527,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
405
527
  active.progressBar.advance(void 0, text);
406
528
  });
407
529
  context.on("files:processing:end", () => {
408
- if (logLevel <= _kubb_core.LogLevel.silent) return;
530
+ if (logLevel <= _kubb_core.logLevel.silent) return;
409
531
  stopSpinner();
410
532
  const text = getMessage("Files written successfully");
411
533
  const active = state.activeProgress.get("files");
@@ -419,22 +541,22 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
419
541
  _clack_prompts.outro(text);
420
542
  });
421
543
  context.on("format:start", () => {
422
- if (logLevel <= _kubb_core.LogLevel.silent) return;
544
+ if (logLevel <= _kubb_core.logLevel.silent) return;
423
545
  const text = getMessage("Format started");
424
546
  _clack_prompts.intro(text);
425
547
  });
426
548
  context.on("format:end", () => {
427
- if (logLevel <= _kubb_core.LogLevel.silent) return;
549
+ if (logLevel <= _kubb_core.logLevel.silent) return;
428
550
  const text = getMessage("Format completed");
429
551
  _clack_prompts.outro(text);
430
552
  });
431
553
  context.on("lint:start", () => {
432
- if (logLevel <= _kubb_core.LogLevel.silent) return;
554
+ if (logLevel <= _kubb_core.logLevel.silent) return;
433
555
  const text = getMessage("Lint started");
434
556
  _clack_prompts.intro(text);
435
557
  });
436
558
  context.on("lint:end", () => {
437
- if (logLevel <= _kubb_core.LogLevel.silent) return;
559
+ if (logLevel <= _kubb_core.logLevel.silent) return;
438
560
  const text = getMessage("Lint completed");
439
561
  _clack_prompts.outro(text);
440
562
  });
@@ -442,7 +564,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
442
564
  const commandWithArgs = formatCommandWithArgs(command, args);
443
565
  const text = getMessage(`Hook ${(0, node_util.styleText)("dim", commandWithArgs)} started`);
444
566
  if (!id) return;
445
- if (logLevel <= _kubb_core.LogLevel.silent) {
567
+ if (logLevel <= _kubb_core.logLevel.silent) {
446
568
  await runHook({
447
569
  id,
448
570
  command,
@@ -457,7 +579,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
457
579
  return;
458
580
  }
459
581
  _clack_prompts.intro(text);
460
- const logger = _clack_prompts.taskLog({ title: getMessage(["Executing hook", logLevel >= _kubb_core.LogLevel.info ? (0, node_util.styleText)("dim", commandWithArgs) : void 0].filter(Boolean).join(" ")) });
582
+ const logger = _clack_prompts.taskLog({ title: getMessage(["Executing hook", logLevel >= _kubb_core.logLevel.info ? (0, node_util.styleText)("dim", commandWithArgs) : void 0].filter(Boolean).join(" ")) });
461
583
  const writable = new ClackWritable(logger);
462
584
  await runHook({
463
585
  id,
@@ -474,7 +596,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
474
596
  });
475
597
  });
476
598
  context.on("hook:end", ({ command, args }) => {
477
- if (logLevel <= _kubb_core.LogLevel.silent) return;
599
+ if (logLevel <= _kubb_core.logLevel.silent) return;
478
600
  const text = getMessage(`Hook ${(0, node_util.styleText)("dim", formatCommandWithArgs(command, args))} successfully executed`);
479
601
  _clack_prompts.outro(text);
480
602
  });
@@ -485,7 +607,7 @@ Run \`npm install -g @kubb/cli\` to update`, "Update available for `Kubb`", {
485
607
  config,
486
608
  status,
487
609
  hrStart,
488
- pluginTimings: logLevel >= _kubb_core.LogLevel.verbose ? pluginTimings : void 0
610
+ pluginTimings: logLevel >= _kubb_core.logLevel.verbose ? pluginTimings : void 0
489
611
  });
490
612
  const title = config.name || "";
491
613
  summary.unshift("\n");
@@ -542,7 +664,7 @@ const fileSystemLogger = (0, _kubb_core.defineLogger)({
542
664
  }
543
665
  }
544
666
  await Promise.all(Object.entries(files).map(async ([fileName, logs]) => {
545
- return (0, _kubb_core_fs.write)(fileName, logs.join("\n\n"));
667
+ return write(fileName, logs.join("\n\n"));
546
668
  }));
547
669
  return Object.keys(files);
548
670
  }
@@ -583,7 +705,7 @@ const fileSystemLogger = (0, _kubb_core.defineLogger)({
583
705
  });
584
706
  });
585
707
  context.on("plugin:end", (plugin, { duration, success }) => {
586
- const durationStr = (0, _kubb_core_utils.formatMs)(duration);
708
+ const durationStr = formatMs(duration);
587
709
  state.cachedLogs.add({
588
710
  date: /* @__PURE__ */ new Date(),
589
711
  logs: [success ? `${plugin.name} completed in ${durationStr}` : `${plugin.name} failed in ${durationStr}`]
@@ -620,7 +742,7 @@ const fileSystemLogger = (0, _kubb_core.defineLogger)({
620
742
  const githubActionsLogger = (0, _kubb_core.defineLogger)({
621
743
  name: "github-actions",
622
744
  install(context, options) {
623
- const logLevel = options?.logLevel ?? _kubb_core.LogLevel.info;
745
+ const logLevel = options?.logLevel ?? _kubb_core.logLevel.info;
624
746
  const state = {
625
747
  totalPlugins: 0,
626
748
  completedPlugins: 0,
@@ -640,7 +762,7 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
640
762
  state.currentConfigs = [];
641
763
  }
642
764
  function showProgressStep() {
643
- if (logLevel <= _kubb_core.LogLevel.silent) return;
765
+ if (logLevel <= _kubb_core.logLevel.silent) return;
644
766
  const line = buildProgressLine(state);
645
767
  if (line) console.log(getMessage(line));
646
768
  }
@@ -654,7 +776,7 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
654
776
  console.log("::endgroup::");
655
777
  }
656
778
  context.on("info", (message, info = "") => {
657
- if (logLevel <= _kubb_core.LogLevel.silent) return;
779
+ if (logLevel <= _kubb_core.logLevel.silent) return;
658
780
  const text = getMessage([
659
781
  (0, node_util.styleText)("blue", "ℹ"),
660
782
  message,
@@ -663,29 +785,29 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
663
785
  console.log(text);
664
786
  });
665
787
  context.on("success", (message, info = "") => {
666
- if (logLevel <= _kubb_core.LogLevel.silent) return;
788
+ if (logLevel <= _kubb_core.logLevel.silent) return;
667
789
  const text = getMessage([
668
790
  (0, node_util.styleText)("blue", "✓"),
669
791
  message,
670
- logLevel >= _kubb_core.LogLevel.info ? (0, node_util.styleText)("dim", info) : void 0
792
+ logLevel >= _kubb_core.logLevel.info ? (0, node_util.styleText)("dim", info) : void 0
671
793
  ].filter(Boolean).join(" "));
672
794
  console.log(text);
673
795
  });
674
796
  context.on("warn", (message, info = "") => {
675
- if (logLevel <= _kubb_core.LogLevel.silent) return;
797
+ if (logLevel <= _kubb_core.logLevel.silent) return;
676
798
  const text = getMessage([
677
799
  (0, node_util.styleText)("yellow", "⚠"),
678
800
  message,
679
- logLevel >= _kubb_core.LogLevel.info ? (0, node_util.styleText)("dim", info) : void 0
801
+ logLevel >= _kubb_core.logLevel.info ? (0, node_util.styleText)("dim", info) : void 0
680
802
  ].filter(Boolean).join(" "));
681
803
  console.warn(`::warning::${text}`);
682
804
  });
683
805
  context.on("error", (error) => {
684
806
  const caused = require_errors.toCause(error);
685
- if (logLevel <= _kubb_core.LogLevel.silent) return;
807
+ if (logLevel <= _kubb_core.logLevel.silent) return;
686
808
  const message = error.message || String(error);
687
809
  console.error(`::error::${message}`);
688
- if (logLevel >= _kubb_core.LogLevel.debug && error.stack) {
810
+ if (logLevel >= _kubb_core.logLevel.debug && error.stack) {
689
811
  const frames = error.stack.split("\n").slice(1, 4);
690
812
  for (const frame of frames) console.log(getMessage((0, node_util.styleText)("dim", frame.trim())));
691
813
  if (caused?.stack) {
@@ -700,14 +822,14 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
700
822
  reset();
701
823
  });
702
824
  context.on("config:start", () => {
703
- if (logLevel <= _kubb_core.LogLevel.silent) return;
825
+ if (logLevel <= _kubb_core.logLevel.silent) return;
704
826
  const text = getMessage("Configuration started");
705
827
  openGroup("Configuration");
706
828
  console.log(text);
707
829
  });
708
830
  context.on("config:end", (configs) => {
709
831
  state.currentConfigs = configs;
710
- if (logLevel <= _kubb_core.LogLevel.silent) return;
832
+ if (logLevel <= _kubb_core.logLevel.silent) return;
711
833
  const text = getMessage("Configuration completed");
712
834
  console.log(text);
713
835
  closeGroup("Configuration");
@@ -720,24 +842,24 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
720
842
  if (state.currentConfigs.length === 1) console.log(getMessage(text));
721
843
  });
722
844
  context.on("plugin:start", (plugin) => {
723
- if (logLevel <= _kubb_core.LogLevel.silent) return;
845
+ if (logLevel <= _kubb_core.logLevel.silent) return;
724
846
  const text = getMessage(`Generating ${(0, node_util.styleText)("bold", plugin.name)}`);
725
847
  if (state.currentConfigs.length === 1) openGroup(`Plugin: ${plugin.name}`);
726
848
  console.log(text);
727
849
  });
728
850
  context.on("plugin:end", (plugin, { duration, success }) => {
729
- if (logLevel <= _kubb_core.LogLevel.silent) return;
851
+ if (logLevel <= _kubb_core.logLevel.silent) return;
730
852
  if (success) state.completedPlugins++;
731
853
  else state.failedPlugins++;
732
854
  const durationStr = formatMsWithColor(duration);
733
- const text = getMessage(success ? `${(0, node_util.styleText)("bold", plugin.name)} completed in ${durationStr}` : `${(0, node_util.styleText)("bold", plugin.name)} failed in ${(0, node_util.styleText)("red", (0, _kubb_core_utils.formatMs)(duration))}`);
855
+ const text = getMessage(success ? `${(0, node_util.styleText)("bold", plugin.name)} completed in ${durationStr}` : `${(0, node_util.styleText)("bold", plugin.name)} failed in ${(0, node_util.styleText)("red", formatMs(duration))}`);
734
856
  console.log(text);
735
857
  if (state.currentConfigs.length > 1) console.log(" ");
736
858
  if (state.currentConfigs.length === 1) closeGroup(`Plugin: ${plugin.name}`);
737
859
  showProgressStep();
738
860
  });
739
861
  context.on("files:processing:start", (files) => {
740
- if (logLevel <= _kubb_core.LogLevel.silent) return;
862
+ if (logLevel <= _kubb_core.logLevel.silent) return;
741
863
  state.totalFiles = files.length;
742
864
  state.processedFiles = 0;
743
865
  if (state.currentConfigs.length === 1) openGroup("File Generation");
@@ -745,14 +867,14 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
745
867
  console.log(text);
746
868
  });
747
869
  context.on("files:processing:end", () => {
748
- if (logLevel <= _kubb_core.LogLevel.silent) return;
870
+ if (logLevel <= _kubb_core.logLevel.silent) return;
749
871
  const text = getMessage("Files written successfully");
750
872
  console.log(text);
751
873
  if (state.currentConfigs.length === 1) closeGroup("File Generation");
752
874
  showProgressStep();
753
875
  });
754
876
  context.on("file:processing:update", () => {
755
- if (logLevel <= _kubb_core.LogLevel.silent) return;
877
+ if (logLevel <= _kubb_core.logLevel.silent) return;
756
878
  state.processedFiles++;
757
879
  });
758
880
  context.on("generation:end", (config) => {
@@ -760,25 +882,25 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
760
882
  console.log(text);
761
883
  });
762
884
  context.on("format:start", () => {
763
- if (logLevel <= _kubb_core.LogLevel.silent) return;
885
+ if (logLevel <= _kubb_core.logLevel.silent) return;
764
886
  const text = getMessage("Format started");
765
887
  if (state.currentConfigs.length === 1) openGroup("Formatting");
766
888
  console.log(text);
767
889
  });
768
890
  context.on("format:end", () => {
769
- if (logLevel <= _kubb_core.LogLevel.silent) return;
891
+ if (logLevel <= _kubb_core.logLevel.silent) return;
770
892
  const text = getMessage("Format completed");
771
893
  console.log(text);
772
894
  if (state.currentConfigs.length === 1) closeGroup("Formatting");
773
895
  });
774
896
  context.on("lint:start", () => {
775
- if (logLevel <= _kubb_core.LogLevel.silent) return;
897
+ if (logLevel <= _kubb_core.logLevel.silent) return;
776
898
  const text = getMessage("Lint started");
777
899
  if (state.currentConfigs.length === 1) openGroup("Linting");
778
900
  console.log(text);
779
901
  });
780
902
  context.on("lint:end", () => {
781
- if (logLevel <= _kubb_core.LogLevel.silent) return;
903
+ if (logLevel <= _kubb_core.logLevel.silent) return;
782
904
  const text = getMessage("Lint completed");
783
905
  console.log(text);
784
906
  if (state.currentConfigs.length === 1) closeGroup("Linting");
@@ -786,7 +908,7 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
786
908
  context.on("hook:start", async ({ id, command, args }) => {
787
909
  const commandWithArgs = formatCommandWithArgs(command, args);
788
910
  const text = getMessage(`Hook ${(0, node_util.styleText)("dim", commandWithArgs)} started`);
789
- if (logLevel > _kubb_core.LogLevel.silent) {
911
+ if (logLevel > _kubb_core.logLevel.silent) {
790
912
  if (state.currentConfigs.length === 1) openGroup(`Hook ${commandWithArgs}`);
791
913
  console.log(text);
792
914
  }
@@ -798,13 +920,13 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
798
920
  commandWithArgs,
799
921
  context,
800
922
  sink: {
801
- onStdout: logLevel > _kubb_core.LogLevel.silent ? (s) => console.log(s) : void 0,
802
- onStderr: logLevel > _kubb_core.LogLevel.silent ? (s) => console.error(`::error::${s}`) : void 0
923
+ onStdout: logLevel > _kubb_core.logLevel.silent ? (s) => console.log(s) : void 0,
924
+ onStderr: logLevel > _kubb_core.logLevel.silent ? (s) => console.error(`::error::${s}`) : void 0
803
925
  }
804
926
  });
805
927
  });
806
928
  context.on("hook:end", ({ command, args }) => {
807
- if (logLevel <= _kubb_core.LogLevel.silent) return;
929
+ if (logLevel <= _kubb_core.logLevel.silent) return;
808
930
  const commandWithArgs = formatCommandWithArgs(command, args);
809
931
  const text = getMessage(`Hook ${(0, node_util.styleText)("dim", commandWithArgs)} completed`);
810
932
  console.log(text);
@@ -813,7 +935,7 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
813
935
  context.on("generation:summary", (config, { status, hrStart, failedPlugins }) => {
814
936
  const pluginsCount = config.plugins?.length ?? 0;
815
937
  const successCount = pluginsCount - failedPlugins.size;
816
- const duration = (0, _kubb_core_utils.formatHrtime)(hrStart);
938
+ const duration = formatHrtime(hrStart);
817
939
  if (state.currentConfigs.length > 1) console.log(" ");
818
940
  console.log(status === "success" ? `Kubb Summary: ${(0, node_util.styleText)("blue", "✓")} ${`${successCount} successful`}, ${pluginsCount} total, ${(0, node_util.styleText)("green", duration)}` : `Kubb Summary: ${(0, node_util.styleText)("blue", "✓")} ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total, ${(0, node_util.styleText)("green", duration)}`);
819
941
  if (state.currentConfigs.length > 1) closeGroup(config.name ? `Generation for ${(0, node_util.styleText)("bold", config.name)}` : "Generation");
@@ -832,12 +954,12 @@ const githubActionsLogger = (0, _kubb_core.defineLogger)({
832
954
  const plainLogger = (0, _kubb_core.defineLogger)({
833
955
  name: "plain",
834
956
  install(context, options) {
835
- const logLevel = options?.logLevel ?? _kubb_core.LogLevel.info;
957
+ const logLevel = options?.logLevel ?? _kubb_core.logLevel.info;
836
958
  function getMessage(message) {
837
959
  return formatMessage(message, logLevel);
838
960
  }
839
961
  context.on("info", (message, info) => {
840
- if (logLevel <= _kubb_core.LogLevel.silent) return;
962
+ if (logLevel <= _kubb_core.logLevel.silent) return;
841
963
  const text = getMessage([
842
964
  "ℹ",
843
965
  message,
@@ -846,20 +968,20 @@ const plainLogger = (0, _kubb_core.defineLogger)({
846
968
  console.log(text);
847
969
  });
848
970
  context.on("success", (message, info = "") => {
849
- if (logLevel <= _kubb_core.LogLevel.silent) return;
971
+ if (logLevel <= _kubb_core.logLevel.silent) return;
850
972
  const text = getMessage([
851
973
  "✓",
852
974
  message,
853
- logLevel >= _kubb_core.LogLevel.info ? info : void 0
975
+ logLevel >= _kubb_core.logLevel.info ? info : void 0
854
976
  ].filter(Boolean).join(" "));
855
977
  console.log(text);
856
978
  });
857
979
  context.on("warn", (message, info) => {
858
- if (logLevel < _kubb_core.LogLevel.warn) return;
980
+ if (logLevel < _kubb_core.logLevel.warn) return;
859
981
  const text = getMessage([
860
982
  "⚠",
861
983
  message,
862
- logLevel >= _kubb_core.LogLevel.info ? info : void 0
984
+ logLevel >= _kubb_core.logLevel.info ? info : void 0
863
985
  ].filter(Boolean).join(" "));
864
986
  console.log(text);
865
987
  });
@@ -867,7 +989,7 @@ const plainLogger = (0, _kubb_core.defineLogger)({
867
989
  const caused = require_errors.toCause(error);
868
990
  const text = getMessage(["✗", error.message].join(" "));
869
991
  console.log(text);
870
- if (logLevel >= _kubb_core.LogLevel.debug && error.stack) {
992
+ if (logLevel >= _kubb_core.logLevel.debug && error.stack) {
871
993
  const frames = error.stack.split("\n").slice(1, 4);
872
994
  for (const frame of frames) console.log(getMessage(frame.trim()));
873
995
  if (caused?.stack) {
@@ -881,12 +1003,12 @@ const plainLogger = (0, _kubb_core.defineLogger)({
881
1003
  console.log("Kubb CLI 🧩");
882
1004
  });
883
1005
  context.on("config:start", () => {
884
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1006
+ if (logLevel <= _kubb_core.logLevel.silent) return;
885
1007
  const text = getMessage("Configuration started");
886
1008
  console.log(text);
887
1009
  });
888
1010
  context.on("config:end", () => {
889
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1011
+ if (logLevel <= _kubb_core.logLevel.silent) return;
890
1012
  const text = getMessage("Configuration completed");
891
1013
  console.log(text);
892
1014
  });
@@ -895,28 +1017,28 @@ const plainLogger = (0, _kubb_core.defineLogger)({
895
1017
  console.log(text);
896
1018
  });
897
1019
  context.on("plugin:start", (plugin) => {
898
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1020
+ if (logLevel <= _kubb_core.logLevel.silent) return;
899
1021
  const text = getMessage(`Generating ${plugin.name}`);
900
1022
  console.log(text);
901
1023
  });
902
1024
  context.on("plugin:end", (plugin, { duration, success }) => {
903
- if (logLevel <= _kubb_core.LogLevel.silent) return;
904
- const durationStr = (0, _kubb_core_utils.formatMs)(duration);
1025
+ if (logLevel <= _kubb_core.logLevel.silent) return;
1026
+ const durationStr = formatMs(duration);
905
1027
  const text = getMessage(success ? `${plugin.name} completed in ${durationStr}` : `${plugin.name} failed in ${durationStr}`);
906
1028
  console.log(text);
907
1029
  });
908
1030
  context.on("files:processing:start", (files) => {
909
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1031
+ if (logLevel <= _kubb_core.logLevel.silent) return;
910
1032
  const text = getMessage(`Writing ${files.length} files`);
911
1033
  console.log(text);
912
1034
  });
913
1035
  context.on("file:processing:update", ({ file, config }) => {
914
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1036
+ if (logLevel <= _kubb_core.logLevel.silent) return;
915
1037
  const text = getMessage(`Writing ${(0, node_path.relative)(config.root, file.path)}`);
916
1038
  console.log(text);
917
1039
  });
918
1040
  context.on("files:processing:end", () => {
919
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1041
+ if (logLevel <= _kubb_core.logLevel.silent) return;
920
1042
  const text = getMessage("Files written successfully");
921
1043
  console.log(text);
922
1044
  });
@@ -925,29 +1047,29 @@ const plainLogger = (0, _kubb_core.defineLogger)({
925
1047
  console.log(text);
926
1048
  });
927
1049
  context.on("format:start", () => {
928
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1050
+ if (logLevel <= _kubb_core.logLevel.silent) return;
929
1051
  const text = getMessage("Format started");
930
1052
  console.log(text);
931
1053
  });
932
1054
  context.on("format:end", () => {
933
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1055
+ if (logLevel <= _kubb_core.logLevel.silent) return;
934
1056
  const text = getMessage("Format completed");
935
1057
  console.log(text);
936
1058
  });
937
1059
  context.on("lint:start", () => {
938
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1060
+ if (logLevel <= _kubb_core.logLevel.silent) return;
939
1061
  const text = getMessage("Lint started");
940
1062
  console.log(text);
941
1063
  });
942
1064
  context.on("lint:end", () => {
943
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1065
+ if (logLevel <= _kubb_core.logLevel.silent) return;
944
1066
  const text = getMessage("Lint completed");
945
1067
  console.log(text);
946
1068
  });
947
1069
  context.on("hook:start", async ({ id, command, args }) => {
948
1070
  const commandWithArgs = formatCommandWithArgs(command, args);
949
1071
  const text = getMessage(`Hook ${commandWithArgs} started`);
950
- if (logLevel > _kubb_core.LogLevel.silent) console.log(text);
1072
+ if (logLevel > _kubb_core.logLevel.silent) console.log(text);
951
1073
  if (!id) return;
952
1074
  await runHook({
953
1075
  id,
@@ -956,13 +1078,13 @@ const plainLogger = (0, _kubb_core.defineLogger)({
956
1078
  commandWithArgs,
957
1079
  context,
958
1080
  sink: {
959
- onStdout: logLevel > _kubb_core.LogLevel.silent ? (s) => console.log(s) : void 0,
960
- onStderr: logLevel > _kubb_core.LogLevel.silent ? (s) => console.error(s) : void 0
1081
+ onStdout: logLevel > _kubb_core.logLevel.silent ? (s) => console.log(s) : void 0,
1082
+ onStderr: logLevel > _kubb_core.logLevel.silent ? (s) => console.error(s) : void 0
961
1083
  }
962
1084
  });
963
1085
  });
964
1086
  context.on("hook:end", ({ command, args }) => {
965
- if (logLevel <= _kubb_core.LogLevel.silent) return;
1087
+ if (logLevel <= _kubb_core.logLevel.silent) return;
966
1088
  const text = getMessage(`Hook ${formatCommandWithArgs(command, args)} completed`);
967
1089
  console.log(text);
968
1090
  });
@@ -973,7 +1095,7 @@ const plainLogger = (0, _kubb_core.defineLogger)({
973
1095
  config,
974
1096
  status,
975
1097
  hrStart,
976
- pluginTimings: logLevel >= _kubb_core.LogLevel.verbose ? pluginTimings : void 0
1098
+ pluginTimings: logLevel >= _kubb_core.logLevel.verbose ? pluginTimings : void 0
977
1099
  });
978
1100
  console.log(require_constants.SUMMARY_SEPARATOR);
979
1101
  console.log(summary.join("\n"));
@@ -988,7 +1110,7 @@ const plainLogger = (0, _kubb_core.defineLogger)({
988
1110
  * Shared across all logger adapters to avoid duplication.
989
1111
  */
990
1112
  function formatMessage(message, logLevel) {
991
- if (logLevel >= _kubb_core.LogLevel.verbose) return `${(0, node_util.styleText)("dim", `[${(/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", {
1113
+ if (logLevel >= _kubb_core.logLevel.verbose) return `${(0, node_util.styleText)("dim", `[${(/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", {
992
1114
  hour12: false,
993
1115
  hour: "2-digit",
994
1116
  minute: "2-digit",
@@ -1002,7 +1124,7 @@ function formatMessage(message, logLevel) {
1002
1124
  */
1003
1125
  function buildProgressLine(state) {
1004
1126
  const parts = [];
1005
- const duration = (0, _kubb_core_utils.formatHrtime)(state.hrStart);
1127
+ const duration = formatHrtime(state.hrStart);
1006
1128
  if (state.totalPlugins > 0) {
1007
1129
  const pluginStr = state.failedPlugins > 0 ? `Plugins ${(0, node_util.styleText)("green", state.completedPlugins.toString())}/${state.totalPlugins} ${(0, node_util.styleText)("red", `(${state.failedPlugins} failed)`)}` : `Plugins ${(0, node_util.styleText)("green", state.completedPlugins.toString())}/${state.totalPlugins}`;
1008
1130
  parts.push(pluginStr);
@@ -1034,7 +1156,7 @@ async function setupLogger(context, { logLevel }) {
1034
1156
  const logger = logMapper[type];
1035
1157
  if (!logger) throw new Error(`Unknown adapter type: ${type}`);
1036
1158
  const cleanup = await logger.install(context, { logLevel });
1037
- if (logLevel >= _kubb_core.LogLevel.debug) await fileSystemLogger.install(context, { logLevel });
1159
+ if (logLevel >= _kubb_core.logLevel.debug) await fileSystemLogger.install(context, { logLevel });
1038
1160
  return cleanup;
1039
1161
  }
1040
1162
  //#endregion
@@ -1042,7 +1164,7 @@ async function setupLogger(context, { logLevel }) {
1042
1164
  async function executeHooks({ hooks, events }) {
1043
1165
  const commands = Array.isArray(hooks.done) ? hooks.done : [hooks.done].filter(Boolean);
1044
1166
  for (const command of commands) {
1045
- const [cmd, ...args] = (0, _kubb_core_utils.tokenize)(command);
1167
+ const [cmd, ...args] = require_shell.tokenize(command);
1046
1168
  if (!cmd) continue;
1047
1169
  const hookId = (0, node_crypto.createHash)("sha256").update(command).digest("hex");
1048
1170
  const hookEndPromise = new Promise((resolve, reject) => {
@@ -1159,7 +1281,7 @@ async function runToolPass({ toolValue, detect, toolMap, toolLabel, successPrefi
1159
1281
  }
1160
1282
  events.emit("success", [
1161
1283
  `${successPrefix} with ${(0, node_util.styleText)("dim", resolvedTool)}`,
1162
- logLevel >= _kubb_core.LogLevel.info ? `on ${(0, node_util.styleText)("dim", outputPath)}` : void 0,
1284
+ logLevel >= _kubb_core.logLevel.info ? `on ${(0, node_util.styleText)("dim", outputPath)}` : void 0,
1163
1285
  "successfully"
1164
1286
  ].filter(Boolean).join(" ")).then(resolve).catch(reject);
1165
1287
  };
@@ -1223,7 +1345,7 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1223
1345
  filesCreated: files.length,
1224
1346
  status: "failed",
1225
1347
  hrStart,
1226
- pluginTimings: logLevel >= _kubb_core.LogLevel.verbose ? pluginTimings : void 0
1348
+ pluginTimings: logLevel >= _kubb_core.logLevel.verbose ? pluginTimings : void 0
1227
1349
  });
1228
1350
  await require_telemetry.sendTelemetry(require_telemetry.buildTelemetryEvent({
1229
1351
  command: "generate",
@@ -1243,8 +1365,8 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1243
1365
  const outputPath = node_path.default.resolve(config.root, config.output.path);
1244
1366
  if (config.output.format) await runToolPass({
1245
1367
  toolValue: config.output.format,
1246
- detect: _kubb_core_utils.detectFormatter,
1247
- toolMap: _kubb_core_utils.formatters,
1368
+ detect: _kubb_core.detectFormatter,
1369
+ toolMap: _kubb_core.formatters,
1248
1370
  toolLabel: "formatter",
1249
1371
  successPrefix: "Formatting",
1250
1372
  noToolMessage: "No formatter found (biome, prettier, or oxfmt). Skipping formatting.",
@@ -1257,8 +1379,8 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1257
1379
  });
1258
1380
  if (config.output.lint) await runToolPass({
1259
1381
  toolValue: config.output.lint,
1260
- detect: _kubb_core_utils.detectLinter,
1261
- toolMap: _kubb_core_utils.linters,
1382
+ detect: _kubb_core.detectLinter,
1383
+ toolMap: _kubb_core.linters,
1262
1384
  toolLabel: "linter",
1263
1385
  successPrefix: "Linting",
1264
1386
  noToolMessage: "No linter found (biome, oxlint, or eslint). Skipping linting.",
@@ -1297,11 +1419,11 @@ async function generate({ input, config: userConfig, events, logLevel }) {
1297
1419
  }));
1298
1420
  }
1299
1421
  async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, watch }) {
1300
- const logLevel = _kubb_core.LogLevel[logLevelKey] ?? _kubb_core.LogLevel.info;
1301
- const events = new _kubb_core_utils.AsyncEventEmitter();
1422
+ const logLevel = _kubb_core.logLevel[logLevelKey] ?? _kubb_core.logLevel.info;
1423
+ const events = new AsyncEventEmitter();
1302
1424
  const promiseManager = new _kubb_core.PromiseManager();
1303
1425
  await setupLogger(events, { logLevel });
1304
- await (0, _kubb_core_utils.executeIfOnline)(async () => {
1426
+ await require_telemetry.executeIfOnline(async () => {
1305
1427
  try {
1306
1428
  const latestVersion = (await (await fetch(require_constants.KUBB_NPM_PACKAGE_URL)).json()).version;
1307
1429
  if (latestVersion && require_package.version < latestVersion) await events.emit("version:new", require_package.version, latestVersion);
@@ -1309,7 +1431,7 @@ async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, wa
1309
1431
  });
1310
1432
  try {
1311
1433
  const result = await getCosmiConfig("kubb", configPath);
1312
- const configs = await (0, _kubb_core_utils.getConfigs)(result.config, { input });
1434
+ const configs = await (0, _kubb_core.getConfigs)(result.config, { input });
1313
1435
  await events.emit("config:start");
1314
1436
  await events.emit("info", "Config loaded", node_path.default.relative(node_process.default.cwd(), result.filepath));
1315
1437
  await events.emit("success", "Config loaded successfully", node_path.default.relative(node_process.default.cwd(), result.filepath));
@@ -1348,4 +1470,4 @@ async function runGenerateCommand({ input, configPath, logLevel: logLevelKey, wa
1348
1470
  //#endregion
1349
1471
  exports.runGenerateCommand = runGenerateCommand;
1350
1472
 
1351
- //# sourceMappingURL=generate-ByMgAV76.cjs.map
1473
+ //# sourceMappingURL=generate-JC65igQh.cjs.map