@kubb/cli 3.0.0-alpha.5 → 3.0.0-alpha.6

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.
@@ -1,5 +1,5 @@
1
1
  // src/generate.ts
2
- import { createLogger, LogMapper as LogMapper2 } from "@kubb/core/logger";
2
+ import { LogMapper as LogMapper2, createLogger } from "@kubb/core/logger";
3
3
  import c4 from "tinyrainbow";
4
4
  import { safeBuild } from "@kubb/core";
5
5
 
@@ -19,7 +19,7 @@ var ConsolaWritable = class extends Writable {
19
19
  this.consola = consola;
20
20
  }
21
21
  _write(chunk, _encoding, callback) {
22
- process2.stdout.write(c.dim(chunk?.toString()));
22
+ process2.stdout.write(`${c.dim(chunk?.toString())}`);
23
23
  callback();
24
24
  }
25
25
  };
@@ -43,14 +43,11 @@ async function executeHooks({ hooks, logger }) {
43
43
  stdout: logger.logLevel === LogMapper.silent ? void 0 : ["pipe", consolaWritable],
44
44
  stripFinalNewline: true
45
45
  });
46
- logger.emit("success", `Executing hook ${logger.logLevel !== LogMapper.silent ? c2.dim(command) : ""}`);
47
- if (subProcess) {
48
- logger.emit("debug", [subProcess.stdout]);
49
- }
46
+ logger.emit("success", `Executed hook ${logger.logLevel !== LogMapper.silent ? c2.dim(command) : ""}`);
50
47
  });
51
48
  });
52
49
  await Promise.all(promises);
53
- logger.emit("success", "Executing hooks");
50
+ logger.emit("success", "Executed hooks");
54
51
  }
55
52
 
56
53
  // src/utils/getErrorCauses.ts
@@ -78,7 +75,7 @@ function parseHrtimeToSeconds(hrtime) {
78
75
  }
79
76
 
80
77
  // src/utils/getSummary.ts
81
- function getSummary({ pluginManager, status, hrStart, config, logger }) {
78
+ function getSummary({ pluginManager, status, hrStart, config }) {
82
79
  const logs = [];
83
80
  const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrStart));
84
81
  const buildStartPlugins = pluginManager.executed.filter((item) => item.hookName === "buildStart" && item.plugin.name !== "core").map((item) => item.plugin.name);
@@ -101,15 +98,14 @@ function getSummary({ pluginManager, status, hrStart, config, logger }) {
101
98
  plugins: status === "success" ? `${c3.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total` : `${c3.red(`${failedPlugins?.length ?? 1} failed`)}, ${pluginsCount} total`,
102
99
  pluginsFailed: status === "failed" ? failedPlugins?.map((name) => randomCliColour(name))?.join(", ") : void 0,
103
100
  filesCreated: files.length,
104
- time: `${c3.yellow(`${elapsedSeconds}s`)} - finished at ${c3.yellow((/* @__PURE__ */ new Date()).toLocaleString("en-GB", { timeZone: "UTC" }))}`,
101
+ time: `${c3.yellow(`${elapsedSeconds}s`)}`,
105
102
  output: path.isAbsolute(config.root) ? path.resolve(config.root, config.output.path) : config.root
106
103
  };
