@kubb/cli 5.5.6 → 5.6.0

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 (146) hide show
  1. package/dist/{Telemetry-CMXOVUKB.js → Telemetry-RBcAjNxj.js} +18 -43
  2. package/dist/Telemetry-RBcAjNxj.js.map +1 -0
  3. package/dist/{Telemetry-DDHXBdEz.cjs → Telemetry-bGdFBaGt.cjs} +27 -89
  4. package/dist/Telemetry-bGdFBaGt.cjs.map +1 -0
  5. package/dist/agent-BPIqnEl2.js +59 -0
  6. package/dist/agent-BPIqnEl2.js.map +1 -0
  7. package/dist/agent-DElUuYuy.cjs +120 -0
  8. package/dist/agent-DElUuYuy.cjs.map +1 -0
  9. package/dist/{background-DxlRE9O5.js → background-0PMj56FJ.js} +6 -5
  10. package/dist/background-0PMj56FJ.js.map +1 -0
  11. package/dist/background-BqS01QDb.js +2 -0
  12. package/dist/{background-Bbcc2TdN.cjs → background-R0T_7Szu.cjs} +8 -7
  13. package/dist/background-R0T_7Szu.cjs.map +1 -0
  14. package/dist/commands-BAgGrcvc.js +65 -0
  15. package/dist/commands-BAgGrcvc.js.map +1 -0
  16. package/dist/commands-Si-RFAS6.cjs +71 -0
  17. package/dist/commands-Si-RFAS6.cjs.map +1 -0
  18. package/dist/config-8Xl4yZmw.js +146 -0
  19. package/dist/config-8Xl4yZmw.js.map +1 -0
  20. package/dist/config-ByfJSj3q.cjs +164 -0
  21. package/dist/config-ByfJSj3q.cjs.map +1 -0
  22. package/dist/constants-CdxpgX3_.cjs.map +1 -1
  23. package/dist/constants-DHRspBTo.js.map +1 -1
  24. package/dist/{errors-C-wEou02.cjs → errors-CMbMAwyW.cjs} +2 -2
  25. package/dist/{errors-C-wEou02.cjs.map → errors-CMbMAwyW.cjs.map} +1 -1
  26. package/dist/index.cjs +431 -22
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.js +429 -20
  29. package/dist/index.js.map +1 -1
  30. package/dist/output-B6Ondw0g.js +776 -0
  31. package/dist/output-B6Ondw0g.js.map +1 -0
  32. package/dist/output-i3s5c4Xu.cjs +878 -0
  33. package/dist/output-i3s5c4Xu.cjs.map +1 -0
  34. package/dist/run-3I2NPeXG.cjs +31 -0
  35. package/dist/run-3I2NPeXG.cjs.map +1 -0
  36. package/dist/{run-C-jBKNbI.cjs → run-BkLJ5mXn.cjs} +22 -43
  37. package/dist/run-BkLJ5mXn.cjs.map +1 -0
  38. package/dist/run-CZlkqkDc.js +30 -0
  39. package/dist/run-CZlkqkDc.js.map +1 -0
  40. package/dist/run-CmNDNEjR.js +346 -0
  41. package/dist/run-CmNDNEjR.js.map +1 -0
  42. package/dist/{run-BdTwxLCW.js → run-D5AeacqK.js} +9 -23
  43. package/dist/run-D5AeacqK.js.map +1 -0
  44. package/dist/{run-y6LRyWdS.cjs → run-D8Wz_17X.cjs} +41 -60
  45. package/dist/run-D8Wz_17X.cjs.map +1 -0
  46. package/dist/{run-Dn8HVjnM.js → run-DQoKTiGk.js} +23 -44
  47. package/dist/run-DQoKTiGk.js.map +1 -0
  48. package/dist/{run-BDaZPU-1.js → run-Dgph0WYk.js} +25 -49
  49. package/dist/run-Dgph0WYk.js.map +1 -0
  50. package/dist/run-t8nm7zcT.cjs +348 -0
  51. package/dist/run-t8nm7zcT.cjs.map +1 -0
  52. package/dist/{run-CZz_GbE4.cjs → run-yvuot2N9.cjs} +12 -26
  53. package/dist/run-yvuot2N9.cjs.map +1 -0
  54. package/dist/{snapshot-B5mc4gpC.js → snapshot-CkHXR0Nl.js} +5 -5
  55. package/dist/snapshot-CkHXR0Nl.js.map +1 -0
  56. package/dist/{snapshot-DnCxZfmM.cjs → snapshot-D4nKbwkw.cjs} +9 -9
  57. package/dist/snapshot-D4nKbwkw.cjs.map +1 -0
  58. package/dist/studioWorker.js +2 -2
  59. package/package.json +7 -7
  60. package/dist/Telemetry-CMXOVUKB.js.map +0 -1
  61. package/dist/Telemetry-DDHXBdEz.cjs.map +0 -1
  62. package/dist/agent-DiB4CRre.cjs +0 -38
  63. package/dist/agent-DiB4CRre.cjs.map +0 -1
  64. package/dist/agent-yA5vrXJB.js +0 -26
  65. package/dist/agent-yA5vrXJB.js.map +0 -1
  66. package/dist/background-Bbcc2TdN.cjs.map +0 -1
  67. package/dist/background-CFNncNYT.js +0 -2
  68. package/dist/background-DxlRE9O5.js.map +0 -1
  69. package/dist/connect-C9tTngda.js +0 -11
  70. package/dist/connect-C9tTngda.js.map +0 -1
  71. package/dist/connect-CJ7BhOcs.cjs +0 -11
  72. package/dist/connect-CJ7BhOcs.cjs.map +0 -1
  73. package/dist/generate-BUqZ_7GB.cjs +0 -92
  74. package/dist/generate-BUqZ_7GB.cjs.map +0 -1
  75. package/dist/generate-q2m01zRd.js +0 -92
  76. package/dist/generate-q2m01zRd.js.map +0 -1
  77. package/dist/gunshiDryRun-DdKJuVn1.js +0 -2
  78. package/dist/init-Ckpwkfvz.cjs +0 -58
  79. package/dist/init-Ckpwkfvz.cjs.map +0 -1
  80. package/dist/init-DukE9Uw4.js +0 -58
  81. package/dist/init-DukE9Uw4.js.map +0 -1
  82. package/dist/login-Bc19oiFE.cjs +0 -11
  83. package/dist/login-Bc19oiFE.cjs.map +0 -1
  84. package/dist/login-Do3nns0B.js +0 -11
  85. package/dist/login-Do3nns0B.js.map +0 -1
  86. package/dist/logout-BvHFvCeI.cjs +0 -16
  87. package/dist/logout-BvHFvCeI.cjs.map +0 -1
  88. package/dist/logout-COxoIMum.js +0 -16
  89. package/dist/logout-COxoIMum.js.map +0 -1
  90. package/dist/mcp-B-GxGgVr.js +0 -19
  91. package/dist/mcp-B-GxGgVr.js.map +0 -1
  92. package/dist/mcp-B3B-rE7W.cjs +0 -18
  93. package/dist/mcp-B3B-rE7W.cjs.map +0 -1
  94. package/dist/output-CVLosNZq.cjs +0 -411
  95. package/dist/output-CVLosNZq.cjs.map +0 -1
  96. package/dist/output-FDo-db-w.js +0 -321
  97. package/dist/output-FDo-db-w.js.map +0 -1
  98. package/dist/package-Ci2fcoOV.js +0 -6
  99. package/dist/package-Ci2fcoOV.js.map +0 -1
  100. package/dist/package-Do9rJ7D3.cjs +0 -11
  101. package/dist/package-Do9rJ7D3.cjs.map +0 -1
  102. package/dist/rolldown-runtime-qbf5tadS.cjs +0 -38
  103. package/dist/run-BDaZPU-1.js.map +0 -1
  104. package/dist/run-BdTwxLCW.js.map +0 -1
  105. package/dist/run-C-jBKNbI.cjs.map +0 -1
  106. package/dist/run-CAcQlhub.js +0 -295
  107. package/dist/run-CAcQlhub.js.map +0 -1
  108. package/dist/run-CSoFhDyK.cjs +0 -297
  109. package/dist/run-CSoFhDyK.cjs.map +0 -1
  110. package/dist/run-CZz_GbE4.cjs.map +0 -1
  111. package/dist/run-CaEbo-te.js +0 -40
  112. package/dist/run-CaEbo-te.js.map +0 -1
  113. package/dist/run-CihzLZmR.cjs +0 -41
  114. package/dist/run-CihzLZmR.cjs.map +0 -1
  115. package/dist/run-Dn8HVjnM.js.map +0 -1
  116. package/dist/run-y6LRyWdS.cjs.map +0 -1
  117. package/dist/shared-Cl-OLpNh.cjs +0 -81
  118. package/dist/shared-Cl-OLpNh.cjs.map +0 -1
  119. package/dist/shared-DaHA7QFQ.js +0 -58
  120. package/dist/shared-DaHA7QFQ.js.map +0 -1
  121. package/dist/snapshot-B5mc4gpC.js.map +0 -1
  122. package/dist/snapshot-DnCxZfmM.cjs.map +0 -1
  123. package/dist/start-B-GXO8tS.cjs +0 -12
  124. package/dist/start-B-GXO8tS.cjs.map +0 -1
  125. package/dist/start-Dbfx_8zG.js +0 -12
  126. package/dist/start-Dbfx_8zG.js.map +0 -1
  127. package/dist/status-DDajNc8w.js +0 -17
  128. package/dist/status-DDajNc8w.js.map +0 -1
  129. package/dist/status-DusS7DfO.cjs +0 -17
  130. package/dist/status-DusS7DfO.cjs.map +0 -1
  131. package/dist/stop-C5t7Yx0t.js +0 -11
  132. package/dist/stop-C5t7Yx0t.js.map +0 -1
  133. package/dist/stop-zmM3A0Re.cjs +0 -11
  134. package/dist/stop-zmM3A0Re.cjs.map +0 -1
  135. package/dist/studio--IOOl_VB.js +0 -174
  136. package/dist/studio--IOOl_VB.js.map +0 -1
  137. package/dist/studio-CJ2XhtRd.cjs +0 -174
  138. package/dist/studio-CJ2XhtRd.cjs.map +0 -1
  139. package/dist/utils-C3HZOWL_.js +0 -1107
  140. package/dist/utils-C3HZOWL_.js.map +0 -1
  141. package/dist/utils-ClRbJfxu.cjs +0 -1210
  142. package/dist/utils-ClRbJfxu.cjs.map +0 -1
  143. package/dist/validate-BcB0tFQ6.cjs +0 -19
  144. package/dist/validate-BcB0tFQ6.cjs.map +0 -1
  145. package/dist/validate-QpkCbIFJ.js +0 -20
  146. package/dist/validate-QpkCbIFJ.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-i3s5c4Xu.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/** Renders a `studio:connected` event's versions: the runtime only when it differs from the host, Studio's only when it sent one. */\nfunction formatVersions({ studio, kubb, agent }: StudioConnectedContext['versions']): string {\n return [`v${agent}`, kubb !== agent ? `runtime v${kubb}` : undefined, studio ? `Studio v${studio}` : undefined].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. The socket opens without being awaited, hence the step.\n context.hook('studio:connecting', ({ url }) => {\n startSpinner(`Connecting to ${styleText('cyan', url)}`)\n })\n\n context.hook('studio:disconnected', ({ reason }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n stopSpinner()\n writer.warn(text(`⚠ Kubb Studio ended the session (${reason})`))\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 const line = `Connected to ${styleText('cyan', url)} ${styleText('dim', `(${formatVersions(versions)})`)}`\n\n if (state.spinner) {\n stopSpinner(line)\n return\n }\n writer.success(text(`✓ ${line}`))\n })\n\n context.hook('studio:ready', () => {\n startSpinner('✓ Ready to receive jobs')\n })\n\n context.hook('studio:command:start', ({ command }) => {\n stopSpinner()\n writer.info(text(`Kubb Studio asked to ${styleText('bold', command)}`))\n })\n\n context.hook('studio:command:end', ({ command, info }) => {\n writer.success(text(`✓ Finished ${command}${info ? ` ${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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"}
@@ -0,0 +1,31 @@
1
+ const require_agent = require("./agent-DElUuYuy.cjs");
2
+ const require_errors = require("./errors-CMbMAwyW.cjs");
3
+ const require_Telemetry = require("./Telemetry-bGdFBaGt.cjs");
4
+ let node_util = require("node:util");
5
+ let node_process = require("node:process");
6
+ node_process = require_agent.__toESM(node_process, 1);
7
+ //#region src/runners/mcp/run.ts
8
+ /**
9
+ * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.
10
+ */
11
+ async function run() {
12
+ const { run: startMcpServer } = await import("@kubb/mcp");
13
+ const report = require_Telemetry.trackRun({
14
+ command: "mcp",
15
+ hrStart: node_process.default.hrtime()
16
+ });
17
+ try {
18
+ console.error((0, node_util.styleText)("cyan", "⏳ Starting MCP server..."));
19
+ console.warn((0, node_util.styleText)("yellow", "This feature is still under development, use with caution"));
20
+ await startMcpServer();
21
+ await report({ status: "success" });
22
+ } catch (error) {
23
+ await report({ status: "failed" });
24
+ console.error(require_errors.toError(error).message);
25
+ node_process.default.exitCode = 1;
26
+ }
27
+ }
28
+ //#endregion
29
+ exports.run = run;
30
+
31
+ //# sourceMappingURL=run-3I2NPeXG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-3I2NPeXG.cjs","names":["trackRun","process","styleText","toError"],"sources":["../src/runners/mcp/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { toError } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { trackRun } from '../../Telemetry.ts'\n\n/**\n * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.\n */\nexport async function run(): Promise<void> {\n const { run: startMcpServer } = (await import('@kubb/mcp')) as typeof McpModule\n\n const report = trackRun({ command: 'mcp', hrStart: process.hrtime() })\n\n try {\n // The MCP stdio transport owns stdout: anything else written there corrupts the JSON-RPC stream.\n console.error(styleText('cyan', '⏳ Starting MCP server...'))\n console.warn(styleText('yellow', 'This feature is still under development, use with caution'))\n await startMcpServer()\n await report({ status: 'success' })\n } catch (error) {\n await report({ status: 'failed' })\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n"],"mappings":";;;;;;;;;;AASA,eAAsB,MAAqB;CACzC,MAAM,EAAE,KAAK,mBAAoB,MAAM,OAAO;CAE9C,MAAM,SAASA,kBAAAA,SAAS;EAAE,SAAS;EAAO,SAASC,aAAAA,QAAQ,OAAO;CAAE,CAAC;CAErE,IAAI;EAEF,QAAQ,OAAA,GAAMC,UAAAA,UAAAA,CAAU,QAAQ,0BAA0B,CAAC;EAC3D,QAAQ,MAAA,GAAKA,UAAAA,UAAAA,CAAU,UAAU,2DAA2D,CAAC;EAC7F,MAAM,eAAe;EACrB,MAAM,OAAO,EAAE,QAAQ,UAAU,CAAC;CACpC,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,QAAQ,MAAMC,eAAAA,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,aAAA,QAAA,WAAmB;CACrB;AACF"}
@@ -1,16 +1,16 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-qbf5tadS.cjs");
2
- const require_output = require("./output-CVLosNZq.cjs");
1
+ const require_agent = require("./agent-DElUuYuy.cjs");
2
+ const require_output = require("./output-i3s5c4Xu.cjs");
3
3
  const require_constants = require("./constants-CdxpgX3_.cjs");
4
4
  let node_util = require("node:util");
5
5
  let node_process = require("node:process");
6
- node_process = require_rolldown_runtime.__toESM(node_process, 1);
6
+ node_process = require_agent.__toESM(node_process, 1);
7
+ let tinyexec = require("tinyexec");
7
8
  let node_path = require("node:path");
8
- node_path = require_rolldown_runtime.__toESM(node_path, 1);
9
- let node_fs = require("node:fs");
10
- node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
9
+ node_path = require_agent.__toESM(node_path, 1);
11
10
  let _clack_prompts = require("@clack/prompts");
12
- _clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
13
- let tinyexec = require("tinyexec");
11
+ _clack_prompts = require_agent.__toESM(_clack_prompts, 1);
12
+ let node_fs = require("node:fs");
13
+ node_fs = require_agent.__toESM(node_fs, 1);
14
14
  //#region ../../internals/shared/src/init.ts
15
15
  /**
16
16
  * Resolves a comma-separated plugin flag (e.g. `--plugins plugin-ts,plugin-zod`) into the
@@ -51,63 +51,47 @@ function resolveInstallVersions({ packages, version }) {
51
51
  return packages.map((name) => name === "kubb" ? `${name}@${version}` : `${name}@${tag}`);
52
52
  }
53
53
  //#endregion
54
- //#region src/tools.ts
55
- /**
56
- * Metadata for each supported package manager, keyed by its short name.
57
- *
58
- * @example
59
- * ```ts
60
- * packageManagers.pnpm.installCommand // ['add', '-D']
61
- * packageManagers.npm.lockFiles // ['package-lock.json']
62
- * ```
63
- */
54
+ //#region src/runners/init/utils.ts
55
+ /** Metadata for each supported package manager, keyed by its short name. */
64
56
  const packageManagers = {
65
57
  pnpm: {
66
58
  name: "pnpm",
67
59
  lockFiles: ["pnpm-lock.yaml"],
60
+ initCommand: ["init"],
68
61
  installCommand: ["add", "-D"]
69
62
  },
70
63
  yarn: {
71
64
  name: "yarn",
72
65
  lockFiles: ["yarn.lock"],
66
+ initCommand: ["init", "-y"],
73
67
  installCommand: ["add", "-D"]
74
68
  },
75
69
  bun: {
76
70
  name: "bun",
77
71
  lockFiles: ["bun.lock", "bun.lockb"],
72
+ initCommand: ["init", "-y"],
78
73
  installCommand: ["add", "-d"]
79
74
  },
80
75
  npm: {
81
76
  name: "npm",
82
77
  lockFiles: ["package-lock.json"],
78
+ initCommand: ["init", "-y"],
83
79
  installCommand: ["install", "--save-dev"]
84
80
  }
85
81
  };
86
- /**
87
- * Detects the active package manager for the given directory.
88
- * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.
89
- * Falls back to `npm` when no signal is found.
90
- *
91
- * @example
92
- * ```ts
93
- * detectPackageManager('/my/project') // { name: 'pnpm', lockFiles: ['pnpm-lock.yaml'], ... }
94
- * detectPackageManager() // falls back to npm when no lock file is found
95
- * ```
96
- */
97
- function detectPackageManager(cwd = process.cwd()) {
98
- const packageJsonPath = (0, node_path.join)(cwd, "package.json");
99
- if ((0, node_fs.existsSync)(packageJsonPath)) try {
100
- const pmField = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8")).packageManager;
82
+ /** Detects the package manager for `cwd`: the `packageManager` field in `package.json`, then a lock file, then `npm`. */
83
+ function detectPackageManager(cwd = node_process.default.cwd()) {
84
+ const packageJsonPath = node_path.default.join(cwd, "package.json");
85
+ if (node_fs.default.existsSync(packageJsonPath)) try {
86
+ const pmField = JSON.parse(node_fs.default.readFileSync(packageJsonPath, "utf-8")).packageManager;
101
87
  if (typeof pmField === "string") {
102
88
  const name = pmField.split("@")[0];
103
89
  if (name && name in packageManagers) return packageManagers[name];
104
90
  }
105
91
  } catch {}
106
- for (const pm of Object.values(packageManagers)) if (pm.lockFiles.some((lockFile) => (0, node_fs.existsSync)((0, node_path.join)(cwd, lockFile)))) return pm;
92
+ for (const pm of Object.values(packageManagers)) if (pm.lockFiles.some((lockFile) => node_fs.default.existsSync(node_path.default.join(cwd, lockFile)))) return pm;
107
93
  return packageManagers.npm;
108
94
  }
109
- //#endregion
110
- //#region src/runners/init/utils.ts
111
95
  /**
112
96
  * Returns `true` when a `package.json` exists at `cwd`.
113
97
  */
@@ -118,12 +102,7 @@ function hasPackageJson(cwd = node_process.default.cwd()) {
118
102
  * Initializes a new `package.json` at `cwd` using the detected package manager.
119
103
  */
120
104
  async function initPackageJson(cwd, packageManager) {
121
- await (0, tinyexec.x)(packageManager.name, {
122
- npm: ["init", "-y"],
123
- pnpm: ["init"],
124
- yarn: ["init", "-y"],
125
- bun: ["init", "-y"]
126
- }[packageManager.name], {
105
+ await (0, tinyexec.x)(packageManager.name, [...packageManager.initCommand], {
127
106
  nodeOptions: {
128
107
  cwd,
129
108
  stdio: "inherit"
@@ -280,4 +259,4 @@ async function run({ yes, version, input: inputFlag, output: outputFlag, plugins
280
259
  //#endregion
281
260
  exports.run = run;
282
261
 
283
- //# sourceMappingURL=run-C-jBKNbI.cjs.map
262
+ //# sourceMappingURL=run-BkLJ5mXn.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-BkLJ5mXn.cjs","names":["availablePlugins","process","path","fs","x","process","styleText","clack","createSpinner","initDefaults","availablePlugins","KUBB_PACKAGE_NAME","KUBB_CONFIG_FILENAME","path","fs"],"sources":["../../../internals/shared/src/init.ts","../src/runners/init/utils.ts","../src/runners/init/run.ts"],"sourcesContent":["import { availablePlugins, KUBB_PACKAGE_NAME } from './constants.ts'\nimport type { PluginOption } from './types.ts'\n\n/**\n * Resolves a comma-separated plugin flag (e.g. `--plugins plugin-ts,plugin-zod`) into the\n * matching known plugin options. Unrecognized names are dropped, and a missing flag yields\n * an empty list.\n */\nexport function resolvePlugins(pluginsFlag: string | undefined): Array<PluginOption> {\n if (!pluginsFlag) {\n return []\n }\n const requested = pluginsFlag\n .split(',')\n .map((value) => value.trim())\n .filter(Boolean)\n return availablePlugins.filter((plugin) => requested.includes(plugin.value))\n}\n\nexport function generateConfigFile({\n selectedPlugins,\n inputPath,\n outputPath,\n}: {\n selectedPlugins: Array<PluginOption>\n inputPath: string\n outputPath: string\n}): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins.map((plugin) => ` ${plugin.importName}(),`).join('\\n')\n\n return `import { defineConfig } from 'kubb/config'\n${imports}\n\nexport default defineConfig({\n input: '${inputPath}',\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\n/**\n * Turns package names into install specifiers for the wizard.\n *\n * `kubb` is pinned to the exact version of the running CLI, since both ship from the same release\n * and resolving `kubb@beta` separately can land on a different version than the CLI doing the\n * scaffolding. Plugins release from their own repo on their own cadence, so they follow the\n * release channel of the CLI through its dist-tag.\n */\nexport function resolveInstallVersions({ packages, version }: { packages: Array<string>; version: string }): Array<string> {\n const prerelease = version.match(/-([a-z]+)/)?.[1]\n const tag = prerelease ?? 'latest'\n\n return packages.map((name) => (name === KUBB_PACKAGE_NAME ? `${name}@${version}` : `${name}@${tag}`))\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { x } from 'tinyexec'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\n/** Metadata describing a package manager's lock file and commands. */\nexport type PackageManagerInfo = {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file names that identify this package manager in a project root. */\n lockFiles: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to create a `package.json`. */\n initCommand: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\n/** Metadata for each supported package manager, keyed by its short name. */\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFiles: ['pnpm-lock.yaml'],\n initCommand: ['init'],\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFiles: ['yarn.lock'],\n initCommand: ['init', '-y'],\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFiles: ['bun.lock', 'bun.lockb'],\n initCommand: ['init', '-y'],\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFiles: ['package-lock.json'],\n initCommand: ['init', '-y'],\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/** Detects the package manager for `cwd`: the `packageManager` field in `package.json`, then a lock file, then `npm`. */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) as PackageJson\n const pmField = packageJson.packageManager\n if (typeof pmField === 'string') {\n const name = pmField.split('@')[0]\n if (name && name in packageManagers) {\n return packageManagers[name as PackageManagerName]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n for (const pm of Object.values(packageManagers)) {\n if (pm.lockFiles.some((lockFile) => fs.existsSync(path.join(cwd, lockFile)))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n\n/**\n * Returns `true` when a `package.json` exists at `cwd`.\n */\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\n/**\n * Initializes a new `package.json` at `cwd` using the detected package manager.\n */\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n await x(packageManager.name, [...packageManager.initCommand], {\n nodeOptions: { cwd, stdio: 'inherit' },\n throwOnError: true,\n })\n}\n\n/**\n * Installs the given packages at `cwd` using the detected package manager.\n */\nexport async function installPackages(packages: Array<string>, packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await x(packageManager.name, [...packageManager.installCommand, ...packages], {\n nodeOptions: { cwd, stdio: 'inherit' },\n throwOnError: true,\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { DryRunExtension } from '@gunshi/plugin-dryrun'\nimport {\n availablePlugins,\n generateConfigFile,\n initDefaults,\n KUBB_CONFIG_FILENAME,\n KUBB_PACKAGE_NAME,\n type PluginOption,\n resolveInstallVersions,\n resolvePlugins,\n} from '@internals/shared'\nimport { createSpinner, logError, logInfo, logIntro, logOutro, logWarn } from '../../loggers/output.ts'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages } from './utils.ts'\n\nfunction cancelAndExit(message = 'Operation canceled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n /**\n * When `true`, skips all interactive prompts and uses default values.\n */\n yes: boolean\n /**\n * Current `@kubb/cli` version string, shown in the closing outro.\n */\n version: string\n /**\n * Input path flag value from `--input`. When provided, skips the input prompt.\n */\n input?: string\n /**\n * Output directory flag value from `--output`. When provided, skips the output prompt.\n */\n output?: string\n /**\n * Comma-separated plugin list from `--plugins`, e.g. `'plugin-ts,plugin-zod'`. When provided, skips the plugin selection prompt.\n */\n plugins?: string\n /**\n * Dry-run extension from `@gunshi/plugin-dryrun`. When enabled, package installation and the\n * config file write are skipped.\n */\n dryRun: DryRunExtension\n}\n\n/**\n * Runs the interactive Kubb scaffolding wizard.\n * Detects the package manager, prompts for input/output paths and plugins, installs packages, and writes `kubb.config.ts`.\n * Pass `yes: true` to skip all prompts and use defaults.\n */\nexport async function run({ yes, version, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n logIntro({ title: styleText('bgCyan', styleText('black', ' Kubb Init ')) })\n\n /**\n * Returns `flag` when provided, the `defaultValue` when `yes` is set,\n * or calls `prompt()` for interactive input. Exits on cancellation.\n */\n async function resolveOrPrompt<T>(flag: T | undefined, defaultValue: T, logLabel: string, prompt: () => Promise<NoInfer<T> | symbol>): Promise<T> {\n if (flag !== undefined) {\n logInfo(`${logLabel}: ${styleText('cyan', String(flag))}`)\n return flag\n }\n if (yes) {\n logInfo(`${logLabel}: ${styleText('cyan', String(defaultValue))}`)\n return defaultValue\n }\n const result = await prompt()\n if (clack.isCancel(result)) cancelAndExit()\n return result as T\n }\n\n try {\n // Check/create package.json, detect package manager once after the block\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n const packageManager = detectPackageManager(cwd)\n const spinner = createSpinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n await initPackageJson(cwd, packageManager)\n spinner.stop(`Created package.json with ${packageManager.name}`)\n }\n\n const packageManager = detectPackageManager(cwd)\n if (hasPackageJson(cwd)) {\n logInfo(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await resolveOrPrompt(inputFlag, initDefaults.inputPath, 'Using input path', () =>\n clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n }),\n )\n\n // Prompt for output directory\n const outputPath = await resolveOrPrompt(outputFlag, initDefaults.outputPath, 'Using output path', () =>\n clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n }),\n )\n\n // Plugin selection\n const defaultPlugins = availablePlugins.filter((p) => (initDefaults.plugins as ReadonlyArray<string>).includes(p.value))\n const pluginLabel = (plugins: Array<PluginOption>) => styleText('cyan', plugins.map((p) => p.label).join(', '))\n\n const selectedPlugins: Array<PluginOption> = await (async () => {\n if (pluginsFlag) {\n const plugins = resolvePlugins(pluginsFlag)\n if (plugins.length === 0) {\n logWarn(`No valid plugins found in --plugins value; falling back to default: ${pluginLabel(defaultPlugins)}`)\n return defaultPlugins\n }\n logInfo(`Using plugins: ${pluginLabel(plugins)}`)\n return plugins\n }\n if (yes) {\n logInfo(`Using plugins: ${pluginLabel(defaultPlugins)}`)\n return defaultPlugins\n }\n const values = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map(({ value, label, hint }) => ({ value, label, hint })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n if (clack.isCancel(values)) cancelAndExit()\n return availablePlugins.filter((p) => (values as Array<string>).includes(p.value))\n })()\n\n // Install packages, matching the release of the running CLI\n const packagesToInstall = resolveInstallVersions({ packages: [KUBB_PACKAGE_NAME, ...selectedPlugins.map((p) => p.packageName)], version })\n\n const spinner = createSpinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await dryRun.run(() => installPackages(packagesToInstall, packageManager, cwd), {\n message: `install ${packagesToInstall.length} packages with ${packageManager.name}`,\n })\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = createSpinner()\n configSpinner.start(`Creating ${KUBB_CONFIG_FILENAME}`)\n\n const configContent = generateConfigFile({ selectedPlugins, inputPath, outputPath })\n const configPath = path.join(cwd, KUBB_CONFIG_FILENAME)\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop(`${KUBB_CONFIG_FILENAME} already exists`)\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: `${KUBB_CONFIG_FILENAME} already exists. Overwrite?`,\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start(`Overwriting ${KUBB_CONFIG_FILENAME}`)\n }\n\n await dryRun.run(() => fs.promises.writeFile(configPath, configContent, 'utf-8'), { message: `write ${KUBB_CONFIG_FILENAME}` })\n\n configSpinner.stop(`Created ${KUBB_CONFIG_FILENAME}`)\n\n logOutro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n logError(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n logError(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import "./rolldown-runtime-CRm0XQPb.js";
2
+ import { t as toError } from "./errors-BQJzaUwP.js";
3
+ import { n as trackRun } from "./Telemetry-RBcAjNxj.js";
4
+ import { styleText } from "node:util";
5
+ import process from "node:process";
6
+ //#region src/runners/mcp/run.ts
7
+ /**
8
+ * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.
9
+ */
10
+ async function run() {
11
+ const { run: startMcpServer } = await import("@kubb/mcp");
12
+ const report = trackRun({
13
+ command: "mcp",
14
+ hrStart: process.hrtime()
15
+ });
16
+ try {
17
+ console.error(styleText("cyan", "⏳ Starting MCP server..."));
18
+ console.warn(styleText("yellow", "This feature is still under development, use with caution"));
19
+ await startMcpServer();
20
+ await report({ status: "success" });
21
+ } catch (error) {
22
+ await report({ status: "failed" });
23
+ console.error(toError(error).message);
24
+ process.exitCode = 1;
25
+ }
26
+ }
27
+ //#endregion
28
+ export { run };
29
+
30
+ //# sourceMappingURL=run-CZlkqkDc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-CZlkqkDc.js","names":[],"sources":["../src/runners/mcp/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { toError } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { trackRun } from '../../Telemetry.ts'\n\n/**\n * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.\n */\nexport async function run(): Promise<void> {\n const { run: startMcpServer } = (await import('@kubb/mcp')) as typeof McpModule\n\n const report = trackRun({ command: 'mcp', hrStart: process.hrtime() })\n\n try {\n // The MCP stdio transport owns stdout: anything else written there corrupts the JSON-RPC stream.\n console.error(styleText('cyan', '⏳ Starting MCP server...'))\n console.warn(styleText('yellow', 'This feature is still under development, use with caution'))\n await startMcpServer()\n await report({ status: 'success' })\n } catch (error) {\n await report({ status: 'failed' })\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n"],"mappings":";;;;;;;;;AASA,eAAsB,MAAqB;CACzC,MAAM,EAAE,KAAK,mBAAoB,MAAM,OAAO;CAE9C,MAAM,SAAS,SAAS;EAAE,SAAS;EAAO,SAAS,QAAQ,OAAO;CAAE,CAAC;CAErE,IAAI;EAEF,QAAQ,MAAM,UAAU,QAAQ,0BAA0B,CAAC;EAC3D,QAAQ,KAAK,UAAU,UAAU,2DAA2D,CAAC;EAC7F,MAAM,eAAe;EACrB,MAAM,OAAO,EAAE,QAAQ,UAAU,CAAC;CACpC,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,QAAQ,WAAW;CACrB;AACF"}