@kubb/cli 5.0.0-beta.6 → 5.0.0-beta.60

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 (142) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +170 -51
  3. package/dist/Telemetry-CVdyJarO.js +283 -0
  4. package/dist/Telemetry-CVdyJarO.js.map +1 -0
  5. package/dist/Telemetry-DrppRqqW.cjs +320 -0
  6. package/dist/Telemetry-DrppRqqW.cjs.map +1 -0
  7. package/dist/{define-Bdn8j5VM.cjs → define-C4AB3POr.cjs} +2 -2
  8. package/dist/{define-Bdn8j5VM.cjs.map → define-C4AB3POr.cjs.map} +1 -1
  9. package/dist/{define-Ctii4bel.js → define-C63T4jp6.js} +2 -2
  10. package/dist/{define-Ctii4bel.js.map → define-C63T4jp6.js.map} +1 -1
  11. package/dist/{errors-CjPmyZHy.js → errors-BsemQCMn.js} +2 -2
  12. package/dist/{errors-CjPmyZHy.js.map → errors-BsemQCMn.js.map} +1 -1
  13. package/dist/{errors-CLCjoSg0.cjs → errors-DykI11xo.cjs} +2 -2
  14. package/dist/{errors-CLCjoSg0.cjs.map → errors-DykI11xo.cjs.map} +1 -1
  15. package/dist/{generate-BB2Q7I9s.cjs → generate-CMsFCzhp.cjs} +22 -17
  16. package/dist/generate-CMsFCzhp.cjs.map +1 -0
  17. package/dist/{generate-BmulGxIM.js → generate-CNXTYKOV.js} +22 -17
  18. package/dist/generate-CNXTYKOV.js.map +1 -0
  19. package/dist/index.cjs +10 -27
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +10 -27
  23. package/dist/index.js.map +1 -1
  24. package/dist/{init-Dpg8e1HN.cjs → init--vszxTGP.cjs} +6 -6
  25. package/dist/{init-Dpg8e1HN.cjs.map → init--vszxTGP.cjs.map} +1 -1
  26. package/dist/{init-BTp9if7K.js → init-BD4zelZR.js} +6 -6
  27. package/dist/{init-BTp9if7K.js.map → init-BD4zelZR.js.map} +1 -1
  28. package/dist/{mcp-C9RoU-Dg.js → mcp-CKrpwcmV.js} +6 -6
  29. package/dist/{mcp-C9RoU-Dg.js.map → mcp-CKrpwcmV.js.map} +1 -1
  30. package/dist/{mcp-wpl6sYYR.cjs → mcp-DSYDu-Tk.cjs} +6 -6
  31. package/dist/{mcp-wpl6sYYR.cjs.map → mcp-DSYDu-Tk.cjs.map} +1 -1
  32. package/dist/package-BFdHEmb9.js +6 -0
  33. package/dist/package-BFdHEmb9.js.map +1 -0
  34. package/dist/{package-iheSdfas.cjs → package-CwCIaoAJ.cjs} +2 -2
  35. package/dist/package-CwCIaoAJ.cjs.map +1 -0
  36. package/dist/run-9ZhHuNZQ.cjs +33 -0
  37. package/dist/run-9ZhHuNZQ.cjs.map +1 -0
  38. package/dist/run-BG7Giryi.js +296 -0
  39. package/dist/run-BG7Giryi.js.map +1 -0
  40. package/dist/{validate-BU4fPTMc.cjs → run-BQO_tPlc.cjs} +25 -20
  41. package/dist/run-BQO_tPlc.cjs.map +1 -0
  42. package/dist/run-CIcMzR6i.js +1377 -0
  43. package/dist/run-CIcMzR6i.js.map +1 -0
  44. package/dist/run-CYnDu3ch.js +51 -0
  45. package/dist/run-CYnDu3ch.js.map +1 -0
  46. package/dist/run-DQZAMhO5.cjs +1380 -0
  47. package/dist/run-DQZAMhO5.cjs.map +1 -0
  48. package/dist/run-DpKny2hT.cjs +300 -0
  49. package/dist/run-DpKny2hT.cjs.map +1 -0
  50. package/dist/run-h8NTawHO.js +32 -0
  51. package/dist/run-h8NTawHO.js.map +1 -0
  52. package/dist/tools-BU99bhi8.js +152 -0
  53. package/dist/tools-BU99bhi8.js.map +1 -0
  54. package/dist/tools-_Xp8-_zy.cjs +175 -0
  55. package/dist/tools-_Xp8-_zy.cjs.map +1 -0
  56. package/dist/{validate-BfJoCxrC.js → validate-BPHQK1kh.js} +6 -6
  57. package/dist/{validate-BfJoCxrC.js.map → validate-BPHQK1kh.js.map} +1 -1
  58. package/dist/{validate-DIDBROB2.cjs → validate-R-AOm0fm.cjs} +6 -6
  59. package/dist/{validate-DIDBROB2.cjs.map → validate-R-AOm0fm.cjs.map} +1 -1
  60. package/package.json +12 -27
  61. package/src/Telemetry.ts +297 -0
  62. package/src/commands/generate.ts +18 -12
  63. package/src/commands/init.ts +2 -2
  64. package/src/commands/mcp.ts +2 -2
  65. package/src/commands/validate.ts +2 -2
  66. package/src/constants.ts +2 -35
  67. package/src/index.ts +5 -21
  68. package/src/loggers/clackLogger.ts +136 -202
  69. package/src/loggers/defineLogger.ts +59 -0
  70. package/src/loggers/plainLogger.ts +48 -103
  71. package/src/loggers/types.ts +6 -1
  72. package/src/loggers/utils.ts +167 -24
  73. package/src/runners/generate/run.ts +399 -0
  74. package/src/runners/generate/utils.ts +229 -0
  75. package/src/runners/{init.ts → init/run.ts} +81 -78
  76. package/src/runners/init/utils.ts +39 -0
  77. package/src/runners/mcp/run.ts +37 -0
  78. package/src/runners/{validate.ts → validate/run.ts} +25 -20
  79. package/dist/agent-BJEvbSiP.js +0 -68
  80. package/dist/agent-BJEvbSiP.js.map +0 -1
  81. package/dist/agent-CXNO6dgj.cjs +0 -70
  82. package/dist/agent-CXNO6dgj.cjs.map +0 -1
  83. package/dist/agent-D9CKYh4K.cjs +0 -122
  84. package/dist/agent-D9CKYh4K.cjs.map +0 -1
  85. package/dist/agent-VXKxLCho.js +0 -118
  86. package/dist/agent-VXKxLCho.js.map +0 -1
  87. package/dist/constants-BPJBMT_6.js +0 -45
  88. package/dist/constants-BPJBMT_6.js.map +0 -1
  89. package/dist/constants-BYGmiFs0.cjs +0 -139
  90. package/dist/constants-BYGmiFs0.cjs.map +0 -1
  91. package/dist/constants-DSJ-Xrbv.js +0 -116
  92. package/dist/constants-DSJ-Xrbv.js.map +0 -1
  93. package/dist/constants-Rcaqzyd-.cjs +0 -80
  94. package/dist/constants-Rcaqzyd-.cjs.map +0 -1
  95. package/dist/generate-BB2Q7I9s.cjs.map +0 -1
  96. package/dist/generate-B_p5dl68.cjs +0 -1755
  97. package/dist/generate-B_p5dl68.cjs.map +0 -1
  98. package/dist/generate-BmulGxIM.js.map +0 -1
  99. package/dist/generate-DAsdUw3z.js +0 -1752
  100. package/dist/generate-DAsdUw3z.js.map +0 -1
  101. package/dist/init-CJ80lKSP.cjs +0 -239
  102. package/dist/init-CJ80lKSP.cjs.map +0 -1
  103. package/dist/init-DCqcEq86.js +0 -235
  104. package/dist/init-DCqcEq86.js.map +0 -1
  105. package/dist/mcp-D1llTaRM.cjs +0 -50
  106. package/dist/mcp-D1llTaRM.cjs.map +0 -1
  107. package/dist/mcp-DNUw8nqb.js +0 -49
  108. package/dist/mcp-DNUw8nqb.js.map +0 -1
  109. package/dist/package-iheSdfas.cjs.map +0 -1
  110. package/dist/package-vLafMWCe.js +0 -6
  111. package/dist/package-vLafMWCe.js.map +0 -1
  112. package/dist/shell-475fQKaX.cjs +0 -62
  113. package/dist/shell-475fQKaX.cjs.map +0 -1
  114. package/dist/shell-DLzN4fRo.js +0 -51
  115. package/dist/shell-DLzN4fRo.js.map +0 -1
  116. package/dist/telemetry-BLX0NzRk.cjs +0 -282
  117. package/dist/telemetry-BLX0NzRk.cjs.map +0 -1
  118. package/dist/telemetry-juq4QBf7.js +0 -245
  119. package/dist/telemetry-juq4QBf7.js.map +0 -1
  120. package/dist/validate-BU4fPTMc.cjs.map +0 -1
  121. package/dist/validate-k9s_hFah.js +0 -46
  122. package/dist/validate-k9s_hFah.js.map +0 -1
  123. package/src/commands/agent/start.ts +0 -50
  124. package/src/commands/agent.ts +0 -10
  125. package/src/loggers/fileSystemLogger.ts +0 -138
  126. package/src/loggers/githubActionsLogger.ts +0 -379
  127. package/src/runners/agent.ts +0 -155
  128. package/src/runners/generate.ts +0 -333
  129. package/src/runners/mcp.ts +0 -56
  130. package/src/types.ts +0 -11
  131. package/src/utils/Writables.ts +0 -17
  132. package/src/utils/executeHooks.ts +0 -45
  133. package/src/utils/flags.ts +0 -9
  134. package/src/utils/getConfig.ts +0 -10
  135. package/src/utils/getCosmiConfig.ts +0 -75
  136. package/src/utils/getSummary.ts +0 -68
  137. package/src/utils/packageManager.ts +0 -23
  138. package/src/utils/runHook.ts +0 -91
  139. package/src/utils/telemetry.ts +0 -273
  140. package/src/utils/watcher.ts +0 -19
  141. /package/dist/{chunk-ByKO4r7w.cjs → chunk-Bx3C2hgW.cjs} +0 -0
  142. /package/dist/{chunk--u3MIqq1.js → chunk-C0LytTxp.js} +0 -0