107
104
  logs.push(
108
105
  [
109
106
  [`${c3.bold("Plugins:")} ${meta.plugins}`, true],
110
107
  [`${c3.dim("Failed:")} ${meta.pluginsFailed || "none"}`, !!meta.pluginsFailed],
111
- [`${c3.bold("Generated:")} ${meta.filesCreated} files`, true],
112
- [`${c3.bold("Time:")} ${meta.time}`, true],
108
+ [`${c3.bold("Generated:")} ${meta.filesCreated} files in ${meta.time}`, true],
113
109
  [`${c3.bold("Output:")} ${meta.output}`, true]
114
110
  ].map((item) => {
115
111
  if (item.at(1)) {
@@ -124,49 +120,61 @@ function getSummary({ pluginManager, status, hrStart, config, logger }) {
124
120
  // src/utils/writeLog.ts
125
121
  import { resolve } from "path";
126
122
  import { read, write } from "@kubb/fs";
127
- async function writeLog(data) {
123
+ async function writeLog({ data, override, fileName = "kubb.log" }) {
128
124
  if (data.trim() === "") {
129
125
  return void 0;
130
126
  }
131
- const path2 = resolve(process.cwd(), "kubb-log.log");
127
+ const path2 = resolve(process.cwd(), fileName);
132
128
  let previousLogs = "";
133
129
  try {
134
130
  previousLogs = await read(resolve(path2));
135
131
  } catch (_err) {
136
132
  }
137
- return write(path2, [previousLogs, data.trim()].filter(Boolean).join("\n\n\n"), { sanity: false });
133
+ if (override) {
134
+ return write(path2, data.trim(), { sanity: false });
135
+ }
136
+ return write(path2, [previousLogs, data.trim()].filter(Boolean).join("\n"), { sanity: false });
138
137
  }
139
138
 
140
139
  // src/generate.ts
141
- import { SingleBar, Presets } from "cli-progress";
142
- import "@kubb/fs";
143
- import { relative } from "path";
140
+ import { Presets, SingleBar } from "cli-progress";
144
141
  async function generate({ input, config, args }) {
145
142
  const logLevel = LogMapper2[args.logLevel] || 3;
146
143
  const logger = createLogger({
147
144
  logLevel,
148
145
  name: config.name
149
146
  });
150
- const progress = new SingleBar(
151
- {
152
- format: logLevel === LogMapper2.info ? "{percentage}% {bar} {value}/{total} files | ETA: {eta}s | {filename}" : "{percentage}% {bar} ETA: {eta}s",
153
- barsize: 40,
154
- fps: 5,
155
- clearOnComplete: true
156
- },
157
- Presets.shades_grey
158
- );
159
- logger.on("progress", ({ count, size, file }) => {
160
- if (count === 0) {
161
- progress.start(size, 0);
162
- } else if (count === size) {
163
- progress.stop();
147
+ const progressBars = {};
148
+ logger.on("progress_start", ({ id, size }) => {
149
+ logger.consola?.pauseLogs();
150
+ if (!progressBars[id]) {
151
+ progressBars[id] = new SingleBar(
152
+ {
153
+ format: logLevel === LogMapper2.info ? "{percentage}% {bar} {value}/{total} {id} | {data}" : "{percentage}% {bar} ETA: {eta}s",
154
+ barsize: 25,
155
+ clearOnComplete: true
156
+ },
157
+ Presets.shades_grey
158
+ );
159
+ progressBars[id].start(size, 1, { id, data: "" });
160
+ }
161
+ });
162
+ logger.on("progress_stop", ({ id }) => {
163
+ const progressBar = progressBars[id];
164
+ progressBar?.stop();
165
+ logger.consola?.resumeLogs();
166
+ });
167
+ logger.on("progress", ({ id, count, data = "" }) => {
168
+ const progressBar = progressBars[id];
169
+ const payload = { id, data };
170
+ if (count) {
171
+ progressBar?.update(count, payload);
164
172
  } else {
165
- progress.update(count, { filename: relative(config.root, file.path) || "" });
173
+ progressBar?.increment(1, payload);
166
174
  }
167
175
  });
168
- logger.on("debug", async (messages) => {
169
- await writeLog(messages.join("\n"));
176
+ logger.on("debug", async ({ logs, override, fileName }) => {
177
+ await writeLog({ data: logs.join("\n"), fileName, override });
170
178
  });
171
179
  const { root = process.cwd(), ...userConfig } = config;
172
180
  const inputPath = input ?? ("path" in userConfig.input ? userConfig.input.path : void 0);
@@ -218,7 +226,7 @@ async function generate({ input, config, args }) {
218
226
  if (config.hooks) {
219
227
  await executeHooks({ hooks: config.hooks, logger });
220
228
  }
221
- logger.consola?.log(`\u26A1\uFE0FBuild completed ${logLevel !== LogMapper2.silent ? c4.dim(inputPath) : ""}`);
229
+ logger.consola?.log(`\u26A1Build completed ${logLevel !== LogMapper2.silent ? c4.dim(inputPath) : ""}`);
222
230
  logger.consola?.box({
223
231
  title: `${config.name || ""}`,
224
232
  message: summary.join(""),
@@ -233,4 +241,4 @@ async function generate({ input, config, args }) {
233
241
  export {
234
242
  generate
235
243
  };
236
- //# sourceMappingURL=chunk-WJ72QPXS.js.map
244
+ //# sourceMappingURL=chunk-7EOWZACL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/generate.ts","../src/utils/executeHooks.ts","../src/utils/Writables.ts","../src/utils/getErrorCauses.ts","../src/utils/getSummary.ts","../src/utils/parseHrtimeToSeconds.ts","../src/utils/writeLog.ts"],"sourcesContent":["import { LogMapper, createLogger } from '@kubb/core/logger'\n\nimport c from 'tinyrainbow'\n\nimport { type Config, safeBuild } from '@kubb/core'\nimport type { Args } from './commands/generate.ts'\nimport { executeHooks } from './utils/executeHooks.ts'\nimport { getErrorCauses } from './utils/getErrorCauses.ts'\nimport { getSummary } from './utils/getSummary.ts'\nimport { writeLog } from './utils/writeLog.ts'\n\nimport { relative } from 'node:path'\nimport { Presets, SingleBar } from 'cli-progress'\n\ntype GenerateProps = {\n input?: string\n config: Config\n args: Args\n}\n\nexport async function generate({ input, config, args }: GenerateProps): Promise<void> {\n const logLevel = LogMapper[args.logLevel as keyof typeof LogMapper] || 3\n const logger = createLogger({\n logLevel,\n name: config.name,\n })\n\n const progressBars: Record<string, SingleBar> = {}\n\n logger.on('progress_start', ({ id, size }) => {\n logger.consola?.pauseLogs()\n if (!progressBars[id]) {\n progressBars[id] = new SingleBar(\n {\n format: logLevel === LogMapper.info ? '{percentage}% {bar} {value}/{total} {id} | {data}' : '{percentage}% {bar} ETA: {eta}s',\n barsize: 25,\n clearOnComplete: true,\n },\n Presets.shades_grey,\n )\n progressBars[id].start(size, 1, { id, data: '' })\n }\n })\n\n logger.on('progress_stop', ({ id }) => {\n const progressBar = progressBars[id]\n progressBar?.stop()\n logger.consola?.resumeLogs()\n })\n\n logger.on('progress', ({ id, count, data = '' }) => {\n const progressBar = progressBars[id]\n const payload = { id, data }\n\n if (count) {\n progressBar?.update(count, payload)\n } else {\n progressBar?.increment(1, payload)\n }\n })\n\n logger.on('debug', async ({ logs, override, fileName }) => {\n await writeLog({ data: logs.join('\\n'), fileName, override })\n })\n\n const { root = process.cwd(), ...userConfig } = config\n const inputPath = input ?? ('path' in userConfig.input ? userConfig.input.path : undefined)\n\n logger.emit('start', `Building ${logLevel !== LogMapper.silent ? c.dim(inputPath) : ''}`)\n\n const definedConfig: Config = {\n root,\n ...userConfig,\n input: inputPath\n ? {\n ...userConfig.input,\n path: inputPath,\n }\n : userConfig.input,\n output: {\n write: true,\n ...userConfig.output,\n },\n }\n const hrStart = process.hrtime()\n const { pluginManager, error } = await safeBuild({\n config: definedConfig,\n logger,\n })\n\n const summary = getSummary({\n pluginManager,\n config: definedConfig,\n status: error ? 'failed' : 'success',\n hrStart,\n logger,\n })\n\n if (error && logger.consola) {\n logger.consola.error(`Build failed ${logLevel !== LogMapper.silent ? c.dim(inputPath) : ''}`)\n\n logger.consola.box({\n title: `${config.name || ''}`,\n message: summary.join(''),\n style: {\n padding: 2,\n borderColor: 'red',\n borderStyle: 'rounded',\n },\n })\n\n const errors = getErrorCauses([error])\n if (logger.consola && errors.length && logLevel === LogMapper.debug) {\n errors.forEach((err) => {\n logger.consola?.error(err)\n })\n }\n\n logger.consola?.error(error)\n\n process.exit(0)\n }\n\n if (config.hooks) {\n await executeHooks({ hooks: config.hooks, logger })\n }\n\n logger.consola?.log(`⚡Build completed ${logLevel !== LogMapper.silent ? c.dim(inputPath) : ''}`)\n\n logger.consola?.box({\n title: `${config.name || ''}`,\n message: summary.join(''),\n style: {\n padding: 2,\n borderColor: 'green',\n borderStyle: 'rounded',\n },\n })\n}\n","import type { Logger } from '@kubb/core/logger'\nimport { execa } from 'execa'\nimport { parseArgsStringToArgv } from 'string-argv'\nimport c from 'tinyrainbow'\n\nimport { ConsolaWritable } from './Writables.ts'\n\nimport type { Config } from '@kubb/core'\nimport { LogMapper } from '@kubb/core/logger'\nimport PQueue from 'p-queue'\n\ntype ExecutingHooksProps = {\n hooks: NonNullable<Config['hooks']>\n logger: Logger\n}\n\nexport async function executeHooks({ hooks, logger }: ExecutingHooksProps): Promise<void> {\n const commands = Array.isArray(hooks.done) ? hooks.done : [hooks.done].filter(Boolean)\n const queue = new PQueue({ concurrency: 1 })\n\n const promises = commands.map(async (command) => {\n const consolaWritable = new ConsolaWritable(logger.consola!, command)\n const [cmd, ..._args] = [...parseArgsStringToArgv(command)]\n\n if (!cmd) {\n return null\n }\n\n await queue.add(async () => {\n logger.emit('start', `Executing hook ${logger.logLevel !== LogMapper.silent ? c.dim(command) : ''}`)\n\n const subProcess = await execa(cmd, _args, {\n detached: true,\n stdout: logger.logLevel === LogMapper.silent ? undefined : ['pipe', consolaWritable],\n stripFinalNewline: true,\n })\n\n logger.emit('success', `Executed hook ${logger.logLevel !== LogMapper.silent ? c.dim(command) : ''}`)\n })\n })\n\n await Promise.all(promises)\n\n logger.emit('success', 'Executed hooks')\n}\n","import { Writable } from 'node:stream'\n\nimport c from 'tinyrainbow'\n\nimport * as process from 'node:process'\nimport type { WritableOptions } from 'node:stream'\nimport type { ConsolaInstance } from 'consola'\n\nexport class ConsolaWritable extends Writable {\n consola: ConsolaInstance\n command: string\n constructor(consola: ConsolaInstance, command: string, opts?: WritableOptions) {\n super(opts)\n\n this.command = command\n this.consola = consola\n }\n _write(chunk: any, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n process.stdout.write(`${c.dim(chunk?.toString())}`)\n\n callback()\n }\n}\n","export function getErrorCauses(errors: Error[]): Error[] {\n return errors\n .reduce((prev, error) => {\n const causedError = error?.cause as Error\n if (causedError) {\n prev = [...prev, ...getErrorCauses([causedError])]\n return prev\n }\n prev = [...prev, error]\n\n return prev\n }, [] as Error[])\n .filter(Boolean)\n}\n","import path from 'node:path'\n\nimport { randomCliColour } from '@kubb/core/logger'\n\nimport c from 'tinyrainbow'\n\nimport { parseHrtimeToSeconds } from './parseHrtimeToSeconds.ts'\n\nimport type { Config, FileMetaBase, PluginManager } from '@kubb/core'\nimport type { Logger } from '@kubb/core/logger'\n\ntype SummaryProps = {\n pluginManager: PluginManager\n status: 'success' | 'failed'\n hrStart: [number, number]\n config: Config\n logger: Logger\n}\n\nexport function getSummary({ pluginManager, status, hrStart, config }: SummaryProps): string[] {\n const logs: string[] = []\n const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrStart))\n\n const buildStartPlugins = pluginManager.executed\n .filter((item) => item.hookName === 'buildStart' && item.plugin.name !== 'core')\n .map((item) => item.plugin.name)\n\n const buildEndPlugins = pluginManager.executed.filter((item) => item.hookName === 'buildEnd' && item.plugin.name !== 'core').map((item) => item.plugin.name)\n\n const failedPlugins = config.plugins?.filter((plugin) => !buildEndPlugins.includes(plugin.name))?.map((plugin) => plugin.name)\n const pluginsCount = config.plugins?.length || 0\n const files = pluginManager.fileManager.files.sort((a: { meta?: FileMetaBase }, b: { meta?: FileMetaBase }) => {\n if (!a.meta?.pluginKey?.[0] || !b.meta?.pluginKey?.[0]) {\n return 0\n }\n if (a.meta?.pluginKey?.[0]?.length < b.meta?.pluginKey?.[0]?.length) {\n return 1\n }\n if (a.meta?.pluginKey?.[0]?.length > b.meta?.pluginKey?.[0]?.length) {\n return -1\n }\n return 0\n })\n\n const meta = {\n plugins:\n status === 'success'\n ? `${c.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total`\n : `${c.red(`${failedPlugins?.length ?? 1} failed`)}, ${pluginsCount} total`,\n pluginsFailed: status === 'failed' ? failedPlugins?.map((name) => randomCliColour(name))?.join(', ') : undefined,\n filesCreated: files.length,\n time: `${c.yellow(`${elapsedSeconds}s`)}`,\n output: path.isAbsolute(config.root) ? path.resolve(config.root, config.output.path) : config.root,\n } as const\n\n logs.push(\n [\n [`${c.bold('Plugins:')} ${meta.plugins}`, true],\n [`${c.dim('Failed:')} ${meta.pluginsFailed || 'none'}`, !!meta.pluginsFailed],\n [`${c.bold('Generated:')} ${meta.filesCreated} files in ${meta.time}`, true],\n [`${c.bold('Output:')} ${meta.output}`, true],\n ]\n .map((item) => {\n if (item.at(1)) {\n return item.at(0)\n }\n return undefined\n })\n .filter(Boolean)\n .join('\\n'),\n )\n\n return logs\n}\n","export function parseHrtimeToSeconds(hrtime: [number, number]): string {\n const seconds = (hrtime[0] + hrtime[1] / 1e9).toFixed(3)\n return seconds\n}\n","import { resolve } from 'node:path'\nimport { read, write } from '@kubb/fs'\n\ntype Props = {\n data: string\n fileName?: string\n override?: boolean\n}\n\nexport async function writeLog({ data, override, fileName = 'kubb.log' }: Props): Promise<string | undefined> {\n if (data.trim() === '') {\n return undefined\n }\n const path = resolve(process.cwd(), fileName)\n let previousLogs = ''\n\n try {\n previousLogs = await read(resolve(path))\n } catch (_err) {\n /* empty */\n }\n\n if (override) {\n return write(path, data.trim(), { sanity: false })\n }\n\n return write(path, [previousLogs, data.trim()].filter(Boolean).join('\\n'), { sanity: false })\n}\n"],"mappings":"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","names":["LogMapper","c","c","process","c","c","c","path","LogMapper","c"]}
@@ -7798,7 +7798,7 @@ var ConsolaWritable = class extends _stream.Writable {
7798
7798
  this.consola = consola;
7799
7799
  }
7800
7800
  _write(chunk, _encoding, callback) {
7801
- process10.stdout.write(p2.dim(_optionalChain([chunk, 'optionalAccess', _38 => _38.toString, 'call', _39 => _39()])));
7801
+ process10.stdout.write(`${p2.dim(_optionalChain([chunk, 'optionalAccess', _38 => _38.toString, 'call', _39 => _39()]))}`);
7802
7802
  callback();
7803
7803
  }
7804
7804
  };
@@ -8281,14 +8281,11 @@ async function executeHooks({ hooks, logger }) {
8281
8281
  stdout: logger.logLevel === _logger.LogMapper.silent ? void 0 : ["pipe", consolaWritable],
8282
8282
  stripFinalNewline: true
8283
8283
  });
8284
- logger.emit("success", `Executing hook ${logger.logLevel !== _logger.LogMapper.silent ? p2.dim(command) : ""}`);
8285
- if (subProcess) {
8286
- logger.emit("debug", [subProcess.stdout]);
8287
- }
8284
+ logger.emit("success", `Executed hook ${logger.logLevel !== _logger.LogMapper.silent ? p2.dim(command) : ""}`);
8288
8285
  });
8289
8286
  });
8290
8287
  await Promise.all(promises);
8291
- logger.emit("success", "Executing hooks");
8288
+ logger.emit("success", "Executed hooks");
8292
8289
  }
8293
8290
 
8294
8291
  // src/utils/getErrorCauses.ts
@@ -8318,7 +8315,7 @@ function parseHrtimeToSeconds(hrtime2) {
8318
8315
  }
8319
8316
 
8320
8317
  // src/utils/getSummary.ts
8321
- function getSummary({ pluginManager, status, hrStart, config, logger }) {
8318
+ function getSummary({ pluginManager, status, hrStart, config }) {
8322
8319
  const logs = [];
8323
8320
  const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(hrStart));
8324
8321
  const buildStartPlugins = pluginManager.executed.filter((item) => item.hookName === "buildStart" && item.plugin.name !== "core").map((item) => item.plugin.name);
@@ -8341,15 +8338,14 @@ function getSummary({ pluginManager, status, hrStart, config, logger }) {
8341
8338
  plugins: status === "success" ? `${p2.green(`${buildStartPlugins.length} successful`)}, ${pluginsCount} total` : `${p2.red(`${_nullishCoalesce(_optionalChain([failedPlugins, 'optionalAccess', _80 => _80.length]), () => ( 1))} failed`)}, ${pluginsCount} total`,
8342
8339
  pluginsFailed: status === "failed" ? _optionalChain([failedPlugins, 'optionalAccess', _81 => _81.map, 'call', _82 => _82((name) => _logger.randomCliColour.call(void 0, name)), 'optionalAccess', _83 => _83.join, 'call', _84 => _84(", ")]) : void 0,
8343
8340
  filesCreated: files.length,
8344
- time: `${p2.yellow(`${elapsedSeconds}s`)} - finished at ${p2.yellow((/* @__PURE__ */ new Date()).toLocaleString("en-GB", { timeZone: "UTC" }))}`,
8341
+ time: `${p2.yellow(`${elapsedSeconds}s`)}`,
8345
8342
  output: _path2.default.isAbsolute(config.root) ? _path2.default.resolve(config.root, config.output.path) : config.root
8346
8343
  };
8347
8344
  logs.push(
8348
8345
  [
8349
8346
  [`${p2.bold("Plugins:")} ${meta.plugins}`, true],
8350
8347
  [`${p2.dim("Failed:")} ${meta.pluginsFailed || "none"}`, !!meta.pluginsFailed],
8351
- [`${p2.bold("Generated:")} ${meta.filesCreated} files`, true],
8352
- [`${p2.bold("Time:")} ${meta.time}`, true],
8348
+ [`${p2.bold("Generated:")} ${meta.filesCreated} files in ${meta.time}`, true],
8353
8349
  [`${p2.bold("Output:")} ${meta.output}`, true]
8354
8350
  ].map((item) => {
8355
8351
  if (item.at(1)) {
@@ -8365,49 +8361,62 @@ function getSummary({ pluginManager, status, hrStart, config, logger }) {
8365
8361
  init_cjs_shims();
8366
8362
 
8367
8363
  var _fs3 = require('@kubb/fs');
8368
- async function writeLog(data) {
8364
+ async function writeLog({ data, override, fileName = "kubb.log" }) {
8369
8365
  if (data.trim() === "") {
8370
8366
  return void 0;
8371
8367
  }
8372
- const path6 = _path.resolve.call(void 0, process.cwd(), "kubb-log.log");
8368
+ const path6 = _path.resolve.call(void 0, process.cwd(), fileName);
8373
8369
  let previousLogs = "";
8374
8370
  try {
8375
8371
  previousLogs = await _fs3.read.call(void 0, _path.resolve.call(void 0, path6));
8376
8372
  } catch (_err) {
8377
8373
  }
8378
- return _fs3.write.call(void 0, path6, [previousLogs, data.trim()].filter(Boolean).join("\n\n\n"), { sanity: false });
8374
+ if (override) {
8375
+ return _fs3.write.call(void 0, path6, data.trim(), { sanity: false });
8376
+ }
8377
+ return _fs3.write.call(void 0, path6, [previousLogs, data.trim()].filter(Boolean).join("\n"), { sanity: false });
8379
8378
  }
8380
8379
 
8381
8380
  // src/generate.ts
8382
- var _cliprogress = require('cli-progress');
8383
-
8384
8381
 
8382
+ var _cliprogress = require('cli-progress');
8385
8383
  async function generate({ input, config, args }) {
8386
8384
  const logLevel = _logger.LogMapper[args.logLevel] || 3;
8387
8385
  const logger = _logger.createLogger.call(void 0, {
8388
8386
  logLevel,
8389
8387
  name: config.name
8390
8388
  });
8391
- const progress = new (0, _cliprogress.SingleBar)(
8392
- {
8393
- format: logLevel === _logger.LogMapper.info ? "{percentage}% {bar} {value}/{total} files | ETA: {eta}s | {filename}" : "{percentage}% {bar} ETA: {eta}s",
8394
- barsize: 40,
8395
- fps: 5,
8396
- clearOnComplete: true
8397
- },
8398
- _cliprogress.Presets.shades_grey
8399
- );
8400
- logger.on("progress", ({ count: count2, size, file }) => {
8401
- if (count2 === 0) {
8402
- progress.start(size, 0);
8403
- } else if (count2 === size) {
8404
- progress.stop();
8389
+ const progressBars = {};
8390
+ logger.on("progress_start", ({ id, size }) => {
8391
+ _optionalChain([logger, 'access', _85 => _85.consola, 'optionalAccess', _86 => _86.pauseLogs, 'call', _87 => _87()]);
8392
+ if (!progressBars[id]) {
8393
+ progressBars[id] = new (0, _cliprogress.SingleBar)(
8394
+ {
8395
+ format: logLevel === _logger.LogMapper.info ? "{percentage}% {bar} {value}/{total} {id} | {data}" : "{percentage}% {bar} ETA: {eta}s",
8396
+ barsize: 25,
8397
+ clearOnComplete: true
8398
+ },
8399
+ _cliprogress.Presets.shades_grey
8400
+ );
8401
+ progressBars[id].start(size, 1, { id, data: "" });
8402
+ }
8403
+ });
8404
+ logger.on("progress_stop", ({ id }) => {
8405
+ const progressBar = progressBars[id];
8406
+ _optionalChain([progressBar, 'optionalAccess', _88 => _88.stop, 'call', _89 => _89()]);
8407
+ _optionalChain([logger, 'access', _90 => _90.consola, 'optionalAccess', _91 => _91.resumeLogs, 'call', _92 => _92()]);
8408
+ });
8409
+ logger.on("progress", ({ id, count: count2, data = "" }) => {
8410
+ const progressBar = progressBars[id];
8411
+ const payload = { id, data };
8412
+ if (count2) {
8413
+ _optionalChain([progressBar, 'optionalAccess', _93 => _93.update, 'call', _94 => _94(count2, payload)]);
8405
8414
  } else {
8406
- progress.update(count2, { filename: _path.relative.call(void 0, config.root, file.path) || "" });
8415
+ _optionalChain([progressBar, 'optionalAccess', _95 => _95.increment, 'call', _96 => _96(1, payload)]);
8407
8416
  }
8408
8417
  });
8409
- logger.on("debug", async (messages) => {
8410
- await writeLog(messages.join("\n"));
8418
+ logger.on("debug", async ({ logs, override, fileName }) => {
8419
+ await writeLog({ data: logs.join("\n"), fileName, override });
8411
8420
  });
8412
8421
  const { root = process.cwd(), ...userConfig } = config;
8413
8422
  const inputPath = _nullishCoalesce(input, () => ( ("path" in userConfig.input ? userConfig.input.path : void 0)));
@@ -8450,17 +8459,17 @@ async function generate({ input, config, args }) {
8450
8459
  const errors = getErrorCauses([error]);
8451
8460
  if (logger.consola && errors.length && logLevel === _logger.LogMapper.debug) {
8452
8461
  errors.forEach((err) => {
8453
- _optionalChain([logger, 'access', _85 => _85.consola, 'optionalAccess', _86 => _86.error, 'call', _87 => _87(err)]);
8462
+ _optionalChain([logger, 'access', _97 => _97.consola, 'optionalAccess', _98 => _98.error, 'call', _99 => _99(err)]);
8454
8463
  });
8455
8464
  }
8456
- _optionalChain([logger, 'access', _88 => _88.consola, 'optionalAccess', _89 => _89.error, 'call', _90 => _90(error)]);
8465
+ _optionalChain([logger, 'access', _100 => _100.consola, 'optionalAccess', _101 => _101.error, 'call', _102 => _102(error)]);
8457
8466
  process.exit(0);
8458
8467
  }
8459
8468
  if (config.hooks) {
8460
8469
  await executeHooks({ hooks: config.hooks, logger });
8461
8470
  }
8462
- _optionalChain([logger, 'access', _91 => _91.consola, 'optionalAccess', _92 => _92.log, 'call', _93 => _93(`\u26A1\uFE0FBuild completed ${logLevel !== _logger.LogMapper.silent ? p2.dim(inputPath) : ""}`)]);
8463
- _optionalChain([logger, 'access', _94 => _94.consola, 'optionalAccess', _95 => _95.box, 'call', _96 => _96({
8471
+ _optionalChain([logger, 'access', _103 => _103.consola, 'optionalAccess', _104 => _104.log, 'call', _105 => _105(`\u26A1Build completed ${logLevel !== _logger.LogMapper.silent ? p2.dim(inputPath) : ""}`)]);
8472
+ _optionalChain([logger, 'access', _106 => _106.consola, 'optionalAccess', _107 => _107.box, 'call', _108 => _108({
8464
8473
  title: `${config.name || ""}`,
8465
8474
  message: summary.join(""),
8466
8475
  style: {
@@ -8477,4 +8486,4 @@ async function generate({ input, config, args }) {
8477
8486
 
8478
8487
 
8479
8488
  exports.init_cjs_shims = init_cjs_shims; exports.p = p2; exports.execa = execa; exports.generate = generate;
8480
- //# sourceMappingURL=chunk-H3BA33NF.cjs.map
8489
+ //# sourceMappingURL=chunk-MXBF3FNZ.cjs.map