@kubb/cli 4.32.4 → 4.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/agent-Bd1QdPVV.cjs +91 -0
  2. package/dist/agent-Bd1QdPVV.cjs.map +1 -0
  3. package/dist/agent-D83d9Pud.cjs +60 -0
  4. package/dist/agent-D83d9Pud.cjs.map +1 -0
  5. package/dist/agent-DgKQXSmR.js +57 -0
  6. package/dist/agent-DgKQXSmR.js.map +1 -0
  7. package/dist/agent-u_Ehwz6r.js +87 -0
  8. package/dist/agent-u_Ehwz6r.js.map +1 -0
  9. package/dist/constants-BTUap0zs.cjs +108 -0
  10. package/dist/constants-BTUap0zs.cjs.map +1 -0
  11. package/dist/constants-CM3dJzjK.js +67 -0
  12. package/dist/constants-CM3dJzjK.js.map +1 -0
  13. package/dist/define--M_JMcDC.js +25 -0
  14. package/dist/define--M_JMcDC.js.map +1 -0
  15. package/dist/define-D6Kfm7-Z.cjs +36 -0
  16. package/dist/define-D6Kfm7-Z.cjs.map +1 -0
  17. package/dist/errors-6mF_WKxg.js +27 -0
  18. package/dist/errors-6mF_WKxg.js.map +1 -0
  19. package/dist/errors-DBW0N9w4.cjs +44 -0
  20. package/dist/errors-DBW0N9w4.cjs.map +1 -0
  21. package/dist/generate-Bn8n4w1O.cjs +65 -0
  22. package/dist/generate-Bn8n4w1O.cjs.map +1 -0
  23. package/dist/{generate-CpWtSc45.js → generate-CAsV9wSx.js} +656 -689
  24. package/dist/generate-CAsV9wSx.js.map +1 -0
  25. package/dist/generate-D-59YK0L.js +66 -0
  26. package/dist/generate-D-59YK0L.js.map +1 -0
  27. package/dist/{generate-COj0aMS6.cjs → generate-JC65igQh.cjs} +662 -694
  28. package/dist/generate-JC65igQh.cjs.map +1 -0
  29. package/dist/index.cjs +226 -35
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +226 -35
  33. package/dist/index.js.map +1 -1
  34. package/dist/init-C-InrmSY.js +302 -0
  35. package/dist/init-C-InrmSY.js.map +1 -0
  36. package/dist/init-CXP8OfMe.js +25 -0
  37. package/dist/init-CXP8OfMe.js.map +1 -0
  38. package/dist/init-CbeE-L-0.cjs +25 -0
  39. package/dist/init-CbeE-L-0.cjs.map +1 -0
  40. package/dist/init-hmolV6B4.cjs +306 -0
  41. package/dist/init-hmolV6B4.cjs.map +1 -0
  42. package/dist/jiti-Cd3S0xwr.cjs +16 -0
  43. package/dist/jiti-Cd3S0xwr.cjs.map +1 -0
  44. package/dist/jiti-e08mD2Ph.js +11 -0
  45. package/dist/jiti-e08mD2Ph.js.map +1 -0
  46. package/dist/mcp-BDxg2oJm.cjs +16 -0
  47. package/dist/mcp-BDxg2oJm.cjs.map +1 -0
  48. package/dist/mcp-ChHFPRzD.cjs +42 -0
  49. package/dist/mcp-ChHFPRzD.cjs.map +1 -0
  50. package/dist/mcp-D2SHEg_d.js +41 -0
  51. package/dist/mcp-D2SHEg_d.js.map +1 -0
  52. package/dist/mcp-MSoE4vNA.js +16 -0
  53. package/dist/mcp-MSoE4vNA.js.map +1 -0
  54. package/dist/{package-aNQWvWbS.cjs → package-CUVyeIbt.cjs} +2 -2
  55. package/dist/package-CUVyeIbt.cjs.map +1 -0
  56. package/dist/package-Cbd8OC6q.js +6 -0
  57. package/dist/package-Cbd8OC6q.js.map +1 -0
  58. package/dist/shell-7HPrTCJ5.cjs +57 -0
  59. package/dist/shell-7HPrTCJ5.cjs.map +1 -0
  60. package/dist/shell-DqqWsHCD.js +46 -0
  61. package/dist/shell-DqqWsHCD.js.map +1 -0
  62. package/dist/{telemetry-BDSSqUiG.cjs → telemetry-Cn9X1I5B.cjs} +79 -9
  63. package/dist/telemetry-Cn9X1I5B.cjs.map +1 -0
  64. package/dist/{telemetry-DYWvlxqs.js → telemetry-DxiR7clS.js} +63 -11
  65. package/dist/telemetry-DxiR7clS.js.map +1 -0
  66. package/dist/validate-BG8A3aQS.cjs +25 -0
  67. package/dist/validate-BG8A3aQS.cjs.map +1 -0
  68. package/dist/validate-BZ1UFkwA.js +25 -0
  69. package/dist/validate-BZ1UFkwA.js.map +1 -0
  70. package/dist/validate-Bbrn3Q-A.cjs +42 -0
  71. package/dist/validate-Bbrn3Q-A.cjs.map +1 -0
  72. package/dist/validate-l8vLmwKA.js +41 -0
  73. package/dist/validate-l8vLmwKA.js.map +1 -0
  74. package/package.json +6 -6
  75. package/src/commands/agent/start.ts +27 -136
  76. package/src/commands/agent.ts +6 -25
  77. package/src/commands/generate.ts +26 -158
  78. package/src/commands/init.ts +9 -360
  79. package/src/commands/mcp.ts +7 -52
  80. package/src/commands/validate.ts +9 -60
  81. package/src/constants.ts +76 -0
  82. package/src/index.ts +36 -42
  83. package/src/loggers/clackLogger.ts +65 -165
  84. package/src/loggers/fileSystemLogger.ts +2 -14
  85. package/src/loggers/githubActionsLogger.ts +58 -125
  86. package/src/loggers/plainLogger.ts +44 -92
  87. package/src/loggers/utils.ts +67 -4
  88. package/src/runners/agent.ts +100 -0
  89. package/src/runners/generate.ts +223 -102
  90. package/src/runners/init.ts +323 -0
  91. package/src/runners/mcp.ts +32 -0
  92. package/src/runners/validate.ts +35 -0
  93. package/src/utils/Writables.ts +2 -2
  94. package/src/utils/executeHooks.ts +20 -8
  95. package/src/utils/getCosmiConfig.ts +10 -11
  96. package/src/utils/getIntro.ts +1 -81
  97. package/src/utils/getSummary.ts +12 -17
  98. package/src/utils/jiti.ts +9 -0
  99. package/src/utils/packageManager.ts +4 -4
  100. package/src/utils/runHook.ts +75 -0
  101. package/src/utils/telemetry.ts +8 -26
  102. package/src/utils/watcher.ts +2 -4
  103. package/dist/agent-6COck3B9.cjs +0 -20
  104. package/dist/agent-6COck3B9.cjs.map +0 -1
  105. package/dist/agent-DMm6c5Vg.js +0 -20
  106. package/dist/agent-DMm6c5Vg.js.map +0 -1
  107. package/dist/generate-COj0aMS6.cjs.map +0 -1
  108. package/dist/generate-CpWtSc45.js.map +0 -1
  109. package/dist/init-Bdn3_qir.js +0 -304
  110. package/dist/init-Bdn3_qir.js.map +0 -1
  111. package/dist/init-CFW2kWY8.cjs +0 -308
  112. package/dist/init-CFW2kWY8.cjs.map +0 -1
  113. package/dist/mcp-DkwtARfo.cjs +0 -57
  114. package/dist/mcp-DkwtARfo.cjs.map +0 -1
  115. package/dist/mcp-DrH93Vq4.js +0 -57
  116. package/dist/mcp-DrH93Vq4.js.map +0 -1
  117. package/dist/package-BnJbGmLm.js +0 -6
  118. package/dist/package-BnJbGmLm.js.map +0 -1
  119. package/dist/package-aNQWvWbS.cjs.map +0 -1
  120. package/dist/start-CqTUu14n.js +0 -131
  121. package/dist/start-CqTUu14n.js.map +0 -1
  122. package/dist/start-D-rsIJGo.cjs +0 -134
  123. package/dist/start-D-rsIJGo.cjs.map +0 -1
  124. package/dist/telemetry-BDSSqUiG.cjs.map +0 -1
  125. package/dist/telemetry-DYWvlxqs.js.map +0 -1
  126. package/dist/validate-BlV8L8gC.js +0 -66
  127. package/dist/validate-BlV8L8gC.js.map +0 -1
  128. package/dist/validate-COhZUXF8.cjs +0 -66
  129. package/dist/validate-COhZUXF8.cjs.map +0 -1
  130. package/src/loggers/envDetection.ts +0 -28
  131. package/src/loggers/index.ts +0 -5
  132. package/src/utils/formatMsWithColor.ts +0 -22
  133. package/src/utils/randomColor.ts +0 -23
