@kubb/cli 5.10.1 → 5.10.3

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 (90) hide show
  1. package/dist/{Telemetry-BfdvvZus.cjs → Telemetry-BV4GonCV.cjs} +2 -2
  2. package/dist/Telemetry-BV4GonCV.cjs.map +1 -0
  3. package/dist/Telemetry-CH2kkxWK.cjs +322 -0
  4. package/dist/Telemetry-CH2kkxWK.cjs.map +1 -0
  5. package/dist/{Telemetry-Bf6lUdai.js → Telemetry-Cz9QCzRo.js} +2 -2
  6. package/dist/Telemetry-Cz9QCzRo.js.map +1 -0
  7. package/dist/{background-D5K6ecEo.js → background-DFME5huR.js} +30 -7
  8. package/dist/background-DFME5huR.js.map +1 -0
  9. package/dist/{background-obsD4Gj2.cjs → background-DVZB1n4j.cjs} +25 -6
  10. package/dist/background-DVZB1n4j.cjs.map +1 -0
  11. package/dist/background-WaKtfQWr.cjs +192 -0
  12. package/dist/background-WaKtfQWr.cjs.map +1 -0
  13. package/dist/{background-C8doa9-4.js → background-_A5NwvYH.js} +1 -1
  14. package/dist/{config-CcqzzfB7.cjs → config-DKAqX5sW.cjs} +18 -4
  15. package/dist/config-DKAqX5sW.cjs.map +1 -0
  16. package/dist/{config-IMZ26zcb.js → config-DV_7s1m-.js} +19 -5
  17. package/dist/config-DV_7s1m-.js.map +1 -0
  18. package/dist/config-OL_izsmp.cjs +113 -0
  19. package/dist/config-OL_izsmp.cjs.map +1 -0
  20. package/dist/credentials-xOkTTDWj.cjs +113 -0
  21. package/dist/credentials-xOkTTDWj.cjs.map +1 -0
  22. package/dist/index.cjs +65 -24
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.cts +8 -0
  25. package/dist/index.d.ts +0 -1
  26. package/dist/index.js +65 -24
  27. package/dist/index.js.map +1 -1
  28. package/dist/output-C5g7AtWH.cjs +1008 -0
  29. package/dist/output-C5g7AtWH.cjs.map +1 -0
  30. package/dist/{output-mwVt_Vj9.js → output-D_gc1nrM.js} +99 -44
  31. package/dist/output-D_gc1nrM.js.map +1 -0
  32. package/dist/{output-DLrxGtuN.cjs → output-nieBFDgM.cjs} +104 -43
  33. package/dist/output-nieBFDgM.cjs.map +1 -0
  34. package/dist/{registry-x-_nbYR6.cjs → registry-C8E_G7Xc.cjs} +49 -15
  35. package/dist/registry-C8E_G7Xc.cjs.map +1 -0
  36. package/dist/registry-CIpW2zQc.cjs +157 -0
  37. package/dist/registry-CIpW2zQc.cjs.map +1 -0
  38. package/dist/{registry-ChqX2AFQ.js → registry-De1vVn1d.js} +50 -16
  39. package/dist/registry-De1vVn1d.js.map +1 -0
  40. package/dist/rolldown-runtime-C0BPl7ul.cjs +43 -0
  41. package/dist/run-BbhrOuK6.cjs +40 -0
  42. package/dist/{run-1MJA0P5x.cjs.map → run-BbhrOuK6.cjs.map} +1 -1
  43. package/dist/{run-DHiVlG37.cjs → run-BnLba1gt.cjs} +27 -14
  44. package/dist/run-BnLba1gt.cjs.map +1 -0
  45. package/dist/{run-D4vOhfbJ.js → run-Bp47k1W1.js} +2 -2
  46. package/dist/{run-D4vOhfbJ.js.map → run-Bp47k1W1.js.map} +1 -1
  47. package/dist/run-BpdJ6X75.cjs +32 -0
  48. package/dist/{run-B13e9GQz.cjs.map → run-BpdJ6X75.cjs.map} +1 -1
  49. package/dist/{run-Cm0sJO0h.js → run-CCMlmk-z.js} +1 -1
  50. package/dist/{run-DTz7gAk1.js → run-CPYD1Lp0.js} +27 -14
  51. package/dist/run-CPYD1Lp0.js.map +1 -0
  52. package/dist/run-CSOEGpWZ.cjs +326 -0
  53. package/dist/run-CSOEGpWZ.cjs.map +1 -0
  54. package/dist/{run-B13e9GQz.cjs → run-CvE8ZdKG.cjs} +2 -2
  55. package/dist/run-CvE8ZdKG.cjs.map +1 -0
  56. package/dist/{run-Cu3pmezx.js → run-DaFK-Uy2.js} +2 -2
  57. package/dist/{run-Cu3pmezx.js.map → run-DaFK-Uy2.js.map} +1 -1
  58. package/dist/{run-BAlcXyYw.js → run-Ij84bqza.js} +22 -16
  59. package/dist/run-Ij84bqza.js.map +1 -0
  60. package/dist/{run-1MJA0P5x.cjs → run-MFjzBB_M.cjs} +2 -2
  61. package/dist/run-MFjzBB_M.cjs.map +1 -0
  62. package/dist/run-hgSZImuK.cjs +345 -0
  63. package/dist/run-hgSZImuK.cjs.map +1 -0
  64. package/dist/{run-CUyhuGlK.cjs → run-hyi91b22.cjs} +22 -16
  65. package/dist/run-hyi91b22.cjs.map +1 -0
  66. package/dist/{snapshot-DCG-Jf1A.js → snapshot-B6w3BLum.js} +22 -9
  67. package/dist/snapshot-B6w3BLum.js.map +1 -0
  68. package/dist/snapshot-DP9Pcnsg.cjs +264 -0
  69. package/dist/snapshot-DP9Pcnsg.cjs.map +1 -0
  70. package/dist/{snapshot-C5cthCuU.cjs → snapshot-D_F4XkYQ.cjs} +22 -9
  71. package/dist/snapshot-D_F4XkYQ.cjs.map +1 -0
  72. package/dist/studioWorker.js +2 -2
  73. package/package.json +15 -10
  74. package/dist/Telemetry-Bf6lUdai.js.map +0 -1
  75. package/dist/Telemetry-BfdvvZus.cjs.map +0 -1
  76. package/dist/background-D5K6ecEo.js.map +0 -1
  77. package/dist/background-obsD4Gj2.cjs.map +0 -1
  78. package/dist/config-CcqzzfB7.cjs.map +0 -1
  79. package/dist/config-IMZ26zcb.js.map +0 -1
  80. package/dist/output-DLrxGtuN.cjs.map +0 -1
  81. package/dist/output-mwVt_Vj9.js.map +0 -1
  82. package/dist/registry-ChqX2AFQ.js.map +0 -1
  83. package/dist/registry-x-_nbYR6.cjs.map +0 -1
  84. package/dist/run-BAlcXyYw.js.map +0 -1
  85. package/dist/run-CUyhuGlK.cjs.map +0 -1
  86. package/dist/run-DHiVlG37.cjs.map +0 -1
  87. package/dist/run-DTz7gAk1.js.map +0 -1
  88. package/dist/snapshot-C5cthCuU.cjs.map +0 -1
  89. package/dist/snapshot-DCG-Jf1A.js.map +0 -1
  90. package/dist/studioWorker.d.ts +0 -1
