@kubb/cli 5.0.0-beta.75 → 5.0.0-beta.77

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 (150) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +171 -51
  3. package/bin/kubb.js +9 -3
  4. package/dist/Telemetry-CxzkLSdD.js +284 -0
  5. package/dist/Telemetry-CxzkLSdD.js.map +1 -0
  6. package/dist/Telemetry-D8jhC5Bc.cjs +315 -0
  7. package/dist/Telemetry-D8jhC5Bc.cjs.map +1 -0
  8. package/dist/{define-Bdn8j5VM.cjs → defineCommand-Bo3yZTWI.cjs} +3 -21
  9. package/dist/defineCommand-Bo3yZTWI.cjs.map +1 -0
  10. package/dist/{define-Ctii4bel.js → defineCommand-DMEeqliP.js} +4 -16
  11. package/dist/defineCommand-DMEeqliP.js.map +1 -0
  12. package/dist/{errors-CjPmyZHy.js → errors-Dc_d7BfX.js} +2 -2
  13. package/dist/{errors-CjPmyZHy.js.map → errors-Dc_d7BfX.js.map} +1 -1
  14. package/dist/{errors-CLCjoSg0.cjs → errors-gxFK0vrp.cjs} +2 -2
  15. package/dist/{errors-CLCjoSg0.cjs.map → errors-gxFK0vrp.cjs.map} +1 -1
  16. package/dist/generate-DvnQaawe.js +77 -0
  17. package/dist/generate-DvnQaawe.js.map +1 -0
  18. package/dist/generate-Dw107fw0.cjs +76 -0
  19. package/dist/generate-Dw107fw0.cjs.map +1 -0
  20. package/dist/index.cjs +93 -149
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.ts +6 -1
  23. package/dist/index.js +93 -149
  24. package/dist/index.js.map +1 -1
  25. package/dist/init-CTY6arQX.cjs +53 -0
  26. package/dist/init-CTY6arQX.cjs.map +1 -0
  27. package/dist/init-DfWdONdA.js +53 -0
  28. package/dist/init-DfWdONdA.js.map +1 -0
  29. package/dist/mcp-Cn_LAuui.js +21 -0
  30. package/dist/mcp-Cn_LAuui.js.map +1 -0
  31. package/dist/mcp-D5bAmwu0.cjs +21 -0
  32. package/dist/mcp-D5bAmwu0.cjs.map +1 -0
  33. package/dist/{package-D5arPDnh.cjs → package-RNhs4w6c.cjs} +2 -2
  34. package/dist/package-RNhs4w6c.cjs.map +1 -0
  35. package/dist/package-pmOGZlq-.js +6 -0
  36. package/dist/package-pmOGZlq-.js.map +1 -0
  37. package/dist/run-44Zxh8Ec.js +289 -0
  38. package/dist/run-44Zxh8Ec.js.map +1 -0
  39. package/dist/run-BPLW8mrc.cjs +52 -0
  40. package/dist/run-BPLW8mrc.cjs.map +1 -0
  41. package/dist/run-DXEMoDFa.cjs +293 -0
  42. package/dist/run-DXEMoDFa.cjs.map +1 -0
  43. package/dist/run-Dv-1NGl-.js +32 -0
  44. package/dist/run-Dv-1NGl-.js.map +1 -0
  45. package/dist/run-Dzqgies_.js +1327 -0
  46. package/dist/run-Dzqgies_.js.map +1 -0
  47. package/dist/run-GFI-E4ua.cjs +33 -0
  48. package/dist/run-GFI-E4ua.cjs.map +1 -0
  49. package/dist/run-WfvBLKQY.js +51 -0
  50. package/dist/run-WfvBLKQY.js.map +1 -0
  51. package/dist/run-qhJgyKZX.cjs +1330 -0
  52. package/dist/run-qhJgyKZX.cjs.map +1 -0
  53. package/dist/tools-CZT9wSA6.cjs +175 -0
  54. package/dist/tools-CZT9wSA6.cjs.map +1 -0
  55. package/dist/tools-D0UogMU3.js +152 -0
  56. package/dist/tools-D0UogMU3.js.map +1 -0
  57. package/dist/validate-DRRJJptl.js +26 -0
  58. package/dist/validate-DRRJJptl.js.map +1 -0
  59. package/dist/validate-DYJrCiw5.cjs +26 -0
  60. package/dist/validate-DYJrCiw5.cjs.map +1 -0
  61. package/package.json +24 -28
  62. package/dist/agent-BEgI2HXH.cjs +0 -58
  63. package/dist/agent-BEgI2HXH.cjs.map +0 -1
  64. package/dist/agent-B_pirbeB.cjs +0 -116
  65. package/dist/agent-B_pirbeB.cjs.map +0 -1
  66. package/dist/agent-CTdJEHEs.js +0 -56
  67. package/dist/agent-CTdJEHEs.js.map +0 -1
  68. package/dist/agent-Ev5hU5hH.js +0 -112
  69. package/dist/agent-Ev5hU5hH.js.map +0 -1
  70. package/dist/constants-CnDXa1R6.cjs +0 -148
  71. package/dist/constants-CnDXa1R6.cjs.map +0 -1
  72. package/dist/constants-aL3CP_Wq.js +0 -95
  73. package/dist/constants-aL3CP_Wq.js.map +0 -1
  74. package/dist/define-Bdn8j5VM.cjs.map +0 -1
  75. package/dist/define-Ctii4bel.js.map +0 -1
  76. package/dist/generate-Cg8yufrw.js +0 -1753
  77. package/dist/generate-Cg8yufrw.js.map +0 -1
  78. package/dist/generate-DDCwNQNo.cjs +0 -65
  79. package/dist/generate-DDCwNQNo.cjs.map +0 -1
  80. package/dist/generate-K8MJ9aQF.cjs +0 -1756
  81. package/dist/generate-K8MJ9aQF.cjs.map +0 -1
  82. package/dist/generate-YPtfjsg4.js +0 -66
  83. package/dist/generate-YPtfjsg4.js.map +0 -1
  84. package/dist/init-Bu95ML_u.cjs +0 -25
  85. package/dist/init-Bu95ML_u.cjs.map +0 -1
  86. package/dist/init-CZ5Xq2Hd.cjs +0 -293
  87. package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
  88. package/dist/init-eNRlotJK.js +0 -289
  89. package/dist/init-eNRlotJK.js.map +0 -1
  90. package/dist/init-ooJeOBGt.js +0 -25
  91. package/dist/init-ooJeOBGt.js.map +0 -1
  92. package/dist/mcp-C-d5N1wZ.js +0 -16
  93. package/dist/mcp-C-d5N1wZ.js.map +0 -1
  94. package/dist/mcp-CLcDV4Jm.cjs +0 -41
  95. package/dist/mcp-CLcDV4Jm.cjs.map +0 -1
  96. package/dist/mcp-D7EIR9fR.js +0 -40
  97. package/dist/mcp-D7EIR9fR.js.map +0 -1
  98. package/dist/mcp-Dpu8vzzj.cjs +0 -16
  99. package/dist/mcp-Dpu8vzzj.cjs.map +0 -1
  100. package/dist/package-D5arPDnh.cjs.map +0 -1
  101. package/dist/package-DqZsMLZ9.js +0 -6
  102. package/dist/package-DqZsMLZ9.js.map +0 -1
  103. package/dist/shell-475fQKaX.cjs +0 -62
  104. package/dist/shell-475fQKaX.cjs.map +0 -1
  105. package/dist/shell-DLzN4fRo.js +0 -51
  106. package/dist/shell-DLzN4fRo.js.map +0 -1
  107. package/dist/telemetry-DN95_2pF.cjs +0 -282
  108. package/dist/telemetry-DN95_2pF.cjs.map +0 -1
  109. package/dist/telemetry-LgT_sdPe.js +0 -245
  110. package/dist/telemetry-LgT_sdPe.js.map +0 -1
  111. package/dist/validate-CIR3_lZI.js +0 -25
  112. package/dist/validate-CIR3_lZI.js.map +0 -1
  113. package/dist/validate-DcqUb4DM.cjs +0 -25
  114. package/dist/validate-DcqUb4DM.cjs.map +0 -1
  115. package/dist/validate-kLJoT_hi.js +0 -33
  116. package/dist/validate-kLJoT_hi.js.map +0 -1
  117. package/dist/validate-yKKzqEZ5.cjs +0 -34
  118. package/dist/validate-yKKzqEZ5.cjs.map +0 -1
  119. package/src/commands/agent/start.ts +0 -47
  120. package/src/commands/agent.ts +0 -8
  121. package/src/commands/generate.ts +0 -57
  122. package/src/commands/init.ts +0 -20
  123. package/src/commands/mcp.ts +0 -12
  124. package/src/commands/validate.ts +0 -20
  125. package/src/constants.ts +0 -104
  126. package/src/index.ts +0 -43
  127. package/src/loggers/clackLogger.ts +0 -458
  128. package/src/loggers/fileSystemLogger.ts +0 -138
  129. package/src/loggers/githubActionsLogger.ts +0 -379
  130. package/src/loggers/plainLogger.ts +0 -254
  131. package/src/loggers/types.ts +0 -1
  132. package/src/loggers/utils.ts +0 -106
  133. package/src/runners/agent.ts +0 -149
  134. package/src/runners/generate.ts +0 -333
  135. package/src/runners/init.ts +0 -296
  136. package/src/runners/mcp.ts +0 -45
  137. package/src/runners/validate.ts +0 -39
  138. package/src/types.ts +0 -11
  139. package/src/utils/Writables.ts +0 -17
  140. package/src/utils/executeHooks.ts +0 -45
  141. package/src/utils/flags.ts +0 -9
  142. package/src/utils/getConfig.ts +0 -10
  143. package/src/utils/getCosmiConfig.ts +0 -80
  144. package/src/utils/getSummary.ts +0 -68
  145. package/src/utils/packageManager.ts +0 -23
  146. package/src/utils/runHook.ts +0 -91
  147. package/src/utils/telemetry.ts +0 -273
  148. package/src/utils/watcher.ts +0 -19
  149. /package/dist/{chunk-ByKO4r7w.cjs → rolldown-runtime-Bx3C2hgW.cjs} +0 -0
  150. /package/dist/{chunk--u3MIqq1.js → rolldown-runtime-C0LytTxp.js} +0 -0