@@ -1,8 +1,8 @@
1
1
  import { styleText } from 'node:util'
2
- import { type Config, defineLogger, LogLevel } from '@kubb/core'
3
- import { formatHrtime, formatMs } from '@kubb/core/utils'
4
- import { type NonZeroExitError, x } from 'tinyexec'
5
- import { formatMsWithColor } from '../utils/formatMsWithColor.ts'
2
+ import { formatHrtime, formatMs, formatMsWithColor, toCause } from '@internals/utils'
3
+ import { type Config, defineLogger, logLevel as logLevelMap } from '@kubb/core'
4
+ import { runHook } from '../utils/runHook.ts'
5
+ import { buildProgressLine, formatCommandWithArgs, formatMessage } from './utils.ts'
6
6
 
7
7
  /**
8
8
  * GitHub Actions adapter for CI environments
@@ -11,7 +11,7 @@ import { formatMsWithColor } from '../utils/formatMsWithColor.ts'
11
11
  export const githubActionsLogger = defineLogger({
12
12
  name: 'github-actions',
13
13
  install(context, options) {
14
- const logLevel = options?.logLevel || LogLevel.info
14
+ const logLevel = options?.logLevel ?? logLevelMap.info
15
15
  const state = {
16
16
  totalPlugins: 0,
17
17
  completedPlugins: 0,
@@ -29,47 +29,22 @@ export const githubActionsLogger = defineLogger({
29
29
  state.totalFiles = 0
30
30
  state.processedFiles = 0
31
31
  state.hrStart = process.hrtime()
32
+ state.currentConfigs = []
32
33
  }
33
34
 
34
35
  function showProgressStep() {
35
- if (logLevel <= LogLevel.silent) {
36
+ if (logLevel <= logLevelMap.silent) {
36
37
  return
37
38
  }
38
39
 
39
- const parts: string[] = []
40
- const duration = formatHrtime(state.hrStart)
41
-
42
- if (state.totalPlugins > 0) {
43
- const pluginStr =
44
- state.failedPlugins > 0
45
- ? `Plugins ${styleText('green', state.completedPlugins.toString())}/${state.totalPlugins} ${styleText('red', `(${state.failedPlugins} failed)`)}`
46
- : `Plugins ${styleText('green', state.completedPlugins.toString())}/${state.totalPlugins}`
47
- parts.push(pluginStr)
48
- }
49
-
50
- if (state.totalFiles > 0) {
51
- parts.push(`Files ${styleText('green', state.processedFiles.toString())}/${state.totalFiles}`)
52
- }
53
-
54
- if (parts.length > 0) {
55
- parts.push(`${styleText('green', duration)} elapsed`)
56
- console.log(getMessage(parts.join(styleText('dim', ' | '))))
40
+ const line = buildProgressLine(state)
41
+ if (line) {
42
+ console.log(getMessage(line))
57
43
  }
58
44
  }
59
45
 
60
46
  function getMessage(message: string): string {
61
- if (logLevel >= LogLevel.verbose) {
62
- const timestamp = new Date().toLocaleTimeString('en-US', {
63
- hour12: false,
64
- hour: '2-digit',
65
- minute: '2-digit',
66
- second: '2-digit',
67
- })
68
-
69
- return [styleText('dim', `[${timestamp}]`), message].join(' ')
70
- }
71
-
72
- return message
47
+ return formatMessage(message, logLevel)
73
48
  }
74
49
 
75
50
  function openGroup(name: string) {
@@ -81,7 +56,7 @@ export const githubActionsLogger = defineLogger({
81
56
  }
82
57
 
83
58
  context.on('info', (message, info = '') => {
84
- if (logLevel <= LogLevel.silent) {
59
+ if (logLevel <= logLevelMap.silent) {
85
60
  return
86
61
  }
87
62
 
@@ -91,36 +66,36 @@ export const githubActionsLogger = defineLogger({
91
66
  })
92
67
 
93
68
  context.on('success', (message, info = '') => {
94
- if (logLevel <= LogLevel.silent) {
69
+ if (logLevel <= logLevelMap.silent) {
95
70
  return
96
71
  }
97
72
 
98
- const text = getMessage([styleText('blue', '✓'), message, logLevel >= LogLevel.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
73
+ const text = getMessage([styleText('blue', '✓'), message, logLevel >= logLevelMap.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
99
74
 
100
75
  console.log(text)
101
76
  })
102
77
 
103
78
  context.on('warn', (message, info = '') => {
104
- if (logLevel <= LogLevel.silent) {
79
+ if (logLevel <= logLevelMap.silent) {
105
80
  return
106
81
  }
107
82
 
108
- const text = getMessage([styleText('yellow', '⚠'), message, logLevel >= LogLevel.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
83
+ const text = getMessage([styleText('yellow', '⚠'), message, logLevel >= logLevelMap.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
109
84
 
110
85
  console.warn(`::warning::${text}`)
111
86
  })
112
87
 
113
88
  context.on('error', (error) => {
114
- const caused = error.cause as Error | undefined
89
+ const caused = toCause(error)
115
90
 
116
- if (logLevel <= LogLevel.silent) {
91
+ if (logLevel <= logLevelMap.silent) {
117
92
  return
118
93
  }
119
94
  const message = error.message || String(error)
120
95
  console.error(`::error::${message}`)
121
96
 
122
97
  // Show stack trace in debug mode (first 3 frames)
123
- if (logLevel >= LogLevel.debug && error.stack) {
98
+ if (logLevel >= logLevelMap.debug && error.stack) {
124
99
  const frames = error.stack.split('\n').slice(1, 4)
125
100
  for (const frame of frames) {
126
101
  console.log(getMessage(styleText('dim', frame.trim())))
@@ -143,7 +118,7 @@ export const githubActionsLogger = defineLogger({
143
118
  })
144
119
 
145
120
  context.on('config:start', () => {
146
- if (logLevel <= LogLevel.silent) {
121
+ if (logLevel <= logLevelMap.silent) {
147
122
  return
148
123
  }
149
124
 
@@ -157,7 +132,7 @@ export const githubActionsLogger = defineLogger({
157
132
  context.on('config:end', (configs) => {
158
133
  state.currentConfigs = configs
159
134
 
160
- if (logLevel <= LogLevel.silent) {
135
+ if (logLevel <= logLevelMap.silent) {
161
136
  return
162
137
  }
163
138
 
@@ -169,8 +144,10 @@ export const githubActionsLogger = defineLogger({
169
144
  })
170
145
 
171
146
  context.on('generation:start', (config) => {
172
- // Initialize progress tracking
173
- state.totalPlugins = config.plugins?.length || 0
147
+ reset()
148
+
149
+ // Initialize progress tracking for this generation
150
+ state.totalPlugins = config.plugins?.length ?? 0
174
151
 
175
152
  const text = config.name ? `Generation for ${styleText('bold', config.name)}` : 'Generation'
176
153
 
@@ -181,12 +158,10 @@ export const githubActionsLogger = defineLogger({
181
158
  if (state.currentConfigs.length === 1) {
182
159
  console.log(getMessage(text))
183
160
  }
184
-
185
- reset()
186
161
  })
187
162
 
188
163
  context.on('plugin:start', (plugin) => {
189
- if (logLevel <= LogLevel.silent) {
164
+ if (logLevel <= logLevelMap.silent) {
190
165
  return
191
166
  }
192
167
  const text = getMessage(`Generating ${styleText('bold', plugin.name)}`)
@@ -199,7 +174,7 @@ export const githubActionsLogger = defineLogger({
199
174
  })
200
175
 
201
176
  context.on('plugin:end', (plugin, { duration, success }) => {
202
- if (logLevel <= LogLevel.silent) {
177
+ if (logLevel <= logLevelMap.silent) {
203
178
  return
204
179
  }
205
180
 
@@ -230,7 +205,7 @@ export const githubActionsLogger = defineLogger({
230
205
  })
231
206
 
232
207
  context.on('files:processing:start', (files) => {
233
- if (logLevel <= LogLevel.silent) {
208
+ if (logLevel <= logLevelMap.silent) {
234
209
  return
235
210
  }
236
211
 
@@ -246,7 +221,7 @@ export const githubActionsLogger = defineLogger({
246
221
  })
247
222
 
248
223
  context.on('files:processing:end', () => {
249
- if (logLevel <= LogLevel.silent) {
224
+ if (logLevel <= logLevelMap.silent) {
250
225
  return
251
226
  }
252
227
  const text = getMessage('Files written successfully')
@@ -256,25 +231,19 @@ export const githubActionsLogger = defineLogger({
256
231
  if (state.currentConfigs.length === 1) {
257
232
  closeGroup('File Generation')
258
233
  }
234
+
235
+ // Show final progress step after files are written
236
+ showProgressStep()
259
237
  })
260
238
 
261
239
  context.on('file:processing:update', () => {
262
- if (logLevel <= LogLevel.silent) {
240
+ if (logLevel <= logLevelMap.silent) {
263
241
  return
264
242
  }
265
243
 
266
244
  state.processedFiles++
267
245
  })
268
246
 
269
- context.on('files:processing:end', () => {
270
- if (logLevel <= LogLevel.silent) {
271
- return
272
- }
273
-
274
- // Show final progress step after files are written
275
- showProgressStep()
276
- })
277
-
278
247
  context.on('generation:end', (config) => {
279
248
  const text = getMessage(
280
249
  config.name ? `${styleText('blue', '✓')} Generation completed for ${styleText('dim', config.name)}` : `${styleText('blue', '✓')} Generation completed`,
@@ -284,7 +253,7 @@ export const githubActionsLogger = defineLogger({
284
253
  })
285
254
 
286
255
  context.on('format:start', () => {
287
- if (logLevel <= LogLevel.silent) {
256
+ if (logLevel <= logLevelMap.silent) {
288
257
  return
289
258
  }
290
259
 
@@ -298,7 +267,7 @@ export const githubActionsLogger = defineLogger({
298
267
  })
299
268
 
300
269
  context.on('format:end', () => {
301
- if (logLevel <= LogLevel.silent) {
270
+ if (logLevel <= logLevelMap.silent) {
302
271
  return
303
272
  }
304
273
 
@@ -312,7 +281,7 @@ export const githubActionsLogger = defineLogger({
312
281
  })
313
282
 
314
283
  context.on('lint:start', () => {
315
- if (logLevel <= LogLevel.silent) {
284
+ if (logLevel <= logLevelMap.silent) {
316
285
  return
317
286
  }
318
287
 
@@ -326,7 +295,7 @@ export const githubActionsLogger = defineLogger({
326
295
  })
327
296
 
328
297
  context.on('lint:end', () => {
329
- if (logLevel <= LogLevel.silent) {
298
+ if (logLevel <= logLevelMap.silent) {
330
299
  return
331
300
  }
332
301
 
@@ -340,14 +309,13 @@ export const githubActionsLogger = defineLogger({
340
309
  })
341
310
 
342
311
  context.on('hook:start', async ({ id, command, args }) => {
343
- const commandWithArgs = args?.length ? `${command} ${args.join(' ')}` : command
312
+ const commandWithArgs = formatCommandWithArgs(command, args)
344
313
  const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} started`)
345
314
 
346
- if (logLevel > LogLevel.silent) {
315
+ if (logLevel > logLevelMap.silent) {
347
316
  if (state.currentConfigs.length === 1) {
348
317
  openGroup(`Hook ${commandWithArgs}`)
349
318
  }
350
-
351
319
  console.log(text)
352
320
  }
353
321
 
@@ -356,65 +324,26 @@ export const githubActionsLogger = defineLogger({
356
324
  return
357
325
  }
358
326
 
359
- try {
360
- const result = await x(command, [...(args ?? [])], {
361
- nodeOptions: { detached: true },
362
- throwOnError: true,
363
- })
364
-
365
- await context.emit('debug', {
366
- date: new Date(),
367
- logs: [result.stdout.trimEnd()],
368
- })
369
-
370
- if (logLevel > LogLevel.silent) {
371
- console.log(result.stdout.trimEnd())
372
- }
373
-
374
- await context.emit('hook:end', {
375
- command,
376
- args,
377
- id,
378
- success: true,
379
- error: null,
380
- })
381
- } catch (err) {
382
- const error = err as NonZeroExitError
383
- const stderr = error.output?.stderr ?? ''
384
- const stdout = error.output?.stdout ?? ''
385
-
386
- await context.emit('debug', {
387
- date: new Date(),
388
- logs: [stdout, stderr].filter(Boolean),
389
- })
390
-
391
- // Display stderr/stdout in GitHub Actions format
392
- if (stderr) {
393
- console.error(`::error::${stderr}`)
394
- }
395
- if (stdout) {
396
- console.log(stdout)
397
- }
398
-
399
- const errorMessage = new Error(`Hook execute failed: ${commandWithArgs}`)
400
-
401
- await context.emit('hook:end', {
402
- command,
403
- args,
404
- id,
405
- success: false,
406
- error: errorMessage,
407
- })
408
- await context.emit('error', errorMessage)
409
- }
327
+ await runHook({
328
+ id,
329
+ command,
330
+ args,
331
+ commandWithArgs,
332
+ context,
333
+ sink: {
334
+ // GHA formats errors with the ::error:: annotation
335
+ onStdout: logLevel > logLevelMap.silent ? (s) => console.log(s) : undefined,
336
+ onStderr: logLevel > logLevelMap.silent ? (s) => console.error(`::error::${s}`) : undefined,
337
+ },
338
+ })
410
339
  })
411
340
 
412
341
  context.on('hook:end', ({ command, args }) => {
413
- if (logLevel <= LogLevel.silent) {
342
+ if (logLevel <= logLevelMap.silent) {
414
343
  return
415
344
  }
416
345
 
417
- const commandWithArgs = args?.length ? `${command} ${args.join(' ')}` : command
346
+ const commandWithArgs = formatCommandWithArgs(command, args)
418
347
  const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} completed`)
419
348
 
420
349
  console.log(text)
@@ -425,7 +354,7 @@ export const githubActionsLogger = defineLogger({
425
354
  })
426
355
 
427
356
  context.on('generation:summary', (config, { status, hrStart, failedPlugins }) => {
428
- const pluginsCount = config.plugins?.length || 0
357
+ const pluginsCount = config.plugins?.length ?? 0
429
358
  const successCount = pluginsCount - failedPlugins.size
430
359
  const duration = formatHrtime(hrStart)
431
360
 
@@ -443,5 +372,9 @@ export const githubActionsLogger = defineLogger({
443
372
  closeGroup(config.name ? `Generation for ${styleText('bold', config.name)}` : 'Generation')
444
373
  }
445
374
  })
375
+
376
+ context.on('lifecycle:end', () => {
377
+ reset()
378
+ })
446
379
  },
447
380
  })
@@ -1,8 +1,10 @@
1
1
  import { relative } from 'node:path'
2
- import { defineLogger, LogLevel } from '@kubb/core'
3
- import { formatMs } from '@kubb/core/utils'
4
- import { type NonZeroExitError, x } from 'tinyexec'
2
+ import { formatMs, toCause } from '@internals/utils'
3
+ import { defineLogger, logLevel as logLevelMap } from '@kubb/core'
4
+ import { SUMMARY_SEPARATOR } from '../constants.ts'
5
5
  import { getSummary } from '../utils/getSummary.ts'
6
+ import { runHook } from '../utils/runHook.ts'
7
+ import { formatCommandWithArgs, formatMessage } from './utils.ts'
6
8
 
7
9
  /**
8
10
  * Plain console adapter for non-TTY environments
@@ -11,25 +13,14 @@ import { getSummary } from '../utils/getSummary.ts'
11
13
  export const plainLogger = defineLogger({
12
14
  name: 'plain',
13
15
  install(context, options) {
14
- const logLevel = options?.logLevel || 3
16
+ const logLevel = options?.logLevel ?? logLevelMap.info
15
17
 
16
18
  function getMessage(message: string): string {
17
- if (logLevel >= LogLevel.verbose) {
18
- const timestamp = new Date().toLocaleTimeString('en-US', {
19
- hour12: false,
20
- hour: '2-digit',
21
- minute: '2-digit',
22
- second: '2-digit',
23
- })
24
-
25
- return [`[${timestamp}]`, message].join(' ')
26
- }
27
-
28
- return message
19
+ return formatMessage(message, logLevel)
29
20
  }
30
21
 
31
22
  context.on('info', (message, info) => {
32
- if (logLevel <= LogLevel.silent) {
23
+ if (logLevel <= logLevelMap.silent) {
33
24
  return
34
25
  }
35
26
 
@@ -39,34 +30,34 @@ export const plainLogger = defineLogger({
39
30
  })
40
31
 
41
32
  context.on('success', (message, info = '') => {
42
- if (logLevel <= LogLevel.silent) {
33
+ if (logLevel <= logLevelMap.silent) {
43
34
  return
44
35
  }
45
36
 
46
- const text = getMessage(['✓', message, logLevel >= LogLevel.info ? info : undefined].filter(Boolean).join(' '))
37
+ const text = getMessage(['✓', message, logLevel >= logLevelMap.info ? info : undefined].filter(Boolean).join(' '))
47
38
 
48
39
  console.log(text)
49
40
  })
50
41
 
51
42
  context.on('warn', (message, info) => {
52
- if (logLevel < LogLevel.warn) {
43
+ if (logLevel < logLevelMap.warn) {
53
44
  return
54
45
  }
55
46
 
56
- const text = getMessage(['⚠', message, logLevel >= LogLevel.info ? info : undefined].filter(Boolean).join(' '))
47
+ const text = getMessage(['⚠', message, logLevel >= logLevelMap.info ? info : undefined].filter(Boolean).join(' '))
57
48
 
58
49
  console.log(text)
59
50
  })
60
51
 
61
52
  context.on('error', (error) => {
62
- const caused = error.cause as Error | undefined
53
+ const caused = toCause(error)
63
54
 
64
55
  const text = getMessage(['✗', error.message].join(' '))
65
56
 
66
57
  console.log(text)
67
58
 
68
59
  // Show stack trace in debug mode (first 3 frames)
69
- if (logLevel >= LogLevel.debug && error.stack) {
60
+ if (logLevel >= logLevelMap.debug && error.stack) {
70
61
  const frames = error.stack.split('\n').slice(1, 4)
71
62
  for (const frame of frames) {
72
63
  console.log(getMessage(frame.trim()))
@@ -88,7 +79,7 @@ export const plainLogger = defineLogger({
88
79
  })
89
80
 
90
81
  context.on('config:start', () => {
91
- if (logLevel <= LogLevel.silent) {
82
+ if (logLevel <= logLevelMap.silent) {
92
83
  return
93
84
  }
94
85
 
@@ -98,7 +89,7 @@ export const plainLogger = defineLogger({
98
89
  })
99
90
 
100
91
  context.on('config:end', () => {
101
- if (logLevel <= LogLevel.silent) {
92
+ if (logLevel <= logLevelMap.silent) {
102
93
  return
103
94
  }
104
95
 
@@ -108,13 +99,13 @@ export const plainLogger = defineLogger({
108
99
  })
109
100
 
110
101
  context.on('generation:start', () => {
111
- const text = getMessage('Configuration started')
102
+ const text = getMessage('Generation started')
112
103
 
113
104
  console.log(text)
114
105
  })
115
106
 
116
107
  context.on('plugin:start', (plugin) => {
117
- if (logLevel <= LogLevel.silent) {
108
+ if (logLevel <= logLevelMap.silent) {
118
109
  return
119
110
  }
120
111
  const text = getMessage(`Generating ${plugin.name}`)
@@ -123,7 +114,7 @@ export const plainLogger = defineLogger({
123
114
  })
124
115
 
125
116
  context.on('plugin:end', (plugin, { duration, success }) => {
126
- if (logLevel <= LogLevel.silent) {
117
+ if (logLevel <= logLevelMap.silent) {
127
118
  return
128
119
  }
129
120
 
@@ -134,7 +125,7 @@ export const plainLogger = defineLogger({
134
125
  })
135
126
 
136
127
  context.on('files:processing:start', (files) => {
137
- if (logLevel <= LogLevel.silent) {
128
+ if (logLevel <= logLevelMap.silent) {
138
129
  return
139
130
  }
140
131
 
@@ -144,7 +135,7 @@ export const plainLogger = defineLogger({
144
135
  })
145
136
 
146
137
  context.on('file:processing:update', ({ file, config }) => {
147
- if (logLevel <= LogLevel.silent) {
138
+ if (logLevel <= logLevelMap.silent) {
148
139
  return
149
140
  }
150
141
 
@@ -154,7 +145,7 @@ export const plainLogger = defineLogger({
154
145
  })
155
146
 
156
147
  context.on('files:processing:end', () => {
157
- if (logLevel <= LogLevel.silent) {
148
+ if (logLevel <= logLevelMap.silent) {
158
149
  return
159
150
  }
160
151
 
@@ -170,7 +161,7 @@ export const plainLogger = defineLogger({
170
161
  })
171
162
 
172
163
  context.on('format:start', () => {
173
- if (logLevel <= LogLevel.silent) {
164
+ if (logLevel <= logLevelMap.silent) {
174
165
  return
175
166
  }
176
167
 
@@ -180,7 +171,7 @@ export const plainLogger = defineLogger({
180
171
  })
181
172
 
182
173
  context.on('format:end', () => {
183
- if (logLevel <= LogLevel.silent) {
174
+ if (logLevel <= logLevelMap.silent) {
184
175
  return
185
176
  }
186
177
 
@@ -190,7 +181,7 @@ export const plainLogger = defineLogger({
190
181
  })
191
182
 
192
183
  context.on('lint:start', () => {
193
- if (logLevel <= LogLevel.silent) {
184
+ if (logLevel <= logLevelMap.silent) {
194
185
  return
195
186
  }
196
187
 
@@ -200,7 +191,7 @@ export const plainLogger = defineLogger({
200
191
  })
201
192
 
202
193
  context.on('lint:end', () => {
203
- if (logLevel <= LogLevel.silent) {
194
+ if (logLevel <= logLevelMap.silent) {
204
195
  return
205
196
  }
206
197
 
@@ -210,10 +201,10 @@ export const plainLogger = defineLogger({
210
201
  })
211
202
 
212
203
  context.on('hook:start', async ({ id, command, args }) => {
213
- const commandWithArgs = args?.length ? `${command} ${args.join(' ')}` : command
204
+ const commandWithArgs = formatCommandWithArgs(command, args)
214
205
  const text = getMessage(`Hook ${commandWithArgs} started`)
215
206
 
216
- if (logLevel > LogLevel.silent) {
207
+ if (logLevel > logLevelMap.silent) {
217
208
  console.log(text)
218
209
  }
219
210
 
@@ -222,64 +213,25 @@ export const plainLogger = defineLogger({
222
213
  return
223
214
  }
224
215
 
225
- try {
226
- const result = await x(command, [...(args ?? [])], {
227
- nodeOptions: { detached: true },
228
- throwOnError: true,
229
- })
230
-
231
- await context.emit('debug', {
232
- date: new Date(),
233
- logs: [result.stdout.trimEnd()],
234
- })
235
-
236
- if (logLevel > LogLevel.silent) {
237
- console.log(result.stdout.trimEnd())
238
- }
239
-
240
- await context.emit('hook:end', {
241
- command,
242
- args,
243
- id,
244
- success: true,
245
- error: null,
246
- })
247
- } catch (err) {
248
- const error = err as NonZeroExitError
249
- const stderr = error.output?.stderr ?? ''
250
- const stdout = error.output?.stdout ?? ''
251
-
252
- await context.emit('debug', {
253
- date: new Date(),
254
- logs: [stdout, stderr].filter(Boolean),
255
- })
256
-
257
- if (stderr) {
258
- console.error(stderr)
259
- }
260
- if (stdout) {
261
- console.log(stdout)
262
- }
263
-
264
- const errorMessage = new Error(`Hook execute failed: ${commandWithArgs}`)
265
-
266
- await context.emit('hook:end', {
267
- command,
268
- args,
269
- id,
270
- success: false,
271
- error: errorMessage,
272
- })
273
- await context.emit('error', errorMessage)
274
- }
216
+ await runHook({
217
+ id,
218
+ command,
219
+ args,
220
+ commandWithArgs,
221
+ context,
222
+ sink: {
223
+ onStdout: logLevel > logLevelMap.silent ? (s) => console.log(s) : undefined,
224
+ onStderr: logLevel > logLevelMap.silent ? (s) => console.error(s) : undefined,
225
+ },
226
+ })
275
227
  })
276
228
 
277
229
  context.on('hook:end', ({ command, args }) => {
278
- if (logLevel <= LogLevel.silent) {
230
+ if (logLevel <= logLevelMap.silent) {
279
231
  return
280
232
  }
281
233
 
282
- const commandWithArgs = args?.length ? `${command} ${args.join(' ')}` : command
234
+ const commandWithArgs = formatCommandWithArgs(command, args)
283
235
  const text = getMessage(`Hook ${commandWithArgs} completed`)
284
236
 
285
237
  console.log(text)
@@ -292,12 +244,12 @@ export const plainLogger = defineLogger({
292
244
  config,
293
245
  status,
294
246
  hrStart,
295
- pluginTimings: logLevel >= LogLevel.verbose ? pluginTimings : undefined,
247
+ pluginTimings: logLevel >= logLevelMap.verbose ? pluginTimings : undefined,
296
248
  })
297
249
 
298
- console.log('---------------------------')
250
+ console.log(SUMMARY_SEPARATOR)
299
251
  console.log(summary.join('\n'))
300
- console.log('---------------------------')
252
+ console.log(SUMMARY_SEPARATOR)
301
253
  })
302
254
  },
303
255
  })