@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.
- package/README.md +177 -26
- package/dist/agent-BAAO2W7u.cjs +70 -0
- package/dist/agent-BAAO2W7u.cjs.map +1 -0
- package/dist/agent-WLRLgsEM.js +68 -0
- package/dist/agent-WLRLgsEM.js.map +1 -0
- package/dist/{chunk--u3MIqq1.js → chunk-BvFE5Tac.js} +1 -0
- package/dist/constants-B2JTeRBb.js +42 -0
- package/dist/constants-B2JTeRBb.js.map +1 -0
- package/dist/constants-BINTA5VZ.cjs +77 -0
- package/dist/constants-BINTA5VZ.cjs.map +1 -0
- package/dist/constants-BYGmiFs0.cjs +139 -0
- package/dist/constants-BYGmiFs0.cjs.map +1 -0
- package/dist/constants-DSJ-Xrbv.js +116 -0
- package/dist/constants-DSJ-Xrbv.js.map +1 -0
- package/dist/define-Bdn8j5VM.cjs.map +1 -1
- package/dist/{define-Ctii4bel.js → define-m_fp-Aqm.js} +2 -2
- package/dist/{define-Ctii4bel.js.map → define-m_fp-Aqm.js.map} +1 -1
- package/dist/{errors-CjPmyZHy.js → errors-CINO1EIv.js} +2 -2
- package/dist/{errors-CjPmyZHy.js.map → errors-CINO1EIv.js.map} +1 -1
- package/dist/errors-CLCjoSg0.cjs.map +1 -1
- package/dist/{generate-CTdVvIaP.js → generate-C4iw5Nou.js} +12 -6
- package/dist/generate-C4iw5Nou.js.map +1 -0
- package/dist/{generate-BzCMyyNN.cjs → generate-DKtBY8eR.cjs} +10 -4
- package/dist/generate-DKtBY8eR.cjs.map +1 -0
- package/dist/index.cjs +20 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +22 -13
- package/dist/index.js.map +1 -1
- package/dist/init-DE_judaK.js +53 -0
- package/dist/init-DE_judaK.js.map +1 -0
- package/dist/init-berpsF2G.cjs +53 -0
- package/dist/init-berpsF2G.cjs.map +1 -0
- package/dist/mcp-Ce6errt_.js +39 -0
- package/dist/mcp-Ce6errt_.js.map +1 -0
- package/dist/mcp-DcohdQTl.cjs +39 -0
- package/dist/mcp-DcohdQTl.cjs.map +1 -0
- package/dist/package-C0vNpFXU.js +6 -0
- package/dist/package-C0vNpFXU.js.map +1 -0
- package/dist/{package-DcmDg_mw.cjs → package-DZDnoPgZ.cjs} +2 -2
- package/dist/package-DZDnoPgZ.cjs.map +1 -0
- package/dist/run-B11-UaUs.cjs +33 -0
- package/dist/run-B11-UaUs.cjs.map +1 -0
- package/dist/{init-eNRlotJK.js → run-BNqMQygv.js} +107 -149
- package/dist/run-BNqMQygv.js.map +1 -0
- package/dist/{generate-BL-Kp5GY.js → run-BgM41TQT.js} +561 -493
- package/dist/run-BgM41TQT.js.map +1 -0
- package/dist/{init-CZ5Xq2Hd.cjs → run-BnGfi7Cp.cjs} +105 -147
- package/dist/run-BnGfi7Cp.cjs.map +1 -0
- package/dist/{agent-sdYBBgrd.js → run-BzpYYOQs.js} +46 -43
- package/dist/run-BzpYYOQs.js.map +1 -0
- package/dist/run-CCZ24VKk.js +51 -0
- package/dist/run-CCZ24VKk.js.map +1 -0
- package/dist/run-CQbj3ley.cjs +52 -0
- package/dist/run-CQbj3ley.cjs.map +1 -0
- package/dist/{generate-DMqdAYqy.cjs → run-DeWgpA6S.cjs} +558 -490
- package/dist/run-DeWgpA6S.cjs.map +1 -0
- package/dist/{agent-B4cAAab2.cjs → run-DwdAwnLG.cjs} +44 -41
- package/dist/run-DwdAwnLG.cjs.map +1 -0
- package/dist/run-PSA9X7ci.js +32 -0
- package/dist/run-PSA9X7ci.js.map +1 -0
- package/dist/shell-475fQKaX.cjs.map +1 -1
- package/dist/{shell-DLzN4fRo.js → shell-CN6DNqeC.js} +2 -2
- package/dist/{shell-DLzN4fRo.js.map → shell-CN6DNqeC.js.map} +1 -1
- package/dist/{telemetry-DN95_2pF.cjs → telemetry-B2iWkY5e.cjs} +5 -7
- package/dist/telemetry-B2iWkY5e.cjs.map +1 -0
- package/dist/{telemetry-LgT_sdPe.js → telemetry-BkektVz6.js} +6 -8
- package/dist/telemetry-BkektVz6.js.map +1 -0
- package/dist/validate-DVeCYyIS.js +26 -0
- package/dist/validate-DVeCYyIS.js.map +1 -0
- package/dist/validate-ymG_XDSU.cjs +26 -0
- package/dist/validate-ymG_XDSU.cjs.map +1 -0
- package/package.json +14 -14
- package/src/commands/agent/start.ts +10 -7
- package/src/commands/agent.ts +3 -1
- package/src/commands/generate.ts +5 -3
- package/src/commands/init.ts +34 -3
- package/src/commands/mcp.ts +28 -4
- package/src/commands/validate.ts +6 -4
- package/src/constants.ts +2 -58
- package/src/index.ts +5 -3
- package/src/loggers/clackLogger.ts +85 -118
- package/src/loggers/fileSystemLogger.ts +28 -15
- package/src/loggers/githubActionsLogger.ts +87 -96
- package/src/loggers/plainLogger.ts +48 -81
- package/src/loggers/types.ts +6 -0
- package/src/loggers/utils.ts +235 -11
- package/src/runners/agent/run.ts +113 -0
- package/src/runners/agent/utils.ts +98 -0
- package/src/runners/generate/run.ts +321 -0
- package/src/runners/generate/utils.ts +225 -0
- package/src/runners/init/run.ts +212 -0
- package/src/{utils/packageManager.ts → runners/init/utils.ts} +12 -2
- package/src/runners/mcp/run.ts +37 -0
- package/src/runners/validate/run.ts +63 -0
- package/src/{utils/telemetry.ts → telemetry.ts} +27 -20
- package/dist/agent-B4cAAab2.cjs.map +0 -1
- package/dist/agent-BFACosbG.cjs +0 -58
- package/dist/agent-BFACosbG.cjs.map +0 -1
- package/dist/agent-s7TqqoTg.js +0 -56
- package/dist/agent-s7TqqoTg.js.map +0 -1
- package/dist/agent-sdYBBgrd.js.map +0 -1
- package/dist/constants-CnDXa1R6.cjs +0 -148
- package/dist/constants-CnDXa1R6.cjs.map +0 -1
- package/dist/constants-aL3CP_Wq.js +0 -95
- package/dist/constants-aL3CP_Wq.js.map +0 -1
- package/dist/generate-BL-Kp5GY.js.map +0 -1
- package/dist/generate-BzCMyyNN.cjs.map +0 -1
- package/dist/generate-CTdVvIaP.js.map +0 -1
- package/dist/generate-DMqdAYqy.cjs.map +0 -1
- package/dist/init-BHMGbly9.cjs +0 -25
- package/dist/init-BHMGbly9.cjs.map +0 -1
- package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
- package/dist/init-eNRlotJK.js.map +0 -1
- package/dist/init-qgpg-iRW.js +0 -25
- package/dist/init-qgpg-iRW.js.map +0 -1
- package/dist/mcp-BRp-2Rdc.js +0 -16
- package/dist/mcp-BRp-2Rdc.js.map +0 -1
- package/dist/mcp-CYOgxB82.cjs +0 -47
- package/dist/mcp-CYOgxB82.cjs.map +0 -1
- package/dist/mcp-DmJm3TrU.js +0 -46
- package/dist/mcp-DmJm3TrU.js.map +0 -1
- package/dist/mcp-N3mRyVuO.cjs +0 -16
- package/dist/mcp-N3mRyVuO.cjs.map +0 -1
- package/dist/package-DcmDg_mw.cjs.map +0 -1
- package/dist/package-DtuyzAVW.js +0 -6
- package/dist/package-DtuyzAVW.js.map +0 -1
- package/dist/telemetry-DN95_2pF.cjs.map +0 -1
- package/dist/telemetry-LgT_sdPe.js.map +0 -1
- package/dist/validate-CJpTOzKA.js +0 -25
- package/dist/validate-CJpTOzKA.js.map +0 -1
- package/dist/validate-DyTbv7Bc.cjs +0 -25
- package/dist/validate-DyTbv7Bc.cjs.map +0 -1
- package/dist/validate-kLJoT_hi.js +0 -33
- package/dist/validate-kLJoT_hi.js.map +0 -1
- package/dist/validate-yKKzqEZ5.cjs +0 -34
- package/dist/validate-yKKzqEZ5.cjs.map +0 -1
- package/src/runners/agent.ts +0 -155
- package/src/runners/generate.ts +0 -333
- package/src/runners/init.ts +0 -296
- package/src/runners/mcp.ts +0 -51
- package/src/runners/validate.ts +0 -39
- package/src/types.ts +0 -11
- package/src/utils/Writables.ts +0 -17
- package/src/utils/executeHooks.ts +0 -45
- package/src/utils/flags.ts +0 -9
- package/src/utils/getConfig.ts +0 -10
- package/src/utils/getCosmiConfig.ts +0 -80
- package/src/utils/getSummary.ts +0 -68
- package/src/utils/runHook.ts +0 -91
- 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 '
|
|
8
|
-
import {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
295
|
-
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
341
|
+
const title = getMessage(`Running ${styleText('dim', commandWithArgs)}`)
|
|
342
|
+
const taskLog = clack.taskLog({ title })
|
|
370
343
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
return
|
|
374
|
-
}
|
|
344
|
+
state.activeHookLogs.set(id, { taskLog, hrStart: process.hrtime() })
|
|
345
|
+
})
|
|
375
346
|
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
|
|
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
|
|
359
|
+
const duration = formatMsWithColor(getElapsedMs(active.hrStart))
|
|
421
360
|
|
|
422
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
|
46
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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', (
|
|
97
|
+
context.on('kubb:debug', ({ date, fileName, logs }) => {
|
|
86
98
|
state.cachedLogs.add({
|
|
87
|
-
date
|
|
88
|
-
|
|
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: [
|
|
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 ?
|
|
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: [
|
|
124
|
+
logs: [`► Writing ${files.length} files`, ...files.map((file) => ` ${file.path}`)],
|
|
112
125
|
})
|
|
113
126
|
})
|
|
114
127
|
|