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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +177 -26
  2. package/dist/agent-BAAO2W7u.cjs +70 -0
  3. package/dist/agent-BAAO2W7u.cjs.map +1 -0
  4. package/dist/agent-WLRLgsEM.js +68 -0
  5. package/dist/agent-WLRLgsEM.js.map +1 -0
  6. package/dist/{chunk--u3MIqq1.js → chunk-BvFE5Tac.js} +1 -0
  7. package/dist/constants-B2JTeRBb.js +42 -0
  8. package/dist/constants-B2JTeRBb.js.map +1 -0
  9. package/dist/constants-BINTA5VZ.cjs +77 -0
  10. package/dist/constants-BINTA5VZ.cjs.map +1 -0
  11. package/dist/constants-BYGmiFs0.cjs +139 -0
  12. package/dist/constants-BYGmiFs0.cjs.map +1 -0
  13. package/dist/constants-DSJ-Xrbv.js +116 -0
  14. package/dist/constants-DSJ-Xrbv.js.map +1 -0
  15. package/dist/define-Bdn8j5VM.cjs.map +1 -1
  16. package/dist/{define-Ctii4bel.js → define-m_fp-Aqm.js} +2 -2
  17. package/dist/{define-Ctii4bel.js.map → define-m_fp-Aqm.js.map} +1 -1
  18. package/dist/{errors-CjPmyZHy.js → errors-CINO1EIv.js} +2 -2
  19. package/dist/{errors-CjPmyZHy.js.map → errors-CINO1EIv.js.map} +1 -1
  20. package/dist/errors-CLCjoSg0.cjs.map +1 -1
  21. package/dist/{generate-CTdVvIaP.js → generate-C4iw5Nou.js} +12 -6
  22. package/dist/generate-C4iw5Nou.js.map +1 -0
  23. package/dist/{generate-BzCMyyNN.cjs → generate-DKtBY8eR.cjs} +10 -4
  24. package/dist/generate-DKtBY8eR.cjs.map +1 -0
  25. package/dist/index.cjs +20 -11
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +22 -13
  29. package/dist/index.js.map +1 -1
  30. package/dist/init-DE_judaK.js +53 -0
  31. package/dist/init-DE_judaK.js.map +1 -0
  32. package/dist/init-berpsF2G.cjs +53 -0
  33. package/dist/init-berpsF2G.cjs.map +1 -0
  34. package/dist/mcp-Ce6errt_.js +39 -0
  35. package/dist/mcp-Ce6errt_.js.map +1 -0
  36. package/dist/mcp-DcohdQTl.cjs +39 -0
  37. package/dist/mcp-DcohdQTl.cjs.map +1 -0
  38. package/dist/package-C0vNpFXU.js +6 -0
  39. package/dist/package-C0vNpFXU.js.map +1 -0
  40. package/dist/{package-DcmDg_mw.cjs → package-DZDnoPgZ.cjs} +2 -2
  41. package/dist/package-DZDnoPgZ.cjs.map +1 -0
  42. package/dist/run-B11-UaUs.cjs +33 -0
  43. package/dist/run-B11-UaUs.cjs.map +1 -0
  44. package/dist/{init-eNRlotJK.js → run-BNqMQygv.js} +107 -149
  45. package/dist/run-BNqMQygv.js.map +1 -0
  46. package/dist/{generate-BL-Kp5GY.js → run-BgM41TQT.js} +561 -493
  47. package/dist/run-BgM41TQT.js.map +1 -0
  48. package/dist/{init-CZ5Xq2Hd.cjs → run-BnGfi7Cp.cjs} +105 -147
  49. package/dist/run-BnGfi7Cp.cjs.map +1 -0
  50. package/dist/{agent-sdYBBgrd.js → run-BzpYYOQs.js} +46 -43
  51. package/dist/run-BzpYYOQs.js.map +1 -0
  52. package/dist/run-CCZ24VKk.js +51 -0
  53. package/dist/run-CCZ24VKk.js.map +1 -0
  54. package/dist/run-CQbj3ley.cjs +52 -0
  55. package/dist/run-CQbj3ley.cjs.map +1 -0
  56. package/dist/{generate-DMqdAYqy.cjs → run-DeWgpA6S.cjs} +558 -490
  57. package/dist/run-DeWgpA6S.cjs.map +1 -0
  58. package/dist/{agent-B4cAAab2.cjs → run-DwdAwnLG.cjs} +44 -41
  59. package/dist/run-DwdAwnLG.cjs.map +1 -0
  60. package/dist/run-PSA9X7ci.js +32 -0
  61. package/dist/run-PSA9X7ci.js.map +1 -0
  62. package/dist/shell-475fQKaX.cjs.map +1 -1
  63. package/dist/{shell-DLzN4fRo.js → shell-CN6DNqeC.js} +2 -2
  64. package/dist/{shell-DLzN4fRo.js.map → shell-CN6DNqeC.js.map} +1 -1
  65. package/dist/{telemetry-DN95_2pF.cjs → telemetry-B2iWkY5e.cjs} +5 -7
  66. package/dist/telemetry-B2iWkY5e.cjs.map +1 -0
  67. package/dist/{telemetry-LgT_sdPe.js → telemetry-BkektVz6.js} +6 -8
  68. package/dist/telemetry-BkektVz6.js.map +1 -0
  69. package/dist/validate-DVeCYyIS.js +26 -0
  70. package/dist/validate-DVeCYyIS.js.map +1 -0
  71. package/dist/validate-ymG_XDSU.cjs +26 -0
  72. package/dist/validate-ymG_XDSU.cjs.map +1 -0
  73. package/package.json +14 -14
  74. package/src/commands/agent/start.ts +10 -7
  75. package/src/commands/agent.ts +3 -1
  76. package/src/commands/generate.ts +5 -3
  77. package/src/commands/init.ts +34 -3
  78. package/src/commands/mcp.ts +28 -4
  79. package/src/commands/validate.ts +6 -4
  80. package/src/constants.ts +2 -58
  81. package/src/index.ts +5 -3
  82. package/src/loggers/clackLogger.ts +85 -118
  83. package/src/loggers/fileSystemLogger.ts +28 -15
  84. package/src/loggers/githubActionsLogger.ts +87 -96
  85. package/src/loggers/plainLogger.ts +48 -81
  86. package/src/loggers/types.ts +6 -0
  87. package/src/loggers/utils.ts +235 -11
  88. package/src/runners/agent/run.ts +113 -0
  89. package/src/runners/agent/utils.ts +98 -0
  90. package/src/runners/generate/run.ts +321 -0
  91. package/src/runners/generate/utils.ts +225 -0
  92. package/src/runners/init/run.ts +212 -0
  93. package/src/{utils/packageManager.ts → runners/init/utils.ts} +12 -2
  94. package/src/runners/mcp/run.ts +37 -0
  95. package/src/runners/validate/run.ts +63 -0
  96. package/src/{utils/telemetry.ts → telemetry.ts} +27 -20
  97. package/dist/agent-B4cAAab2.cjs.map +0 -1
  98. package/dist/agent-BFACosbG.cjs +0 -58
  99. package/dist/agent-BFACosbG.cjs.map +0 -1
  100. package/dist/agent-s7TqqoTg.js +0 -56
  101. package/dist/agent-s7TqqoTg.js.map +0 -1
  102. package/dist/agent-sdYBBgrd.js.map +0 -1
  103. package/dist/constants-CnDXa1R6.cjs +0 -148
  104. package/dist/constants-CnDXa1R6.cjs.map +0 -1
  105. package/dist/constants-aL3CP_Wq.js +0 -95
  106. package/dist/constants-aL3CP_Wq.js.map +0 -1
  107. package/dist/generate-BL-Kp5GY.js.map +0 -1
  108. package/dist/generate-BzCMyyNN.cjs.map +0 -1
  109. package/dist/generate-CTdVvIaP.js.map +0 -1
  110. package/dist/generate-DMqdAYqy.cjs.map +0 -1
  111. package/dist/init-BHMGbly9.cjs +0 -25
  112. package/dist/init-BHMGbly9.cjs.map +0 -1
  113. package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
  114. package/dist/init-eNRlotJK.js.map +0 -1
  115. package/dist/init-qgpg-iRW.js +0 -25
  116. package/dist/init-qgpg-iRW.js.map +0 -1
  117. package/dist/mcp-BRp-2Rdc.js +0 -16
  118. package/dist/mcp-BRp-2Rdc.js.map +0 -1
  119. package/dist/mcp-CYOgxB82.cjs +0 -47
  120. package/dist/mcp-CYOgxB82.cjs.map +0 -1
  121. package/dist/mcp-DmJm3TrU.js +0 -46
  122. package/dist/mcp-DmJm3TrU.js.map +0 -1
  123. package/dist/mcp-N3mRyVuO.cjs +0 -16
  124. package/dist/mcp-N3mRyVuO.cjs.map +0 -1
  125. package/dist/package-DcmDg_mw.cjs.map +0 -1
  126. package/dist/package-DtuyzAVW.js +0 -6
  127. package/dist/package-DtuyzAVW.js.map +0 -1
  128. package/dist/telemetry-DN95_2pF.cjs.map +0 -1
  129. package/dist/telemetry-LgT_sdPe.js.map +0 -1
  130. package/dist/validate-CJpTOzKA.js +0 -25
  131. package/dist/validate-CJpTOzKA.js.map +0 -1
  132. package/dist/validate-DyTbv7Bc.cjs +0 -25
  133. package/dist/validate-DyTbv7Bc.cjs.map +0 -1
  134. package/dist/validate-kLJoT_hi.js +0 -33
  135. package/dist/validate-kLJoT_hi.js.map +0 -1
  136. package/dist/validate-yKKzqEZ5.cjs +0 -34
  137. package/dist/validate-yKKzqEZ5.cjs.map +0 -1
  138. package/src/runners/agent.ts +0 -155
  139. package/src/runners/generate.ts +0 -333
  140. package/src/runners/init.ts +0 -296
  141. package/src/runners/mcp.ts +0 -51
  142. package/src/runners/validate.ts +0 -39
  143. package/src/types.ts +0 -11
  144. package/src/utils/Writables.ts +0 -17
  145. package/src/utils/executeHooks.ts +0 -45
  146. package/src/utils/flags.ts +0 -9
  147. package/src/utils/getConfig.ts +0 -10
  148. package/src/utils/getCosmiConfig.ts +0 -80
  149. package/src/utils/getSummary.ts +0 -68
  150. package/src/utils/runHook.ts +0 -91
  151. package/src/utils/watcher.ts +0 -19