package/src/constants.ts DELETED
@@ -1,104 +0,0 @@
1
- /**
2
- * Default filename for the Kubb configuration file.
3
- *
4
- * Used by the `init` command when scaffolding new projects and by the `agent` default config.
5
- */
6
- export const KUBB_CONFIG_FILENAME = 'kubb.config.ts' as const
7
-
8
- /**
9
- * NPM registry endpoint used to check for @kubb/cli updates.
10
- */
11
- export const KUBB_NPM_PACKAGE_URL = 'https://registry.npmjs.org/@kubb/cli/latest' as const
12
-
13
- /**
14
- * OpenTelemetry ingestion endpoint for anonymous usage telemetry.
15
- */
16
- export const OTLP_ENDPOINT = 'https://otlp.kubb.dev' as const
17
-
18
- /**
19
- * Horizontal rule rendered above/below the plain-logger generation summary.
20
- */
21
- export const SUMMARY_SEPARATOR = '─'.repeat(27)
22
-
23
- /**
24
- * Maximum number of █ characters in a plugin timing bar.
25
- */
26
- export const SUMMARY_MAX_BAR_LENGTH = 10 as const
27
-
28
- /**
29
- * Divides elapsed milliseconds into bar-length units (1 block per 100 ms).
30
- */
31
- export const SUMMARY_TIME_SCALE_DIVISOR = 100 as const
32
-
33
- /**
34
- * Glob pattern for paths the file watcher ignores.
35
- */
36
- export const WATCHER_IGNORED_PATHS = '**/{.git,node_modules}/**' as const
37
-
38
- /**
39
- * Flags that short-circuit execution (help/version) — no telemetry notice is shown.
40
- */
41
- export const QUIET_FLAGS = new Set(['--help', '-h', '--version', '-v'] as const)
42
-
43
- export const agentDefaults = {
44
- port: '3000',
45
- host: 'localhost',
46
- configFile: KUBB_CONFIG_FILENAME,
47
- retryTimeout: '30000',
48
- studioUrl: 'https://studio.kubb.dev',
49
- /**
50
- * Relative path from the @kubb/agent package root to the server entry.
51
- */
52
- serverEntryPath: '.output/server/index.mjs',
53
- } as const
54
-
55
- /**
56
- * Default values used during interactive `init` scaffolding.
57
- */
58
- export const initDefaults = {
59
- inputPath: './openapi.yaml',
60
- outputPath: './src/gen',
61
- plugins: ['plugin-ts'],
62
- } as const
63
-
64
- /**
65
- * Maps each plugin value to the default config snippet inserted by `init`.
66
- * The `satisfies` constraint ensures all values remain plain strings while
67
- * `as const` keeps the object deeply immutable.
68
- */
69
- export const pluginDefaultConfigs = {
70
- 'plugin-ts': `pluginTs({
71
- output: { path: 'models' },
72
- })`,
73
- 'plugin-client': `pluginClient({
74
- output: { path: 'clients' },
75
- })`,
76
- 'plugin-react-query': `pluginReactQuery({
77
- output: { path: 'hooks' },
78
- })`,
79
- 'plugin-vue-query': `pluginVueQuery({
80
- output: { path: 'hooks' },
81
- })`,
82
- 'plugin-zod': `pluginZod({
83
- output: { path: 'zod' },
84
- })`,
85
- 'plugin-faker': `pluginFaker({
86
- output: { path: 'mocks' },
87
- })`,
88
- 'plugin-msw': `pluginMsw({
89
- output: { path: 'msw' },
90
- })`,
91
- 'plugin-cypress': `pluginCypress({
92
- output: { path: 'cypress' },
93
- })`,
94
- 'plugin-mcp': `pluginMcp({
95
- output: { path: 'mcp' },
96
- })`,
97
- 'plugin-redoc': `pluginRedoc({
98
- output: { path: 'redoc' },
99
- })`,
100
- } as const satisfies Record<string, string>
101
-
102
- /**
103
- * Color palette used by randomCliColor() for deterministic plugin name coloring.
104
- */
package/src/index.ts DELETED
@@ -1,43 +0,0 @@
1
- import { styleText } from 'node:util'
2
- import { createCLI } from '@internals/utils'
3
- import { version } from '../package.json'
4
- import { QUIET_FLAGS } from './constants.ts'
5
- import { isFlag } from './utils/flags.ts'
6
- import { isTelemetryDisabled } from './utils/telemetry.ts'
7
-
8
- const cli = createCLI()
9
-
10
- function shouldShowTelemetryNotice(argv: Array<string>): boolean {
11
- if (isTelemetryDisabled()) {
12
- return false
13
- }
14
- // Skip when the user is just asking for help or version info
15
- if (argv.some((arg) => isFlag(QUIET_FLAGS, arg))) {
16
- return false
17
- }
18
- // Skip in non-interactive / scripting contexts
19
- if (!process.stdout.isTTY) {
20
- return false
21
- }
22
- return true
23
- }
24
-
25
- export async function run(argv: Array<string> = process.argv): Promise<void> {
26
- if (shouldShowTelemetryNotice(argv)) {
27
- console.log(
28
- `${styleText('yellow', 'Notice:')} Kubb collects anonymous telemetry data to help improve the tool. No personal data or file contents are collected. \nTo disable, set ${styleText('cyan', 'KUBB_DISABLE_TELEMETRY=1')}.\n`,
29
- )
30
- }
31
-
32
- const { command: generateCommand } = await import('./commands/generate.ts')
33
- const { command: validateCommand } = await import('./commands/validate.ts')
34
- const { command: mcpCommand } = await import('./commands/mcp.ts')
35
- const { command: agentCommand } = await import('./commands/agent.ts')
36
- const { command: initCommand } = await import('./commands/init.ts')
37
-
38
- await cli.run([generateCommand, validateCommand, mcpCommand, agentCommand, initCommand], argv, {
39
- programName: 'kubb',
40
- defaultCommandName: 'generate',
41
- version,
42
- })
43
- }
@@ -1,458 +0,0 @@
1
- import { relative } from 'node:path'
2
- import process from 'node:process'
3
- import { styleText } from 'node:util'
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'
11
-
12
- /**
13
- * TTY logger with beautiful UI and progress indicators for local development.
14
- */
15
- export const clackLogger = defineLogger({
16
- name: 'clack',
17
- install(context, options) {
18
- const logLevel = options?.logLevel ?? logLevelMap.info
19
- const state = {
20
- totalPlugins: 0,
21
- completedPlugins: 0,
22
- failedPlugins: 0,
23
- totalFiles: 0,
24
- processedFiles: 0,
25
- hrStart: process.hrtime(),
26
- spinner: clack.spinner(),
27
- isSpinning: false,
28
- activeProgress: new Map<string, { interval?: NodeJS.Timeout; progressBar: clack.ProgressResult }>(),
29
- }
30
-
31
- function reset() {
32
- for (const [_key, active] of state.activeProgress) {
33
- if (active.interval) {
34
- clearInterval(active.interval)
35
- }
36
- active.progressBar?.stop()
37
- }
38
-
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()
45
- state.spinner = clack.spinner()
46
- state.isSpinning = false
47
- state.activeProgress.clear()
48
- }
49
-
50
- function showProgressStep() {
51
- if (logLevel <= logLevelMap.silent) {
52
- return
53
- }
54
-
55
- const line = buildProgressLine(state)
56
- if (line) {
57
- clack.log.step(getMessage(line))
58
- }
59
- }
60
-
61
- function getMessage(message: string): string {
62
- return formatMessage(message, logLevel)
63
- }
64
-
65
- function startSpinner(text?: string) {
66
- state.spinner.start(text)
67
- state.isSpinning = true
68
- }
69
-
70
- function stopSpinner(text?: string) {
71
- state.spinner.stop(text)
72
- state.isSpinning = false
73
- }
74
-
75
- context.on('kubb:info', ({ message, info = '' }) => {
76
- if (logLevel <= logLevelMap.silent) {
77
- return
78
- }
79
-
80
- const text = getMessage([styleText('blue', 'ℹ'), message, styleText('dim', info)].join(' '))
81
-
82
- if (state.isSpinning) {
83
- state.spinner.message(text)
84
- } else {
85
- clack.log.info(text)
86
- }
87
- })
88
-
89
- context.on('kubb:success', ({ message, info = '' }) => {
90
- if (logLevel <= logLevelMap.silent) {
91
- return
92
- }
93
-
94
- const text = getMessage([styleText('blue', '✓'), message, logLevel >= logLevelMap.info ? styleText('dim', info) : undefined].filter(Boolean).join(' '))
95
-
96
- if (state.isSpinning) {
97
- stopSpinner(text)
98
- } else {
99
- clack.log.success(text)
100
- }
101
- })
102
-
103
- context.on('kubb:warn', ({ message, info }) => {
104
- if (logLevel < logLevelMap.warn) {
105
- return
106
- }
107
-
108
- const text = getMessage(
109
- [styleText('yellow', '⚠'), message, logLevel >= logLevelMap.info && info ? styleText('dim', info) : undefined].filter(Boolean).join(' '),
110
- )
111
-
112
- clack.log.warn(text)
113
- })
114
-
115
- context.on('kubb:error', ({ error }) => {
116
- const caused = toCause(error)
117
-
118
- const text = [styleText('red', '✗'), error.message].join(' ')
119
-
120
- if (state.isSpinning) {
121
- stopSpinner(getMessage(text))
122
- } else {
123
- clack.log.error(getMessage(text))
124
- }
125
-
126
- // Show stack trace in debug mode (first 3 frames)
127
- if (logLevel >= logLevelMap.debug && error.stack) {
128
- const frames = error.stack.split('\n').slice(1, 4)
129
- for (const frame of frames) {
130
- clack.log.message(getMessage(styleText('dim', frame.trim())))
131
- }
132
-
133
- if (caused?.stack) {
134
- clack.log.message(styleText('dim', `└─ caused by ${caused.message}`))
135
-
136
- const frames = caused.stack.split('\n').slice(1, 4)
137
- for (const frame of frames) {
138
- clack.log.message(getMessage(` ${styleText('dim', frame.trim())}`))
139
- }
140
- }
141
- }
142
- })
143
-
144
- context.on('kubb:version:new', ({ currentVersion, latestVersion }) => {
145
- if (logLevel <= logLevelMap.silent) {
146
- return
147
- }
148
-
149
- try {
150
- clack.box(
151
- `\`v${currentVersion}\` → \`v${latestVersion}\`
152
- Run \`npm install -g @kubb/cli\` to update`,
153
- 'Update available for `Kubb`',
154
- {
155
- width: 'auto',
156
- formatBorder: (s: string) => styleText('yellow', s),
157
- rounded: true,
158
- withGuide: false,
159
- contentAlign: 'center',
160
- titleAlign: 'center',
161
- },
162
- )
163
- } catch {
164
- console.log(`Update available for Kubb: v${currentVersion} → v${latestVersion}`)
165
- console.log('Run `npm install -g @kubb/cli` to update')
166
- }
167
- })
168
-
169
- context.on('kubb:lifecycle:start', async ({ version }) => {
170
- console.log(`\n${getIntro({ title: 'The ultimate toolkit for working with APIs', description: 'Ready to start', version, areEyesOpen: true })}\n`)
171
-
172
- reset()
173
- })
174
-
175
- context.on('kubb:config:start', () => {
176
- if (logLevel <= logLevelMap.silent) {
177
- return
178
- }
179
-
180
- const text = getMessage('Configuration started')
181
-
182
- clack.intro(text)
183
- startSpinner(getMessage('Configuration loading'))
184
- })
185
-
186
- context.on('kubb:config:end', () => {
187
- if (logLevel <= logLevelMap.silent) {
188
- return
189
- }
190
-
191
- const text = getMessage('Configuration completed')
192
-
193
- clack.outro(text)
194
- })
195
-
196
- context.on('kubb:generation:start', ({ config }) => {
197
- reset()
198
-
199
- // Initialize progress tracking for this generation
200
- state.totalPlugins = config.plugins?.length ?? 0
201
-
202
- const text = getMessage(['Generation started', config.name ? `for ${styleText('dim', config.name)}` : undefined].filter(Boolean).join(' '))
203
-
204
- clack.intro(text)
205
- })
206
-
207
- context.on('kubb:plugin:start', ({ plugin }) => {
208
- if (logLevel <= logLevelMap.silent) {
209
- return
210
- }
211
-
212
- stopSpinner()
213
-
214
- const progressBar = clack.progress({
215
- style: 'block',
216
- max: 100,
217
- size: 30,
218
- })
219
- const text = getMessage(`Generating ${styleText('bold', plugin.name)}`)
220
- progressBar.start(text)
221
-
222
- const interval = setInterval(() => {
223
- progressBar.advance()
224
- }, 100)
225
-
226
- state.activeProgress.set(plugin.name, { progressBar, interval })
227
- })
228
-
229
- context.on('kubb:plugin:end', ({ plugin, duration, success }) => {
230
- stopSpinner()
231
-
232
- const active = state.activeProgress.get(plugin.name)
233
-
234
- if (!active || logLevel === logLevelMap.silent) {
235
- return
236
- }
237
-
238
- clearInterval(active.interval)
239
-
240
- if (success) {
241
- state.completedPlugins++
242
- } else {
243
- state.failedPlugins++
244
- }
245
-
246
- const durationStr = formatMsWithColor(duration)
247
- const text = getMessage(
248
- success
249
- ? `${styleText('bold', plugin.name)} completed in ${durationStr}`
250
- : `${styleText('bold', plugin.name)} failed in ${styleText('red', formatMs(duration))}`,
251
- )
252
-
253
- active.progressBar.stop(text)
254
- state.activeProgress.delete(plugin.name)
255
-
256
- // Show progress step after each plugin
257
- showProgressStep()
258
- })
259
-
260
- context.on('kubb:files:processing:start', ({ files }) => {
261
- if (logLevel <= logLevelMap.silent) {
262
- return
263
- }
264
-
265
- stopSpinner()
266
-
267
- state.totalFiles = files.length
268
- state.processedFiles = 0
269
-
270
- const text = `Writing ${files.length} files`
271
- const progressBar = clack.progress({
272
- style: 'block',
273
- max: files.length,
274
- size: 30,
275
- })
276
-
277
- context.emit('kubb:info', { message: text })
278
- progressBar.start(getMessage(text))
279
- state.activeProgress.set('files', { progressBar })
280
- })
281
-
282
- context.on('kubb:file:processing:update', ({ file, config }) => {
283
- if (logLevel <= logLevelMap.silent) {
284
- return
285
- }
286
-
287
- stopSpinner()
288
-
289
- state.processedFiles++
290
-
291
- const text = `Writing ${relative(config.root, file.path)}`
292
- const active = state.activeProgress.get('files')
293
-
294
- if (!active) {
295
- return
296
- }
297
-
298
- active.progressBar.advance(undefined, text)
299
- })
300
- context.on('kubb:files:processing:end', () => {
301
- if (logLevel <= logLevelMap.silent) {
302
- return
303
- }
304
-
305
- stopSpinner()
306
-
307
- const text = getMessage('Files written successfully')
308
- const active = state.activeProgress.get('files')
309
-
310
- if (!active) {
311
- return
312
- }
313
-
314
- active.progressBar.stop(text)
315
- state.activeProgress.delete('files')
316
-
317
- // Show final progress step after files are written
318
- showProgressStep()
319
- })
320
-
321
- context.on('kubb:generation:end', ({ config }) => {
322
- const text = getMessage(config.name ? `Generation completed for ${styleText('dim', config.name)}` : 'Generation completed')
323
-
324
- clack.outro(text)
325
- })
326
-
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')
343
-
344
- clack.outro(text)
345
- })
346
-
347
- context.on('kubb:lint:start', () => {
348
- if (logLevel <= logLevelMap.silent) {
349
- return
350
- }
351
-
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
- })
366
-
367
- context.on('kubb:hook:start', async ({ id, command, args }) => {
368
- const commandWithArgs = formatCommandWithArgs(command, args)
369
- const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} started`)
370
-
371
- // Skip hook execution if no id is provided (e.g., during benchmarks or tests)
372
- if (!id) {
373
- return
374
- }
375
-
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
- })
388
- return
389
- }
390
-
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) {
416
- return
417
- }
418
-
419
- const commandWithArgs = formatCommandWithArgs(command, args)
420
- const text = getMessage(`Hook ${styleText('dim', commandWithArgs)} successfully executed`)
421
-
422
- clack.outro(text)
423
- })
424
-
425
- context.on('kubb:generation:summary', ({ config, pluginTimings, failedPlugins, filesCreated, status, hrStart }) => {
426
- const summary = getSummary({
427
- failedPlugins,
428
- filesCreated,
429
- config,
430
- status,
431
- hrStart,
432
- pluginTimings: logLevel >= logLevelMap.verbose ? pluginTimings : undefined,
433
- })
434
- const title = config.name || ''
435
-
436
- summary.unshift('\n')
437
- summary.push('\n')
438
-
439
- const borderColor = status === 'success' ? 'green' : 'red'
440
- try {
441
- clack.box(summary.join('\n'), getMessage(title), {
442
- width: 'auto',
443
- formatBorder: (s: string) => styleText(borderColor, s),
444
- rounded: true,
445
- withGuide: false,
446
- contentAlign: 'left',
447
- titleAlign: 'center',
448
- })
449
- } catch {
450
- console.log(summary.join('\n'))
451
- }
452
- })
453
-
454
- context.on('kubb:lifecycle:end', () => {
455
- reset()
456
- })
457
- },
458
- })