@@ -0,0 +1,1008 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
2
+ const require_Telemetry = require("./Telemetry-CH2kkxWK.cjs");
3
+ let node_util = require("node:util");
4
+ let node_process = require("node:process");
5
+ node_process = require_rolldown_runtime.__toESM(node_process, 1);
6
+ let node_fs_promises = require("node:fs/promises");
7
+ let node_path = require("node:path");
8
+ let gunshi_agent = require("gunshi/agent");
9
+ let _kubb_core = require("@kubb/core");
10
+ let _clack_prompts = require("@clack/prompts");
11
+ _clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
12
+ let node_fs = require("node:fs");
13
+ let jiti = require("jiti");
14
+ //#region ../../internals/shared/src/constants.ts
15
+ const KUBB_CONFIG_FILENAME = "kubb.config.ts";
16
+ /** File extensions a Kubb config file may use. */
17
+ const CONFIG_EXTENSIONS = [
18
+ ".ts",
19
+ ".mts",
20
+ ".cts",
21
+ ".js",
22
+ ".mjs",
23
+ ".cjs"
24
+ ];
25
+ const KUBB_PACKAGE_NAME = "kubb";
26
+ const initDefaults = {
27
+ inputPath: "./openapi.yaml",
28
+ outputPath: "./src/gen",
29
+ plugins: ["plugin-ts"]
30
+ };
31
+ //#endregion
32
+ //#region ../../internals/shared/src/loader.ts
33
+ /**
34
+ * jiti options for loading Kubb config modules: the automatic JSX runtime pointed at
35
+ * `@kubb/renderer-jsx`, and `moduleCache` off so a re-load re-evaluates the file.
36
+ */
37
+ const JITI_OPTIONS = {
38
+ jsx: {
39
+ runtime: "automatic",
40
+ importSource: "@kubb/renderer-jsx"
41
+ },
42
+ moduleCache: false
43
+ };
44
+ /**
45
+ * Plain JavaScript files. jiti hands these to Node's native `import()`, whose module cache never
46
+ * lets go of a file, so `moduleCache: false` alone would keep returning the first version of it.
47
+ */
48
+ const JAVASCRIPT_EXTENSION = /\.[cm]?jsx?$/;
49
+ const jiti$1 = (0, jiti.createJiti)(require("url").pathToFileURL(__filename).href, JITI_OPTIONS);
50
+ /**
51
+ * Loads a Kubb TypeScript or JavaScript config module via jiti.
52
+ *
53
+ * jiti transpiles TypeScript and the `@kubb/renderer-jsx` JSX runtime on the fly. Every load
54
+ * re-evaluates the file, so a config edited on disk is picked up by the next load.
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * const config = await loadModule('/abs/kubb.config.ts', { default: true })
59
+ * ```
60
+ */
61
+ async function loadModule(filePath, options) {
62
+ if (!JAVASCRIPT_EXTENSION.test(filePath)) return options?.default ? jiti$1.import(filePath, { default: true }) : jiti$1.import(filePath);
63
+ const mod = await jiti$1.evalModule(await (0, node_fs_promises.readFile)(filePath, "utf8"), {
64
+ filename: filePath,
65
+ async: true,
66
+ forceTranspile: true
67
+ });
68
+ return options?.default ? mod?.default ?? mod : mod;
69
+ }
70
+ //#endregion
71
+ //#region ../../internals/shared/src/config.ts
72
+ const SEARCH_FILES = [
73
+ "",
74
+ ".config/",
75
+ "configs/"
76
+ ].flatMap((prefix) => [`${prefix}.kubbrc`, `${prefix}kubb.config`]);
77
+ /**
78
+ * The first Kubb config file in `cwd` or the nearest parent folder that has one: `.kubbrc` before
79
+ * `kubb.config`, the folder itself before its `.config/` and `configs/`, and {@link CONFIG_EXTENSIONS} in order.
80
+ */
81
+ function findConfigFile(cwd = node_process.default.cwd()) {
82
+ for (let dir = (0, node_path.resolve)(cwd);; dir = (0, node_path.dirname)(dir)) {
83
+ const found = SEARCH_FILES.flatMap((file) => CONFIG_EXTENSIONS.map((extension) => (0, node_path.join)(dir, `${file}${extension}`))).find((file) => (0, node_fs.existsSync)(file));
84
+ if (found || (0, node_path.dirname)(dir) === dir) return found;
85
+ }
86
+ }
87
+ /**
88
+ * Loads a Kubb config module, calls it with `cli` when it exports a function, and returns its
89
+ * configs as a list, so a single config and a `defineConfig([...])` array read the same.
90
+ */
91
+ async function loadConfigFile(file, cli) {
92
+ const loaded = await loadModule(file, { default: true });
93
+ const resolved = await (typeof loaded === "function" ? loaded(cli) : loaded);
94
+ return Array.isArray(resolved) ? resolved : [resolved];
95
+ }
96
+ //#endregion
97
+ //#region src/utils/env.ts
98
+ /**
99
+ * Returns `true` when the process has an interactive TTY with a valid terminal
100
+ * width and is not running in CI.
101
+ *
102
+ * Some IDE-embedded terminals report `isTTY = true` but set `columns` to `0`,
103
+ * which breaks clack's box-drawing helpers (they call `String.prototype.repeat`
104
+ * with a negative count and throw a `RangeError`). A positive column count is
105
+ * required before the TTY counts as usable.
106
+ *
107
+ * @example
108
+ * ```ts
109
+ * if (canUseTTY()) {
110
+ * renderProgressBar()
111
+ * }
112
+ * ```
113
+ */
114
+ function canUseTTY() {
115
+ return process.stdout.isTTY && (process.stdout.columns ?? 0) > 0 && !require_Telemetry.isCIEnvironment();
116
+ }
117
+ /**
118
+ * Returns `true` when output can carry spinners and clack's gutter: an interactive TTY that no AI
119
+ * coding agent is reading. Cursor-movement escapes are hard for an agent to parse even over a
120
+ * pseudo-TTY, so it gets the plain writer.
121
+ */
122
+ function isRichOutput() {
123
+ return canUseTTY() && !(0, gunshi_agent.getAgentProfile)().isAgent;
124
+ }
125
+ //#endregion
126
+ //#region src/loggers/banner.ts
127
+ /**
128
+ * Colors for each part of the Kubb mascot illustration.
129
+ */
130
+ const palette = {
131
+ /**
132
+ * Top cap of the skittle.
133
+ */
134
+ lid: (text) => (0, node_util.styleText)("red", text),
135
+ /**
136
+ * Wood body.
137
+ */
138
+ wood: (text) => (0, node_util.styleText)("yellow", text),
139
+ /**
140
+ * Base wood body.
141
+ */
142
+ woodBase: (text) => (0, node_util.styleText)(["dim", "yellow"], text),
143
+ /**
144
+ * Eye whites.
145
+ */
146
+ eye: (text) => (0, node_util.styleText)("white", text),
147
+ /**
148
+ * Highlight accent.
149
+ */
150
+ highlight: (text) => (0, node_util.styleText)("gray", text),
151
+ /**
152
+ * Cheek blush.
153
+ */
154
+ blush: (text) => (0, node_util.styleText)("magenta", text)
155
+ };
156
+ /**
157
+ * Generates the Kubb mascot welcome banner as an ANSI-colored string.
158
+ *
159
+ * @example
160
+ * ```ts
161
+ * console.log(getIntro({ title: 'kubb.config.ts', description: 'generating…', version: '5.0.0', areEyesOpen: true }))
162
+ * ```
163
+ */
164
+ function getIntro({ title, description, version, areEyesOpen }) {
165
+ const kubbVersion = (0, node_util.styleText)(["bold", "yellow"], `KUBB v${version}`);
166
+ const eyeTop = areEyesOpen ? palette.eye("█▀█") : palette.eye("───");
167
+ const eyeBottom = areEyesOpen ? palette.eye("▀▀▀") : palette.eye("───");
168
+ return [
169
+ ` ${palette.lid("▄▄▄▄▄▄▄▄▄▄▄▄▄")}`,
170
+ ` ${palette.wood("█ ")}${palette.highlight("▄▄")}${palette.wood(" ")}${palette.highlight("▄▄")}${palette.wood(" █")} ${kubbVersion}`,
171
+ ` ${palette.wood("█ ")}${eyeTop}${palette.wood(" ")}${eyeTop}${palette.wood(" █")} ${(0, node_util.styleText)("gray", title)}`,
172
+ ` ${palette.wood("█ ")}${eyeBottom}${palette.wood(" ")}${palette.blush("◡")}${palette.wood(" ")}${eyeBottom}${palette.wood(" █")} ${(0, node_util.styleText)("yellow", "➜")} ${(0, node_util.styleText)("white", description)}`,
173
+ ` ${palette.woodBase("▀▀▀▀▀▀▀▀▀▀▀▀▀")}`
174
+ ].join("\n");
175
+ }
176
+ /**
177
+ * Formats a millisecond duration with a threshold-based ANSI color.
178
+ * `≤ 500 ms` → green · `≤ 1 000 ms` → yellow · `> 1 000 ms` → red.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * formatMsWithColor(200) // '\x1b[32m200ms\x1b[39m'
183
+ * formatMsWithColor(800) // '\x1b[33m800ms\x1b[39m'
184
+ * formatMsWithColor(1500) // '\x1b[31m1.50s\x1b[39m'
185
+ * ```
186
+ */
187
+ function formatMsWithColor(ms) {
188
+ const formatted = require_Telemetry.formatMs(ms);
189
+ if (ms <= 500) return (0, node_util.styleText)("green", formatted);
190
+ if (ms <= 1e3) return (0, node_util.styleText)("yellow", formatted);
191
+ return (0, node_util.styleText)("red", formatted);
192
+ }
193
+ //#endregion
194
+ //#region src/loggers/createLogger.ts
195
+ /** Display path for a config's input: the string form, or its `path` field when the input is an object. */
196
+ function getInputPath(config) {
197
+ const { input } = config;
198
+ if (typeof input === "string") return input;
199
+ return typeof input?.path === "string" ? input.path : void 0;
200
+ }
201
+ /** Counts a noun, so a message never reads `1 files`. */
202
+ function pluralize(count, noun) {
203
+ return `${count} ${count === 1 ? noun : `${noun}s`}`;
204
+ }
205
+ /** Prefixes a `[HH:MM:SS]` timestamp at verbose and above. */
206
+ function formatMessage(message, logLevel) {
207
+ if (logLevel >= _kubb_core.logLevel.verbose) {
208
+ const timestamp = (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", {
209
+ hour12: false,
210
+ hour: "2-digit",
211
+ minute: "2-digit",
212
+ second: "2-digit"
213
+ });
214
+ return `${(0, node_util.styleText)("dim", `[${timestamp}]`)} ${message}`;
215
+ }
216
+ return message;
217
+ }
218
+ /**
219
+ * Renders a `studio:connected` event's versions: the runtime only when it differs from the host.
220
+ */
221
+ function formatVersions({ studio, kubb, agent }) {
222
+ return [
223
+ `v${agent}`,
224
+ kubb !== agent ? `runtime v${kubb}` : void 0,
225
+ `Studio v${studio}`
226
+ ].filter(Boolean).join(", ");
227
+ }
228
+ /** The progress summary line the clack logger shows, `null` when there is nothing to display. */
229
+ function buildProgressLine(state) {
230
+ const parts = [];
231
+ const duration = require_Telemetry.formatMs(require_Telemetry.getElapsedMs(state.hrStart));
232
+ if (state.totalPlugins > 0) {
233
+ 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}`;
234
+ parts.push(pluginStr);
235
+ }
236
+ if (state.totalFiles > 0) parts.push(`Files ${(0, node_util.styleText)("green", state.processedFiles.toString())}/${state.totalFiles}`);
237
+ if (parts.length === 0) return null;
238
+ parts.push(`${(0, node_util.styleText)("green", duration)} elapsed`);
239
+ return parts.join((0, node_util.styleText)("dim", " | "));
240
+ }
241
+ function createProgressCounters() {
242
+ return {
243
+ totalPlugins: 0,
244
+ completedPlugins: 0,
245
+ failedPlugins: 0,
246
+ totalFiles: 0,
247
+ processedFiles: 0,
248
+ hrStart: node_process.default.hrtime()
249
+ };
250
+ }
251
+ /**
252
+ * The three output phases, in the order the generate runner runs them.
253
+ */
254
+ const PHASES = {
255
+ format: {
256
+ running: "Formatting",
257
+ success: "Formatted",
258
+ failure: "Formatting failed"
259
+ },
260
+ lint: {
261
+ running: "Linting",
262
+ success: "Linted",
263
+ failure: "Linting failed"
264
+ },
265
+ hooks: {
266
+ running: "Running post-generate hooks",
267
+ success: "Post-generate hooks completed",
268
+ failure: "Post-generate hooks failed",
269
+ showHookResults: true
270
+ }
271
+ };
272
+ /**
273
+ * Drops the blank lines a subprocess leaves at either end of its output, so its block does not open
274
+ * or close on an empty row.
275
+ */
276
+ function trimBlankEdges(lines) {
277
+ const start = lines.findIndex((line) => line.trim());
278
+ if (start === -1) return [];
279
+ return lines.slice(start, lines.findLastIndex((line) => line.trim()) + 1);
280
+ }
281
+ /**
282
+ * Wires a {@link LoggerWriter} onto the run's hooks. This owns what a run says and in what order:
283
+ * one group per config, a step over the plugin work, a progress bar for the writes, one step per
284
+ * output phase, then the summary and the group's closing result. The writer only decides how each
285
+ * line looks, so every logger reports the same run the same way.
286
+ *
287
+ * @example
288
+ * ```ts
289
+ * export const plainLogger = createLogger(writer, { audience: 'agent' })
290
+ * ```
291
+ */
292
+ function createLogger(writer, { audience }) {
293
+ return function install(context, { logLevel }) {
294
+ const silent = logLevel <= _kubb_core.logLevel.silent;
295
+ const human = audience === "human";
296
+ const formatOptions = {
297
+ audience,
298
+ verbose: logLevel >= _kubb_core.logLevel.verbose,
299
+ width: Math.min(node_process.default.stdout.columns || 80, 100) - 2
300
+ };
301
+ const state = {
302
+ ...createProgressCounters(),
303
+ spinner: null,
304
+ progress: null,
305
+ hooks: /* @__PURE__ */ new Map(),
306
+ /**
307
+ * Plugin results held back while the generation step owns the line.
308
+ */
309
+ pluginLines: [],
310
+ phase: null,
311
+ groupOpen: false,
312
+ /**
313
+ * Whether this run keeps its files in memory, as a `kubb studio` run without `--allow-write` does.
314
+ */
315
+ inMemory: false,
316
+ /**
317
+ * Problems held back so the human view can print them grouped by plugin once the build ends.
318
+ */
319
+ problems: [],
320
+ /**
321
+ * The finished config's diagnostics and file count, for the closing summary.
322
+ */
323
+ outcome: null
324
+ };
325
+ function text(message) {
326
+ return formatMessage(message, logLevel);
327
+ }
328
+ function startSpinner(message) {
329
+ if (silent) return;
330
+ state.spinner = writer.spinner();
331
+ state.spinner.start(text(message));
332
+ }
333
+ function stopSpinner(message, status = "success") {
334
+ const spinner = state.spinner;
335
+ if (!spinner) return;
336
+ state.spinner = null;
337
+ if (message === void 0) {
338
+ spinner.clear();
339
+ return;
340
+ }
341
+ if (status === "failed") {
342
+ spinner.error(text(message));
343
+ return;
344
+ }
345
+ spinner.stop(text(message));
346
+ }
347
+ function stopProgress(message) {
348
+ const progress = state.progress;
349
+ if (!progress) return;
350
+ state.progress = null;
351
+ progress.stop(message === void 0 ? "" : text(message));
352
+ }
353
+ function startPhase({ running, success, failure, showHookResults = false }) {
354
+ state.phase = {
355
+ successLabel: success,
356
+ failureLabel: failure,
357
+ showHookResults,
358
+ failed: false,
359
+ hrStart: node_process.default.hrtime(),
360
+ lines: [],
361
+ output: []
362
+ };
363
+ startSpinner(running);
364
+ }
365
+ function endPhase() {
366
+ const phase = state.phase;
367
+ state.phase = null;
368
+ if (!phase || silent) return;
369
+ const duration = formatMsWithColor(require_Telemetry.getElapsedMs(phase.hrStart));
370
+ stopSpinner(phase.failed ? `${phase.failureLabel} after ${duration}` : `${phase.successLabel} in ${duration}`, phase.failed ? "failed" : "success");
371
+ if (phase.lines.length) writer.block(phase.lines);
372
+ writeOutput(phase.output);
373
+ }
374
+ function writeOutput(lines) {
375
+ const output = trimBlankEdges(lines);
376
+ if (output.length) writer.raw(output);
377
+ }
378
+ /** `✖ Failed 1 error · 1 warning in plugin-ts` once the build ended, or `✗ Generation failed` for a run that stopped early. */
379
+ function failedTitle() {
380
+ const diagnostics = state.outcome?.diagnostics ?? [];
381
+ const counts = formatCounts(diagnostics);
382
+ if (!human || !counts) return "✗ Generation failed";
383
+ const plugins = _kubb_core.Diagnostics.failedPlugins(diagnostics);
384
+ return `✖ Failed ${counts}${plugins.length ? ` in ${plugins.join(", ")}` : ""}`;
385
+ }
386
+ function closeGroup(status) {
387
+ if (!state.groupOpen) return;
388
+ state.groupOpen = false;
389
+ stopSpinner();
390
+ stopProgress();
391
+ writer.groupEnd(status === "failed" ? (0, node_util.styleText)("red", failedTitle()) : (0, node_util.styleText)("green", "✓ Generation succeeded"));
392
+ }
393
+ function reset() {
394
+ stopSpinner();
395
+ stopProgress();
396
+ Object.assign(state, createProgressCounters());
397
+ state.hooks.clear();
398
+ state.pluginLines = [];
399
+ state.phase = null;
400
+ state.groupOpen = false;
401
+ state.problems = [];
402
+ state.outcome = null;
403
+ }
404
+ /**
405
+ * Prints problems grouped under their plugin's name, each with the code aligned at the right.
406
+ */
407
+ function writeProblems(problems) {
408
+ if (!problems.length) return;
409
+ if (!human) {
410
+ for (const problem of problems) writer.diagnostic(_kubb_core.Diagnostics.format(problem, formatOptions));
411
+ return;
412
+ }
413
+ const lines = [...Map.groupBy(problems, (problem) => problem.plugin ?? "")].flatMap(([plugin, group]) => [...plugin ? [` ${(0, node_util.styleText)("bold", plugin)}`, ""] : [], ...group.flatMap((problem) => [..._kubb_core.Diagnostics.format(problem, formatOptions).map((line) => ` ${line}`), ""])]);
414
+ writer.diagnostic(lines.slice(0, -1));
415
+ }
416
+ /** The run's verdict: `1 error · 1 warning` for a human, `1 error, 1 warning` for an agent. */
417
+ function formatCounts(diagnostics) {
418
+ const { errors, warnings } = _kubb_core.Diagnostics.count(diagnostics);
419
+ return [errors && pluralize(errors, "error"), warnings && pluralize(warnings, "warning")].filter(Boolean).join(human ? " · " : ", ");
420
+ }
421
+ function formatLine(symbol, message, info) {
422
+ return text([
423
+ symbol,
424
+ message,
425
+ info && (0, node_util.styleText)("dim", info)
426
+ ].filter(Boolean).join(" "));
427
+ }
428
+ context.hook("kubb:warn", ({ message, info }) => {
429
+ if (logLevel < _kubb_core.logLevel.warn) return;
430
+ writer.warn(formatLine((0, node_util.styleText)("yellow", "⚠"), message, logLevel >= _kubb_core.logLevel.info ? info : void 0));
431
+ });
432
+ context.hook("kubb:error", ({ error }) => {
433
+ if (state.phase) state.phase.failed = true;
434
+ const message = error.name === "Error" || _kubb_core.Diagnostics.isError(error) ? error.message : `${error.name}: ${error.message}`;
435
+ const help = _kubb_core.Diagnostics.isError(error) ? error.diagnostic.help : void 0;
436
+ const [headline = "", ...details] = _kubb_core.Diagnostics.format({
437
+ code: _kubb_core.Diagnostics.code.unknown,
438
+ severity: "error",
439
+ message,
440
+ help,
441
+ cause: error
442
+ }, formatOptions);
443
+ if (!human) {
444
+ stopSpinner();
445
+ stopProgress();
446
+ writer.diagnostic([headline, ...details]);
447
+ return;
448
+ }
449
+ if (state.spinner) stopSpinner(message, "failed");
450
+ else writer.error(text(message));
451
+ if (details.length) writer.block(details.map(text));
452
+ });
453
+ context.hook("kubb:diagnostic", ({ diagnostic }) => {
454
+ if (silent && diagnostic.severity !== "error") return;
455
+ stopSpinner();
456
+ stopProgress();
457
+ if (_kubb_core.Diagnostics.isUpdate(diagnostic)) {
458
+ writer.update([`\`v${diagnostic.currentVersion}\` → \`v${diagnostic.latestVersion}\``, "Run `npm install -g @kubb/cli` to update"], "Update available for `Kubb`");
459
+ return;
460
+ }
461
+ if (human && state.groupOpen) {
462
+ state.problems.push(diagnostic);
463
+ return;
464
+ }
465
+ writeProblems([diagnostic]);
466
+ });
467
+ context.hook("studio:disconnected", ({ code, reason }) => {
468
+ if (logLevel < _kubb_core.logLevel.warn) return;
469
+ stopSpinner();
470
+ if (code === 4002) {
471
+ writer.warn(text("⚠ Another process connected to Kubb Studio as this agent, so this one stopped"));
472
+ return;
473
+ }
474
+ writer.warn(text(`⚠ Kubb Studio ended the session (${reason || `code ${code}`})`));
475
+ });
476
+ context.hook("studio:warn", ({ message, permission }) => {
477
+ if (logLevel < _kubb_core.logLevel.warn) return;
478
+ const remedy = permission ? `; pass --${permission.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)} to allow it` : "";
479
+ writer.warn(text(`⚠ ${message}${remedy}`));
480
+ });
481
+ context.hook("studio:error", ({ error }) => {
482
+ if (state.spinner) {
483
+ stopSpinner(error.message, "failed");
484
+ return;
485
+ }
486
+ writer.error(text(error.message));
487
+ });
488
+ context.hook("kubb:lifecycle:start", () => {
489
+ reset();
490
+ });
491
+ context.hook("kubb:generation:start", ({ config }) => {
492
+ closeGroup("failed");
493
+ reset();
494
+ state.totalPlugins = config.plugins?.length ?? 0;
495
+ state.inMemory = config.storage?.name === "memory";
496
+ if (silent) return;
497
+ const inputPath = getInputPath(config);
498
+ writer.group(text([(0, node_util.styleText)("bold", config.name ?? "kubb"), inputPath ? (0, node_util.styleText)("dim", inputPath) : void 0].filter(Boolean).join(" ")));
499
+ state.groupOpen = true;
500
+ startSpinner("Generating");
501
+ });
502
+ context.hook("kubb:format:start", () => startPhase(PHASES.format));
503
+ context.hook("kubb:format:end", endPhase);
504
+ context.hook("kubb:lint:start", () => startPhase(PHASES.lint));
505
+ context.hook("kubb:lint:end", endPhase);
506
+ context.hook("kubb:hooks:start", () => startPhase(PHASES.hooks));
507
+ context.hook("kubb:hooks:end", endPhase);
508
+ context.hook("kubb:hook:end", (ctx) => {
509
+ const { id, command, name, args, success, error } = ctx;
510
+ if (!id) return;
511
+ if (!success && state.phase) state.phase.failed = true;
512
+ if (silent) {
513
+ if (!ctx.success) {
514
+ if (ctx.stdout) console.log(ctx.stdout);
515
+ if (ctx.stderr) console.error(ctx.stderr);
516
+ }
517
+ return;
518
+ }
519
+ const active = state.hooks.get(id);
520
+ if (!active) return;
521
+ state.hooks.delete(id);
522
+ const label = (0, node_util.styleText)("dim", name ?? (args?.length ? `${command} ${args.join(" ")}` : command));
523
+ const reason = error?.message ? ` (${error.message})` : "";
524
+ const result = success ? `${(0, node_util.styleText)("green", "✓")} ${label} in ${formatMsWithColor(require_Telemetry.getElapsedMs(active.hrStart))}` : `${(0, node_util.styleText)("red", "✗")} ${label} failed${reason}`;
525
+ const phase = state.phase;
526
+ if (phase) {
527
+ if (phase.showHookResults || !success) phase.lines.push(result);
528
+ phase.output.push(...active.lines);
529
+ return;
530
+ }
531
+ stopSpinner();
532
+ writer.step(text(result));
533
+ writeOutput(active.lines);
534
+ });
535
+ context.hook("kubb:generation:end", ({ diagnostics = [], filesCreated = 0, hrStart = node_process.default.hrtime() }) => {
536
+ stopSpinner();
537
+ stopProgress();
538
+ state.outcome = {
539
+ diagnostics,
540
+ filesCreated,
541
+ hrStart
542
+ };
543
+ writeProblems(state.problems.splice(0));
544
+ });
545
+ context.hook("kubb:lifecycle:end", () => {
546
+ writeProblems(state.problems.splice(0));
547
+ closeGroup("failed");
548
+ reset();
549
+ });
550
+ if (!silent) {
551
+ context.hook("kubb:info", ({ message, info }) => {
552
+ const line = formatLine((0, node_util.styleText)("blue", "ℹ"), message, info);
553
+ if (state.phase) {
554
+ state.phase.lines.push(line);
555
+ return;
556
+ }
557
+ if (state.spinner) {
558
+ state.spinner.message(line);
559
+ return;
560
+ }
561
+ writer.info(line);
562
+ });
563
+ context.hook("kubb:success", ({ message, info }) => {
564
+ const line = formatLine((0, node_util.styleText)("green", "✓"), message, logLevel >= _kubb_core.logLevel.info ? info : void 0);
565
+ if (state.spinner) {
566
+ state.spinner.message(line);
567
+ return;
568
+ }
569
+ writer.success(line);
570
+ });
571
+ context.hook("studio:connected", ({ url, versions }) => {
572
+ stopSpinner();
573
+ writer.success(text(`✓ Connected to ${(0, node_util.styleText)("cyan", url)} ${(0, node_util.styleText)("dim", `(${formatVersions(versions)})`)}`));
574
+ startSpinner("✓ Ready to receive jobs");
575
+ });
576
+ context.hook("studio:command", ({ command, info }) => {
577
+ stopSpinner();
578
+ writer.success(text(`✓ Finished ${command} ${(0, node_util.styleText)("dim", `(${info})`)}`));
579
+ startSpinner("✓ Ready to receive jobs");
580
+ });
581
+ context.hook("studio:reconnecting", ({ delayMs }) => {
582
+ stopSpinner();
583
+ writer.info(text((0, node_util.styleText)("dim", `Retrying connection to Kubb Studio in ${require_Telemetry.formatMs(delayMs)}`)));
584
+ });
585
+ context.hook("kubb:plugin:start", ({ plugin }) => {
586
+ state.spinner?.message(text(`Generating ${(0, node_util.styleText)("dim", plugin.name)}`));
587
+ });
588
+ context.hook("kubb:plugin:end", ({ plugin, duration, success }) => {
589
+ if (success) state.completedPlugins++;
590
+ if (!success) state.failedPlugins++;
591
+ state.pluginLines.push(text(`${plugin.name} ${success ? "completed" : "failed"} in ${formatMsWithColor(duration)}`));
592
+ });
593
+ context.hook("kubb:plugins:end", () => {
594
+ const failed = state.failedPlugins > 0;
595
+ stopSpinner(buildProgressLine(state) ?? void 0, failed ? "failed" : "success");
596
+ if (state.pluginLines.length) {
597
+ writer.block(state.pluginLines);
598
+ state.pluginLines = [];
599
+ }
600
+ });
601
+ context.hook("kubb:files:processing:start", ({ files }) => {
602
+ stopSpinner();
603
+ state.totalFiles = files.length;
604
+ state.processedFiles = 0;
605
+ state.progress = writer.progress(files.length);
606
+ state.progress.start(text(`${state.inMemory ? "Generating" : "Writing"} ${pluralize(files.length, "file")}`));
607
+ });
608
+ context.hook("kubb:files:processing:update", ({ files }) => {
609
+ for (const { file, config } of files) {
610
+ state.processedFiles++;
611
+ state.progress?.advance(`${state.inMemory ? "Generating" : "Writing"} ${(0, node_path.relative)(config.root, file.path)}`);
612
+ }
613
+ });
614
+ context.hook("kubb:files:processing:end", () => {
615
+ stopProgress(state.inMemory ? `Generated ${pluralize(state.processedFiles, "file")} in memory` : `Wrote ${pluralize(state.processedFiles, "file")}`);
616
+ });
617
+ context.hook("kubb:hook:start", ({ id }) => {
618
+ if (!id) return;
619
+ state.hooks.set(id, {
620
+ hrStart: node_process.default.hrtime(),
621
+ lines: []
622
+ });
623
+ });
624
+ context.hook("kubb:hook:line", ({ id, line }) => {
625
+ const active = state.hooks.get(id);
626
+ if (!active) return;
627
+ if (state.phase) {
628
+ active.lines.push(line);
629
+ return;
630
+ }
631
+ writer.raw([line]);
632
+ });
633
+ }
634
+ return { renderSummary(lines, { status }) {
635
+ if (silent || !state.groupOpen) return;
636
+ if (human) {
637
+ closeGroup(status);
638
+ writer.diagnostic([...lines]);
639
+ return;
640
+ }
641
+ stopSpinner();
642
+ stopProgress();
643
+ state.groupOpen = false;
644
+ const { diagnostics = [], filesCreated = 0, hrStart = node_process.default.hrtime() } = state.outcome ?? {};
645
+ if (status === "failed") {
646
+ const plugins = _kubb_core.Diagnostics.failedPlugins(diagnostics);
647
+ writer.diagnostic([`Kubb failed: ${formatCounts(diagnostics) || "an error"}${plugins.length ? ` (${plugins.join(", ")})` : ""}. Exit code 1.`, "Rerun with --reporter json for machine-readable diagnostics."]);
648
+ return;
649
+ }
650
+ const warnings = formatCounts(diagnostics);
651
+ writer.diagnostic([`Kubb succeeded: ${pluralize(filesCreated, "file")} generated in ${require_Telemetry.formatMs(require_Telemetry.getElapsedMs(hrStart))}${warnings ? `, ${warnings}` : ""}.`]);
652
+ } };
653
+ };
654
+ }
655
+ //#endregion
656
+ //#region src/loggers/clackLogger.ts
657
+ /**
658
+ * Draws with clack: a gutter bar per group, animated steps, and a progress bar for the writes.
659
+ */
660
+ const clackWriter = {
661
+ group: (title) => _clack_prompts.intro(title),
662
+ groupEnd: (text) => _clack_prompts.outro(text),
663
+ step: (text) => _clack_prompts.log.step(text, { spacing: 0 }),
664
+ info: (text) => _clack_prompts.log.info(text),
665
+ success: (text) => _clack_prompts.log.success(text),
666
+ warn: (text) => _clack_prompts.log.warn(text),
667
+ error: (text) => _clack_prompts.log.error(text),
668
+ block: (lines) => _clack_prompts.log.message(lines, { spacing: 0 }),
669
+ raw: (lines) => console.log((0, node_util.styleText)("dim", lines.join("\n"))),
670
+ diagnostic: (lines) => _clack_prompts.log.message(lines, {
671
+ symbol: "",
672
+ secondarySymbol: ""
673
+ }),
674
+ update: (lines, title) => _clack_prompts.box(lines.join("\n"), title, {
675
+ width: "auto",
676
+ formatBorder: (border) => (0, node_util.styleText)("yellow", border),
677
+ rounded: true,
678
+ withGuide: false,
679
+ contentAlign: "center",
680
+ titleAlign: "center"
681
+ }),
682
+ spinner: () => _clack_prompts.spinner(),
683
+ progress(max) {
684
+ const bar = _clack_prompts.progress({
685
+ style: "block",
686
+ max,
687
+ size: 30
688
+ });
689
+ return {
690
+ start: (text) => bar.start(text),
691
+ advance: (text) => bar.advance(1, text),
692
+ stop: (text) => bar.stop(text)
693
+ };
694
+ }
695
+ };
696
+ /**
697
+ * TTY logger for local development, with animated steps and progress bars.
698
+ */
699
+ const clackLogger = createLogger(clackWriter, { audience: "human" });
700
+ //#endregion
701
+ //#region src/loggers/plainLogger.ts
702
+ /**
703
+ * Prefixes that stand in for the symbols clack draws, so plain output reads the same way.
704
+ */
705
+ const SYMBOLS = {
706
+ info: "ℹ",
707
+ warn: "⚠",
708
+ error: "✗",
709
+ step: "◇"
710
+ };
711
+ /** Draws with one `write` call per line. Nothing animates, so a step prints at start and end. */
712
+ function createWriter(write) {
713
+ return {
714
+ group: write,
715
+ groupEnd: write,
716
+ step: (text) => write(`${SYMBOLS.step} ${text}`),
717
+ info: write,
718
+ success: write,
719
+ warn: write,
720
+ error: (text) => write(`${SYMBOLS.error} ${text}`),
721
+ block: (lines) => write(lines.join("\n")),
722
+ raw: (lines) => write(lines.join("\n")),
723
+ diagnostic: (lines) => write(lines.join("\n")),
724
+ update: (lines, title) => write([title, ...lines].join("\n")),
725
+ spinner: () => ({
726
+ start: write,
727
+ message: write,
728
+ clear: () => {},
729
+ stop: (text) => text && write(text),
730
+ error: (text) => write(`${SYMBOLS.error} ${text}`)
731
+ }),
732
+ progress: () => ({
733
+ start: write,
734
+ advance: write,
735
+ stop: (text) => text && write(text)
736
+ })
737
+ };
738
+ }
739
+ /** The plain logger writing through `write`, e.g. `console.error` so stdout carries only JSON. */
740
+ function createPlainLogger(write) {
741
+ return createLogger(createWriter(write), { audience: "agent" });
742
+ }
743
+ /** Draws on the console, for non-TTY environments and for an AI coding agent reading the output. */
744
+ const plainWriter = createWriter((line) => console.log(line));
745
+ /**
746
+ * Console adapter for non-TTY environments, and for an AI coding agent reading the output. Reports
747
+ * the same run in the same order as `clackLogger`, without the animation.
748
+ */
749
+ const plainLogger = createLogger(plainWriter, { audience: "agent" });
750
+ //#endregion
751
+ //#region src/loggers/output.ts
752
+ const SPONSOR_TIPS = [
753
+ "Your sponsorship keeps Kubb codegen, plugins, and docs maintained",
754
+ "Sponsor faster generators and better Kubb Studio workflows",
755
+ "Help keep Kubb free for TypeScript teams building APIs",
756
+ "Support React Query, Zod, Faker, and MSW integrations",
757
+ "Back open-source tools that turn OpenAPI into TypeScript",
758
+ "Sponsor fixes, releases, and new plugins for your API workflow",
759
+ "Help Kubb stay independent and focused on developer tools"
760
+ ];
761
+ const SPONSOR_LINKS = [
762
+ "https://github.com/sponsors/stijnvanhulle",
763
+ "https://opencollective.com/kubb",
764
+ "https://kubb.dev/sponsors"
765
+ ];
766
+ /** The writer the loggers draw with on this terminal, so a command's own lines look like its run. */
767
+ function writer() {
768
+ return isRichOutput() ? clackWriter : plainWriter;
769
+ }
770
+ function nextTip() {
771
+ return `${SPONSOR_TIPS[Math.floor(Math.random() * SPONSOR_TIPS.length)]}: ${SPONSOR_LINKS[Math.floor(Math.random() * SPONSOR_LINKS.length)]}`;
772
+ }
773
+ function formatTip(tip) {
774
+ return (0, node_util.styleText)("magenta", " Tip ") + (0, node_util.styleText)("yellow", tip);
775
+ }
776
+ /**
777
+ * Prints one random tip outside every group. Rich terminals get the styled variant;
778
+ * plain/CI output gets a stable text-only line so the tip is still visible as final output.
779
+ */
780
+ function logTip() {
781
+ const tip = nextTip();
782
+ if (!isRichOutput()) {
783
+ console.log(`Tip: ${tip}`);
784
+ return;
785
+ }
786
+ console.log(`${(0, node_util.styleText)("magenta", "✦")}${formatTip(tip)}`);
787
+ }
788
+ function write(level, message) {
789
+ if (isRichOutput()) {
790
+ _clack_prompts.log[level](message);
791
+ return;
792
+ }
793
+ console.log(`${SYMBOLS[level]} ${message}`);
794
+ }
795
+ /**
796
+ * Opens a command's output with its title.
797
+ */
798
+ function logIntro({ title, warning, block = true }) {
799
+ if (block && isRichOutput()) {
800
+ if (title) _clack_prompts.intro(title);
801
+ if (warning) _clack_prompts.log.warn(warning);
802
+ return;
803
+ }
804
+ if (title) console.log(title);
805
+ if (warning) console.warn(warning);
806
+ if (title || warning) console.log();
807
+ }
808
+ /**
809
+ * Closes the block {@link logIntro} opened. The closing gutter is not a written line, so plain
810
+ * output prints the text on its own.
811
+ */
812
+ function logOutro(text) {
813
+ writer().groupEnd(text);
814
+ }
815
+ /**
816
+ * Prints one empty line between two groups, without clack's gutter bar, since the bar belongs to a
817
+ * group and a spacer sits outside every one.
818
+ */
819
+ function logSpacer() {
820
+ console.log("");
821
+ }
822
+ /**
823
+ * Opens the command with the Kubb mascot and version, or a single version line where the terminal
824
+ * cannot draw it.
825
+ */
826
+ function logBanner(version) {
827
+ if (isRichOutput()) {
828
+ console.log(`\n${getIntro({
829
+ title: "Turn your API spec into type-safe code",
830
+ description: "Ready to start",
831
+ version,
832
+ areEyesOpen: true
833
+ })}\n`);
834
+ return;
835
+ }
836
+ console.log(`Kubb CLI v${version}`);
837
+ }
838
+ /** Prints lines as one block, without a symbol in front of them. Not the writer's block, which drops clack's spacing around it. */
839
+ function logBlock(lines) {
840
+ if (isRichOutput()) {
841
+ _clack_prompts.log.message(lines);
842
+ return;
843
+ }
844
+ console.log([lines].flat().join("\n"));
845
+ }
846
+ function logInfo(message) {
847
+ write("info", message);
848
+ }
849
+ function logWarn(message) {
850
+ write("warn", message);
851
+ }
852
+ function logError(message) {
853
+ write("error", message);
854
+ }
855
+ /**
856
+ * Reports a step the command is taking, rather than something it found.
857
+ */
858
+ function logStep(message) {
859
+ write("step", message);
860
+ }
861
+ /**
862
+ * A progress spinner, or a writer that prints each message it is given when the terminal cannot
863
+ * animate one. Callers drive both the same way, including the failure state.
864
+ */
865
+ function createSpinner() {
866
+ return writer().spinner();
867
+ }
868
+ //#endregion
869
+ Object.defineProperty(exports, "CONFIG_EXTENSIONS", {
870
+ enumerable: true,
871
+ get: function() {
872
+ return CONFIG_EXTENSIONS;
873
+ }
874
+ });
875
+ Object.defineProperty(exports, "KUBB_CONFIG_FILENAME", {
876
+ enumerable: true,
877
+ get: function() {
878
+ return KUBB_CONFIG_FILENAME;
879
+ }
880
+ });
881
+ Object.defineProperty(exports, "KUBB_PACKAGE_NAME", {
882
+ enumerable: true,
883
+ get: function() {
884
+ return KUBB_PACKAGE_NAME;
885
+ }
886
+ });
887
+ Object.defineProperty(exports, "canUseTTY", {
888
+ enumerable: true,
889
+ get: function() {
890
+ return canUseTTY;
891
+ }
892
+ });
893
+ Object.defineProperty(exports, "clackLogger", {
894
+ enumerable: true,
895
+ get: function() {
896
+ return clackLogger;
897
+ }
898
+ });
899
+ Object.defineProperty(exports, "createPlainLogger", {
900
+ enumerable: true,
901
+ get: function() {
902
+ return createPlainLogger;
903
+ }
904
+ });
905
+ Object.defineProperty(exports, "createSpinner", {
906
+ enumerable: true,
907
+ get: function() {
908
+ return createSpinner;
909
+ }
910
+ });
911
+ Object.defineProperty(exports, "findConfigFile", {
912
+ enumerable: true,
913
+ get: function() {
914
+ return findConfigFile;
915
+ }
916
+ });
917
+ Object.defineProperty(exports, "initDefaults", {
918
+ enumerable: true,
919
+ get: function() {
920
+ return initDefaults;
921
+ }
922
+ });
923
+ Object.defineProperty(exports, "isRichOutput", {
924
+ enumerable: true,
925
+ get: function() {
926
+ return isRichOutput;
927
+ }
928
+ });
929
+ Object.defineProperty(exports, "loadConfigFile", {
930
+ enumerable: true,
931
+ get: function() {
932
+ return loadConfigFile;
933
+ }
934
+ });
935
+ Object.defineProperty(exports, "logBanner", {
936
+ enumerable: true,
937
+ get: function() {
938
+ return logBanner;
939
+ }
940
+ });
941
+ Object.defineProperty(exports, "logBlock", {
942
+ enumerable: true,
943
+ get: function() {
944
+ return logBlock;
945
+ }
946
+ });
947
+ Object.defineProperty(exports, "logError", {
948
+ enumerable: true,
949
+ get: function() {
950
+ return logError;
951
+ }
952
+ });
953
+ Object.defineProperty(exports, "logInfo", {
954
+ enumerable: true,
955
+ get: function() {
956
+ return logInfo;
957
+ }
958
+ });
959
+ Object.defineProperty(exports, "logIntro", {
960
+ enumerable: true,
961
+ get: function() {
962
+ return logIntro;
963
+ }
964
+ });
965
+ Object.defineProperty(exports, "logOutro", {
966
+ enumerable: true,
967
+ get: function() {
968
+ return logOutro;
969
+ }
970
+ });
971
+ Object.defineProperty(exports, "logSpacer", {
972
+ enumerable: true,
973
+ get: function() {
974
+ return logSpacer;
975
+ }
976
+ });
977
+ Object.defineProperty(exports, "logStep", {
978
+ enumerable: true,
979
+ get: function() {
980
+ return logStep;
981
+ }
982
+ });
983
+ Object.defineProperty(exports, "logTip", {
984
+ enumerable: true,
985
+ get: function() {
986
+ return logTip;
987
+ }
988
+ });
989
+ Object.defineProperty(exports, "logWarn", {
990
+ enumerable: true,
991
+ get: function() {
992
+ return logWarn;
993
+ }
994
+ });
995
+ Object.defineProperty(exports, "plainLogger", {
996
+ enumerable: true,
997
+ get: function() {
998
+ return plainLogger;
999
+ }
1000
+ });
1001
+ Object.defineProperty(exports, "pluralize", {
1002
+ enumerable: true,
1003
+ get: function() {
1004
+ return pluralize;
1005
+ }
1006
+ });
1007
+
1008
+ //# sourceMappingURL=output-C5g7AtWH.cjs.map