@@ -2,12 +2,10 @@ import { relative } from 'node:path'
2
2
  import process from 'node:process'
3
3
  import { styleText } from 'node:util'
4
4
  import * as clack from '@clack/prompts'
5
- import { formatMs, formatMsWithColor, getIntro, toCause } from '@internals/utils'
6
- import { defineLogger, logLevel as logLevelMap } from '@kubb/core'
7
- import { getSummary } from '../utils/getSummary.ts'
8
- import { runHook } from '../utils/runHook.ts'
9
- import { ClackWritable } from '../utils/Writables.ts'
10
- import { buildProgressLine, formatCommandWithArgs, formatMessage } from './utils.ts'
5
+ import { formatMs, formatMsWithColor, getElapsedMs, getIntro, toCause } from '@internals/utils'
6
+ import { defineLogger, type KubbHooks, logLevel as logLevelMap } from '@kubb/core'
7
+ import { getSummary } from './utils.ts'
8
+ import { buildProgressLine, createProgressCounters, formatCommandWithArgs, formatMessage, recordPluginResult, resetProgressCounters } from './utils.ts'
11
9
 
12
10
  /**
13
11
  * TTY logger with beautiful UI and progress indicators for local development.
@@ -17,15 +15,11 @@ export const clackLogger = defineLogger({
17
15
  install(context, options) {
18
16
  const logLevel = options?.logLevel ?? logLevelMap.info
19
17
  const state = {
20
- totalPlugins: 0,
21
- completedPlugins: 0,
22
- failedPlugins: 0,
23
- totalFiles: 0,
24
- processedFiles: 0,
25
- hrStart: process.hrtime(),
18
+ ...createProgressCounters(),
26
19
  spinner: clack.spinner(),
27
20
  isSpinning: false,
28
21
  activeProgress: new Map<string, { interval?: NodeJS.Timeout; progressBar: clack.ProgressResult }>(),
22
+ activeHookLogs: new Map<string, { taskLog: ReturnType<typeof clack.taskLog>; hrStart: [number, number] }>(),
29
23
  }
30
24
 
31
25
  function reset() {
@@ -36,15 +30,11 @@ export const clackLogger = defineLogger({
36
30
  active.progressBar?.stop()
37
31
  }
38
32
 
39
- state.totalPlugins = 0
40
- state.completedPlugins = 0
41
- state.failedPlugins = 0
42
- state.totalFiles = 0
43
- state.processedFiles = 0
44
- state.hrStart = process.hrtime()
33
+ resetProgressCounters(state)
45
34
  state.spinner = clack.spinner()
46
35
  state.isSpinning = false
47
36
  state.activeProgress.clear()
37
+ state.activeHookLogs.clear()
48
38
  }
49
39
 
50
40
  function showProgressStep() {
@@ -62,12 +52,25 @@ export const clackLogger = defineLogger({
62
52
  return formatMessage(message, logLevel)
63
53
  }
64
54
 
55
+ // Registers a handler that prints a fixed step message, skipped at silent level.
56
+ function onStep<E extends keyof KubbHooks>(event: E, message: string): void {
57
+ context.on(event, () => {
58
+ if (logLevel <= logLevelMap.silent) {
59
+ return
60
+ }
61
+ clack.log.step(getMessage(message))
62
+ })
63
+ }
64
+
65
65
  function startSpinner(text?: string) {
66
66
  state.spinner.start(text)
67
67
  state.isSpinning = true
68
68
  }
69
69
 
70
70
  function stopSpinner(text?: string) {
71
+ if (!state.isSpinning) {
72
+ return
73
+ }
71
74
  state.spinner.stop(text)
72
75
  state.isSpinning = false
73
76
  }
@@ -81,9 +84,9 @@ export const clackLogger = defineLogger({
81
84
 
82
85
  if (state.isSpinning) {
83
86
  state.spinner.message(text)
84
- } else {
85
- clack.log.info(text)
87
+ return
86
88
  }
89
+ clack.log.info(text)
87
90
  })
88
91
 
89
92
  context.on('kubb:success', ({ message, info = '' }) => {
@@ -95,9 +98,9 @@ export const clackLogger = defineLogger({
95
98
 
96
99
  if (state.isSpinning) {
97
100
  stopSpinner(text)
98
- } else {
99
- clack.log.success(text)
101
+ return
100
102
  }
103
+ clack.log.success(text)
101
104
  })
102
105
 
103
106
  context.on('kubb:warn', ({ message, info }) => {
@@ -119,9 +122,9 @@ export const clackLogger = defineLogger({
119
122
 
120
123
  if (state.isSpinning) {
121
124
  stopSpinner(getMessage(text))
122
- } else {
123
- clack.log.error(getMessage(text))
125
+ return
124
126
  }
127
+ clack.log.error(getMessage(text))
125
128
 
126
129
  // Show stack trace in debug mode (first 3 frames)
127
130
  if (logLevel >= logLevelMap.debug && error.stack) {
@@ -199,6 +202,10 @@ Run \`npm install -g @kubb/cli\` to update`,
199
202
  // Initialize progress tracking for this generation
200
203
  state.totalPlugins = config.plugins?.length ?? 0
201
204
 
205
+ if (logLevel <= logLevelMap.silent) {
206
+ return
207
+ }
208
+
202
209
  const text = getMessage(['Generation started', config.name ? `for ${styleText('dim', config.name)}` : undefined].filter(Boolean).join(' '))
203
210
 
204
211
  clack.intro(text)
@@ -237,11 +244,7 @@ Run \`npm install -g @kubb/cli\` to update`,
237
244
 
238
245
  clearInterval(active.interval)
239
246
 
240
- if (success) {
241
- state.completedPlugins++
242
- } else {
243
- state.failedPlugins++
244
- }
247
+ recordPluginResult(state, success)
245
248
 
246
249
  const durationStr = formatMsWithColor(duration)
247
250
  const text = getMessage(
@@ -279,23 +282,20 @@ Run \`npm install -g @kubb/cli\` to update`,
279
282
  state.activeProgress.set('files', { progressBar })
280
283
  })
281
284
 
282
- context.on('kubb:file:processing:update', ({ file, config }) => {
285
+ context.on('kubb:files:processing:update', ({ files }) => {
283
286
  if (logLevel <= logLevelMap.silent) {
284
287
  return
285
288
  }
286
289
 
287
290
  stopSpinner()
288
291
 
289
- state.processedFiles++
290
-
291
- const text = `Writing ${relative(config.root, file.path)}`
292
292
  const active = state.activeProgress.get('files')
293
-
294
- if (!active) {
295
- return
293
+ for (const { file, config } of files) {
294
+ state.processedFiles++
295
+ if (active) {
296
+ active.progressBar.advance(undefined, `Writing ${relative(config.root, file.path)}`)
297
+ }
296
298
  }
297
-
298
- active.progressBar.advance(undefined, text)
299
299
  })
300
300
  context.on('kubb:files:processing:end', () => {
301
301
  if (logLevel <= logLevelMap.silent) {
@@ -319,107 +319,51 @@ Run \`npm install -g @kubb/cli\` to update`,
319
319
  })
320
320
 
321
321
  context.on('kubb:generation:end', ({ config }) => {
322
+ stopSpinner()
323
+
322
324
  const text = getMessage(config.name ? `Generation completed for ${styleText('dim', config.name)}` : 'Generation completed')
323
325
 
324
326
  clack.outro(text)
325
327
  })
326
328
 
327
- context.on('kubb:format:start', () => {
328
- if (logLevel <= logLevelMap.silent) {
329
- return
330
- }
331
-
332
- const text = getMessage('Format started')
333
-
334
- clack.intro(text)
335
- })
336
-
337
- context.on('kubb:format:end', () => {
338
- if (logLevel <= logLevelMap.silent) {
339
- return
340
- }
341
-
342
- const text = getMessage('Format completed')
329
+ onStep('kubb:format:start', 'Formatting')
330
+ onStep('kubb:lint:start', 'Linting')
331
+ onStep('kubb:hooks:start', 'Running hooks')
343
332
 
344
- clack.outro(text)
345
- })
346
-
347
- context.on('kubb:lint:start', () => {
348
- if (logLevel <= logLevelMap.silent) {
333
+ context.on('kubb:hook:start', ({ id, command, args }) => {
334
+ if (logLevel <= logLevelMap.silent || !id) {
349
335
  return
350
336
  }
351
337
 
352
- const text = getMessage('Lint started')
353
-
354
- clack.intro(text)
355
- })
356
-
357
- context.on('kubb:lint:end', () => {
358
- if (logLevel <= logLevelMap.silent) {
359
- return
360
- }
361
-
362
- const text = getMessage('Lint completed')
363
-
364
- clack.outro(text)
365
- })
338
+ stopSpinner()
366
339
 
367
- context.on('kubb:hook:start', async ({ id, command, args }) => {
368
340
  const commandWithArgs = formatCommandWithArgs(command, args)
369
- const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} started`)
341
+ const title = getMessage(`Running ${styleText('dim', commandWithArgs)}`)
342
+ const taskLog = clack.taskLog({ title })
370
343
 
371
- // Skip hook execution if no id is provided (e.g., during benchmarks or tests)
372
- if (!id) {
373
- return
374
- }
344
+ state.activeHookLogs.set(id, { taskLog, hrStart: process.hrtime() })
345
+ })
375
346
 
376
- if (logLevel <= logLevelMap.silent) {
377
- await runHook({
378
- id,
379
- command,
380
- args,
381
- commandWithArgs,
382
- context,
383
- sink: {
384
- onStderr: (s) => console.error(s),
385
- onStdout: (s) => console.log(s),
386
- },
387
- })
347
+ context.on('kubb:hook:end', ({ id, command, args, success, error }) => {
348
+ if (logLevel <= logLevelMap.silent || !id) {
388
349
  return
389
350
  }
390
351
 
391
- clack.intro(text)
392
-
393
- const logger = clack.taskLog({
394
- title: getMessage(['Executing hook', logLevel >= logLevelMap.info ? styleText('dim', commandWithArgs) : undefined].filter(Boolean).join(' ')),
395
- })
396
-
397
- const writable = new ClackWritable(logger)
398
-
399
- await runHook({
400
- id,
401
- command,
402
- args,
403
- commandWithArgs,
404
- context,
405
- stream: true,
406
- sink: {
407
- onLine: (line) => writable.write(line),
408
- onStderr: (s) => logger.error(s),
409
- onStdout: (s) => logger.message(s),
410
- },
411
- })
412
- })
413
-
414
- context.on('kubb:hook:end', ({ command, args }) => {
415
- if (logLevel <= logLevelMap.silent) {
352
+ const active = state.activeHookLogs.get(id)
353
+ if (!active) {
416
354
  return
417
355
  }
356
+ state.activeHookLogs.delete(id)
418
357
 
419
358
  const commandWithArgs = formatCommandWithArgs(command, args)
420
- const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} successfully executed`)
359
+ const duration = formatMsWithColor(getElapsedMs(active.hrStart))
421
360
 
422
- clack.outro(text)
361
+ if (success) {
362
+ active.taskLog.success(getMessage(`${styleText('dim', commandWithArgs)} completed in ${duration}`))
363
+ } else {
364
+ const reason = error?.message ? ` (${error.message})` : ''
365
+ active.taskLog.error(getMessage(`${styleText('dim', commandWithArgs)} failed${reason}`), { showLog: true })
366
+ }
423
367
  })
424
368
 
425
369
  context.on('kubb:generation:summary', ({ config, pluginTimings, failedPlugins, filesCreated, status, hrStart }) => {
@@ -454,5 +398,28 @@ Run \`npm install -g @kubb/cli\` to update`,
454
398
  context.on('kubb:lifecycle:end', () => {
455
399
  reset()
456
400
  })
401
+
402
+ return (_commandWithArgs: string, hookId: string) => {
403
+ if (logLevel <= logLevelMap.silent) {
404
+ return {
405
+ onStdout: (s: string) => console.log(s),
406
+ onStderr: (s: string) => console.error(s),
407
+ }
408
+ }
409
+
410
+ const active = state.activeHookLogs.get(hookId)
411
+ if (!active) {
412
+ return null
413
+ }
414
+
415
+ const { taskLog } = active
416
+
417
+ return {
418
+ stream: true,
419
+ onLine: (line: string) => taskLog.message(styleText('dim', line)),
420
+ onStdout: (s: string) => taskLog.message(s),
421
+ onStderr: (s: string) => taskLog.message(styleText('red', s)),
422
+ }
423
+ }
457
424
  },
458
425
  })
@@ -4,14 +4,24 @@ import { formatMs, write } from '@internals/utils'
4
4
  import { defineLogger } from '@kubb/core'
5
5
 
6
6
  type CachedEvent = {
7
+ /**
8
+ * Timestamp when this event was captured, used to derive the log filename.
9
+ */
7
10
  date: Date
