@kubb/cli 5.5.6 → 5.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{Telemetry-DDHXBdEz.cjs → Telemetry-CDyZhMHb.cjs} +27 -89
- package/dist/Telemetry-CDyZhMHb.cjs.map +1 -0
- package/dist/{Telemetry-CMXOVUKB.js → Telemetry-WZD1Le7A.js} +18 -43
- package/dist/Telemetry-WZD1Le7A.js.map +1 -0
- package/dist/agent-BPIqnEl2.js +59 -0
- package/dist/agent-BPIqnEl2.js.map +1 -0
- package/dist/agent-DElUuYuy.cjs +120 -0
- package/dist/agent-DElUuYuy.cjs.map +1 -0
- package/dist/{background-DxlRE9O5.js → background-CQmrmXMz.js} +7 -10
- package/dist/background-CQmrmXMz.js.map +1 -0
- package/dist/{background-Bbcc2TdN.cjs → background-Ch3napsn.cjs} +8 -7
- package/dist/background-Ch3napsn.cjs.map +1 -0
- package/dist/background-D7IE4acj.js +2 -0
- package/dist/commands-CCMgXgwc.cjs +87 -0
- package/dist/commands-CCMgXgwc.cjs.map +1 -0
- package/dist/commands-ECaVqjMu.js +81 -0
- package/dist/commands-ECaVqjMu.js.map +1 -0
- package/dist/config-B2BlaYOU.cjs +164 -0
- package/dist/config-B2BlaYOU.cjs.map +1 -0
- package/dist/config-CCxOcwWu.js +146 -0
- package/dist/config-CCxOcwWu.js.map +1 -0
- package/dist/constants-CdxpgX3_.cjs.map +1 -1
- package/dist/constants-DHRspBTo.js.map +1 -1
- package/dist/{errors-C-wEou02.cjs → errors-CMbMAwyW.cjs} +2 -2
- package/dist/{errors-C-wEou02.cjs.map → errors-CMbMAwyW.cjs.map} +1 -1
- package/dist/index.cjs +425 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +423 -20
- package/dist/index.js.map +1 -1
- package/dist/output-CnSY0tCG.js +766 -0
- package/dist/output-CnSY0tCG.js.map +1 -0
- package/dist/output-gox62nKo.cjs +868 -0
- package/dist/output-gox62nKo.cjs.map +1 -0
- package/dist/{run-CZz_GbE4.cjs → run-3xcH2h63.cjs} +12 -26
- package/dist/run-3xcH2h63.cjs.map +1 -0
- package/dist/{run-y6LRyWdS.cjs → run-BIK3c6u-.cjs} +96 -186
- package/dist/run-BIK3c6u-.cjs.map +1 -0
- package/dist/run-BKHV1Apt.cjs +31 -0
- package/dist/run-BKHV1Apt.cjs.map +1 -0
- package/dist/{run-Dn8HVjnM.js → run-BP_Z7A4e.js} +23 -44
- package/dist/run-BP_Z7A4e.js.map +1 -0
- package/dist/{run-C-jBKNbI.cjs → run-BvKVx0qs.cjs} +22 -43
- package/dist/run-BvKVx0qs.cjs.map +1 -0
- package/dist/run-DAYWA84e.js +349 -0
- package/dist/run-DAYWA84e.js.map +1 -0
- package/dist/run-J7ekQ_kc.js +30 -0
- package/dist/run-J7ekQ_kc.js.map +1 -0
- package/dist/{run-BDaZPU-1.js → run-TsXMXWSj.js} +91 -174
- package/dist/run-TsXMXWSj.js.map +1 -0
- package/dist/run-UY0fzPon.cjs +351 -0
- package/dist/run-UY0fzPon.cjs.map +1 -0
- package/dist/{run-BdTwxLCW.js → run-sM7YjAc9.js} +9 -23
- package/dist/run-sM7YjAc9.js.map +1 -0
- package/dist/{snapshot-B5mc4gpC.js → snapshot-7yPYU6ol.js} +68 -136
- package/dist/snapshot-7yPYU6ol.js.map +1 -0
- package/dist/{snapshot-DnCxZfmM.cjs → snapshot-Bi1Jy0hs.cjs} +69 -137
- package/dist/snapshot-Bi1Jy0hs.cjs.map +1 -0
- package/dist/studioWorker.js +3 -9
- package/dist/studioWorker.js.map +1 -1
- package/package.json +8 -12
- package/dist/Telemetry-CMXOVUKB.js.map +0 -1
- package/dist/Telemetry-DDHXBdEz.cjs.map +0 -1
- package/dist/agent-DiB4CRre.cjs +0 -38
- package/dist/agent-DiB4CRre.cjs.map +0 -1
- package/dist/agent-yA5vrXJB.js +0 -26
- package/dist/agent-yA5vrXJB.js.map +0 -1
- package/dist/background-Bbcc2TdN.cjs.map +0 -1
- package/dist/background-CFNncNYT.js +0 -2
- package/dist/background-DxlRE9O5.js.map +0 -1
- package/dist/connect-C9tTngda.js +0 -11
- package/dist/connect-C9tTngda.js.map +0 -1
- package/dist/connect-CJ7BhOcs.cjs +0 -11
- package/dist/connect-CJ7BhOcs.cjs.map +0 -1
- package/dist/generate-BUqZ_7GB.cjs +0 -92
- package/dist/generate-BUqZ_7GB.cjs.map +0 -1
- package/dist/generate-q2m01zRd.js +0 -92
- package/dist/generate-q2m01zRd.js.map +0 -1
- package/dist/gunshiDryRun-DdKJuVn1.js +0 -2
- package/dist/init-Ckpwkfvz.cjs +0 -58
- package/dist/init-Ckpwkfvz.cjs.map +0 -1
- package/dist/init-DukE9Uw4.js +0 -58
- package/dist/init-DukE9Uw4.js.map +0 -1
- package/dist/login-Bc19oiFE.cjs +0 -11
- package/dist/login-Bc19oiFE.cjs.map +0 -1
- package/dist/login-Do3nns0B.js +0 -11
- package/dist/login-Do3nns0B.js.map +0 -1
- package/dist/logout-BvHFvCeI.cjs +0 -16
- package/dist/logout-BvHFvCeI.cjs.map +0 -1
- package/dist/logout-COxoIMum.js +0 -16
- package/dist/logout-COxoIMum.js.map +0 -1
- package/dist/mcp-B-GxGgVr.js +0 -19
- package/dist/mcp-B-GxGgVr.js.map +0 -1
- package/dist/mcp-B3B-rE7W.cjs +0 -18
- package/dist/mcp-B3B-rE7W.cjs.map +0 -1
- package/dist/output-CVLosNZq.cjs +0 -411
- package/dist/output-CVLosNZq.cjs.map +0 -1
- package/dist/output-FDo-db-w.js +0 -321
- package/dist/output-FDo-db-w.js.map +0 -1
- package/dist/package-Ci2fcoOV.js +0 -6
- package/dist/package-Ci2fcoOV.js.map +0 -1
- package/dist/package-Do9rJ7D3.cjs +0 -11
- package/dist/package-Do9rJ7D3.cjs.map +0 -1
- package/dist/rolldown-runtime-qbf5tadS.cjs +0 -38
- package/dist/run-BDaZPU-1.js.map +0 -1
- package/dist/run-BdTwxLCW.js.map +0 -1
- package/dist/run-C-jBKNbI.cjs.map +0 -1
- package/dist/run-CAcQlhub.js +0 -295
- package/dist/run-CAcQlhub.js.map +0 -1
- package/dist/run-CSoFhDyK.cjs +0 -297
- package/dist/run-CSoFhDyK.cjs.map +0 -1
- package/dist/run-CZz_GbE4.cjs.map +0 -1
- package/dist/run-CaEbo-te.js +0 -40
- package/dist/run-CaEbo-te.js.map +0 -1
- package/dist/run-CihzLZmR.cjs +0 -41
- package/dist/run-CihzLZmR.cjs.map +0 -1
- package/dist/run-Dn8HVjnM.js.map +0 -1
- package/dist/run-y6LRyWdS.cjs.map +0 -1
- package/dist/shared-Cl-OLpNh.cjs +0 -81
- package/dist/shared-Cl-OLpNh.cjs.map +0 -1
- package/dist/shared-DaHA7QFQ.js +0 -58
- package/dist/shared-DaHA7QFQ.js.map +0 -1
- package/dist/snapshot-B5mc4gpC.js.map +0 -1
- package/dist/snapshot-DnCxZfmM.cjs.map +0 -1
- package/dist/start-B-GXO8tS.cjs +0 -12
- package/dist/start-B-GXO8tS.cjs.map +0 -1
- package/dist/start-Dbfx_8zG.js +0 -12
- package/dist/start-Dbfx_8zG.js.map +0 -1
- package/dist/status-DDajNc8w.js +0 -17
- package/dist/status-DDajNc8w.js.map +0 -1
- package/dist/status-DusS7DfO.cjs +0 -17
- package/dist/status-DusS7DfO.cjs.map +0 -1
- package/dist/stop-C5t7Yx0t.js +0 -11
- package/dist/stop-C5t7Yx0t.js.map +0 -1
- package/dist/stop-zmM3A0Re.cjs +0 -11
- package/dist/stop-zmM3A0Re.cjs.map +0 -1
- package/dist/studio--IOOl_VB.js +0 -174
- package/dist/studio--IOOl_VB.js.map +0 -1
- package/dist/studio-CJ2XhtRd.cjs +0 -174
- package/dist/studio-CJ2XhtRd.cjs.map +0 -1
- package/dist/utils-C3HZOWL_.js +0 -1107
- package/dist/utils-C3HZOWL_.js.map +0 -1
- package/dist/utils-ClRbJfxu.cjs +0 -1210
- package/dist/utils-ClRbJfxu.cjs.map +0 -1
- package/dist/validate-BcB0tFQ6.cjs +0 -19
- package/dist/validate-BcB0tFQ6.cjs.map +0 -1
- package/dist/validate-QpkCbIFJ.js +0 -20
- package/dist/validate-QpkCbIFJ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-gox62nKo.cjs","names":["styleText","formatMs","logLevelMap","styleText","formatMs","getElapsedMs","process","Diagnostics","relative","isCIEnvironment","getAgentName","clack","styleText","styleText"],"sources":["../src/loggers/banner.ts","../src/loggers/createLogger.ts","../src/utils/env.ts","../src/loggers/clackLogger.ts","../src/loggers/plainLogger.ts","../src/loggers/output.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { formatMs } from '@internals/utils'\n\n/**\n * Parsed RGB channels from a CSS hex color string.\n */\ntype RGB = { r: number; g: number; b: number }\n\n/**\n * Parses a CSS hex color string (`#RGB`) into its RGB channels.\n * Falls back to `255` for any channel that cannot be parsed.\n */\nfunction parseHex(color: string): RGB {\n const int = Number.parseInt(color.replace('#', ''), 16)\n return Number.isNaN(int) ? { r: 255, g: 255, b: 255 } : { r: (int >> 16) & 0xff, g: (int >> 8) & 0xff, b: int & 0xff }\n}\n\n/**\n * Returns a function that wraps a string in a 24-bit ANSI true-color escape sequence\n * for the given hex color.\n */\nfunction hex(color: string): (text: string) => string {\n const { r, g, b } = parseHex(color)\n return (text: string) => `\\x1b[38;2;${r};${g};${b}m${text}\\x1b[0m`\n}\n\nfunction gradient(colorStops: Array<string>, text: string): string {\n const chars = text.split('')\n return chars\n .map((char, i) => {\n const t = chars.length <= 1 ? 0 : i / (chars.length - 1)\n const seg = Math.min(Math.floor(t * (colorStops.length - 1)), colorStops.length - 2)\n const lt = t * (colorStops.length - 1) - seg\n const from = parseHex(colorStops[seg]!)\n const to = parseHex(colorStops[seg + 1]!)\n const r = Math.round(from.r + (to.r - from.r) * lt)\n const g = Math.round(from.g + (to.g - from.g) * lt)\n const b = Math.round(from.b + (to.b - from.b) * lt)\n return `\\x1b[38;2;${r};${g};${b}m${char}\\x1b[0m`\n })\n .join('')\n}\n\n/**\n * ANSI color functions for each part of the Kubb mascot illustration.\n */\nconst palette = {\n /**\n * Top cap of the skittle.\n */\n lid: hex('#F55A17'),\n /**\n * Upper wood body.\n */\n woodTop: hex('#F5A217'),\n /**\n * Middle wood body.\n */\n woodMid: hex('#F58517'),\n /**\n * Base wood body.\n */\n woodBase: hex('#B45309'),\n /**\n * Eye whites.\n */\n eye: hex('#FFFFFF'),\n /**\n * Highlight accent.\n */\n highlight: hex('#adadc6'),\n /**\n * Cheek blush.\n */\n blush: hex('#FDA4AF'),\n}\n\n/**\n * Generates the Kubb mascot welcome banner as an ANSI-colored string.\n *\n * @example\n * ```ts\n * console.log(getIntro({ title: 'kubb.config.ts', description: 'generating…', version: '5.0.0', areEyesOpen: true }))\n * ```\n */\nexport function getIntro({\n title,\n description,\n version,\n areEyesOpen,\n}: {\n /**\n * Name of the active configuration or tool being started.\n */\n title: string\n /**\n * Short subtitle shown next to the arrow prompt.\n */\n description: string\n /**\n * Kubb version string rendered in the gradient header.\n */\n version: string\n /**\n * When `false` the eyes are shown as closed dashes instead of open blocks.\n */\n areEyesOpen: boolean\n}): string {\n const kubbVersion = gradient(['#F58517', '#F5A217', '#F55A17'], `KUBB v${version}`)\n\n const eyeTop = areEyesOpen ? palette.eye('█▀█') : palette.eye('───')\n const eyeBottom = areEyesOpen ? palette.eye('▀▀▀') : palette.eye('───')\n\n return [\n ` ${palette.lid('▄▄▄▄▄▄▄▄▄▄▄▄▄')}`,\n ` ${palette.woodTop('█ ')}${palette.highlight('▄▄')}${palette.woodTop(' ')}${palette.highlight('▄▄')}${palette.woodTop(' █')} ${kubbVersion}`,\n ` ${palette.woodMid('█ ')}${eyeTop}${palette.woodMid(' ')}${eyeTop}${palette.woodMid(' █')} ${styleText('gray', title)}`,\n ` ${palette.woodMid('█ ')}${eyeBottom}${palette.woodMid(' ')}${palette.blush('◡')}${palette.woodMid(' ')}${eyeBottom}${palette.woodMid(' █')} ${styleText('yellow', '➜')} ${styleText('white', description)}`,\n ` ${palette.woodBase('▀▀▀▀▀▀▀▀▀▀▀▀▀')}`,\n ].join('\\n')\n}\n\n/**\n * Formats a millisecond duration with a threshold-based ANSI color.\n * `≤ 500 ms` → green · `≤ 1 000 ms` → yellow · `> 1 000 ms` → red.\n *\n * @example\n * ```ts\n * formatMsWithColor(200) // '\\x1b[32m200ms\\x1b[39m'\n * formatMsWithColor(800) // '\\x1b[33m800ms\\x1b[39m'\n * formatMsWithColor(1500) // '\\x1b[31m1.50s\\x1b[39m'\n * ```\n */\nexport function formatMsWithColor(ms: number): string {\n const formatted = formatMs(ms)\n if (ms <= 500) return styleText('green', formatted)\n if (ms <= 1000) return styleText('yellow', formatted)\n\n return styleText('red', formatted)\n}\n","import { relative } from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport type { Config } from '@kubb/core'\nimport { Diagnostics, logLevel as logLevelMap } from '@kubb/core'\nimport type { StudioConnectedContext } from '@kubb/studio'\nimport { formatMsWithColor } from './banner.ts'\nimport type { Logger, LoggerWriter, LogStatus, WriterProgress, WriterSpinner } from './defineLogger.ts'\n\n/** Display path for a config's input: the string form, or its `path` field when the input is an object. */\nfunction getInputPath(config: Config): string | undefined {\n const { input } = config\n if (typeof input === 'string') return input\n return typeof input?.path === 'string' ? input.path : undefined\n}\n\n/** Counts a noun, so a message never reads `1 files`. */\nexport function pluralize(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : `${noun}s`}`\n}\n\n/** Prefixes a `[HH:MM:SS]` timestamp at verbose and above. */\nfunction formatMessage(message: string, logLevel: number): string {\n if (logLevel >= logLevelMap.verbose) {\n const timestamp = new Date().toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n return `${styleText('dim', `[${timestamp}]`)} ${message}`\n }\n return message\n}\n\n/**\n * Renders a `studio:connected` event's versions: the runtime only when it differs from the host.\n */\nfunction formatVersions({ studio, kubb, agent }: StudioConnectedContext['versions']): string {\n return [`v${agent}`, kubb !== agent ? `runtime v${kubb}` : undefined, `Studio v${studio}`].filter(Boolean).join(', ')\n}\n\n/** The first three frames of a stack, without the message line. */\nfunction topFrames(stack: string): Array<string> {\n return stack\n .split('\\n')\n .slice(1, 4)\n .map((frame) => frame.trim())\n}\n\n/** First stack frames for verbose error output, including an optional `cause` chain. */\nfunction formatErrorFrames(error: Error): { frames: Array<string>; cause?: { header: string; frames: Array<string> } } | null {\n if (!error.stack) {\n return null\n }\n\n const frames = topFrames(error.stack)\n const caused = error.cause instanceof Error ? error.cause : undefined\n\n if (!caused?.stack) {\n return { frames }\n }\n\n return {\n frames,\n cause: {\n header: `└─ caused by ${caused.message}`,\n frames: topFrames(caused.stack),\n },\n }\n}\n\ntype ProgressState = {\n totalPlugins: number\n completedPlugins: number\n failedPlugins: number\n totalFiles: number\n processedFiles: number\n /** `process.hrtime()` snapshot taken at the start of generation, for the elapsed time. */\n hrStart: [number, number]\n}\n\n/** The progress summary line the clack logger shows, `null` when there is nothing to display. */\nfunction buildProgressLine(state: ProgressState): string | null {\n const parts: Array<string> = []\n const duration = formatMs(getElapsedMs(state.hrStart))\n\n if (state.totalPlugins > 0) {\n const pluginStr =\n state.failedPlugins > 0\n ? `Plugins ${styleText('green', state.completedPlugins.toString())}/${state.totalPlugins} ${styleText('red', `(${state.failedPlugins} failed)`)}`\n : `Plugins ${styleText('green', state.completedPlugins.toString())}/${state.totalPlugins}`\n parts.push(pluginStr)\n }\n\n if (state.totalFiles > 0) {\n parts.push(`Files ${styleText('green', state.processedFiles.toString())}/${state.totalFiles}`)\n }\n\n if (parts.length === 0) {\n return null\n }\n\n parts.push(`${styleText('green', duration)} elapsed`)\n return parts.join(styleText('dim', ' | '))\n}\n\nfunction createProgressCounters(): ProgressState {\n return {\n totalPlugins: 0,\n completedPlugins: 0,\n failedPlugins: 0,\n totalFiles: 0,\n processedFiles: 0,\n hrStart: process.hrtime(),\n }\n}\n\n/**\n * One output phase while its step owns the line. A phase buffers what it is told, because a spinner\n * redraws over anything written under it, and prints the lot once it knows its own result.\n */\ntype Phase = {\n successLabel: string\n failureLabel: string\n /**\n * Whether each hook's own result is worth a line. Format and lint run one command, so the phase\n * result already says everything; the post-generate phase runs several.\n */\n showHookResults: boolean\n failed: boolean\n hrStart: [number, number]\n lines: Array<string>\n /**\n * Raw lines a hook printed, drawn outside the group.\n */\n output: Array<string>\n}\n\ntype StartPhaseOptions = {\n /**\n * Shown while the phase runs.\n */\n running: string\n success: string\n failure: string\n showHookResults?: boolean\n}\n\n/**\n * The three output phases, in the order the generate runner runs them.\n */\nconst PHASES = {\n format: { running: 'Formatting', success: 'Formatted', failure: 'Formatting failed' },\n lint: { running: 'Linting', success: 'Linted', failure: 'Linting failed' },\n hooks: {\n running: 'Running post-generate hooks',\n success: 'Post-generate hooks completed',\n failure: 'Post-generate hooks failed',\n showHookResults: true,\n },\n} as const satisfies Record<string, StartPhaseOptions>\n\n/**\n * Drops the blank lines a subprocess leaves at either end of its output, so its block does not open\n * or close on an empty row.\n */\nfunction trimBlankEdges(lines: ReadonlyArray<string>): Array<string> {\n const start = lines.findIndex((line) => line.trim())\n if (start === -1) {\n return []\n }\n\n return lines.slice(start, lines.findLastIndex((line) => line.trim()) + 1)\n}\n\n/**\n * Wires a {@link LoggerWriter} onto the run's hooks. This owns what a run says and in what order:\n * one group per config, a step over the plugin work, a progress bar for the writes, one step per\n * output phase, then the summary and the group's closing result. The writer only decides how each\n * line looks, so every logger reports the same run the same way.\n *\n * @example\n * ```ts\n * export const plainLogger = createLogger(writer)\n * ```\n */\nexport function createLogger(writer: LoggerWriter): Logger {\n return function install(context, { logLevel }) {\n const silent = logLevel <= logLevelMap.silent\n const state = {\n ...createProgressCounters(),\n spinner: null as WriterSpinner | null,\n progress: null as WriterProgress | null,\n hooks: new Map<string, { hrStart: [number, number]; lines: Array<string> }>(),\n /**\n * Plugin results held back while the generation step owns the line.\n */\n pluginLines: [] as Array<string>,\n phase: null as Phase | null,\n groupOpen: false,\n }\n\n function text(message: string): string {\n return formatMessage(message, logLevel)\n }\n\n function startSpinner(message: string) {\n if (silent) {\n return\n }\n\n state.spinner = writer.spinner()\n state.spinner.start(text(message))\n }\n\n function stopSpinner(message?: string, status: LogStatus = 'success') {\n const spinner = state.spinner\n if (!spinner) {\n return\n }\n state.spinner = null\n\n if (message === undefined) {\n spinner.clear()\n return\n }\n if (status === 'failed') {\n spinner.error(text(message))\n return\n }\n spinner.stop(text(message))\n }\n\n function stopProgress(message?: string) {\n const progress = state.progress\n if (!progress) {\n return\n }\n state.progress = null\n progress.stop(message === undefined ? '' : text(message))\n }\n\n function startPhase({ running, success, failure, showHookResults = false }: StartPhaseOptions) {\n state.phase = { successLabel: success, failureLabel: failure, showHookResults, failed: false, hrStart: process.hrtime(), lines: [], output: [] }\n startSpinner(running)\n }\n\n function endPhase() {\n const phase = state.phase\n state.phase = null\n\n if (!phase || silent) {\n return\n }\n\n const duration = formatMsWithColor(getElapsedMs(phase.hrStart))\n\n stopSpinner(phase.failed ? `${phase.failureLabel} after ${duration}` : `${phase.successLabel} in ${duration}`, phase.failed ? 'failed' : 'success')\n\n if (phase.lines.length) {\n writer.block(phase.lines)\n }\n writeOutput(phase.output)\n }\n\n function writeOutput(lines: ReadonlyArray<string>) {\n const output = trimBlankEdges(lines)\n if (output.length) {\n writer.raw(output)\n }\n }\n\n // A run that throws before `kubb:generation:end` never reaches the summary, so the lifecycle\n // end calls this too rather than leave a group without its closing line.\n function closeGroup(status: LogStatus) {\n if (!state.groupOpen) {\n return\n }\n state.groupOpen = false\n\n stopSpinner()\n stopProgress()\n writer.groupEnd(status === 'failed' ? styleText('red', '✗ Generation failed') : styleText('green', '✓ Generation succeeded'))\n }\n\n function reset() {\n stopSpinner()\n stopProgress()\n Object.assign(state, createProgressCounters())\n state.hooks.clear()\n state.pluginLines = []\n state.phase = null\n state.groupOpen = false\n }\n\n function formatLine(symbol: string, message: string, info?: string): string {\n return text([symbol, message, info && styleText('dim', info)].filter(Boolean).join(' '))\n }\n\n context.hook('kubb:warn', ({ message, info }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n writer.warn(formatLine(styleText('yellow', '⚠'), message, logLevel >= logLevelMap.info ? info : undefined))\n })\n\n // Unguarded: a failure stays visible even at silent.\n context.hook('kubb:error', ({ error }) => {\n if (state.phase) {\n state.phase.failed = true\n }\n\n // The writer draws the error symbol, so the message goes in bare.\n if (state.spinner) {\n stopSpinner(error.message, 'failed')\n } else {\n writer.error(text(error.message))\n }\n\n const frames = logLevel >= logLevelMap.verbose ? formatErrorFrames(error) : null\n if (!frames) {\n return\n }\n\n writer.block(frames.frames.map((frame) => text(styleText('dim', frame))))\n if (frames.cause) {\n writer.block([styleText('dim', frames.cause.header), ...frames.cause.frames.map((frame) => text(` ${styleText('dim', frame)}`))])\n }\n })\n\n context.hook('kubb:diagnostic', ({ diagnostic }) => {\n // Silent still surfaces errors so failures stay visible. It drops warnings and info.\n if (silent && diagnostic.severity !== 'error') {\n return\n }\n\n stopSpinner()\n stopProgress()\n\n if (Diagnostics.isUpdate(diagnostic)) {\n writer.update(\n [`\\`v${diagnostic.currentVersion}\\` → \\`v${diagnostic.latestVersion}\\``, 'Run `npm install -g @kubb/cli` to update'],\n 'Update available for `Kubb`',\n )\n return\n }\n\n const { headline, details } = Diagnostics.format(diagnostic)\n writer.diagnostic([headline, ...details])\n })\n\n // A `kubb studio` session emits these on the same emitter as its generations, so one logger\n // renders the whole command.\n context.hook('studio:disconnected', ({ code, reason }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n stopSpinner()\n writer.warn(text(`⚠ Kubb Studio ended the session (${reason || `code ${code}`})`))\n })\n\n context.hook('studio:warn', ({ message, permission }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n const remedy = permission ? `; pass --${permission.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)} to allow it` : ''\n writer.warn(text(`⚠ ${message}${remedy}`))\n })\n\n // Unguarded, like `kubb:error`: a failure stays visible even at silent.\n context.hook('studio:error', ({ error }) => {\n if (state.spinner) {\n stopSpinner(error.message, 'failed')\n return\n }\n writer.error(text(error.message))\n })\n\n context.hook('kubb:lifecycle:start', () => {\n reset()\n })\n\n context.hook('kubb:generation:start', ({ config }) => {\n closeGroup('failed')\n reset()\n\n state.totalPlugins = config.plugins?.length ?? 0\n\n if (silent) {\n return\n }\n\n const inputPath = getInputPath(config)\n\n writer.group(text([styleText('bold', config.name ?? 'kubb'), inputPath ? styleText('dim', inputPath) : undefined].filter(Boolean).join(' ')))\n state.groupOpen = true\n\n startSpinner('Generating')\n })\n\n context.hook('kubb:format:start', () => startPhase(PHASES.format))\n context.hook('kubb:format:end', endPhase)\n context.hook('kubb:lint:start', () => startPhase(PHASES.lint))\n context.hook('kubb:lint:end', endPhase)\n context.hook('kubb:hooks:start', () => startPhase(PHASES.hooks))\n context.hook('kubb:hooks:end', endPhase)\n\n context.hook('kubb:hook:end', (ctx) => {\n const { id, command, name, args, success, error } = ctx\n if (!id) {\n return\n }\n\n if (!success && state.phase) {\n state.phase.failed = true\n }\n\n if (silent) {\n // Even when silent, surface a failed hook's captured output.\n if (!ctx.success) {\n if (ctx.stdout) console.log(ctx.stdout)\n if (ctx.stderr) console.error(ctx.stderr)\n }\n return\n }\n\n const active = state.hooks.get(id)\n if (!active) {\n return\n }\n state.hooks.delete(id)\n\n const label = styleText('dim', name ?? (args?.length ? `${command} ${args.join(' ')}` : command))\n const reason = error?.message ? ` (${error.message})` : ''\n const result = success\n ? `${styleText('green', '✓')} ${label} in ${formatMsWithColor(getElapsedMs(active.hrStart))}`\n : `${styleText('red', '✗')} ${label} failed${reason}`\n\n const phase = state.phase\n if (phase) {\n if (phase.showHookResults || !success) {\n phase.lines.push(result)\n }\n phase.output.push(...active.lines)\n return\n }\n\n stopSpinner()\n writer.step(text(result))\n writeOutput(active.lines)\n })\n\n context.hook('kubb:generation:end', () => {\n stopSpinner()\n stopProgress()\n })\n\n context.hook('kubb:lifecycle:end', () => {\n closeGroup('failed')\n reset()\n })\n\n // Not registered at silent: the missing `kubb:hook:line` listener is also what tells the runner not to stream.\n if (!silent) {\n context.hook('kubb:info', ({ message, info }) => {\n const line = formatLine(styleText('blue', 'ℹ'), message, info)\n\n // Info carries something new (the auto-detected tool), so inside a phase it waits for the phase to print.\n if (state.phase) {\n state.phase.lines.push(line)\n return\n }\n if (state.spinner) {\n state.spinner.message(line)\n return\n }\n writer.info(line)\n })\n\n context.hook('kubb:success', ({ message, info }) => {\n const line = formatLine(styleText('green', '✓'), message, logLevel >= logLevelMap.info ? info : undefined)\n\n // The phase step's own result already reports these successes, so let the step carry them.\n if (state.spinner) {\n state.spinner.message(line)\n return\n }\n writer.success(line)\n })\n\n context.hook('studio:connected', ({ url, versions }) => {\n stopSpinner()\n writer.success(text(`✓ Connected to ${styleText('cyan', url)} ${styleText('dim', `(${formatVersions(versions)})`)}`))\n startSpinner('✓ Ready to receive jobs')\n })\n\n context.hook('studio:command', ({ command, info }) => {\n stopSpinner()\n writer.success(text(`✓ Finished ${command} ${styleText('dim', `(${info})`)}`))\n startSpinner('✓ Ready to receive jobs')\n })\n\n context.hook('studio:reconnecting', ({ delayMs }) => {\n stopSpinner()\n writer.info(text(styleText('dim', `Retrying connection to Kubb Studio in ${formatMs(delayMs)}`)))\n })\n\n context.hook('kubb:plugin:start', ({ plugin }) => {\n state.spinner?.message(text(`Generating ${styleText('dim', plugin.name)}`))\n })\n\n // Buffered, not printed: a step redraws over anything written while it runs.\n context.hook('kubb:plugin:end', ({ plugin, duration, success }) => {\n if (success) {\n state.completedPlugins++\n }\n if (!success) {\n state.failedPlugins++\n }\n state.pluginLines.push(text(`${plugin.name} ${success ? 'completed' : 'failed'} in ${formatMsWithColor(duration)}`))\n })\n\n context.hook('kubb:plugins:end', () => {\n const failed = state.failedPlugins > 0\n stopSpinner(buildProgressLine(state) ?? 'No plugins ran', failed ? 'failed' : 'success')\n\n if (state.pluginLines.length) {\n writer.block(state.pluginLines)\n state.pluginLines = []\n }\n })\n\n context.hook('kubb:files:processing:start', ({ files }) => {\n stopSpinner()\n state.totalFiles = files.length\n state.processedFiles = 0\n\n state.progress = writer.progress(files.length)\n state.progress.start(text(`Writing ${pluralize(files.length, 'file')}`))\n })\n\n context.hook('kubb:files:processing:update', ({ files }) => {\n for (const { file, config } of files) {\n state.processedFiles++\n state.progress?.advance(`Writing ${relative(config.root, file.path)}`)\n }\n })\n\n context.hook('kubb:files:processing:end', () => {\n stopProgress(`Wrote ${pluralize(state.processedFiles, 'file')}`)\n })\n\n context.hook('kubb:hook:start', ({ id }) => {\n if (!id) {\n return\n }\n state.hooks.set(id, { hrStart: process.hrtime(), lines: [] })\n })\n\n context.hook('kubb:hook:line', ({ id, line }) => {\n const active = state.hooks.get(id)\n if (!active) {\n return\n }\n\n // A phase step redraws its own line, so its output waits until the phase ends.\n if (state.phase) {\n active.lines.push(line)\n return\n }\n writer.raw([line])\n })\n }\n\n return {\n renderSummary(lines, { status }) {\n if (silent || !state.groupOpen) {\n return\n }\n\n closeGroup(status)\n writer.diagnostic([...lines])\n },\n }\n }\n}\n","import { getAgentName } from '../agent.ts'\nimport { isCIEnvironment } from '@internals/utils'\n\n/**\n * Returns `true` when the process has an interactive TTY with a valid terminal\n * width and is not running in CI.\n *\n * Some IDE-embedded terminals report `isTTY = true` but set `columns` to `0`,\n * which breaks clack's box-drawing helpers (they call `String.prototype.repeat`\n * with a negative count and throw a `RangeError`). A positive column count is\n * required before the TTY counts as usable.\n *\n * @example\n * ```ts\n * if (canUseTTY()) {\n * renderProgressBar()\n * }\n * ```\n */\nexport function canUseTTY(): boolean {\n return process.stdout.isTTY && (process.stdout.columns ?? 0) > 0 && !isCIEnvironment()\n}\n\n/**\n * Returns `true` when output can carry spinners and clack's gutter: an interactive TTY that no AI\n * coding agent is reading. Cursor-movement escapes are hard for an agent to parse even over a\n * pseudo-TTY, so it gets the plain writer.\n */\nexport function isRichOutput(): boolean {\n return canUseTTY() && !getAgentName()\n}\n","import { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { createLogger } from './createLogger.ts'\nimport type { Logger, LoggerWriter } from './defineLogger.ts'\n\n/**\n * Draws with clack: a gutter bar per group, animated steps, and a progress bar for the writes.\n */\nexport const clackWriter: LoggerWriter = {\n group: (title) => clack.intro(title),\n groupEnd: (text) => clack.outro(text),\n step: (text) => clack.log.step(text, { spacing: 0 }),\n info: (text) => clack.log.info(text),\n success: (text) => clack.log.success(text),\n warn: (text) => clack.log.warn(text),\n error: (text) => clack.log.error(text),\n block: (lines) => clack.log.message(lines, { spacing: 0 }),\n // A subprocess's output is not Kubb's tree, so it goes out past clack and its gutter bar. The\n // step above it is already stopped by the time this runs.\n raw: (lines) => console.log(styleText('dim', lines.join('\\n'))),\n // The diagnostic carries its own code and indented rows, so clear clack's gutter and bar and let\n // the block stand on its own.\n diagnostic: (lines) => clack.log.message(lines, { symbol: '', secondarySymbol: '' }),\n update: (lines, title) =>\n clack.box(lines.join('\\n'), title, {\n width: 'auto',\n formatBorder: (border: string) => styleText('yellow', border),\n rounded: true,\n withGuide: false,\n contentAlign: 'center',\n titleAlign: 'center',\n }),\n spinner() {\n const spinner = clack.spinner()\n\n return {\n start: (text) => spinner.start(text),\n message: (text) => spinner.message(text),\n clear: () => spinner.clear(),\n stop: (text) => spinner.stop(text),\n error: (text) => spinner.error(text),\n }\n },\n progress(max) {\n const bar = clack.progress({ style: 'block', max, size: 30 })\n\n return {\n start: (text) => bar.start(text),\n advance: (text) => bar.advance(1, text),\n stop: (text) => bar.stop(text),\n }\n },\n}\n\n/**\n * TTY logger for local development, with animated steps and progress bars.\n */\nexport const clackLogger: Logger = createLogger(clackWriter)\n","import { createLogger } from './createLogger.ts'\nimport type { Logger, LoggerWriter } from './defineLogger.ts'\n\n/**\n * Prefixes that stand in for the symbols clack draws, so plain output reads the same way.\n */\nexport const SYMBOLS = { info: 'ℹ', warn: '⚠', error: '✗', step: '◇' } as const\n\n/** Draws with one `write` call per line. Nothing animates, so a step prints at start and end. */\nfunction createWriter(write: (line: string) => void): LoggerWriter {\n return {\n group: write,\n groupEnd: write,\n step: (text) => write(`${SYMBOLS.step} ${text}`),\n info: write,\n success: write,\n warn: write,\n error: (text) => write(`${SYMBOLS.error} ${text}`),\n block: (lines) => write(lines.join('\\n')),\n raw: (lines) => write(lines.join('\\n')),\n diagnostic: (lines) => write(lines.join('\\n')),\n update: (lines, title) => write([title, ...lines].join('\\n')),\n spinner: () => ({\n start: write,\n message: write,\n clear: () => {},\n stop: (text) => text && write(text),\n error: (text) => write(`${SYMBOLS.error} ${text}`),\n }),\n progress: () => ({\n start: write,\n advance: write,\n stop: (text) => text && write(text),\n }),\n }\n}\n\n/** The plain logger writing through `write`, e.g. `console.error` so stdout carries only JSON. */\nexport function createPlainLogger(write: (line: string) => void): Logger {\n return createLogger(createWriter(write))\n}\n\n/** Draws on the console, for non-TTY environments and for an AI coding agent reading the output. */\nexport const plainWriter = createWriter((line) => console.log(line))\n\n/**\n * Console adapter for non-TTY environments, and for an AI coding agent reading the output. Reports\n * the same run in the same order as `clackLogger`, without the animation.\n */\nexport const plainLogger = createLogger(plainWriter)\n","import { styleText } from 'node:util'\nimport * as prompts from '@clack/prompts'\nimport { isRichOutput } from '../utils/env.ts'\nimport { getIntro } from './banner.ts'\nimport { clackWriter } from './clackLogger.ts'\nimport type { LoggerWriter, WriterSpinner } from './defineLogger.ts'\nimport { plainWriter, SYMBOLS } from './plainLogger.ts'\n\nconst SPONSOR_TIPS = [\n 'Your sponsorship keeps Kubb codegen, plugins, and docs maintained',\n 'Sponsor faster generators and better Kubb Studio workflows',\n 'Help keep Kubb free for TypeScript teams building APIs',\n 'Support React Query, Zod, Faker, and MSW integrations',\n 'Back open-source tools that turn OpenAPI into TypeScript',\n 'Sponsor fixes, releases, and new plugins for your API workflow',\n 'Help Kubb stay independent and focused on developer tools',\n] as const\n\nconst SPONSOR_LINKS = ['https://github.com/sponsors/stijnvanhulle', 'https://opencollective.com/kubb', 'https://kubb.dev/sponsors'] as const\n\n/** The writer the loggers draw with on this terminal, so a command's own lines look like its run. */\nfunction writer(): LoggerWriter {\n return isRichOutput() ? clackWriter : plainWriter\n}\n\nfunction nextTip(): string {\n const tip = SPONSOR_TIPS[Math.floor(Math.random() * SPONSOR_TIPS.length)]!\n const link = SPONSOR_LINKS[Math.floor(Math.random() * SPONSOR_LINKS.length)]!\n return `${tip}: ${link}`\n}\n\nfunction formatTip(tip: string): string {\n return styleText('magenta', ' Tip ') + styleText('yellow', tip)\n}\n\n/**\n * Prints one random tip outside every group. Rich terminals get the styled variant;\n * plain/CI output gets a stable text-only line so the tip is still visible as final output.\n */\nexport function logTip(): void {\n const tip = nextTip()\n if (!isRichOutput()) {\n console.log(`Tip: ${tip}`)\n return\n }\n\n console.log(`${styleText('magenta', '✦')}${formatTip(tip)}`)\n}\n\ntype Level = keyof typeof SYMBOLS\n\n// Not through the writers: in plain output a command's own info and warning carry their symbol, and clack's step keeps its spacing.\nfunction write(level: Level, message: string): void {\n if (isRichOutput()) {\n prompts.log[level](message)\n\n return\n }\n\n console.log(`${SYMBOLS[level]} ${message}`)\n}\n\ntype IntroOptions = {\n title?: string\n /**\n * Printed under the title, for a command that has a caveat to lead with.\n */\n warning?: string\n /**\n * Whether to open a block a later {@link logOutro} closes. Pass `false` for a command that\n * prints and exits, since nothing would ever close the block.\n *\n * @default true\n */\n block?: boolean\n}\n\n/**\n * Opens a command's output with its title.\n */\nexport function logIntro({ title, warning, block = true }: IntroOptions): void {\n if (block && isRichOutput()) {\n if (title) {\n prompts.intro(title)\n }\n\n if (warning) {\n prompts.log.warn(warning)\n }\n\n return\n }\n\n if (title) {\n console.log(title)\n }\n\n if (warning) {\n console.warn(warning)\n }\n\n if (title || warning) {\n console.log()\n }\n}\n\n/**\n * Closes the block {@link logIntro} opened. The closing gutter is not a written line, so plain\n * output prints the text on its own.\n */\nexport function logOutro(text: string): void {\n writer().groupEnd(text)\n}\n\n/**\n * Prints one empty line between two groups, without clack's gutter bar, since the bar belongs to a\n * group and a spacer sits outside every one.\n */\nexport function logSpacer(): void {\n console.log('')\n}\n\n/**\n * Opens the command with the Kubb mascot and version, or a single version line where the terminal\n * cannot draw it.\n */\nexport function logBanner(version: string): void {\n if (isRichOutput()) {\n console.log(`\\n${getIntro({ title: 'Turn your API spec into type-safe code', description: 'Ready to start', version, areEyesOpen: true })}\\n`)\n\n return\n }\n\n console.log(`Kubb CLI v${version}`)\n}\n\n/** Prints lines as one block, without a symbol in front of them. Not the writer's block, which drops clack's spacing around it. */\nexport function logBlock(lines: string | Array<string>): void {\n if (isRichOutput()) {\n prompts.log.message(lines)\n\n return\n }\n\n console.log([lines].flat().join('\\n'))\n}\n\nexport function logInfo(message: string): void {\n write('info', message)\n}\n\nexport function logWarn(message: string): void {\n write('warn', message)\n}\n\nexport function logError(message: string): void {\n write('error', message)\n}\n\n/**\n * Reports a step the command is taking, rather than something it found.\n */\nexport function logStep(message: string): void {\n write('step', message)\n}\n\n/**\n * A progress spinner, or a writer that prints each message it is given when the terminal cannot\n * animate one. Callers drive both the same way, including the failure state.\n */\nexport function createSpinner(): WriterSpinner {\n return writer().spinner()\n}\n"],"mappings":"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"}
|
|
@@ -1,32 +1,28 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_errors = require("./errors-
|
|
3
|
-
const require_Telemetry = require("./Telemetry-
|
|
4
|
-
const require_package = require("./package-Do9rJ7D3.cjs");
|
|
1
|
+
const require_agent = require("./agent-DElUuYuy.cjs");
|
|
2
|
+
const require_errors = require("./errors-CMbMAwyW.cjs");
|
|
3
|
+
const require_Telemetry = require("./Telemetry-CDyZhMHb.cjs");
|
|
5
4
|
let node_util = require("node:util");
|
|
6
5
|
let node_process = require("node:process");
|
|
7
|
-
node_process =
|
|
6
|
+
node_process = require_agent.__toESM(node_process, 1);
|
|
8
7
|
//#region src/runners/validate/run.ts
|
|
9
8
|
/**
|
|
10
9
|
* Validates an OpenAPI/Swagger file at `input` using `@kubb/adapter-oas`.
|
|
11
10
|
* Exits the process with code 1 on validation failure or missing dependency.
|
|
12
11
|
*/
|
|
13
|
-
async function run({ input
|
|
14
|
-
const
|
|
15
|
-
const report = (status) => require_Telemetry.sendTelemetry(require_Telemetry.buildTelemetryEvent({
|
|
12
|
+
async function run({ input }) {
|
|
13
|
+
const report = require_Telemetry.trackRun({
|
|
16
14
|
command: "validate",
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
status
|
|
20
|
-
}));
|
|
15
|
+
hrStart: node_process.default.hrtime()
|
|
16
|
+
});
|
|
21
17
|
try {
|
|
22
18
|
const { adapterOas } = await import("@kubb/adapter-oas");
|
|
23
19
|
const adapter = adapterOas();
|
|
24
20
|
if (!adapter.validate) throw new Error("The loaded adapter does not support validation.");
|
|
25
21
|
await adapter.validate(input, { throwOnError: true });
|
|
26
|
-
await report("success");
|
|
22
|
+
await report({ status: "success" });
|
|
27
23
|
console.log("✅ Validation success");
|
|
28
24
|
} catch (error) {
|
|
29
|
-
await report("failed");
|
|
25
|
+
await report({ status: "failed" });
|
|
30
26
|
if (error instanceof Error && /@kubb\/adapter-oas/.test(error.message)) {
|
|
31
27
|
console.error((0, node_util.styleText)("red", "The @kubb/adapter-oas package is not installed."));
|
|
32
28
|
console.error("");
|
|
@@ -41,17 +37,7 @@ async function run({ input, version }) {
|
|
|
41
37
|
node_process.default.exit(1);
|
|
42
38
|
}
|
|
43
39
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Loaded on demand by `index.ts`, so `@kubb/adapter-oas` stays out of the process for every other
|
|
46
|
-
* command.
|
|
47
|
-
*/
|
|
48
|
-
const runner = async ({ values }) => {
|
|
49
|
-
await run({
|
|
50
|
-
input: values.input,
|
|
51
|
-
version: require_package.version
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
40
|
//#endregion
|
|
55
|
-
exports.
|
|
41
|
+
exports.run = run;
|
|
56
42
|
|
|
57
|
-
//# sourceMappingURL=run-
|
|
43
|
+
//# sourceMappingURL=run-3xcH2h63.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-3xcH2h63.cjs","names":["trackRun","process","styleText","toError"],"sources":["../src/runners/validate/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { toError } from '@internals/utils'\nimport { trackRun } from '../../Telemetry.ts'\n\ntype ValidateOptions = {\n /**\n * Path or URL to the OpenAPI/Swagger file to validate.\n */\n input: string\n}\n\n/**\n * Validates an OpenAPI/Swagger file at `input` using `@kubb/adapter-oas`.\n * Exits the process with code 1 on validation failure or missing dependency.\n */\nexport async function run({ input }: ValidateOptions): Promise<void> {\n const report = trackRun({ command: 'validate', hrStart: process.hrtime() })\n\n try {\n const { adapterOas } = await import('@kubb/adapter-oas')\n\n const adapter = adapterOas()\n if (!adapter.validate) {\n throw new Error('The loaded adapter does not support validation.')\n }\n\n await adapter.validate(input, { throwOnError: true })\n await report({ status: 'success' })\n\n console.log('✅ Validation success')\n } catch (error) {\n await report({ status: 'failed' })\n if (error instanceof Error && /@kubb\\/adapter-oas/.test(error.message)) {\n console.error(styleText('red', 'The @kubb/adapter-oas package is not installed.'))\n console.error('')\n console.error('Install it with:')\n console.error(styleText('cyan', ' npm install @kubb/adapter-oas'))\n console.error(styleText('cyan', ' # or'))\n console.error(styleText('cyan', ' pnpm install @kubb/adapter-oas'))\n console.error('')\n }\n console.error('❌ Validation failed')\n console.error(toError(error).message)\n\n process.exit(1)\n }\n}\n"],"mappings":";;;;;;;;;;;AAgBA,eAAsB,IAAI,EAAE,SAAyC;CACnE,MAAM,SAASA,kBAAAA,SAAS;EAAE,SAAS;EAAY,SAASC,aAAAA,QAAQ,OAAO;CAAE,CAAC;CAE1E,IAAI;EACF,MAAM,EAAE,eAAe,MAAM,OAAO;EAEpC,MAAM,UAAU,WAAW;EAC3B,IAAI,CAAC,QAAQ,UACX,MAAM,IAAI,MAAM,iDAAiD;EAGnE,MAAM,QAAQ,SAAS,OAAO,EAAE,cAAc,KAAK,CAAC;EACpD,MAAM,OAAO,EAAE,QAAQ,UAAU,CAAC;EAElC,QAAQ,IAAI,sBAAsB;CACpC,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,IAAI,iBAAiB,SAAS,qBAAqB,KAAK,MAAM,OAAO,GAAG;GACtE,QAAQ,OAAA,GAAMC,UAAAA,UAAAA,CAAU,OAAO,iDAAiD,CAAC;GACjF,QAAQ,MAAM,EAAE;GAChB,QAAQ,MAAM,kBAAkB;GAChC,QAAQ,OAAA,GAAMA,UAAAA,UAAAA,CAAU,QAAQ,iCAAiC,CAAC;GAClE,QAAQ,OAAA,GAAMA,UAAAA,UAAAA,CAAU,QAAQ,QAAQ,CAAC;GACzC,QAAQ,OAAA,GAAMA,UAAAA,UAAAA,CAAU,QAAQ,kCAAkC,CAAC;GACnE,QAAQ,MAAM,EAAE;EAClB;EACA,QAAQ,MAAM,qBAAqB;EACnC,QAAQ,MAAMC,eAAAA,QAAQ,KAAK,CAAC,CAAC,OAAO;EAEpC,aAAA,QAAQ,KAAK,CAAC;CAChB;AACF"}
|
|
@@ -1,101 +1,52 @@
|
|
|
1
|
-
const
|
|
2
|
-
const require_errors = require("./errors-
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const require_output = require("./output-CVLosNZq.cjs");
|
|
7
|
-
const require_package = require("./package-Do9rJ7D3.cjs");
|
|
1
|
+
const require_agent = require("./agent-DElUuYuy.cjs");
|
|
2
|
+
const require_errors = require("./errors-CMbMAwyW.cjs");
|
|
3
|
+
const require_Telemetry = require("./Telemetry-CDyZhMHb.cjs");
|
|
4
|
+
const require_output = require("./output-gox62nKo.cjs");
|
|
5
|
+
const require_config = require("./config-B2BlaYOU.cjs");
|
|
8
6
|
const require_constants = require("./constants-CdxpgX3_.cjs");
|
|
9
7
|
let node_util = require("node:util");
|
|
10
8
|
let node_crypto = require("node:crypto");
|
|
11
9
|
let node_os = require("node:os");
|
|
12
10
|
let node_process = require("node:process");
|
|
13
|
-
node_process =
|
|
14
|
-
let
|
|
15
|
-
let node_fs_promises = require("node:fs/promises");
|
|
11
|
+
node_process = require_agent.__toESM(node_process, 1);
|
|
12
|
+
let tinyexec = require("tinyexec");
|
|
16
13
|
let node_path = require("node:path");
|
|
17
|
-
node_path =
|
|
14
|
+
node_path = require_agent.__toESM(node_path, 1);
|
|
18
15
|
let _kubb_core = require("@kubb/core");
|
|
19
16
|
let _clack_prompts = require("@clack/prompts");
|
|
20
|
-
_clack_prompts =
|
|
17
|
+
_clack_prompts = require_agent.__toESM(_clack_prompts, 1);
|
|
21
18
|
let _kubb_studio = require("@kubb/studio");
|
|
22
19
|
//#region ../../internals/utils/src/openInBrowser.ts
|
|
20
|
+
const ignore = () => {};
|
|
23
21
|
/**
|
|
24
22
|
* Opens a URL or local file in the default browser, unless running in CI.
|
|
25
23
|
*/
|
|
26
24
|
function openInBrowser(target) {
|
|
27
25
|
if (require_agent.isCIEnvironment()) return;
|
|
28
|
-
if (node_process.default.platform === "win32")
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Resolves to `true` when the file or directory at `path` exists.
|
|
40
|
-
* Uses `Bun.file().exists()` when running under Bun, `fs.access` otherwise.
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```ts
|
|
44
|
-
* if (await exists('./kubb.config.ts')) {
|
|
45
|
-
* const content = await read('./kubb.config.ts')
|
|
46
|
-
* }
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
async function exists(path) {
|
|
50
|
-
if (require_Telemetry.runtime.isBun) return Bun.file(path).exists();
|
|
51
|
-
return (0, node_fs_promises.access)(path).then(() => true, () => false);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Reads the file at `path` as a UTF-8 string.
|
|
55
|
-
* Uses `Bun.file().text()` when running under Bun, `fs.readFile` otherwise.
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```ts
|
|
59
|
-
* const source = await read('./src/Pet.ts')
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
|
-
async function read(path) {
|
|
63
|
-
if (require_Telemetry.runtime.isBun) return Bun.file(path).text();
|
|
64
|
-
return (0, node_fs_promises.readFile)(path, { encoding: "utf8" });
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Recursively removes `path`. Silently succeeds when `path` does not exist.
|
|
68
|
-
*
|
|
69
|
-
* @example
|
|
70
|
-
* ```ts
|
|
71
|
-
* await clean('./dist')
|
|
72
|
-
* ```
|
|
73
|
-
*/
|
|
74
|
-
async function clean(path) {
|
|
75
|
-
return (0, node_fs_promises.rm)(path, {
|
|
76
|
-
recursive: true,
|
|
77
|
-
force: true
|
|
78
|
-
});
|
|
26
|
+
if (node_process.default.platform === "win32") {
|
|
27
|
+
(0, tinyexec.x)("cmd", [
|
|
28
|
+
"/c",
|
|
29
|
+
"start",
|
|
30
|
+
"",
|
|
31
|
+
target
|
|
32
|
+
]).then(ignore, ignore);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
(0, tinyexec.x)(node_process.default.platform === "darwin" ? "open" : "xdg-open", [target]).then(ignore, ignore);
|
|
79
36
|
}
|
|
80
37
|
//#endregion
|
|
81
38
|
//#region src/runners/studio/credentials.ts
|
|
39
|
+
const projectBase = (project = node_process.default.cwd()) => node_path.default.join("projects", (0, node_crypto.hash)("sha256", project));
|
|
82
40
|
/**
|
|
83
|
-
* Root for
|
|
84
|
-
* the last Studio config, and the live-session registry. `KUBB_HOME` relocates all of it.
|
|
85
|
-
*/
|
|
86
|
-
function getKubbHome() {
|
|
87
|
-
return node_process.default.env.KUBB_HOME ?? node_path.default.join((0, node_os.homedir)(), ".kubb");
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Root for the credential and machine identity of the current project.
|
|
41
|
+
* Root for the credential and machine identity of the current project, inside `KUBB_HOME`.
|
|
91
42
|
*
|
|
92
43
|
* Studio agents are project connections, so two projects on one machine must not share the same
|
|
93
44
|
* persisted token or machine secret.
|
|
94
45
|
*/
|
|
95
46
|
function getProjectKubbHome(project = node_process.default.cwd()) {
|
|
96
|
-
|
|
97
|
-
return node_path.default.join(getKubbHome(), "projects", projectId);
|
|
47
|
+
return (0, _kubb_core.resolveKubbDir)(projectBase(project));
|
|
98
48
|
}
|
|
49
|
+
const projectStorage = () => (0, _kubb_core.kubbStorage)({ base: projectBase() });
|
|
99
50
|
const CREDENTIALS_FILENAME = "credentials.json";
|
|
100
51
|
/**
|
|
101
52
|
* Absolute path of the stored credential, so callers can name it in output without rebuilding it.
|
|
@@ -109,38 +60,39 @@ function getCredentialsPath() {
|
|
|
109
60
|
* overwrite it rather than the CLI dying on it.
|
|
110
61
|
*/
|
|
111
62
|
async function readCredentials() {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
return JSON.parse(raw);
|
|
116
|
-
} catch {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
63
|
+
const stored = await projectStorage().getItem(CREDENTIALS_FILENAME).catch(() => null);
|
|
64
|
+
return typeof stored?.token === "string" && stored.token !== "" ? stored : null;
|
|
119
65
|
}
|
|
120
66
|
/**
|
|
121
|
-
* Writes the credential
|
|
122
|
-
* is set at creation time rather than left to the process umask or fixed up afterward, which
|
|
123
|
-
* would leave the token briefly readable under the umask's default mode.
|
|
67
|
+
* Writes the credential into the project folder, which only its owner can open.
|
|
124
68
|
*/
|
|
125
69
|
async function writeCredentials(credentials) {
|
|
126
|
-
|
|
127
|
-
await (0, node_fs_promises.mkdir)(node_path.default.dirname(file), {
|
|
128
|
-
recursive: true,
|
|
129
|
-
mode: 448
|
|
130
|
-
});
|
|
131
|
-
await (0, node_fs_promises.writeFile)(file, JSON.stringify(credentials, null, 2), { mode: 384 });
|
|
70
|
+
await projectStorage().setItem(CREDENTIALS_FILENAME, credentials);
|
|
132
71
|
}
|
|
133
72
|
/**
|
|
134
73
|
* Forgets the stored credential. Succeeds when there was nothing to forget.
|
|
135
74
|
*/
|
|
136
75
|
async function clearCredentials() {
|
|
137
|
-
await
|
|
76
|
+
await projectStorage().removeItem(CREDENTIALS_FILENAME);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Reads this project's machine secret, creating it on first use. Pairing sends its hash, so pairing
|
|
80
|
+
* the same project again rotates one agent's token instead of creating a second agent. It lives
|
|
81
|
+
* apart from the credential, which {@link clearCredentials} deletes.
|
|
82
|
+
*/
|
|
83
|
+
async function getMachineId() {
|
|
84
|
+
const storage = projectStorage();
|
|
85
|
+
const stored = await storage.getItem("machine-secret").catch(() => null);
|
|
86
|
+
if (typeof stored === "string" && stored.trim()) return stored.trim();
|
|
87
|
+
const secret = (0, node_crypto.randomBytes)(32).toString("hex");
|
|
88
|
+
await storage.setItem("machine-secret", secret);
|
|
89
|
+
return secret;
|
|
138
90
|
}
|
|
139
91
|
//#endregion
|
|
140
92
|
//#region src/runners/studio/run.ts
|
|
141
93
|
function createStudioOptions(values) {
|
|
142
94
|
return {
|
|
143
|
-
version:
|
|
95
|
+
version: require_Telemetry.version,
|
|
144
96
|
configPath: values.config,
|
|
145
97
|
studioUrl: values.url ?? _kubb_studio.defaultStudioUrl,
|
|
146
98
|
permission: {
|
|
@@ -169,6 +121,7 @@ async function login({ studioUrl, autoOpen }, { signal, previousCredentials } =
|
|
|
169
121
|
type: "cli",
|
|
170
122
|
name: node_path.default.basename(node_process.default.cwd()),
|
|
171
123
|
hostname: (0, node_os.hostname)(),
|
|
124
|
+
machineId: await getMachineId(),
|
|
172
125
|
signal,
|
|
173
126
|
onCode: (session) => {
|
|
174
127
|
console.log(`\nOpen ${(0, node_util.styleText)("cyan", session.verification_uri)} and approve the code ${(0, node_util.styleText)("bold", session.user_code)}`);
|
|
@@ -274,7 +227,7 @@ async function resolvePermissions(options, credentials, configPath = require_con
|
|
|
274
227
|
* Returns the first config.
|
|
275
228
|
*/
|
|
276
229
|
async function loadConfigs(options) {
|
|
277
|
-
const { configPath, configs } = await
|
|
230
|
+
const { configPath, configs } = await require_config.getConfigs({
|
|
278
231
|
configPath: options.configPath,
|
|
279
232
|
logLevel: options.logLevel
|
|
280
233
|
});
|
|
@@ -326,68 +279,59 @@ async function connect(options, context = {}) {
|
|
|
326
279
|
events.once("SIGINT", stop);
|
|
327
280
|
events.once("SIGTERM", stop);
|
|
328
281
|
}
|
|
329
|
-
let hinted = false;
|
|
330
|
-
let reauthenticated = false;
|
|
331
282
|
try {
|
|
332
283
|
if (!context.prepared) {
|
|
333
|
-
const { getWorkerStatus } = await Promise.resolve().then(() => require("./background-
|
|
284
|
+
const { getWorkerStatus } = await Promise.resolve().then(() => require("./background-Ch3napsn.cjs"));
|
|
334
285
|
if ((await getWorkerStatus()).running) throw new Error("This project is running in the background. Run `kubb studio stop` first.");
|
|
335
286
|
}
|
|
336
287
|
const prepared = context.prepared ?? await prepareConnection(options, signal);
|
|
337
288
|
let { credentials, permissions } = prepared;
|
|
338
289
|
const { configPath } = prepared;
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
290
|
+
let hinted = false;
|
|
291
|
+
let pairedAgain = false;
|
|
292
|
+
const hooks = new _kubb_core.Hookable();
|
|
293
|
+
require_config.setupReporters(hooks, {
|
|
294
|
+
logLevel: _kubb_core.logLevel[options.logLevel ?? "info"],
|
|
295
|
+
reporters: [_kubb_core.cliReporter],
|
|
296
|
+
...context.onState ? { logger: require_output.plainLogger } : {}
|
|
297
|
+
});
|
|
298
|
+
hooks.hook("studio:connected", async () => {
|
|
299
|
+
pairedAgain = false;
|
|
300
|
+
await context.onState?.("connected");
|
|
301
|
+
if (hinted || context.onState || options.logLevel === "silent") return;
|
|
302
|
+
hinted = true;
|
|
303
|
+
require_output.logBlock((0, node_util.styleText)("dim", "Press Ctrl+C to disconnect"));
|
|
304
|
+
require_output.logTip();
|
|
305
|
+
});
|
|
306
|
+
hooks.hook("studio:reconnecting", () => context.onState?.("reconnecting"));
|
|
307
|
+
for (;;) try {
|
|
308
|
+
await (0, _kubb_studio.connectAgent)({
|
|
309
|
+
token: credentials.token,
|
|
343
310
|
studioUrl: options.studioUrl,
|
|
344
311
|
configPath,
|
|
345
312
|
version: options.version,
|
|
346
313
|
root: node_process.default.cwd(),
|
|
347
314
|
permissions,
|
|
348
315
|
loadConfig: async () => (await loadConfigs(options)).config,
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
if (node_process.default.env.KUBB_AGENT_TOKEN) throw explainRejectedToken(error, "envToken");
|
|
369
|
-
if (!live) await clearCredentials();
|
|
370
|
-
if (reauthenticated) throw explainRejectedToken(error, "reauthExhausted");
|
|
371
|
-
if (context.onState || require_agent.isCIEnvironment() || !require_output.canUseTTY()) throw explainRejectedToken(error, "nonInteractive");
|
|
372
|
-
console.log((0, node_util.styleText)("yellow", live ? `${error.message} Studio needs you to approve access again.` : `${error.message} Pairing again...`));
|
|
373
|
-
if (live) await clearCredentials();
|
|
374
|
-
try {
|
|
375
|
-
credentials = await login(options, {
|
|
376
|
-
signal,
|
|
377
|
-
previousCredentials: credentials
|
|
378
|
-
});
|
|
379
|
-
} catch (error) {
|
|
380
|
-
if (error instanceof _kubb_studio.PairingCanceledError) {
|
|
381
|
-
if (live && options.logLevel !== "silent") require_output.logOutro("Disconnected");
|
|
382
|
-
return null;
|
|
383
|
-
}
|
|
384
|
-
throw error;
|
|
385
|
-
}
|
|
386
|
-
reauthenticated = true;
|
|
387
|
-
permissions = await resolvePermissions(options, credentials, configPath, !node_process.default.env.KUBB_AGENT_TOKEN);
|
|
388
|
-
return credentials;
|
|
389
|
-
}
|
|
390
|
-
});
|
|
316
|
+
hooks,
|
|
317
|
+
signal
|
|
318
|
+
});
|
|
319
|
+
break;
|
|
320
|
+
} catch (error) {
|
|
321
|
+
if (!(error instanceof _kubb_studio.InvalidAgentTokenError)) throw error;
|
|
322
|
+
await context.onState?.("authentication required");
|
|
323
|
+
if (node_process.default.env.KUBB_AGENT_TOKEN) throw explainRejectedToken(error, "envToken");
|
|
324
|
+
await clearCredentials();
|
|
325
|
+
if (pairedAgain) throw explainRejectedToken(error, "reauthExhausted");
|
|
326
|
+
if (context.onState || require_agent.isCIEnvironment() || !require_output.canUseTTY()) throw explainRejectedToken(error, "nonInteractive");
|
|
327
|
+
console.log((0, node_util.styleText)("yellow", `${error.message} Pairing again...`));
|
|
328
|
+
credentials = await login(options, {
|
|
329
|
+
signal,
|
|
330
|
+
previousCredentials: credentials
|
|
331
|
+
});
|
|
332
|
+
pairedAgain = true;
|
|
333
|
+
permissions = await resolvePermissions(options, credentials, configPath);
|
|
334
|
+
}
|
|
391
335
|
if (!context.onState && signal.aborted && options.logLevel !== "silent") require_output.logOutro("Disconnected");
|
|
392
336
|
} catch (error) {
|
|
393
337
|
if (!(error instanceof _kubb_studio.PairingCanceledError)) throw error;
|
|
@@ -397,50 +341,22 @@ async function connect(options, context = {}) {
|
|
|
397
341
|
}
|
|
398
342
|
}
|
|
399
343
|
/**
|
|
400
|
-
* Reports the paired agent and any saved permissions for the current project.
|
|
401
|
-
*/
|
|
402
|
-
async function status(options) {
|
|
403
|
-
const credentials = await readCredentials();
|
|
404
|
-
if (!credentials) {
|
|
405
|
-
console.log("Not paired. Run `kubb studio login`.");
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
console.log(`Paired with ${credentials.studioUrl} as ${(0, node_util.styleText)("cyan", credentials.agentSlug || credentials.agentId)}`);
|
|
409
|
-
if (credentials.studioUrl !== options.studioUrl) console.log((0, node_util.styleText)("yellow", `Connecting to ${options.studioUrl} needs pairing again.`));
|
|
410
|
-
const remembered = credentials.projects?.[node_process.default.cwd()];
|
|
411
|
-
if (!remembered) {
|
|
412
|
-
console.log((0, node_util.styleText)("dim", "No saved permissions for this project. Run `kubb studio` to connect and choose."));
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
console.log((0, node_util.styleText)("dim", "Saved permissions"));
|
|
416
|
-
for (const row of formatPermissionRows({
|
|
417
|
-
allowRead: remembered.allowRead === true,
|
|
418
|
-
allowWrite: remembered.allowWrite === true,
|
|
419
|
-
allowConfigEdit: remembered.allowConfigEdit === true,
|
|
420
|
-
allowExec: remembered.allowExec === true
|
|
421
|
-
})) console.log(row);
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
344
|
* Runs a Studio command with shared setup and telemetry reporting.
|
|
425
345
|
*/
|
|
426
|
-
async function run(options, action,
|
|
427
|
-
|
|
428
|
-
const hrStart = node_process.default.hrtime();
|
|
429
|
-
const report = (status) => require_Telemetry.sendTelemetry(require_Telemetry.buildTelemetryEvent({
|
|
346
|
+
async function run({ options, action, block = false, json = false }) {
|
|
347
|
+
const report = require_Telemetry.trackRun({
|
|
430
348
|
command: "studio",
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
status
|
|
434
|
-
}));
|
|
349
|
+
hrStart: node_process.default.hrtime()
|
|
350
|
+
});
|
|
435
351
|
try {
|
|
436
352
|
if (options.logLevel !== "silent" && !json) require_output.logIntro({
|
|
437
353
|
warning: (0, node_util.styleText)("yellow", "This feature is still under development, use with caution"),
|
|
438
354
|
block
|
|
439
355
|
});
|
|
440
356
|
await action();
|
|
441
|
-
await report("success");
|
|
357
|
+
await report({ status: "success" });
|
|
442
358
|
} catch (error) {
|
|
443
|
-
await report("failed");
|
|
359
|
+
await report({ status: "failed" });
|
|
444
360
|
console.error(require_errors.toError(error).message);
|
|
445
361
|
node_process.default.exitCode = 1;
|
|
446
362
|
}
|
|
@@ -464,10 +380,10 @@ Object.defineProperty(exports, "createStudioOptions", {
|
|
|
464
380
|
return createStudioOptions;
|
|
465
381
|
}
|
|
466
382
|
});
|
|
467
|
-
Object.defineProperty(exports, "
|
|
383
|
+
Object.defineProperty(exports, "formatPermissionRows", {
|
|
468
384
|
enumerable: true,
|
|
469
385
|
get: function() {
|
|
470
|
-
return
|
|
386
|
+
return formatPermissionRows;
|
|
471
387
|
}
|
|
472
388
|
});
|
|
473
389
|
Object.defineProperty(exports, "getProjectKubbHome", {
|
|
@@ -494,10 +410,10 @@ Object.defineProperty(exports, "prepareConnection", {
|
|
|
494
410
|
return prepareConnection;
|
|
495
411
|
}
|
|
496
412
|
});
|
|
497
|
-
Object.defineProperty(exports, "
|
|
413
|
+
Object.defineProperty(exports, "readCredentials", {
|
|
498
414
|
enumerable: true,
|
|
499
415
|
get: function() {
|
|
500
|
-
return
|
|
416
|
+
return readCredentials;
|
|
501
417
|
}
|
|
502
418
|
});
|
|
503
419
|
Object.defineProperty(exports, "run", {
|
|
@@ -506,11 +422,5 @@ Object.defineProperty(exports, "run", {
|
|
|
506
422
|
return run;
|
|
507
423
|
}
|
|
508
424
|
});
|
|
509
|
-
Object.defineProperty(exports, "status", {
|
|
510
|
-
enumerable: true,
|
|
511
|
-
get: function() {
|
|
512
|
-
return status;
|
|
513
|
-
}
|
|
514
|
-
});
|
|
515
425
|
|
|
516
|
-
//# sourceMappingURL=run-
|
|
426
|
+
//# sourceMappingURL=run-BIK3c6u-.cjs.map
|