@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.
- package/LICENSE +17 -10
- package/README.md +171 -51
- package/bin/kubb.js +9 -3
- package/dist/Telemetry-CxzkLSdD.js +284 -0
- package/dist/Telemetry-CxzkLSdD.js.map +1 -0
- package/dist/Telemetry-D8jhC5Bc.cjs +315 -0
- package/dist/Telemetry-D8jhC5Bc.cjs.map +1 -0
- package/dist/{define-Bdn8j5VM.cjs → defineCommand-Bo3yZTWI.cjs} +3 -21
- package/dist/defineCommand-Bo3yZTWI.cjs.map +1 -0
- package/dist/{define-Ctii4bel.js → defineCommand-DMEeqliP.js} +4 -16
- package/dist/defineCommand-DMEeqliP.js.map +1 -0
- package/dist/{errors-CjPmyZHy.js → errors-Dc_d7BfX.js} +2 -2
- package/dist/{errors-CjPmyZHy.js.map → errors-Dc_d7BfX.js.map} +1 -1
- package/dist/{errors-CLCjoSg0.cjs → errors-gxFK0vrp.cjs} +2 -2
- package/dist/{errors-CLCjoSg0.cjs.map → errors-gxFK0vrp.cjs.map} +1 -1
- package/dist/generate-DvnQaawe.js +77 -0
- package/dist/generate-DvnQaawe.js.map +1 -0
- package/dist/generate-Dw107fw0.cjs +76 -0
- package/dist/generate-Dw107fw0.cjs.map +1 -0
- package/dist/index.cjs +93 -149
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +93 -149
- package/dist/index.js.map +1 -1
- package/dist/init-CTY6arQX.cjs +53 -0
- package/dist/init-CTY6arQX.cjs.map +1 -0
- package/dist/init-DfWdONdA.js +53 -0
- package/dist/init-DfWdONdA.js.map +1 -0
- package/dist/mcp-Cn_LAuui.js +21 -0
- package/dist/mcp-Cn_LAuui.js.map +1 -0
- package/dist/mcp-D5bAmwu0.cjs +21 -0
- package/dist/mcp-D5bAmwu0.cjs.map +1 -0
- package/dist/{package-D5arPDnh.cjs → package-RNhs4w6c.cjs} +2 -2
- package/dist/package-RNhs4w6c.cjs.map +1 -0
- package/dist/package-pmOGZlq-.js +6 -0
- package/dist/package-pmOGZlq-.js.map +1 -0
- package/dist/run-44Zxh8Ec.js +289 -0
- package/dist/run-44Zxh8Ec.js.map +1 -0
- package/dist/run-BPLW8mrc.cjs +52 -0
- package/dist/run-BPLW8mrc.cjs.map +1 -0
- package/dist/run-DXEMoDFa.cjs +293 -0
- package/dist/run-DXEMoDFa.cjs.map +1 -0
- package/dist/run-Dv-1NGl-.js +32 -0
- package/dist/run-Dv-1NGl-.js.map +1 -0
- package/dist/run-Dzqgies_.js +1327 -0
- package/dist/run-Dzqgies_.js.map +1 -0
- package/dist/run-GFI-E4ua.cjs +33 -0
- package/dist/run-GFI-E4ua.cjs.map +1 -0
- package/dist/run-WfvBLKQY.js +51 -0
- package/dist/run-WfvBLKQY.js.map +1 -0
- package/dist/run-qhJgyKZX.cjs +1330 -0
- package/dist/run-qhJgyKZX.cjs.map +1 -0
- package/dist/tools-CZT9wSA6.cjs +175 -0
- package/dist/tools-CZT9wSA6.cjs.map +1 -0
- package/dist/tools-D0UogMU3.js +152 -0
- package/dist/tools-D0UogMU3.js.map +1 -0
- package/dist/validate-DRRJJptl.js +26 -0
- package/dist/validate-DRRJJptl.js.map +1 -0
- package/dist/validate-DYJrCiw5.cjs +26 -0
- package/dist/validate-DYJrCiw5.cjs.map +1 -0
- package/package.json +24 -28
- package/dist/agent-BEgI2HXH.cjs +0 -58
- package/dist/agent-BEgI2HXH.cjs.map +0 -1
- package/dist/agent-B_pirbeB.cjs +0 -116
- package/dist/agent-B_pirbeB.cjs.map +0 -1
- package/dist/agent-CTdJEHEs.js +0 -56
- package/dist/agent-CTdJEHEs.js.map +0 -1
- package/dist/agent-Ev5hU5hH.js +0 -112
- package/dist/agent-Ev5hU5hH.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/define-Bdn8j5VM.cjs.map +0 -1
- package/dist/define-Ctii4bel.js.map +0 -1
- package/dist/generate-Cg8yufrw.js +0 -1753
- package/dist/generate-Cg8yufrw.js.map +0 -1
- package/dist/generate-DDCwNQNo.cjs +0 -65
- package/dist/generate-DDCwNQNo.cjs.map +0 -1
- package/dist/generate-K8MJ9aQF.cjs +0 -1756
- package/dist/generate-K8MJ9aQF.cjs.map +0 -1
- package/dist/generate-YPtfjsg4.js +0 -66
- package/dist/generate-YPtfjsg4.js.map +0 -1
- package/dist/init-Bu95ML_u.cjs +0 -25
- package/dist/init-Bu95ML_u.cjs.map +0 -1
- package/dist/init-CZ5Xq2Hd.cjs +0 -293
- package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
- package/dist/init-eNRlotJK.js +0 -289
- package/dist/init-eNRlotJK.js.map +0 -1
- package/dist/init-ooJeOBGt.js +0 -25
- package/dist/init-ooJeOBGt.js.map +0 -1
- package/dist/mcp-C-d5N1wZ.js +0 -16
- package/dist/mcp-C-d5N1wZ.js.map +0 -1
- package/dist/mcp-CLcDV4Jm.cjs +0 -41
- package/dist/mcp-CLcDV4Jm.cjs.map +0 -1
- package/dist/mcp-D7EIR9fR.js +0 -40
- package/dist/mcp-D7EIR9fR.js.map +0 -1
- package/dist/mcp-Dpu8vzzj.cjs +0 -16
- package/dist/mcp-Dpu8vzzj.cjs.map +0 -1
- package/dist/package-D5arPDnh.cjs.map +0 -1
- package/dist/package-DqZsMLZ9.js +0 -6
- package/dist/package-DqZsMLZ9.js.map +0 -1
- package/dist/shell-475fQKaX.cjs +0 -62
- package/dist/shell-475fQKaX.cjs.map +0 -1
- package/dist/shell-DLzN4fRo.js +0 -51
- package/dist/shell-DLzN4fRo.js.map +0 -1
- package/dist/telemetry-DN95_2pF.cjs +0 -282
- package/dist/telemetry-DN95_2pF.cjs.map +0 -1
- package/dist/telemetry-LgT_sdPe.js +0 -245
- package/dist/telemetry-LgT_sdPe.js.map +0 -1
- package/dist/validate-CIR3_lZI.js +0 -25
- package/dist/validate-CIR3_lZI.js.map +0 -1
- package/dist/validate-DcqUb4DM.cjs +0 -25
- package/dist/validate-DcqUb4DM.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/commands/agent/start.ts +0 -47
- package/src/commands/agent.ts +0 -8
- package/src/commands/generate.ts +0 -57
- package/src/commands/init.ts +0 -20
- package/src/commands/mcp.ts +0 -12
- package/src/commands/validate.ts +0 -20
- package/src/constants.ts +0 -104
- package/src/index.ts +0 -43
- package/src/loggers/clackLogger.ts +0 -458
- package/src/loggers/fileSystemLogger.ts +0 -138
- package/src/loggers/githubActionsLogger.ts +0 -379
- package/src/loggers/plainLogger.ts +0 -254
- package/src/loggers/types.ts +0 -1
- package/src/loggers/utils.ts +0 -106
- package/src/runners/agent.ts +0 -149
- package/src/runners/generate.ts +0 -333
- package/src/runners/init.ts +0 -296
- package/src/runners/mcp.ts +0 -45
- 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/packageManager.ts +0 -23
- package/src/utils/runHook.ts +0 -91
- package/src/utils/telemetry.ts +0 -273
- package/src/utils/watcher.ts +0 -19
- /package/dist/{chunk-ByKO4r7w.cjs → rolldown-runtime-Bx3C2hgW.cjs} +0 -0
- /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
|
-
})
|