8
- logs: string[]
11
+ /**
12
+ * Accumulated log lines for this event.
13
+ */
14
+ logs: Array<string>
15
+ /**
16
+ * Optional override for the output filename inside `.kubb/`. When omitted, the filename is derived from `date`.
17
+ */
9
18
  fileName?: string
10
19
  }
11
20
 
12
21
  /**
13
22
  * FileSystem logger that captures debug events and writes them to `.kubb` directory files.
14
- * Note: Logs write on `lifecycle:end` or process exit. Cached logs may be lost if the process crashes before these events.
23
+ *
24
+ * @note Logs are written on `kubb:lifecycle:end` or process exit. Cached logs may be lost if the process crashes before either event.
15
25
  */
16
26
  export const fileSystemLogger = defineLogger({
17
27
  name: 'filesystem',
@@ -31,7 +41,7 @@ export const fileSystemLogger = defineLogger({
31
41
  return []
32
42
  }
33
43
 
34
- const files: Record<string, string[]> = {}
44
+ const files: Record<string, Array<string>> = {}
35
45
 
36
46
  for (const log of state.cachedLogs) {
37
47
  const baseName = log.fileName || `${['kubb', name, state.startDate].filter(Boolean).join('-')}.log`
@@ -42,13 +52,15 @@ export const fileSystemLogger = defineLogger({
42
52
  }
43
53
 
44
54
  if (log.logs.length > 0) {
45
- const timestamp = log.date.toLocaleString()
46
- files[pathName].push(`[${timestamp}]\n${log.logs.join('\n')}`)
55
+ const prefix = `[${log.date.toLocaleString()}] `
56
+ const indent = ' '.repeat(prefix.length)
57
+ const [first, ...rest] = log.logs
58
+ files[pathName].push([prefix + first, ...rest.map((line) => indent + line)].join('\n'))
47
59
  }
48
60
  }
49
61
 
50
62
  for (const [fileName, logs] of Object.entries(files)) {
51
- await write(fileName, logs.join('\n\n'))
63
+ await write(fileName, logs.join('\n'))
52
64
  }
53
65
 
54
66
  return Object.keys(files)
@@ -57,21 +69,21 @@ export const fileSystemLogger = defineLogger({
57
69
  context.on('kubb:info', ({ message, info }) => {
58
70
  state.cachedLogs.add({
59
71
  date: new Date(),
60
- logs: [`ℹ ${message} ${info}`],
72
+ logs: [`ℹ ${[message, info].filter(Boolean).join(' ')}`],
61
73
  })
62
74
  })
63
75
 
64
76
  context.on('kubb:success', ({ message, info }) => {
65
77
  state.cachedLogs.add({
66
78
  date: new Date(),
67
- logs: [`✓ ${message} ${info}`],
79
+ logs: [`✓ ${[message, info].filter(Boolean).join(' ')}`],
68
80
  })
69
81
  })
70
82
 
71
83
  context.on('kubb:warn', ({ message, info }) => {
72
84
  state.cachedLogs.add({
73
85
  date: new Date(),
74
- logs: [`⚠ ${message} ${info}`],
86
+ logs: [`⚠ ${[message, info].filter(Boolean).join(' ')}`],
75
87
  })
76
88
  })
77
89
 
@@ -82,17 +94,18 @@ export const fileSystemLogger = defineLogger({
82
94
  })
83
95
  })
84
96
 
85
- context.on('kubb:debug', (message) => {
97
+ context.on('kubb:debug', ({ date, fileName, logs }) => {
86
98
  state.cachedLogs.add({
87
- date: new Date(),
88
- logs: message.logs,
99
+ date,
100
+ fileName,
101
+ logs,
89
102
  })
90
103
  })
91
104
 
92
105
  context.on('kubb:plugin:start', ({ plugin }) => {
93
106
  state.cachedLogs.add({
94
107
  date: new Date(),
95
- logs: [`Generating ${plugin.name}`],
108
+ logs: [`► Generating ${plugin.name}`],
96
109
  })
97
110
  })
98
111
 
@@ -101,14 +114,14 @@ export const fileSystemLogger = defineLogger({
101
114
 
102
115
  state.cachedLogs.add({
103
116
  date: new Date(),
104
- logs: [success ? `${plugin.name} completed in ${durationStr}` : `${plugin.name} failed in ${durationStr}`],
117
+ logs: [success ? `✓ ${plugin.name} completed in ${durationStr}` : `✗ ${plugin.name} failed in ${durationStr}`],
105
118
  })
106
119
  })
107
120
 
108
121
  context.on('kubb:files:processing:start', ({ files }) => {
109
122
  state.cachedLogs.add({
110
123
  date: new Date(),
111
- logs: [`Start ${files.length} writing:`, ...files.map((file) => file.path)],
124
+ logs: [`► Writing ${files.length} files`, ...files.map((file) => ` ${file.path}`)],
112
125
  })
113
126
  })
114
127