@@ -1,50 +0,0 @@
1
- import { defineCommand } from '@internals/utils'
2
- import { version } from '../../../package.json'
3
- import { agentDefaults } from '../../constants.ts'
4
-
5
- export const command = defineCommand({
6
- name: 'start',
7
- description:
8
- 'Start the Kubb Agent HTTP server. Exposes a REST API that accepts a kubb.config.ts patch and returns generated code as a stream. Use --allow-write to also write files to disk.',
9
- examples: ['kubb agent start', 'kubb agent start --port 4000', 'kubb agent start --allow-write', 'kubb agent start --config ./kubb.config.ts --allow-all'],
10
- options: {
11
- config: {
12
- type: 'string',
13
- description: 'Path to the Kubb config file',
14
- short: 'c',
15
- },
16
- port: {
17
- type: 'string',
18
- description: 'Port the HTTP server listens on',
19
- short: 'p',
20
- default: agentDefaults.port,
21
- },
22
- host: {
23
- type: 'string',
24
- description: 'Hostname the HTTP server binds to',
25
- default: agentDefaults.host,
26
- },
27
- 'allow-write': {
28
- type: 'boolean',
29
- description: 'Write generated files to the filesystem. When omitted, output is streamed only and no files are written.',
30
- default: false,
31
- },
32
- 'allow-all': {
33
- type: 'boolean',
34
- description: 'Grant all permissions (implies --allow-write).',
35
- default: false,
36
- },
37
- },
38
- async run({ values }) {
39
- const { runAgentStart } = await import('../../runners/agent.ts')
40
-
41
- await runAgentStart({
42
- port: values.port !== undefined ? values.port : undefined,
43
- host: values.host,
44
- configPath: values.config,
45
- allowWrite: values['allow-write'],
46
- allowAll: values['allow-all'],
47
- version,
48
- })
49
- },
50
- })
@@ -1,10 +0,0 @@
1
- import { defineCommand } from '@internals/utils'
2
- import { command as startCommand } from './agent/start.ts'
3
-
4
- export const command = defineCommand({
5
- name: 'agent',
6
- description:
7
- 'Manage the Kubb Agent — an HTTP server that lets AI agents trigger code generation programmatically via a REST API. Useful when an AI workflow needs to generate code without direct CLI access.',
8
- examples: ['kubb agent start', 'kubb agent start --port 4000 --allow-write', 'kubb agent start --config ./kubb.config.ts --allow-all'],
9
- subCommands: [startCommand],
10
- })
@@ -1,138 +0,0 @@
1
- import { relative, resolve } from 'node:path'
2
- import process from 'node:process'
3
- import { formatMs, write } from '@internals/utils'
4
- import { defineLogger } from '@kubb/core'
5
-
6
- type CachedEvent = {
7
- date: Date
8
- logs: string[]
9
- fileName?: string
10
- }
11
-
12
- /**
13
- * 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.
15
- */
16
- export const fileSystemLogger = defineLogger({
17
- name: 'filesystem',
18
- install(context) {
19
- const state = {
20
- cachedLogs: new Set<CachedEvent>(),
21
- startDate: Date.now(),
22
- }
23
-
24
- function reset() {
25
- state.cachedLogs = new Set<CachedEvent>()
26
- state.startDate = Date.now()
27
- }
28
-
29
- async function writeLogs(name?: string) {
30
- if (state.cachedLogs.size === 0) {
31
- return []
32
- }
33
-
34
- const files: Record<string, string[]> = {}
35
-
36
- for (const log of state.cachedLogs) {
37
- const baseName = log.fileName || `${['kubb', name, state.startDate].filter(Boolean).join('-')}.log`
38
- const pathName = resolve(process.cwd(), '.kubb', baseName)
39
-
40
- if (!files[pathName]) {
41
- files[pathName] = []
42
- }
43
-
44
- if (log.logs.length > 0) {
45
- const timestamp = log.date.toLocaleString()
46
- files[pathName].push(`[${timestamp}]\n${log.logs.join('\n')}`)
47
- }
48
- }
49
-
50
- for (const [fileName, logs] of Object.entries(files)) {
51
- await write(fileName, logs.join('\n\n'))
52
- }
53
-
54
- return Object.keys(files)
55
- }
56
-
57
- context.on('kubb:info', ({ message, info }) => {
58
- state.cachedLogs.add({
59
- date: new Date(),
60
- logs: [`ℹ ${message} ${info}`],
61
- })
62
- })
63
-
64
- context.on('kubb:success', ({ message, info }) => {
65
- state.cachedLogs.add({
66
- date: new Date(),
67
- logs: [`✓ ${message} ${info}`],
68
- })
69
- })
70
-
71
- context.on('kubb:warn', ({ message, info }) => {
72
- state.cachedLogs.add({
73
- date: new Date(),
74
- logs: [`⚠ ${message} ${info}`],
75
- })
76
- })
77
-
78
- context.on('kubb:error', ({ error }) => {
79
- state.cachedLogs.add({
80
- date: new Date(),
81
- logs: [`✗ ${error.message}`, error.stack || 'unknown stack'],
82
- })
83
- })
84
-
85
- context.on('kubb:debug', (message) => {
86
- state.cachedLogs.add({
87
- date: new Date(),
88
- logs: message.logs,
89
- })
90
- })
91
-
92
- context.on('kubb:plugin:start', ({ plugin }) => {
93
- state.cachedLogs.add({
94
- date: new Date(),
95
- logs: [`Generating ${plugin.name}`],
96
- })
97
- })
98
-
99
- context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
100
- const durationStr = formatMs(duration)
101
-
102
- state.cachedLogs.add({
103
- date: new Date(),
104
- logs: [success ? `${plugin.name} completed in ${durationStr}` : `${plugin.name} failed in ${durationStr}`],
105
- })
106
- })
107
-
108
- context.on('kubb:files:processing:start', ({ files }) => {
109
- state.cachedLogs.add({
110
- date: new Date(),
111
- logs: [`Start ${files.length} writing:`, ...files.map((file) => file.path)],
112
- })
113
- })
114
-
115
- context.on('kubb:generation:end', async ({ config }) => {
116
- const writtenFilePaths = await writeLogs(config.name)
117
- if (writtenFilePaths.length > 0) {
118
- const files = writtenFilePaths.map((f) => relative(process.cwd(), f))
119
- await context.emit('kubb:info', { message: 'Debug files written to:', info: files.join(', ') })
120
- }
121
- reset()
122
- })
123
-
124
- // Fallback: Write logs on process exit to handle crashes
125
- const exitHandler = () => {
126
- // Synchronous write on exit - best effort
127
- if (state.cachedLogs.size > 0) {
128
- writeLogs().catch(() => {
129
- // Ignore errors on exit
130
- })
131
- }
132
- }
133
-
134
- process.once('exit', exitHandler)
135
- process.once('SIGINT', exitHandler)
136
- process.once('SIGTERM', exitHandler)
137
- },
138
- })
@@ -1,379 +0,0 @@
1
- import { styleText } from 'node:util'
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
-
7
- /**
8
- * GitHub Actions logger using group annotations for collapsible sections in CI.
9
- */
10
- export const githubActionsLogger = defineLogger({
11
- name: 'github-actions',
12
- install(context, options) {
13
- const logLevel = options?.logLevel ?? logLevelMap.info
14
- const state = {
15
- totalPlugins: 0,
16
- completedPlugins: 0,
17
- failedPlugins: 0,
18
- totalFiles: 0,
19
- processedFiles: 0,
20
- hrStart: process.hrtime(),
21
- currentConfigs: [] as Array<Config>,
22
- }
23
-
24
- function reset() {
25
- state.totalPlugins = 0
26
- state.completedPlugins = 0
27
- state.failedPlugins = 0
28
- state.totalFiles = 0
29
- state.processedFiles = 0
30
- state.hrStart = process.hrtime()
31
- state.currentConfigs = []
32
- }
33
-
34
- function showProgressStep() {
35
- if (logLevel <= logLevelMap.silent) {
36
- return
37
- }
38
-
39
- const line = buildProgressLine(state)
40
- if (line) {
41
- console.log(getMessage(line))
42
- }
43
- }
44
-
45
- function getMessage(message: string): string {
46
- return formatMessage(message, logLevel)
47
- }
48
-
49
- function openGroup(name: string) {
50
- console.log(`::group::${name}`)
51
- }
52
-
53
- function closeGroup(_name: string) {
54
- console.log('::endgroup::')
55
- }
56
-
57
- context.on('kubb:info', ({ message, info = '' }) => {
58
- if (logLevel <= logLevelMap.silent) {
59
- return
60
- }
61
-
62
- const text = getMessage([styleText('blue', 'ℹ'), message, styleText('dim', info)].join(' '))
63
-
64
- console.log(text)
65
- })
66
-
67
- context.on('kubb:success', ({ message, info = '' }) => {
68
- if (logLevel <= logLevelMap.silent) {
69
- return
70
- }
71
-
72
- const text = getMessage([styleText('blue', '✓'), message, logLevel >= logLevelMap.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
73
-
74
- console.log(text)
75
- })
76
-
77
- context.on('kubb:warn', ({ message, info = '' }) => {
78
- if (logLevel <= logLevelMap.silent) {
79
- return
80
- }
81
-
82
- const text = getMessage([styleText('yellow', '⚠'), message, logLevel >= logLevelMap.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
83
-
84
- console.warn(`::warning::${text}`)
85
- })
86
-
87
- context.on('kubb:error', ({ error }) => {
88
- const caused = toCause(error)
89
-
90
- if (logLevel <= logLevelMap.silent) {
91
- return
92
- }
93
- const message = error.message || String(error)
94
- console.error(`::error::${message}`)
95
-
96
- // Show stack trace in debug mode (first 3 frames)
97
- if (logLevel >= logLevelMap.debug && error.stack) {
98
- const frames = error.stack.split('\n').slice(1, 4)
99
- for (const frame of frames) {
100
- console.log(getMessage(styleText('dim', frame.trim())))
101
- }
102
-
103
- if (caused?.stack) {
104
- console.log(styleText('dim', `└─ caused by ${caused.message}`))
105
-
106
- const frames = caused.stack.split('\n').slice(1, 4)
107
- for (const frame of frames) {
108
- console.log(getMessage(` ${styleText('dim', frame.trim())}`))
109
- }
110
- }
111
- }
112
- })
113
-
114
- context.on('kubb:lifecycle:start', ({ version }) => {
115
- console.log(styleText('yellow', `Kubb ${version} 🧩`))
116
- reset()
117
- })
118
-
119
- context.on('kubb:config:start', () => {
120
- if (logLevel <= logLevelMap.silent) {
121
- return
122
- }
123
-
124
- const text = getMessage('Configuration started')
125
-
126
- openGroup('Configuration')
127
-
128
- console.log(text)
129
- })
130
-
131
- context.on('kubb:config:end', ({ configs }) => {
132
- state.currentConfigs = configs
133
-
134
- if (logLevel <= logLevelMap.silent) {
135
- return
136
- }
137
-
138
- const text = getMessage('Configuration completed')
139
-
140
- console.log(text)
141
-
142
- closeGroup('Configuration')
143
- })
144
-
145
- context.on('kubb:generation:start', ({ config }) => {
146
- reset()
147
-
148
- // Initialize progress tracking for this generation
149
- state.totalPlugins = config.plugins?.length ?? 0
150
-
151
- const text = config.name ? `Generation for ${styleText('bold', config.name)}` : 'Generation'
152
-
153
- if (state.currentConfigs.length > 1) {
154
- openGroup(text)
155
- }
156
-
157
- if (state.currentConfigs.length === 1) {
158
- console.log(getMessage(text))
159
- }
160
- })
161
-
162
- context.on('kubb:plugin:start', ({ plugin }) => {
163
- if (logLevel <= logLevelMap.silent) {
164
- return
165
- }
166
- const text = getMessage(`Generating ${styleText('bold', plugin.name)}`)
167
-
168
- if (state.currentConfigs.length === 1) {
169
- openGroup(`Plugin: ${plugin.name}`)
170
- }
171
-
172
- console.log(text)
173
- })
174
-
175
- context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
176
- if (logLevel <= logLevelMap.silent) {
177
- return
178
- }
179
-
180
- if (success) {
181
- state.completedPlugins++
182
- } else {
183
- state.failedPlugins++
184
- }
185
-
186
- const durationStr = formatMsWithColor(duration)
187
- const text = getMessage(
188
- success
189
- ? `${styleText('bold', plugin.name)} completed in ${durationStr}`
190
- : `${styleText('bold', plugin.name)} failed in ${styleText('red', formatMs(duration))}`,
191
- )
192
-
193
- console.log(text)
194
- if (state.currentConfigs.length > 1) {
195
- console.log(' ')
196
- }
197
-
198
- if (state.currentConfigs.length === 1) {
199
- closeGroup(`Plugin: ${plugin.name}`)
200
- }
201
-
202
- // Show progress step after each plugin
203
- showProgressStep()
204
- })
205
-
206
- context.on('kubb:files:processing:start', ({ files }) => {
207
- if (logLevel <= logLevelMap.silent) {
208
- return
209
- }
210
-
211
- state.totalFiles = files.length
212
- state.processedFiles = 0
213
-
214
- if (state.currentConfigs.length === 1) {
215
- openGroup('File Generation')
216
- }
217
- const text = getMessage(`Writing ${files.length} files`)
218
-
219
- console.log(text)
220
- })
221
-
222
- context.on('kubb:files:processing:end', () => {
223
- if (logLevel <= logLevelMap.silent) {
224
- return
225
- }
226
- const text = getMessage('Files written successfully')
227
-
228
- console.log(text)
229
-
230
- if (state.currentConfigs.length === 1) {
231
- closeGroup('File Generation')
232
- }
233
-
234
- // Show final progress step after files are written
235
- showProgressStep()
236
- })
237
-
238
- context.on('kubb:file:processing:update', () => {
239
- if (logLevel <= logLevelMap.silent) {
240
- return
241
- }
242
-
243
- state.processedFiles++
244
- })
245
-
246
- context.on('kubb:generation:end', ({ config }) => {
247
- const text = getMessage(
248
- config.name ? `${styleText('blue', '✓')} Generation completed for ${styleText('dim', config.name)}` : `${styleText('blue', '✓')} Generation completed`,
249
- )
250
-
251
- console.log(text)
252
- })
253
-
254
- context.on('kubb:format:start', () => {
255
- if (logLevel <= logLevelMap.silent) {
256
- return
257
- }
258
-
259
- const text = getMessage('Format started')
260
-
261
- if (state.currentConfigs.length === 1) {
262
- openGroup('Formatting')
263
- }
264
-
265
- console.log(text)
266
- })
267
-
268
- context.on('kubb:format:end', () => {
269
- if (logLevel <= logLevelMap.silent) {
270
- return
271
- }
272
-
273
- const text = getMessage('Format completed')
274
-
275
- console.log(text)
276
-
277
- if (state.currentConfigs.length === 1) {
278
- closeGroup('Formatting')
279
- }
280
- })
281
-
282
- context.on('kubb:lint:start', () => {
283
- if (logLevel <= logLevelMap.silent) {
284
- return
285
- }
286
-
287
- const text = getMessage('Lint started')
288
-
289
- if (state.currentConfigs.length === 1) {
290
- openGroup('Linting')
291
- }
292
-
293
- console.log(text)
294
- })
295
-
296
- context.on('kubb:lint:end', () => {
297
- if (logLevel <= logLevelMap.silent) {
298
- return
299
- }
300
-
301
- const text = getMessage('Lint completed')
302
-
303
- console.log(text)
304
-
305
- if (state.currentConfigs.length === 1) {
306
- closeGroup('Linting')
307
- }
308
- })
309
-
310
- context.on('kubb:hook:start', async ({ id, command, args }) => {
311
- const commandWithArgs = formatCommandWithArgs(command, args)
312
- const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} started`)
313
-
314
- if (logLevel > logLevelMap.silent) {
315
- if (state.currentConfigs.length === 1) {
316
- openGroup(`Hook ${commandWithArgs}`)
317
- }
318
- console.log(text)
319
- }
320
-
321
- // Skip hook execution if no id is provided (e.g., during benchmarks or tests)
322
- if (!id) {
323
- return
324
- }
325
-
326
- await runHook({
327
- id,
328
- command,
329
- args,
330
- commandWithArgs,
331
- context,
332
- sink: {
333
- // GHA formats errors with the ::error:: annotation
334
- onStdout: logLevel > logLevelMap.silent ? (s) => console.log(s) : undefined,
335
- onStderr: logLevel > logLevelMap.silent ? (s) => console.error(`::error::${s}`) : undefined,
336
- },
337
- })
338
- })
339
-
340
- context.on('kubb:hook:end', ({ command, args }) => {
341
- if (logLevel <= logLevelMap.silent) {
342
- return
343
- }
344
-
345
- const commandWithArgs = formatCommandWithArgs(command, args)
346
- const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} completed`)
347
-
348
- console.log(text)
349
-
350
- if (state.currentConfigs.length === 1) {
351
- closeGroup(`Hook ${commandWithArgs}`)
352
- }
353
- })
354
-
355
- context.on('kubb:generation:summary', ({ config, status, hrStart, failedPlugins }) => {
356
- const pluginsCount = config.plugins?.length ?? 0
357
- const successCount = pluginsCount - failedPlugins.size
358
- const duration = formatHrtime(hrStart)
359
-
360
- if (state.currentConfigs.length > 1) {
361
- console.log(' ')
362
- }
363
-
364
- console.log(
365
- status === 'success'
366
- ? `Kubb Summary: ${styleText('blue', '✓')} ${`${successCount} successful`}, ${pluginsCount} total, ${styleText('green', duration)}`
367
- : `Kubb Summary: ${styleText('blue', '✓')} ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total, ${styleText('green', duration)}`,
368
- )
369
-
370
- if (state.currentConfigs.length > 1) {
371
- closeGroup(config.name ? `Generation for ${styleText('bold', config.name)}` : 'Generation')
372
- }
373
- })
374
-
375
- context.on('kubb:lifecycle:end', () => {
376
- reset()
377
- })
378
- },
379
- })