@kubb/cli 5.12.7 → 5.13.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 (58) hide show
  1. package/dist/{Telemetry-CMgGcwu7.cjs → Telemetry-CzA7GfW7.cjs} +2 -2
  2. package/dist/{Telemetry-CMgGcwu7.cjs.map → Telemetry-CzA7GfW7.cjs.map} +1 -1
  3. package/dist/{Telemetry-DrKtRFON.js → Telemetry-I67lvF8y.js} +2 -2
  4. package/dist/{Telemetry-DrKtRFON.js.map → Telemetry-I67lvF8y.js.map} +1 -1
  5. package/dist/{background-BZkCbNM3.cjs → background-BPwWyywl.cjs} +2 -2
  6. package/dist/{background-BZkCbNM3.cjs.map → background-BPwWyywl.cjs.map} +1 -1
  7. package/dist/{background-BoG8TJzG.js → background-nkOdMBvH.js} +1 -1
  8. package/dist/{background-BqCyi_sa.js → background-xL-mKrxo.js} +2 -2
  9. package/dist/{background-BqCyi_sa.js.map → background-xL-mKrxo.js.map} +1 -1
  10. package/dist/index.cjs +18 -18
  11. package/dist/index.js +18 -18
  12. package/dist/{registry-DQUhk1-E.js → registry-Bn0bgtR3.js} +3 -3
  13. package/dist/{registry-DQUhk1-E.js.map → registry-Bn0bgtR3.js.map} +1 -1
  14. package/dist/{registry-Bmfi_DWI.cjs → registry-CNPqnBjo.cjs} +3 -3
  15. package/dist/{registry-Bmfi_DWI.cjs.map → registry-CNPqnBjo.cjs.map} +1 -1
  16. package/dist/{reporters-BPwAeHx6.js → reporters-BQaxBft9.js} +4 -4
  17. package/dist/{reporters-BPwAeHx6.js.map → reporters-BQaxBft9.js.map} +1 -1
  18. package/dist/{reporters-ByGDYzho.cjs → reporters-B_Lf5MZf.cjs} +4 -4
  19. package/dist/{reporters-ByGDYzho.cjs.map → reporters-B_Lf5MZf.cjs.map} +1 -1
  20. package/dist/{run-B_TsKumr.cjs → run-B1jaIDea.cjs} +6 -6
  21. package/dist/{run-B_TsKumr.cjs.map → run-B1jaIDea.cjs.map} +1 -1
  22. package/dist/{run-5QXtkjqO.js → run-Bg5jzlvC.js} +2 -2
  23. package/dist/{run-5QXtkjqO.js.map → run-Bg5jzlvC.js.map} +1 -1
  24. package/dist/{run-DFgraxGd.js → run-Cg_loIjl.js} +1 -1
  25. package/dist/{run-CC_Ef181.js → run-CmOibezr.js} +7 -7
  26. package/dist/{run-CC_Ef181.js.map → run-CmOibezr.js.map} +1 -1
  27. package/dist/{run-DKhWFtJ_.js → run-DBErftUD.js} +6 -6
  28. package/dist/{run-DKhWFtJ_.js.map → run-DBErftUD.js.map} +1 -1
  29. package/dist/{run-CBtltUAJ.js → run-DUK-Z3tk.js} +4 -4
  30. package/dist/{run-CBtltUAJ.js.map → run-DUK-Z3tk.js.map} +1 -1
  31. package/dist/{run-B-vCt5GI.cjs → run-DjMwepfC.cjs} +4 -4
  32. package/dist/{run-B-vCt5GI.cjs.map → run-DjMwepfC.cjs.map} +1 -1
  33. package/dist/{run-DHlD69Wh.cjs → run-DuOLXXqa.cjs} +2 -2
  34. package/dist/{run-DHlD69Wh.cjs.map → run-DuOLXXqa.cjs.map} +1 -1
  35. package/dist/{run-BYfSyM7V.cjs → run-YmNOYlBE.cjs} +7 -7
  36. package/dist/{run-BYfSyM7V.cjs.map → run-YmNOYlBE.cjs.map} +1 -1
  37. package/dist/{snapshot-l3anxLva.js → snapshot-N8_rfWqr.js} +6 -6
  38. package/dist/{snapshot-l3anxLva.js.map → snapshot-N8_rfWqr.js.map} +1 -1
  39. package/dist/{snapshot-DUh4e8Lg.cjs → snapshot-Smvh93Bg.cjs} +6 -6
  40. package/dist/{snapshot-DUh4e8Lg.cjs.map → snapshot-Smvh93Bg.cjs.map} +1 -1
  41. package/dist/{status-P4hk8_d2.js → status-fSlGI1LJ.js} +3 -3
  42. package/dist/{status-P4hk8_d2.js.map → status-fSlGI1LJ.js.map} +1 -1
  43. package/dist/{status-J176zLXd.cjs → status-gcN3XKIP.cjs} +3 -3
  44. package/dist/{status-J176zLXd.cjs.map → status-gcN3XKIP.cjs.map} +1 -1
  45. package/dist/studioWorker.js +2 -2
  46. package/dist/{summary-BJTGNbZx.js → summary-Beblp31L.js} +3 -3
  47. package/dist/{summary-BJTGNbZx.js.map → summary-Beblp31L.js.map} +1 -1
  48. package/dist/{summary-ByLBw5Yl.cjs → summary-UB5CLh4Z.cjs} +3 -3
  49. package/dist/{summary-ByLBw5Yl.cjs.map → summary-UB5CLh4Z.cjs.map} +1 -1
  50. package/dist/{text-CFjUgZY-.js → text-DvPK4YDj.js} +2 -2
  51. package/dist/{text-CFjUgZY-.js.map → text-DvPK4YDj.js.map} +1 -1
  52. package/dist/{text-B3svCeKt.cjs → text-mhjHGn_Z.cjs} +2 -2
  53. package/dist/{text-B3svCeKt.cjs.map → text-mhjHGn_Z.cjs.map} +1 -1
  54. package/dist/{utils-2v3vv0xg.js → utils-BU7XZRZo.js} +3 -3
  55. package/dist/{utils-2v3vv0xg.js.map → utils-BU7XZRZo.js.map} +1 -1
  56. package/dist/{utils-Da0WSV3s.cjs → utils-DSbCbvNB.cjs} +3 -3
  57. package/dist/{utils-Da0WSV3s.cjs.map → utils-DSbCbvNB.cjs.map} +1 -1
  58. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"reporters-ByGDYzho.cjs","names":["logLevelMap","styleText","styleText","process","formatMsWithColor","getElapsedMs","styleText","logLevelMap","styleText","logLevelMap","process","relative","Diagnostics","styleText","getInputKind","resolve","read","pluralize","pluralize","relative","styleText","styleText","logLevelMap","toPermissionFlag","process","getElapsedMs","Diagnostics","pluralize","formatMs","process","formatMs","getElapsedMs","styleText","pluralize","formatBar","formatMsWithColor","defaultWriter","createCliReporter","logLevelMap","resolve","readOutputFiles","isPathInside","readFile","process","createOutputManifest","cacheStorage","diffOutput"],"sources":["../src/loggers/features/context.ts","../src/loggers/features/generation.ts","../src/loggers/features/phases.ts","../src/loggers/specFrame.ts","../src/loggers/features/problems.ts","../src/loggers/features/progress.ts","../src/loggers/features/session.ts","../src/loggers/features/spinner.ts","../src/loggers/features/walk.ts","../src/loggers/features/index.ts","../src/loggers/reporters.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { type Config, type Hookable, type KubbHooks, logLevel as logLevelMap } from '@kubb/core'\nimport type { LoggerWriter } from '../types.ts'\n\n/**\n * What `installLogger` shares with its features: the writer, the verbosity flags, and the two\n * run-wide flags a feature flips for the others to read.\n */\nexport type LoggerContext = {\n hooks: Hookable<KubbHooks>\n writer: LoggerWriter\n logLevel: number\n silent: boolean\n human: boolean\n /** Set once a rich `kubb studio` session connects: each run then shows as one job line. */\n session: boolean\n /** Whether a config's group is open, so a problem can wait for its end. */\n groupOpen: boolean\n /** Prefixes a `[HH:MM:SS]` timestamp at verbose and above. */\n text: (message: string) => string\n /** `✓ message info`, with the info dimmed. */\n line: (symbol: string, message: string, info?: string) => string\n /** Registers a per-run hook. In a Studio session the job line stands for the whole run, so these stay quiet. */\n onRun: <Name extends keyof KubbHooks & string>(name: Name, fn: (...args: KubbHooks[Name]) => unknown) => () => void\n}\n\nexport function createLoggerContext({ hooks, writer, logLevel }: { hooks: Hookable<KubbHooks>; writer: LoggerWriter; logLevel: number }): LoggerContext {\n const text = (message: string) => (logLevel >= logLevelMap.verbose ? `${styleText('dim', `[${clock()}]`)} ${message}` : message)\n const ctx: LoggerContext = {\n hooks,\n writer,\n logLevel,\n silent: logLevel <= logLevelMap.silent,\n human: writer.audience === 'human',\n session: false,\n groupOpen: false,\n text,\n line: (symbol, message, info) => text([symbol, message, info && styleText('dim', info)].filter(Boolean).join(' ')),\n onRun(name, fn) {\n return hooks.hook(name, (...args) => (ctx.session ? undefined : fn(...args)))\n },\n }\n return ctx\n}\n\n/** `HH:MM:SS` in 24-hour time. */\nexport function clock(date = new Date()): string {\n return date.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\n/** Display path for a config's input: the string form, or its `path` field when the input is an object. */\nexport function 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","import { styleText } from 'node:util'\nimport type { SummaryRenderer } from '@kubb/core'\nimport type { LogStatus } from '../types.ts'\nimport { getInputPath, type LoggerContext } from './context.ts'\nimport type { Phases } from './phases.ts'\nimport type { Problems } from './problems.ts'\nimport type { Progress } from './progress.ts'\nimport type { Spinner } from './spinner.ts'\nimport type { Walk } from './walk.ts'\n\n/**\n * One config's run: the group it opens, the state every feature resets at its start, and the\n * closing line, which the lifecycle end draws too for a run that threw before its summary.\n */\nexport function createGeneration(\n ctx: LoggerContext,\n { spinner, progress, walk, phases, problems }: { spinner: Spinner; progress: Progress; walk: Walk; phases: Phases; problems: Problems },\n): { renderSummary: SummaryRenderer } {\n const { writer, silent, human, text, hooks, onRun } = ctx\n\n function reset() {\n spinner.reset()\n progress.reset()\n walk.reset()\n phases.reset()\n problems.reset()\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 (!ctx.groupOpen) {\n return\n }\n ctx.groupOpen = false\n\n spinner.stop()\n progress.stop()\n writer.groupEnd(status === 'failed' ? styleText('red', problems.failedTitle()) : styleText('green', '✓ Generation succeeded'))\n }\n\n hooks.hook('kubb:lifecycle:start', () => {\n reset()\n })\n\n onRun('kubb:generation:start', ({ config }) => {\n closeGroup('failed')\n reset()\n\n walk.state.totalPlugins = config.plugins?.length ?? 0\n progress.state.inMemory = config.storage?.name === 'memory'\n problems.setSpec(config)\n\n if (silent) {\n return\n }\n\n const input = getInputPath(config)\n writer.group(text([styleText('bold', config.name ?? 'kubb'), input ? styleText('dim', input) : undefined].filter(Boolean).join(' ')))\n ctx.groupOpen = true\n\n spinner.start('Parsing spec')\n })\n\n onRun('kubb:generation:end', async ({ diagnostics = [] }) => {\n spinner.stop()\n progress.stop()\n problems.state.diagnostics = diagnostics\n await problems.flush()\n })\n\n hooks.hook('kubb:lifecycle:end', async () => {\n await problems.flush()\n closeGroup('failed')\n reset()\n })\n\n const renderSummary: SummaryRenderer = (lines, { status }) => {\n if (silent || !ctx.groupOpen) {\n return\n }\n\n spinner.stop()\n progress.stop()\n if (human) closeGroup(status)\n ctx.groupOpen = false\n writer.diagnostic([...lines])\n }\n\n return { renderSummary }\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getElapsedMs } from '@internals/utils'\nimport { logLevel as logLevelMap } from '@kubb/core'\nimport { formatMsWithColor } from '../banner.ts'\nimport type { LoggerContext } from './context.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Phases = ReturnType<typeof createPhases>\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 = StartPhaseOptions & {\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 /**\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}\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/** A hook's display name: its `name`, or the command line it runs. */\nfunction formatHookLabel({ command, name, args }: { command: string; name?: string; args?: ReadonlyArray<string> }): string {\n return name ?? (args?.length ? `${command} ${args.join(' ')}` : command)\n}\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/** The format, lint and post-generate phases, and the hooks and messages they buffer while their step owns the line. */\nexport function createPhases({ writer, silent, logLevel, text, line, onRun }: LoggerContext, spinner: Spinner) {\n const state = {\n phase: null as Phase | null,\n hooks: new Map<string, { hrStart: [number, number]; lines: Array<string> }>(),\n }\n\n function startPhase(options: StartPhaseOptions) {\n state.phase = { ...options, failed: false, hrStart: process.hrtime(), lines: [], output: [] }\n spinner.start(options.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 spinner.stop(phase.failed ? `${phase.failure} after ${duration}` : `${phase.success} 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 onRun('kubb:format:start', () => startPhase(PHASES.format))\n onRun('kubb:format:end', endPhase)\n onRun('kubb:lint:start', () => startPhase(PHASES.lint))\n onRun('kubb:lint:end', endPhase)\n onRun('kubb:hooks:start', () => startPhase(PHASES.hooks))\n onRun('kubb:hooks:end', endPhase)\n\n onRun('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. `stdout` and `stderr` only exist on a failed result.\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', formatHookLabel({ command, name, args }))\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 spinner.stop()\n writer.step(text(result))\n writeOutput(active.lines)\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 onRun('kubb:info', ({ message, info }) => {\n const formatted = line(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(formatted)\n return\n }\n if (spinner.message(formatted)) {\n return\n }\n writer.info(formatted)\n })\n\n onRun('kubb:success', ({ message, info }) => {\n const formatted = line(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 (spinner.message(formatted)) {\n return\n }\n writer.success(formatted)\n })\n\n onRun('kubb:hook:start', ({ id, command, name, args }) => {\n if (!id) {\n return\n }\n state.hooks.set(id, { hrStart: process.hrtime(), lines: [] })\n spinner.message(text(`Running ${styleText('dim', formatHookLabel({ command, name, args }))}`))\n })\n\n onRun('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 /** The phase whose step owns the line, so a failure or an info line can wait for it. */\n get phase(): Phase | null {\n return state.phase\n },\n reset() {\n state.phase = null\n state.hooks = new Map()\n },\n }\n}\n","import { styleText } from 'node:util'\nimport type { Adapter, DiagnosticLocation } from '@kubb/core'\n\n/**\n * A location in source text, with a terminal code frame that underlines it.\n */\nexport type SpecPosition = {\n line: number\n column: number\n frame: Array<string>\n}\n\n/**\n * Where `location` sits in `source` according to its adapter, with a code frame. `undefined` when the adapter cannot place it.\n */\nexport function locateInSpec({ adapter, source, location }: { adapter: Adapter; source: string; location: DiagnosticLocation }): SpecPosition | undefined {\n const lines = source.split(/\\r?\\n/)\n try {\n const range = adapter.locate?.(source, location)\n if (!range) return undefined\n const before = source.slice(0, range.start).split('\\n')\n const line = before.length\n const column = before.at(-1)!.length + 1\n const text = lines[line - 1] ?? ''\n const width = String(line).length\n const gutter = (number?: number) => styleText('dim', `${number === undefined ? ''.padStart(width) : String(number).padStart(width)} │`)\n const carets = '^'.repeat(Math.max(1, Math.min(range.end - range.start, text.length - column + 1)))\n return {\n line,\n column,\n frame: [\n ...(line > 1 ? [`${gutter(line - 1)} ${lines[line - 2]}`] : []),\n `${gutter(line)} ${text}`,\n `${gutter()} ${' '.repeat(column - 1)}${styleText('red', carets)}`,\n ],\n }\n } catch {\n return undefined\n }\n}\n","import { relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { read } from '@internals/utils'\nimport type { Adapter, Config, Diagnostic, DiagnosticFormatOptions, ProblemDiagnostic } from '@kubb/core'\nimport { Diagnostics, getInputKind, logLevel as logLevelMap } from '@kubb/core'\nimport { pluralize } from '../../ui/text.ts'\nimport { locateInSpec } from '../specFrame.ts'\nimport { getInputPath, type LoggerContext } from './context.ts'\nimport type { Phases } from './phases.ts'\nimport type { Progress } from './progress.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Problems = ReturnType<typeof createProblems>\n\n/** Warnings, errors and diagnostics: printed as they come, or held back and grouped by plugin once a human's build ends. */\nexport function createProblems(ctx: LoggerContext, spinner: Spinner, progress: Progress, phases: Phases) {\n const { writer, silent, human, logLevel, text, line, hooks } = ctx\n const { audience } = writer\n const formatOptions: DiagnosticFormatOptions = {\n audience,\n verbose: logLevel >= logLevelMap.verbose,\n // The code lines up at the right edge, inside the group indent and the human view's per-problem indent.\n width: Math.min(process.stdout.columns || 80, 100) - (audience === 'human' ? 4 : 2),\n }\n const state = {\n /** Problems held back so the human view can print them grouped by plugin once the build ends. */\n problems: [] as Array<ProblemDiagnostic>,\n /** The finished config's diagnostics, for the closing verdict. */\n diagnostics: [] as Array<Diagnostic>,\n /** A local-file input, which a located diagnostic points into; `load` parses it once, on the first such diagnostic. */\n spec: undefined as { path: string; adapter: Adapter; source: Promise<string | undefined> } | undefined,\n }\n\n /** Format options for one problem, with its line and column in a local spec when its pointer resolves there. */\n async function optionsFor(problem: ProblemDiagnostic): Promise<DiagnosticFormatOptions> {\n const { location } = problem\n const { spec } = state\n if (!location || !spec) {\n return formatOptions\n }\n\n const source = await spec.source\n const position = source && locateInSpec({ adapter: spec.adapter, source, location })\n if (!position) {\n return formatOptions\n }\n return { ...formatOptions, position: { file: relative(process.cwd(), spec.path), ...position } }\n }\n\n /**\n * Prints problems grouped under their plugin's name, each with the code aligned at the right.\n */\n async function writeProblems(problems: ReadonlyArray<ProblemDiagnostic>) {\n if (!problems.length) {\n return\n }\n const formatted = await Promise.all(problems.map(async (problem) => Diagnostics.format(problem, await optionsFor(problem))))\n if (!human) {\n for (const lines of formatted) writer.diagnostic(lines)\n return\n }\n\n const byPlugin = Map.groupBy(\n problems.map((problem, index) => ({ plugin: problem.plugin ?? '', lines: formatted[index]! })),\n ({ plugin }) => plugin,\n )\n const lines = [...byPlugin].flatMap(([plugin, group]) => [\n ...(plugin ? [` ${styleText('bold', plugin)}`, ''] : []),\n ...group.flatMap((entry) => [...entry.lines.map((entryLine) => ` ${entryLine}`), '']),\n ])\n writer.diagnostic(lines.slice(0, -1))\n }\n\n hooks.hook('kubb:warn', ({ message, info }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n writer.warn(line(styleText('yellow', '⚠'), message, logLevel >= logLevelMap.info ? info : undefined))\n })\n\n // Unguarded: a failure stays visible even at silent.\n hooks.hook('kubb:error', ({ error }) => {\n const phase = phases.phase\n if (phase) {\n phase.failed = true\n }\n\n // Rendered as a `KUBB_UNKNOWN` diagnostic, so the output alone says what broke and where. The\n // name tells a `TypeError` from a plain `Error`.\n const message = error.name === 'Error' || Diagnostics.isError(error) ? error.message : `${error.name}: ${error.message}`\n const help = Diagnostics.isError(error) ? error.diagnostic.help : undefined\n const [headline = '', ...details] = Diagnostics.format({ code: Diagnostics.code.unknown, severity: 'error', message, help, cause: error }, formatOptions)\n\n if (!human) {\n spinner.stop()\n progress.stop()\n writer.diagnostic([headline, ...details])\n return\n }\n\n // The writer draws the error symbol, so the message goes in bare.\n if (spinner.active) {\n spinner.stop(message, 'failed')\n } else {\n writer.error(text(message))\n }\n if (details.length) {\n writer.block(details.map(text))\n }\n })\n\n hooks.hook('kubb:diagnostic', async ({ 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 // A Studio job's problems show in Studio; its job line counts the errors.\n if (ctx.session && !Diagnostics.isUpdate(diagnostic)) {\n return\n }\n\n spinner.stop()\n progress.stop()\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 // Inside a build, the human view waits for the end to group by plugin.\n if (human && ctx.groupOpen) {\n state.problems.push(diagnostic)\n return\n }\n await writeProblems([diagnostic])\n })\n\n return {\n state,\n /** Points located diagnostics into the config's input when it is a local file. */\n setSpec(config: Config) {\n const input = getInputPath(config)\n if (input && config.adapter?.locate && getInputKind(input) === 'file') {\n const path = resolve(config.root, input)\n // Read lazily, once, and only when a diagnostic needs a frame.\n let source: Promise<string | undefined> | undefined\n state.spec = {\n path,\n adapter: config.adapter,\n get source() {\n return (source ??= read(path).catch(() => undefined))\n },\n }\n }\n },\n /** Prints the problems held back so far. */\n flush() {\n return writeProblems(state.problems.splice(0))\n },\n /** `✖ Failed 1 error · 1 warning in plugin-ts` once the build ended, or `✗ Generation failed` for a run that stopped early. */\n failedTitle(): string {\n const { errors, warnings } = Diagnostics.count(state.diagnostics)\n const counts = [errors && pluralize(errors, 'error'), warnings && pluralize(warnings, 'warning')].filter(Boolean).join(' · ')\n if (!human || !counts) {\n return '✗ Generation failed'\n }\n const plugins = Diagnostics.failedPlugins(state.diagnostics)\n return `✖ Failed ${counts}${plugins.length ? ` in ${plugins.join(', ')}` : ''}`\n },\n reset() {\n Object.assign(state, { problems: [], diagnostics: [], spec: undefined })\n },\n }\n}\n","import { relative } from 'node:path'\nimport { styleText } from 'node:util'\nimport { pluralize } from '../../ui/text.ts'\nimport type { WriterProgress } from '../types.ts'\nimport type { LoggerContext } from './context.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Progress = ReturnType<typeof createProgress>\n\n/** The progress bar over the file writes, and the counts the summary line shows. */\nexport function createProgress({ writer, silent, text, onRun }: LoggerContext, spinner: Spinner) {\n const state = {\n progress: null as WriterProgress | null,\n totalFiles: 0,\n processedFiles: 0,\n /** Whether this run keeps its files in memory, as a `kubb studio` run without `--allow-write` does. */\n inMemory: false,\n }\n\n function stop(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 if (!silent) {\n onRun('kubb:files:processing:start', ({ files }) => {\n spinner.stop()\n state.totalFiles = files.length\n state.processedFiles = 0\n\n state.progress = writer.progress(files.length)\n state.progress.start(text(`${state.inMemory ? 'Generating' : 'Writing'} ${pluralize(files.length, 'file')}`))\n })\n\n onRun('kubb:files:processing:update', ({ files }) => {\n for (const { file, config } of files) {\n state.processedFiles++\n state.progress?.advance(`${state.inMemory ? 'Generating' : 'Writing'} ${relative(config.root, file.path)}`)\n }\n })\n\n onRun('kubb:files:processing:end', ({ files, unchanged }) => {\n const skipped = unchanged.length ? styleText('dim', ` · ${unchanged.length} unchanged`) : ''\n stop(\n state.inMemory\n ? `Generated ${pluralize(state.processedFiles, 'file')} in memory`\n : `Wrote ${pluralize(files.length - unchanged.length, 'file')}${skipped}`,\n )\n })\n }\n\n return {\n state,\n stop,\n reset() {\n stop()\n Object.assign(state, { totalFiles: 0, processedFiles: 0, inMemory: false })\n },\n }\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { Diagnostics, logLevel as logLevelMap } from '@kubb/core'\nimport { pluralize, toPermissionFlag } from '../../ui/text.ts'\nimport { clock, type LoggerContext } from './context.ts'\nimport type { Spinner } from './spinner.ts'\n\n/** One line of a Studio session's job log: the time, the command, who asked for it, and how it ended. */\nfunction formatJobLine({ command, result, requestedBy }: { command: string; result: string; requestedBy?: string }): string {\n const by = requestedBy ? `${styleText('dim', `by ${requestedBy}`.padEnd(16))} ` : ''\n return `${styleText('dim', clock())} ${command.padEnd(10)} ${by}${result}`\n}\n\n/**\n * A `kubb studio` session. It emits these on the same emitter as its generations, so one logger\n * renders the whole command: the connection, then one job line per command.\n */\nexport function createSession(ctx: LoggerContext, spinner: Spinner) {\n const { writer, silent, human, logLevel, text, hooks } = ctx\n\n hooks.hook('studio:disconnected', ({ code, reason }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n spinner.stop()\n // 4002 is `AgentCloseCode.SUPERSEDED`, spelled out because `@kubb/studio` is an optional peer.\n if (code === 4002) {\n writer.warn(text('⚠ Another process connected to Kubb Studio as this agent, so this one stopped'))\n return\n }\n writer.warn(text(`⚠ Kubb Studio ended the session (${reason || `code ${code}`})`))\n })\n\n hooks.hook('studio:warn', ({ message, permission }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n const remedy = permission ? `; pass ${toPermissionFlag(permission)} to allow it` : ''\n // A warning drawn under a running spinner leaves a stale spinner frame above it, so it pauses the spinner like a job line does.\n const paused = spinner.active\n spinner.stop()\n writer.warn(text(`⚠ ${message}${remedy}`))\n if (paused) spinner.start('Ready for jobs')\n })\n\n // Unguarded, like `kubb:error`: a failure stays visible even at silent.\n hooks.hook('studio:error', ({ error }) => {\n if (spinner.active) {\n spinner.stop(error.message, 'failed')\n return\n }\n writer.error(text(error.message))\n })\n\n if (silent) {\n return\n }\n\n // The last generation's outcome, for the job line `studio:command` prints after it.\n let job: { fileCount: number; ms: number; errors: number } | null = null\n\n hooks.hook('studio:connected', ({ url, versions: { studio, kubb, agent } }) => {\n ctx.session = human\n spinner.stop()\n // The runtime version shows only when it differs from the host's.\n const versions = [`v${agent}`, kubb !== agent ? `runtime v${kubb}` : undefined, `Studio v${studio}`].filter(Boolean).join(' · ')\n writer.success(text(`✓ Connected to ${styleText('cyan', url)} ${styleText('dim', `· ${versions}`)}`))\n spinner.start('Ready for jobs')\n })\n\n hooks.hook('kubb:generation:start', () => {\n if (ctx.session) spinner.message(text('Generating'))\n })\n\n hooks.hook('kubb:generation:end', ({ diagnostics = [], filesCreated = 0, status, hrStart = process.hrtime() }) => {\n job = { fileCount: filesCreated, ms: getElapsedMs(hrStart), errors: status === 'failed' ? Diagnostics.count(diagnostics).errors : 0 }\n })\n\n hooks.hook('studio:command', ({ command, info, requestedBy, failed }) => {\n spinner.stop()\n const took = command === 'generate' && job ? `${pluralize(job.fileCount, 'file')} in ${formatMs(job.ms)} ` : ''\n const result = failed\n ? `${styleText('red', '✖')} ${job?.errors ? pluralize(job.errors, 'error') : 'failed'}, see Studio`\n : `${styleText('green', '✓')} ${took}${styleText('dim', `(${info})`)}`\n writer.info(formatJobLine({ command, requestedBy, result }))\n job = null\n spinner.start('Ready for jobs')\n })\n\n hooks.hook('studio:reconnecting', ({ delayMs }) => {\n spinner.stop()\n writer.info(text(styleText('dim', `Retrying connection to Kubb Studio in ${formatMs(delayMs)}`)))\n })\n}\n","import type { LogStatus, WriterSpinner } from '../types.ts'\nimport type { LoggerContext } from './context.ts'\n\nexport type Spinner = ReturnType<typeof createSpinner>\n\n/** The step whose end is not known when it starts: the spec parse, the node walk, a phase, or a Studio session waiting for jobs. */\nexport function createSpinner({ writer, silent, text }: LoggerContext) {\n let spinner: WriterSpinner | null = null\n\n function stop(message?: string, status: LogStatus = 'success') {\n const active = spinner\n if (!active) {\n return\n }\n spinner = null\n\n if (message === undefined) {\n active.clear()\n return\n }\n if (status === 'failed') {\n active.error(text(message))\n return\n }\n active.stop(text(message))\n }\n\n return {\n /** Whether a spinner is drawing right now. */\n get active(): boolean {\n return spinner !== null\n },\n start(message: string) {\n if (silent) {\n return\n }\n\n spinner = writer.spinner()\n spinner.start(text(message))\n },\n stop,\n /** Redraws the spinner's line. `false` when no spinner is running, so the caller prints the line itself. */\n message(line: string): boolean {\n if (!spinner) {\n return false\n }\n spinner.message(line)\n return true\n },\n reset: () => stop(),\n }\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { formatBar, formatMsWithColor } from '../banner.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport type { LoggerContext } from './context.ts'\nimport type { Progress } from './progress.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Walk = ReturnType<typeof createWalk>\n\n/** Milliseconds between redraws of the live generation block, about clack's spinner frame rate. */\nconst WALK_REDRAW_MS = 80\n\nfunction createState() {\n return {\n totalPlugins: 0,\n completedPlugins: 0,\n failedPlugins: 0,\n /** `process.hrtime()` snapshot taken at the start of generation, for the elapsed time. */\n hrStart: process.hrtime(),\n /** Plugin results held back while the generation step owns the line. */\n pluginLines: [] as Array<string>,\n /** The node walk's live state: the spec's node total, the distinct nodes generated, and each plugin's count and current node. */\n walk: { total: 0, visited: new Set<string>(), plugins: new Map<string, { count: number; current: string }>() },\n lastWalkDraw: 0,\n }\n}\n\n/** The node walk the plugins share: the live generation block, and the plugin results printed once the walk ends. */\nexport function createWalk({ writer, silent, human, text, onRun }: LoggerContext, spinner: Spinner, progress: Progress) {\n const state = createState()\n\n /** The progress summary line the clack logger shows, `null` when there is nothing to display. */\n function buildProgressLine(): string | null {\n const parts: Array<string> = []\n const duration = formatMs(getElapsedMs(state.hrStart))\n const { totalFiles, processedFiles } = progress.state\n\n if (state.totalPlugins > 0) {\n const failed = state.failedPlugins > 0 ? ` ${styleText('red', `(${state.failedPlugins} failed)`)}` : ''\n parts.push(`Plugins ${styleText('green', state.completedPlugins.toString())}/${state.totalPlugins}${failed}`)\n }\n\n if (totalFiles > 0) {\n parts.push(`Files ${styleText('green', processedFiles.toString())}/${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\n if (!silent) {\n onRun('kubb:build:start', ({ nodeCounts: { schemas, operations } }) => {\n state.walk.total = schemas + operations\n const details = `${pluralize(schemas, 'schema')} · ${pluralize(operations, 'operation')} · ${formatMs(getElapsedMs(state.hrStart))}`\n spinner.stop(`Parsed spec ${styleText('dim', details)}`)\n spinner.start('Generating')\n })\n\n // Plugins all end after one shared node walk, so per-node hooks keep the step live; plain output would get a line per node.\n if (human) {\n const onNode = (key: string, name: string, plugin: string) => {\n const { total, visited, plugins } = state.walk\n visited.add(key)\n plugins.set(plugin, { count: (plugins.get(plugin)?.count ?? 0) + 1, current: name })\n\n // Counting stays per node; the redraw waits for the spinner's next frame.\n const now = Date.now()\n if (now - state.lastWalkDraw < WALK_REDRAW_MS) return\n state.lastWalkDraw = now\n\n const elapsed = styleText('dim', formatMs(getElapsedMs(state.hrStart)))\n const head = total\n ? `Generating ${formatBar(visited.size, total)} ${visited.size}/${total} nodes ${elapsed}`\n : `Generating ${pluralize(visited.size, 'node')} ${elapsed}`\n const width = Math.max(...[...plugins.keys()].map((pluginName) => pluginName.length))\n const rows = [...plugins].map(\n ([pluginName, row]) =>\n `${styleText('dim', '│')} ${pluginName.padEnd(width)} ${styleText('dim', String(row.count).padStart(4))} ${styleText('cyan', row.current)}`,\n )\n spinner.message(text([head, ...rows].join('\\n')))\n }\n\n onRun('kubb:generate:schema', (node, { plugin }) => onNode(`schema:${node.name}`, node.name ?? 'schema', plugin.name))\n onRun('kubb:generate:operation', (node, { plugin }) => onNode(`operation:${node.operationId}`, node.operationId, plugin.name))\n }\n\n // Buffered, not printed: a step redraws over anything written while it runs.\n onRun('kubb:plugin:end', ({ plugin, duration, success }) => {\n state[success ? 'completedPlugins' : 'failedPlugins']++\n state.pluginLines.push(text(`${plugin.name} ${success ? 'completed' : 'failed'} in ${formatMsWithColor(duration)}`))\n })\n\n onRun('kubb:plugins:end', () => {\n const failed = state.failedPlugins > 0\n spinner.stop(buildProgressLine() ?? undefined, failed ? 'failed' : 'success')\n\n if (state.pluginLines.length) {\n writer.block(state.pluginLines)\n state.pluginLines = []\n }\n })\n }\n\n return {\n state,\n reset() {\n Object.assign(state, createState())\n },\n }\n}\n","import type { Hookable, KubbHooks, SummaryRenderer } from '@kubb/core'\nimport type { LoggerWriter } from '../types.ts'\nimport { createLoggerContext } from './context.ts'\nimport { createGeneration } from './generation.ts'\nimport { createPhases } from './phases.ts'\nimport { createProblems } from './problems.ts'\nimport { createProgress } from './progress.ts'\nimport { createSession } from './session.ts'\nimport { createSpinner } from './spinner.ts'\nimport { createWalk } from './walk.ts'\n\n/**\n * Wires a {@link LoggerWriter} onto the run's hooks. Each feature registers the hooks for one\n * concern, so every writer reports the same run in the same order: one group per config, a step\n * over the plugin work, a progress bar for the writes, one step per output phase, then the summary.\n * It hands back `renderSummary`, which writes the `cli` reporter's summary inside the group opened\n * for that config and closes the group.\n */\nexport function installLogger({ hooks, writer, logLevel }: { hooks: Hookable<KubbHooks>; writer: LoggerWriter; logLevel: number }): {\n renderSummary: SummaryRenderer\n} {\n const ctx = createLoggerContext({ hooks, writer, logLevel })\n const spinner = createSpinner(ctx)\n const progress = createProgress(ctx, spinner)\n const walk = createWalk(ctx, spinner, progress)\n const phases = createPhases(ctx, spinner)\n const problems = createProblems(ctx, spinner, progress, phases)\n createSession(ctx, spinner)\n return createGeneration(ctx, { spinner, progress, walk, phases, problems })\n}\n","import process from 'node:process'\nimport { resolve } from 'node:path'\nimport { readFile } from 'node:fs/promises'\nimport { isPathInside } from '@internals/utils'\nimport type { GenerationResult, Hookable, KubbHooks, Reporter, ReporterContext } from '@kubb/core'\nimport { cacheStorage, createCliReporter, createOutputManifest, logLevel as logLevelMap } from '@kubb/core'\nimport { writer as defaultWriter } from '../ui/log.ts'\nimport { installLogger } from './features/index.ts'\nimport type { LoggerWriter } from './types.ts'\nimport { diffOutput, readOutputFiles } from '../runners/generate/utils.ts'\n\n/** Installs the live logger and wires the selected reporters. `cli` renders its summary through the logger, and is skipped when `json` owns stdout. */\nfunction setupReporters(\n context: Hookable<KubbHooks>,\n {\n logLevel,\n reporters,\n writer = defaultWriter(),\n dryRun = false,\n }: {\n /** Output verbosity. Use the `logLevel` constants exported from `@kubb/core`. */\n logLevel: number\n reporters: ReadonlyArray<Reporter>\n /** Overrides the terminal-based pick, e.g. the plain writer for `kubb studio snapshot`. */\n writer?: LoggerWriter\n /**\n * Labels the memory-backed generation as a preview rather than a completed write.\n */\n dryRun?: boolean\n },\n): void {\n const hasJson = reporters.some((reporter) => reporter.name === 'json')\n const selected = reporters.flatMap((reporter) => {\n if (reporter.name !== 'cli') return [reporter]\n if (hasJson) return []\n return [createCliReporter({ render: installLogger({ hooks: context, writer, logLevel }).renderSummary })]\n })\n const ctx: ReporterContext = { logLevel }\n const pluginFiles = selected.some((reporter) => reporter.needsPluginFiles) ? new Map<string, Array<string>>() : undefined\n const seen = new Set<string>()\n if (pluginFiles) {\n context.hook('kubb:plugin:end', ({ plugin, files }) => {\n for (const file of files) {\n if (seen.has(file.path)) continue\n seen.add(file.path)\n const paths = pluginFiles.get(plugin.name) ?? []\n paths.push(file.path)\n pluginFiles.set(plugin.name, paths)\n }\n })\n }\n\n // Configs generate one at a time, so the last write before `kubb:generation:end` is this config's.\n let filesUnchanged = 0\n let previous: Map<string, string> | undefined\n let paths: Array<string> = []\n let outputPath = ''\n const trackChanges = selected.some((reporter) => reporter.name === 'cli') && logLevel > logLevelMap.silent\n context.hook('kubb:generation:start', async ({ config }) => {\n pluginFiles?.clear()\n seen.clear()\n filesUnchanged = 0\n paths = []\n outputPath = resolve(config.root, config.output.path)\n previous = trackChanges && (dryRun || config.storage?.name === 'fs') ? await readOutputFiles(outputPath) : undefined\n })\n context.hook('kubb:files:processing:start', async ({ files }) => {\n if (!previous) return\n // Plugin output can live outside the main output folder; capture it before writes start.\n for (const file of files) {\n if (previous.has(file.path) || isPathInside(outputPath, file.path)) continue\n const source = await readFile(file.path, 'utf8').catch(() => null)\n if (source !== null) previous.set(file.path, source)\n }\n })\n context.hook('kubb:files:processing:end', ({ files, unchanged }) => {\n filesUnchanged = unchanged.length\n paths = files.map((file) => file.path)\n })\n\n context.hook('kubb:generation:end', async ({ config, storage, diagnostics = [], filesCreated = 0, status = 'success', hrStart = process.hrtime() }) => {\n const result: GenerationResult = { config, diagnostics, filesCreated, filesUnchanged, dryRun, status, hrStart }\n const cliResult = { ...result }\n if (previous && status !== 'failed') {\n const manifest = dryRun ? await createOutputManifest({ storage, cache: cacheStorage({ root: config.root }) }) : undefined\n const diff = await diffOutput({\n storage,\n paths,\n clean: Boolean(config.output.clean),\n manifest,\n previousFiles: previous,\n })\n const changes = { added: 0, modified: 0, deleted: 0, linesAdded: 0, linesRemoved: 0 }\n const counts = { A: 'added', M: 'modified', D: 'deleted' } as const\n for (const file of diff.files) {\n changes[counts[file.status]]++\n changes.linesAdded += file.added ?? 0\n changes.linesRemoved += file.removed ?? 0\n }\n cliResult.filesCreated = changes.added + changes.modified + diff.unchanged\n cliResult.filesUnchanged = diff.unchanged\n cliResult.fileChanges = changes\n }\n for (const reporter of selected) {\n const grouped = reporter.needsPluginFiles && pluginFiles?.size ? [...pluginFiles].map(([plugin, files]) => ({ plugin, files: [...files] })) : undefined\n await reporter.report({ ...(reporter.name === 'cli' ? cliResult : result), pluginFiles: grouped }, ctx)\n }\n })\n\n context.hook('kubb:lifecycle:end', async () => {\n for (const reporter of selected) await reporter.drain?.(ctx)\n })\n}\n\nexport default setupReporters\n\n/** Picks the reporters whose `name` is in `names`, in the given order (the CLI maps `--reporter` to this); duplicates and unknown names are skipped. */\nexport function selectReporters(reporters: ReadonlyArray<Reporter>, names: ReadonlyArray<string>): Array<Reporter> {\n return [...new Set(names)].flatMap((name) => reporters.find((reporter) => reporter.name === name) ?? [])\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reporters-B_Lf5MZf.cjs","names":["logLevelMap","styleText","styleText","process","formatMsWithColor","getElapsedMs","styleText","logLevelMap","styleText","logLevelMap","process","relative","Diagnostics","styleText","getInputKind","resolve","read","pluralize","pluralize","relative","styleText","styleText","logLevelMap","toPermissionFlag","process","getElapsedMs","Diagnostics","pluralize","formatMs","process","formatMs","getElapsedMs","styleText","pluralize","formatBar","formatMsWithColor","defaultWriter","createCliReporter","logLevelMap","resolve","readOutputFiles","isPathInside","readFile","process","createOutputManifest","cacheStorage","diffOutput"],"sources":["../src/loggers/features/context.ts","../src/loggers/features/generation.ts","../src/loggers/features/phases.ts","../src/loggers/specFrame.ts","../src/loggers/features/problems.ts","../src/loggers/features/progress.ts","../src/loggers/features/session.ts","../src/loggers/features/spinner.ts","../src/loggers/features/walk.ts","../src/loggers/features/index.ts","../src/loggers/reporters.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { type Config, type Hookable, type KubbHooks, logLevel as logLevelMap } from '@kubb/core'\nimport type { LoggerWriter } from '../types.ts'\n\n/**\n * What `installLogger` shares with its features: the writer, the verbosity flags, and the two\n * run-wide flags a feature flips for the others to read.\n */\nexport type LoggerContext = {\n hooks: Hookable<KubbHooks>\n writer: LoggerWriter\n logLevel: number\n silent: boolean\n human: boolean\n /** Set once a rich `kubb studio` session connects: each run then shows as one job line. */\n session: boolean\n /** Whether a config's group is open, so a problem can wait for its end. */\n groupOpen: boolean\n /** Prefixes a `[HH:MM:SS]` timestamp at verbose and above. */\n text: (message: string) => string\n /** `✓ message info`, with the info dimmed. */\n line: (symbol: string, message: string, info?: string) => string\n /** Registers a per-run hook. In a Studio session the job line stands for the whole run, so these stay quiet. */\n onRun: <Name extends keyof KubbHooks & string>(name: Name, fn: (...args: KubbHooks[Name]) => unknown) => () => void\n}\n\nexport function createLoggerContext({ hooks, writer, logLevel }: { hooks: Hookable<KubbHooks>; writer: LoggerWriter; logLevel: number }): LoggerContext {\n const text = (message: string) => (logLevel >= logLevelMap.verbose ? `${styleText('dim', `[${clock()}]`)} ${message}` : message)\n const ctx: LoggerContext = {\n hooks,\n writer,\n logLevel,\n silent: logLevel <= logLevelMap.silent,\n human: writer.audience === 'human',\n session: false,\n groupOpen: false,\n text,\n line: (symbol, message, info) => text([symbol, message, info && styleText('dim', info)].filter(Boolean).join(' ')),\n onRun(name, fn) {\n return hooks.hook(name, (...args) => (ctx.session ? undefined : fn(...args)))\n },\n }\n return ctx\n}\n\n/** `HH:MM:SS` in 24-hour time. */\nexport function clock(date = new Date()): string {\n return date.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' })\n}\n\n/** Display path for a config's input: the string form, or its `path` field when the input is an object. */\nexport function 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","import { styleText } from 'node:util'\nimport type { SummaryRenderer } from '@kubb/core'\nimport type { LogStatus } from '../types.ts'\nimport { getInputPath, type LoggerContext } from './context.ts'\nimport type { Phases } from './phases.ts'\nimport type { Problems } from './problems.ts'\nimport type { Progress } from './progress.ts'\nimport type { Spinner } from './spinner.ts'\nimport type { Walk } from './walk.ts'\n\n/**\n * One config's run: the group it opens, the state every feature resets at its start, and the\n * closing line, which the lifecycle end draws too for a run that threw before its summary.\n */\nexport function createGeneration(\n ctx: LoggerContext,\n { spinner, progress, walk, phases, problems }: { spinner: Spinner; progress: Progress; walk: Walk; phases: Phases; problems: Problems },\n): { renderSummary: SummaryRenderer } {\n const { writer, silent, human, text, hooks, onRun } = ctx\n\n function reset() {\n spinner.reset()\n progress.reset()\n walk.reset()\n phases.reset()\n problems.reset()\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 (!ctx.groupOpen) {\n return\n }\n ctx.groupOpen = false\n\n spinner.stop()\n progress.stop()\n writer.groupEnd(status === 'failed' ? styleText('red', problems.failedTitle()) : styleText('green', '✓ Generation succeeded'))\n }\n\n hooks.hook('kubb:lifecycle:start', () => {\n reset()\n })\n\n onRun('kubb:generation:start', ({ config }) => {\n closeGroup('failed')\n reset()\n\n walk.state.totalPlugins = config.plugins?.length ?? 0\n progress.state.inMemory = config.storage?.name === 'memory'\n problems.setSpec(config)\n\n if (silent) {\n return\n }\n\n const input = getInputPath(config)\n writer.group(text([styleText('bold', config.name ?? 'kubb'), input ? styleText('dim', input) : undefined].filter(Boolean).join(' ')))\n ctx.groupOpen = true\n\n spinner.start('Parsing spec')\n })\n\n onRun('kubb:generation:end', async ({ diagnostics = [] }) => {\n spinner.stop()\n progress.stop()\n problems.state.diagnostics = diagnostics\n await problems.flush()\n })\n\n hooks.hook('kubb:lifecycle:end', async () => {\n await problems.flush()\n closeGroup('failed')\n reset()\n })\n\n const renderSummary: SummaryRenderer = (lines, { status }) => {\n if (silent || !ctx.groupOpen) {\n return\n }\n\n spinner.stop()\n progress.stop()\n if (human) closeGroup(status)\n ctx.groupOpen = false\n writer.diagnostic([...lines])\n }\n\n return { renderSummary }\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getElapsedMs } from '@internals/utils'\nimport { logLevel as logLevelMap } from '@kubb/core'\nimport { formatMsWithColor } from '../banner.ts'\nimport type { LoggerContext } from './context.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Phases = ReturnType<typeof createPhases>\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 = StartPhaseOptions & {\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 /**\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}\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/** A hook's display name: its `name`, or the command line it runs. */\nfunction formatHookLabel({ command, name, args }: { command: string; name?: string; args?: ReadonlyArray<string> }): string {\n return name ?? (args?.length ? `${command} ${args.join(' ')}` : command)\n}\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/** The format, lint and post-generate phases, and the hooks and messages they buffer while their step owns the line. */\nexport function createPhases({ writer, silent, logLevel, text, line, onRun }: LoggerContext, spinner: Spinner) {\n const state = {\n phase: null as Phase | null,\n hooks: new Map<string, { hrStart: [number, number]; lines: Array<string> }>(),\n }\n\n function startPhase(options: StartPhaseOptions) {\n state.phase = { ...options, failed: false, hrStart: process.hrtime(), lines: [], output: [] }\n spinner.start(options.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 spinner.stop(phase.failed ? `${phase.failure} after ${duration}` : `${phase.success} 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 onRun('kubb:format:start', () => startPhase(PHASES.format))\n onRun('kubb:format:end', endPhase)\n onRun('kubb:lint:start', () => startPhase(PHASES.lint))\n onRun('kubb:lint:end', endPhase)\n onRun('kubb:hooks:start', () => startPhase(PHASES.hooks))\n onRun('kubb:hooks:end', endPhase)\n\n onRun('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. `stdout` and `stderr` only exist on a failed result.\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', formatHookLabel({ command, name, args }))\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 spinner.stop()\n writer.step(text(result))\n writeOutput(active.lines)\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 onRun('kubb:info', ({ message, info }) => {\n const formatted = line(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(formatted)\n return\n }\n if (spinner.message(formatted)) {\n return\n }\n writer.info(formatted)\n })\n\n onRun('kubb:success', ({ message, info }) => {\n const formatted = line(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 (spinner.message(formatted)) {\n return\n }\n writer.success(formatted)\n })\n\n onRun('kubb:hook:start', ({ id, command, name, args }) => {\n if (!id) {\n return\n }\n state.hooks.set(id, { hrStart: process.hrtime(), lines: [] })\n spinner.message(text(`Running ${styleText('dim', formatHookLabel({ command, name, args }))}`))\n })\n\n onRun('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 /** The phase whose step owns the line, so a failure or an info line can wait for it. */\n get phase(): Phase | null {\n return state.phase\n },\n reset() {\n state.phase = null\n state.hooks = new Map()\n },\n }\n}\n","import { styleText } from 'node:util'\nimport type { Adapter, DiagnosticLocation } from '@kubb/core'\n\n/**\n * A location in source text, with a terminal code frame that underlines it.\n */\nexport type SpecPosition = {\n line: number\n column: number\n frame: Array<string>\n}\n\n/**\n * Where `location` sits in `source` according to its adapter, with a code frame. `undefined` when the adapter cannot place it.\n */\nexport function locateInSpec({ adapter, source, location }: { adapter: Adapter; source: string; location: DiagnosticLocation }): SpecPosition | undefined {\n const lines = source.split(/\\r?\\n/)\n try {\n const range = adapter.locate?.(source, location)\n if (!range) return undefined\n const before = source.slice(0, range.start).split('\\n')\n const line = before.length\n const column = before.at(-1)!.length + 1\n const text = lines[line - 1] ?? ''\n const width = String(line).length\n const gutter = (number?: number) => styleText('dim', `${number === undefined ? ''.padStart(width) : String(number).padStart(width)} │`)\n const carets = '^'.repeat(Math.max(1, Math.min(range.end - range.start, text.length - column + 1)))\n return {\n line,\n column,\n frame: [\n ...(line > 1 ? [`${gutter(line - 1)} ${lines[line - 2]}`] : []),\n `${gutter(line)} ${text}`,\n `${gutter()} ${' '.repeat(column - 1)}${styleText('red', carets)}`,\n ],\n }\n } catch {\n return undefined\n }\n}\n","import { relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { read } from '@internals/utils'\nimport type { Adapter, Config, Diagnostic, DiagnosticFormatOptions, ProblemDiagnostic } from '@kubb/core'\nimport { Diagnostics, getInputKind, logLevel as logLevelMap } from '@kubb/core'\nimport { pluralize } from '../../ui/text.ts'\nimport { locateInSpec } from '../specFrame.ts'\nimport { getInputPath, type LoggerContext } from './context.ts'\nimport type { Phases } from './phases.ts'\nimport type { Progress } from './progress.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Problems = ReturnType<typeof createProblems>\n\n/** Warnings, errors and diagnostics: printed as they come, or held back and grouped by plugin once a human's build ends. */\nexport function createProblems(ctx: LoggerContext, spinner: Spinner, progress: Progress, phases: Phases) {\n const { writer, silent, human, logLevel, text, line, hooks } = ctx\n const { audience } = writer\n const formatOptions: DiagnosticFormatOptions = {\n audience,\n verbose: logLevel >= logLevelMap.verbose,\n // The code lines up at the right edge, inside the group indent and the human view's per-problem indent.\n width: Math.min(process.stdout.columns || 80, 100) - (audience === 'human' ? 4 : 2),\n }\n const state = {\n /** Problems held back so the human view can print them grouped by plugin once the build ends. */\n problems: [] as Array<ProblemDiagnostic>,\n /** The finished config's diagnostics, for the closing verdict. */\n diagnostics: [] as Array<Diagnostic>,\n /** A local-file input, which a located diagnostic points into; `load` parses it once, on the first such diagnostic. */\n spec: undefined as { path: string; adapter: Adapter; source: Promise<string | undefined> } | undefined,\n }\n\n /** Format options for one problem, with its line and column in a local spec when its pointer resolves there. */\n async function optionsFor(problem: ProblemDiagnostic): Promise<DiagnosticFormatOptions> {\n const { location } = problem\n const { spec } = state\n if (!location || !spec) {\n return formatOptions\n }\n\n const source = await spec.source\n const position = source && locateInSpec({ adapter: spec.adapter, source, location })\n if (!position) {\n return formatOptions\n }\n return { ...formatOptions, position: { file: relative(process.cwd(), spec.path), ...position } }\n }\n\n /**\n * Prints problems grouped under their plugin's name, each with the code aligned at the right.\n */\n async function writeProblems(problems: ReadonlyArray<ProblemDiagnostic>) {\n if (!problems.length) {\n return\n }\n const formatted = await Promise.all(problems.map(async (problem) => Diagnostics.format(problem, await optionsFor(problem))))\n if (!human) {\n for (const lines of formatted) writer.diagnostic(lines)\n return\n }\n\n const byPlugin = Map.groupBy(\n problems.map((problem, index) => ({ plugin: problem.plugin ?? '', lines: formatted[index]! })),\n ({ plugin }) => plugin,\n )\n const lines = [...byPlugin].flatMap(([plugin, group]) => [\n ...(plugin ? [` ${styleText('bold', plugin)}`, ''] : []),\n ...group.flatMap((entry) => [...entry.lines.map((entryLine) => ` ${entryLine}`), '']),\n ])\n writer.diagnostic(lines.slice(0, -1))\n }\n\n hooks.hook('kubb:warn', ({ message, info }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n writer.warn(line(styleText('yellow', '⚠'), message, logLevel >= logLevelMap.info ? info : undefined))\n })\n\n // Unguarded: a failure stays visible even at silent.\n hooks.hook('kubb:error', ({ error }) => {\n const phase = phases.phase\n if (phase) {\n phase.failed = true\n }\n\n // Rendered as a `KUBB_UNKNOWN` diagnostic, so the output alone says what broke and where. The\n // name tells a `TypeError` from a plain `Error`.\n const message = error.name === 'Error' || Diagnostics.isError(error) ? error.message : `${error.name}: ${error.message}`\n const help = Diagnostics.isError(error) ? error.diagnostic.help : undefined\n const [headline = '', ...details] = Diagnostics.format({ code: Diagnostics.code.unknown, severity: 'error', message, help, cause: error }, formatOptions)\n\n if (!human) {\n spinner.stop()\n progress.stop()\n writer.diagnostic([headline, ...details])\n return\n }\n\n // The writer draws the error symbol, so the message goes in bare.\n if (spinner.active) {\n spinner.stop(message, 'failed')\n } else {\n writer.error(text(message))\n }\n if (details.length) {\n writer.block(details.map(text))\n }\n })\n\n hooks.hook('kubb:diagnostic', async ({ 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 // A Studio job's problems show in Studio; its job line counts the errors.\n if (ctx.session && !Diagnostics.isUpdate(diagnostic)) {\n return\n }\n\n spinner.stop()\n progress.stop()\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 // Inside a build, the human view waits for the end to group by plugin.\n if (human && ctx.groupOpen) {\n state.problems.push(diagnostic)\n return\n }\n await writeProblems([diagnostic])\n })\n\n return {\n state,\n /** Points located diagnostics into the config's input when it is a local file. */\n setSpec(config: Config) {\n const input = getInputPath(config)\n if (input && config.adapter?.locate && getInputKind(input) === 'file') {\n const path = resolve(config.root, input)\n // Read lazily, once, and only when a diagnostic needs a frame.\n let source: Promise<string | undefined> | undefined\n state.spec = {\n path,\n adapter: config.adapter,\n get source() {\n return (source ??= read(path).catch(() => undefined))\n },\n }\n }\n },\n /** Prints the problems held back so far. */\n flush() {\n return writeProblems(state.problems.splice(0))\n },\n /** `✖ Failed 1 error · 1 warning in plugin-ts` once the build ended, or `✗ Generation failed` for a run that stopped early. */\n failedTitle(): string {\n const { errors, warnings } = Diagnostics.count(state.diagnostics)\n const counts = [errors && pluralize(errors, 'error'), warnings && pluralize(warnings, 'warning')].filter(Boolean).join(' · ')\n if (!human || !counts) {\n return '✗ Generation failed'\n }\n const plugins = Diagnostics.failedPlugins(state.diagnostics)\n return `✖ Failed ${counts}${plugins.length ? ` in ${plugins.join(', ')}` : ''}`\n },\n reset() {\n Object.assign(state, { problems: [], diagnostics: [], spec: undefined })\n },\n }\n}\n","import { relative } from 'node:path'\nimport { styleText } from 'node:util'\nimport { pluralize } from '../../ui/text.ts'\nimport type { WriterProgress } from '../types.ts'\nimport type { LoggerContext } from './context.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Progress = ReturnType<typeof createProgress>\n\n/** The progress bar over the file writes, and the counts the summary line shows. */\nexport function createProgress({ writer, silent, text, onRun }: LoggerContext, spinner: Spinner) {\n const state = {\n progress: null as WriterProgress | null,\n totalFiles: 0,\n processedFiles: 0,\n /** Whether this run keeps its files in memory, as a `kubb studio` run without `--allow-write` does. */\n inMemory: false,\n }\n\n function stop(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 if (!silent) {\n onRun('kubb:files:processing:start', ({ files }) => {\n spinner.stop()\n state.totalFiles = files.length\n state.processedFiles = 0\n\n state.progress = writer.progress(files.length)\n state.progress.start(text(`${state.inMemory ? 'Generating' : 'Writing'} ${pluralize(files.length, 'file')}`))\n })\n\n onRun('kubb:files:processing:update', ({ files }) => {\n for (const { file, config } of files) {\n state.processedFiles++\n state.progress?.advance(`${state.inMemory ? 'Generating' : 'Writing'} ${relative(config.root, file.path)}`)\n }\n })\n\n onRun('kubb:files:processing:end', ({ files, unchanged }) => {\n const skipped = unchanged.length ? styleText('dim', ` · ${unchanged.length} unchanged`) : ''\n stop(\n state.inMemory\n ? `Generated ${pluralize(state.processedFiles, 'file')} in memory`\n : `Wrote ${pluralize(files.length - unchanged.length, 'file')}${skipped}`,\n )\n })\n }\n\n return {\n state,\n stop,\n reset() {\n stop()\n Object.assign(state, { totalFiles: 0, processedFiles: 0, inMemory: false })\n },\n }\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { Diagnostics, logLevel as logLevelMap } from '@kubb/core'\nimport { pluralize, toPermissionFlag } from '../../ui/text.ts'\nimport { clock, type LoggerContext } from './context.ts'\nimport type { Spinner } from './spinner.ts'\n\n/** One line of a Studio session's job log: the time, the command, who asked for it, and how it ended. */\nfunction formatJobLine({ command, result, requestedBy }: { command: string; result: string; requestedBy?: string }): string {\n const by = requestedBy ? `${styleText('dim', `by ${requestedBy}`.padEnd(16))} ` : ''\n return `${styleText('dim', clock())} ${command.padEnd(10)} ${by}${result}`\n}\n\n/**\n * A `kubb studio` session. It emits these on the same emitter as its generations, so one logger\n * renders the whole command: the connection, then one job line per command.\n */\nexport function createSession(ctx: LoggerContext, spinner: Spinner) {\n const { writer, silent, human, logLevel, text, hooks } = ctx\n\n hooks.hook('studio:disconnected', ({ code, reason }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n\n spinner.stop()\n // 4002 is `AgentCloseCode.SUPERSEDED`, spelled out because `@kubb/studio` is an optional peer.\n if (code === 4002) {\n writer.warn(text('⚠ Another process connected to Kubb Studio as this agent, so this one stopped'))\n return\n }\n writer.warn(text(`⚠ Kubb Studio ended the session (${reason || `code ${code}`})`))\n })\n\n hooks.hook('studio:warn', ({ message, permission }) => {\n if (logLevel < logLevelMap.warn) {\n return\n }\n const remedy = permission ? `; pass ${toPermissionFlag(permission)} to allow it` : ''\n // A warning drawn under a running spinner leaves a stale spinner frame above it, so it pauses the spinner like a job line does.\n const paused = spinner.active\n spinner.stop()\n writer.warn(text(`⚠ ${message}${remedy}`))\n if (paused) spinner.start('Ready for jobs')\n })\n\n // Unguarded, like `kubb:error`: a failure stays visible even at silent.\n hooks.hook('studio:error', ({ error }) => {\n if (spinner.active) {\n spinner.stop(error.message, 'failed')\n return\n }\n writer.error(text(error.message))\n })\n\n if (silent) {\n return\n }\n\n // The last generation's outcome, for the job line `studio:command` prints after it.\n let job: { fileCount: number; ms: number; errors: number } | null = null\n\n hooks.hook('studio:connected', ({ url, versions: { studio, kubb, agent } }) => {\n ctx.session = human\n spinner.stop()\n // The runtime version shows only when it differs from the host's.\n const versions = [`v${agent}`, kubb !== agent ? `runtime v${kubb}` : undefined, `Studio v${studio}`].filter(Boolean).join(' · ')\n writer.success(text(`✓ Connected to ${styleText('cyan', url)} ${styleText('dim', `· ${versions}`)}`))\n spinner.start('Ready for jobs')\n })\n\n hooks.hook('kubb:generation:start', () => {\n if (ctx.session) spinner.message(text('Generating'))\n })\n\n hooks.hook('kubb:generation:end', ({ diagnostics = [], filesCreated = 0, status, hrStart = process.hrtime() }) => {\n job = { fileCount: filesCreated, ms: getElapsedMs(hrStart), errors: status === 'failed' ? Diagnostics.count(diagnostics).errors : 0 }\n })\n\n hooks.hook('studio:command', ({ command, info, requestedBy, failed }) => {\n spinner.stop()\n const took = command === 'generate' && job ? `${pluralize(job.fileCount, 'file')} in ${formatMs(job.ms)} ` : ''\n const result = failed\n ? `${styleText('red', '✖')} ${job?.errors ? pluralize(job.errors, 'error') : 'failed'}, see Studio`\n : `${styleText('green', '✓')} ${took}${styleText('dim', `(${info})`)}`\n writer.info(formatJobLine({ command, requestedBy, result }))\n job = null\n spinner.start('Ready for jobs')\n })\n\n hooks.hook('studio:reconnecting', ({ delayMs }) => {\n spinner.stop()\n writer.info(text(styleText('dim', `Retrying connection to Kubb Studio in ${formatMs(delayMs)}`)))\n })\n}\n","import type { LogStatus, WriterSpinner } from '../types.ts'\nimport type { LoggerContext } from './context.ts'\n\nexport type Spinner = ReturnType<typeof createSpinner>\n\n/** The step whose end is not known when it starts: the spec parse, the node walk, a phase, or a Studio session waiting for jobs. */\nexport function createSpinner({ writer, silent, text }: LoggerContext) {\n let spinner: WriterSpinner | null = null\n\n function stop(message?: string, status: LogStatus = 'success') {\n const active = spinner\n if (!active) {\n return\n }\n spinner = null\n\n if (message === undefined) {\n active.clear()\n return\n }\n if (status === 'failed') {\n active.error(text(message))\n return\n }\n active.stop(text(message))\n }\n\n return {\n /** Whether a spinner is drawing right now. */\n get active(): boolean {\n return spinner !== null\n },\n start(message: string) {\n if (silent) {\n return\n }\n\n spinner = writer.spinner()\n spinner.start(text(message))\n },\n stop,\n /** Redraws the spinner's line. `false` when no spinner is running, so the caller prints the line itself. */\n message(line: string): boolean {\n if (!spinner) {\n return false\n }\n spinner.message(line)\n return true\n },\n reset: () => stop(),\n }\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { formatBar, formatMsWithColor } from '../banner.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport type { LoggerContext } from './context.ts'\nimport type { Progress } from './progress.ts'\nimport type { Spinner } from './spinner.ts'\n\nexport type Walk = ReturnType<typeof createWalk>\n\n/** Milliseconds between redraws of the live generation block, about clack's spinner frame rate. */\nconst WALK_REDRAW_MS = 80\n\nfunction createState() {\n return {\n totalPlugins: 0,\n completedPlugins: 0,\n failedPlugins: 0,\n /** `process.hrtime()` snapshot taken at the start of generation, for the elapsed time. */\n hrStart: process.hrtime(),\n /** Plugin results held back while the generation step owns the line. */\n pluginLines: [] as Array<string>,\n /** The node walk's live state: the spec's node total, the distinct nodes generated, and each plugin's count and current node. */\n walk: { total: 0, visited: new Set<string>(), plugins: new Map<string, { count: number; current: string }>() },\n lastWalkDraw: 0,\n }\n}\n\n/** The node walk the plugins share: the live generation block, and the plugin results printed once the walk ends. */\nexport function createWalk({ writer, silent, human, text, onRun }: LoggerContext, spinner: Spinner, progress: Progress) {\n const state = createState()\n\n /** The progress summary line the clack logger shows, `null` when there is nothing to display. */\n function buildProgressLine(): string | null {\n const parts: Array<string> = []\n const duration = formatMs(getElapsedMs(state.hrStart))\n const { totalFiles, processedFiles } = progress.state\n\n if (state.totalPlugins > 0) {\n const failed = state.failedPlugins > 0 ? ` ${styleText('red', `(${state.failedPlugins} failed)`)}` : ''\n parts.push(`Plugins ${styleText('green', state.completedPlugins.toString())}/${state.totalPlugins}${failed}`)\n }\n\n if (totalFiles > 0) {\n parts.push(`Files ${styleText('green', processedFiles.toString())}/${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\n if (!silent) {\n onRun('kubb:build:start', ({ nodeCounts: { schemas, operations } }) => {\n state.walk.total = schemas + operations\n const details = `${pluralize(schemas, 'schema')} · ${pluralize(operations, 'operation')} · ${formatMs(getElapsedMs(state.hrStart))}`\n spinner.stop(`Parsed spec ${styleText('dim', details)}`)\n spinner.start('Generating')\n })\n\n // Plugins all end after one shared node walk, so per-node hooks keep the step live; plain output would get a line per node.\n if (human) {\n const onNode = (key: string, name: string, plugin: string) => {\n const { total, visited, plugins } = state.walk\n visited.add(key)\n plugins.set(plugin, { count: (plugins.get(plugin)?.count ?? 0) + 1, current: name })\n\n // Counting stays per node; the redraw waits for the spinner's next frame.\n const now = Date.now()\n if (now - state.lastWalkDraw < WALK_REDRAW_MS) return\n state.lastWalkDraw = now\n\n const elapsed = styleText('dim', formatMs(getElapsedMs(state.hrStart)))\n const head = total\n ? `Generating ${formatBar(visited.size, total)} ${visited.size}/${total} nodes ${elapsed}`\n : `Generating ${pluralize(visited.size, 'node')} ${elapsed}`\n const width = Math.max(...[...plugins.keys()].map((pluginName) => pluginName.length))\n const rows = [...plugins].map(\n ([pluginName, row]) =>\n `${styleText('dim', '│')} ${pluginName.padEnd(width)} ${styleText('dim', String(row.count).padStart(4))} ${styleText('cyan', row.current)}`,\n )\n spinner.message(text([head, ...rows].join('\\n')))\n }\n\n onRun('kubb:generate:schema', (node, { plugin }) => onNode(`schema:${node.name}`, node.name ?? 'schema', plugin.name))\n onRun('kubb:generate:operation', (node, { plugin }) => onNode(`operation:${node.operationId}`, node.operationId, plugin.name))\n }\n\n // Buffered, not printed: a step redraws over anything written while it runs.\n onRun('kubb:plugin:end', ({ plugin, duration, success }) => {\n state[success ? 'completedPlugins' : 'failedPlugins']++\n state.pluginLines.push(text(`${plugin.name} ${success ? 'completed' : 'failed'} in ${formatMsWithColor(duration)}`))\n })\n\n onRun('kubb:plugins:end', () => {\n const failed = state.failedPlugins > 0\n spinner.stop(buildProgressLine() ?? undefined, failed ? 'failed' : 'success')\n\n if (state.pluginLines.length) {\n writer.block(state.pluginLines)\n state.pluginLines = []\n }\n })\n }\n\n return {\n state,\n reset() {\n Object.assign(state, createState())\n },\n }\n}\n","import type { Hookable, KubbHooks, SummaryRenderer } from '@kubb/core'\nimport type { LoggerWriter } from '../types.ts'\nimport { createLoggerContext } from './context.ts'\nimport { createGeneration } from './generation.ts'\nimport { createPhases } from './phases.ts'\nimport { createProblems } from './problems.ts'\nimport { createProgress } from './progress.ts'\nimport { createSession } from './session.ts'\nimport { createSpinner } from './spinner.ts'\nimport { createWalk } from './walk.ts'\n\n/**\n * Wires a {@link LoggerWriter} onto the run's hooks. Each feature registers the hooks for one\n * concern, so every writer reports the same run in the same order: one group per config, a step\n * over the plugin work, a progress bar for the writes, one step per output phase, then the summary.\n * It hands back `renderSummary`, which writes the `cli` reporter's summary inside the group opened\n * for that config and closes the group.\n */\nexport function installLogger({ hooks, writer, logLevel }: { hooks: Hookable<KubbHooks>; writer: LoggerWriter; logLevel: number }): {\n renderSummary: SummaryRenderer\n} {\n const ctx = createLoggerContext({ hooks, writer, logLevel })\n const spinner = createSpinner(ctx)\n const progress = createProgress(ctx, spinner)\n const walk = createWalk(ctx, spinner, progress)\n const phases = createPhases(ctx, spinner)\n const problems = createProblems(ctx, spinner, progress, phases)\n createSession(ctx, spinner)\n return createGeneration(ctx, { spinner, progress, walk, phases, problems })\n}\n","import process from 'node:process'\nimport { resolve } from 'node:path'\nimport { readFile } from 'node:fs/promises'\nimport { isPathInside } from '@internals/utils'\nimport type { GenerationResult, Hookable, KubbHooks, Reporter, ReporterContext } from '@kubb/core'\nimport { cacheStorage, createCliReporter, createOutputManifest, logLevel as logLevelMap } from '@kubb/core'\nimport { writer as defaultWriter } from '../ui/log.ts'\nimport { installLogger } from './features/index.ts'\nimport type { LoggerWriter } from './types.ts'\nimport { diffOutput, readOutputFiles } from '../runners/generate/utils.ts'\n\n/** Installs the live logger and wires the selected reporters. `cli` renders its summary through the logger, and is skipped when `json` owns stdout. */\nfunction setupReporters(\n context: Hookable<KubbHooks>,\n {\n logLevel,\n reporters,\n writer = defaultWriter(),\n dryRun = false,\n }: {\n /** Output verbosity. Use the `logLevel` constants exported from `@kubb/core`. */\n logLevel: number\n reporters: ReadonlyArray<Reporter>\n /** Overrides the terminal-based pick, e.g. the plain writer for `kubb studio snapshot`. */\n writer?: LoggerWriter\n /**\n * Labels the memory-backed generation as a preview rather than a completed write.\n */\n dryRun?: boolean\n },\n): void {\n const hasJson = reporters.some((reporter) => reporter.name === 'json')\n const selected = reporters.flatMap((reporter) => {\n if (reporter.name !== 'cli') return [reporter]\n if (hasJson) return []\n return [createCliReporter({ render: installLogger({ hooks: context, writer, logLevel }).renderSummary })]\n })\n const ctx: ReporterContext = { logLevel }\n const pluginFiles = selected.some((reporter) => reporter.needsPluginFiles) ? new Map<string, Array<string>>() : undefined\n const seen = new Set<string>()\n if (pluginFiles) {\n context.hook('kubb:plugin:end', ({ plugin, files }) => {\n for (const file of files) {\n if (seen.has(file.path)) continue\n seen.add(file.path)\n const paths = pluginFiles.get(plugin.name) ?? []\n paths.push(file.path)\n pluginFiles.set(plugin.name, paths)\n }\n })\n }\n\n // Configs generate one at a time, so the last write before `kubb:generation:end` is this config's.\n let filesUnchanged = 0\n let previous: Map<string, string> | undefined\n let paths: Array<string> = []\n let outputPath = ''\n const trackChanges = selected.some((reporter) => reporter.name === 'cli') && logLevel > logLevelMap.silent\n context.hook('kubb:generation:start', async ({ config }) => {\n pluginFiles?.clear()\n seen.clear()\n filesUnchanged = 0\n paths = []\n outputPath = resolve(config.root, config.output.path)\n previous = trackChanges && (dryRun || config.storage?.name === 'fs') ? await readOutputFiles(outputPath) : undefined\n })\n context.hook('kubb:files:processing:start', async ({ files }) => {\n if (!previous) return\n // Plugin output can live outside the main output folder; capture it before writes start.\n for (const file of files) {\n if (previous.has(file.path) || isPathInside(outputPath, file.path)) continue\n const source = await readFile(file.path, 'utf8').catch(() => null)\n if (source !== null) previous.set(file.path, source)\n }\n })\n context.hook('kubb:files:processing:end', ({ files, unchanged }) => {\n filesUnchanged = unchanged.length\n paths = files.map((file) => file.path)\n })\n\n context.hook('kubb:generation:end', async ({ config, storage, diagnostics = [], filesCreated = 0, status = 'success', hrStart = process.hrtime() }) => {\n const result: GenerationResult = { config, diagnostics, filesCreated, filesUnchanged, dryRun, status, hrStart }\n const cliResult = { ...result }\n if (previous && status !== 'failed') {\n const manifest = dryRun ? await createOutputManifest({ storage, cache: cacheStorage({ root: config.root }) }) : undefined\n const diff = await diffOutput({\n storage,\n paths,\n clean: Boolean(config.output.clean),\n manifest,\n previousFiles: previous,\n })\n const changes = { added: 0, modified: 0, deleted: 0, linesAdded: 0, linesRemoved: 0 }\n const counts = { A: 'added', M: 'modified', D: 'deleted' } as const\n for (const file of diff.files) {\n changes[counts[file.status]]++\n changes.linesAdded += file.added ?? 0\n changes.linesRemoved += file.removed ?? 0\n }\n cliResult.filesCreated = changes.added + changes.modified + diff.unchanged\n cliResult.filesUnchanged = diff.unchanged\n cliResult.fileChanges = changes\n }\n for (const reporter of selected) {\n const grouped = reporter.needsPluginFiles && pluginFiles?.size ? [...pluginFiles].map(([plugin, files]) => ({ plugin, files: [...files] })) : undefined\n await reporter.report({ ...(reporter.name === 'cli' ? cliResult : result), pluginFiles: grouped }, ctx)\n }\n })\n\n context.hook('kubb:lifecycle:end', async () => {\n for (const reporter of selected) await reporter.drain?.(ctx)\n })\n}\n\nexport default setupReporters\n\n/** Picks the reporters whose `name` is in `names`, in the given order (the CLI maps `--reporter` to this); duplicates and unknown names are skipped. */\nexport function selectReporters(reporters: ReadonlyArray<Reporter>, names: ReadonlyArray<string>): Array<Reporter> {\n return [...new Set(names)].flatMap((name) => reporters.find((reporter) => reporter.name === name) ?? [])\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-CPE0t6oh.cjs");
2
- const require_Telemetry = require("./Telemetry-CMgGcwu7.cjs");
3
- const require_utils = require("./utils-Da0WSV3s.cjs");
4
- const require_text = require("./text-B3svCeKt.cjs");
5
- const require_registry = require("./registry-Bmfi_DWI.cjs");
2
+ const require_Telemetry = require("./Telemetry-CzA7GfW7.cjs");
3
+ const require_utils = require("./utils-DSbCbvNB.cjs");
4
+ const require_text = require("./text-mhjHGn_Z.cjs");
5
+ const require_registry = require("./registry-CNPqnBjo.cjs");
6
6
  const require_config = require("./config-1tiH3heq.cjs");
7
- const require_reporters = require("./reporters-ByGDYzho.cjs");
7
+ const require_reporters = require("./reporters-B_Lf5MZf.cjs");
8
8
  let node_util = require("node:util");
9
9
  let node_process = require("node:process");
10
10
  node_process = require_rolldown_runtime.__toESM(node_process, 1);
@@ -218,4 +218,4 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
218
218
  exports.generate = generate;
219
219
  exports.run = run;
220
220
 
221
- //# sourceMappingURL=run-B_TsKumr.cjs.map
221
+ //# sourceMappingURL=run-B1jaIDea.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-B_TsKumr.cjs","names":["trackRun","process","memoryStorage","createKubb","isOutdated","version","Diagnostics","styleText","pluralize","formatMs","logLevelMap","Hookable","cliReporter","createPlainWriter","logBanner","getConfigs","createSpinner","path","jsonReporter","fileReporter","htmlReporter","selectReporters","trackBuild","getInputKind","diffBuilds","getElapsedMs","listenForKeys","startWatcher","logInfo","logError"],"sources":["../src/runners/generate/run.ts"],"sourcesContent":["import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, formatters, getElapsedMs, linters } from '@internals/utils'\nimport {\n Hookable,\n type CLIOptions,\n cliReporter,\n type Config,\n createKubb,\n Diagnostics,\n fileReporter,\n getInputKind,\n htmlReporter,\n jsonReporter,\n type KubbHooks,\n logLevel as logLevelMap,\n memoryStorage,\n type ReporterName,\n} from '@kubb/core'\nimport { version } from '../../../package.json'\nimport { trackRun } from '../../Telemetry.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport setupReporters, { selectReporters } from '../../loggers/reporters.ts'\nimport { createPlainWriter } from '../../loggers/plainWriter.ts'\nimport { logIntro, logOutro, logSpacer, logTip } from '../../ui/intro.ts'\nimport { logError, logInfo, logStep, logWarn } from '../../ui/log.ts'\nimport { logBanner } from '../../ui/mascot.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { getConfigs } from '../../config.ts'\nimport { isOutdated } from '../../utils/registry.ts'\nimport { type BuildDiff, type BuildSnapshot, diffBuilds, listenForKeys, startWatcher, trackBuild } from './utils.ts'\n\n/** NPM registry endpoint used to check for @kubb/cli updates. */\nconst KUBB_NPM_PACKAGE_URL = 'https://registry.npmjs.org/@kubb/cli/latest' as const\n\n/** Upper bound in milliseconds for the npm update check, so a slow registry never stalls a run. */\nconst UPDATE_CHECK_TIMEOUT_MS = 3_000\n\n/** The formatter names from `Config['output'].format`, without `'auto'` (detection, not a tool) and `false` (skip). */\ntype FormatterName = Exclude<NonNullable<Config['output']['format']>, 'auto' | false>\ntype LinterName = Exclude<NonNullable<Config['output']['lint']>, 'auto' | false>\n\n// Pinned here, not in `@internals/utils` (which must not import `@kubb/core`): a tool added to the union without a descriptor fails to compile.\nformatters satisfies Record<FormatterName, unknown>\nlinters satisfies Record<LinterName, unknown>\n\ntype GenerateProps = {\n input?: string\n config: Config\n hooks: Hookable<KubbHooks>\n /**\n * When `true`, generates in memory instead of writing to disk, skips formatting, linting, and\n * post-generate commands, and prints what would change on disk.\n */\n dryRun?: boolean\n}\n\nexport async function generate(options: GenerateProps): Promise<boolean> {\n const { input, hooks, dryRun = false } = options\n\n const report = trackRun({ command: 'generate', hrStart: process.hrtime() })\n\n const config: Config = {\n ...options.config,\n input: input ?? options.config.input,\n // Dry-run never touches disk, regardless of the config's own storage driver.\n storage: dryRun ? memoryStorage() : options.config.storage,\n // Also keeps core's `hasOutputPasses` false, so dry-run skips the output manifest write too.\n output: dryRun ? { ...options.config.output, format: false, lint: false, postGenerate: [] } : options.config.output,\n }\n\n // Core formats, lints and runs `output.postGenerate` after an error-free build, and reports\n // their failures as coded diagnostics that reach the summary, the json report and the exit code.\n const kubb = createKubb(config, { hooks })\n const result = await kubb.generate()\n\n await report({\n // A setup that threw leaves no driver, so read the configured plugins instead.\n plugins: kubb.config.plugins.flatMap((p) =>\n p && typeof p === 'object' ? [{ name: p.meta?.name ?? p.name ?? '', options: (p.options ?? {}) as Record<string, unknown> }] : [],\n ),\n filesCreated: result.files.length,\n status: result.success ? 'success' : 'failed',\n })\n\n return result.success\n}\n\ntype GenerateCommandOptions = {\n input?: string\n configPath?: string\n logLevel: string\n watch: boolean\n reporters?: Array<ReporterName>\n dryRun?: boolean\n}\n\n/** The latest published version, `undefined` when the registry does not answer in time. Never rejects. */\nasync function fetchLatestVersion(): Promise<string | undefined> {\n try {\n const res = await fetch(KUBB_NPM_PACKAGE_URL, { signal: AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS) })\n const data = (await res.json()) as { version: string }\n return data.version\n } catch {\n // Ignore network errors\n return undefined\n }\n}\n\nasync function checkForUpdate({ hooks, latest }: { hooks: Hookable<KubbHooks>; latest: Promise<string | undefined> }): Promise<void> {\n const latestVersion = await latest\n if (latestVersion && isOutdated({ installed: version, latest: latestVersion })) {\n await Diagnostics.emit(hooks, Diagnostics.update({ currentVersion: version, latestVersion }))\n }\n}\n\n/** Prints `Rebuilt in 1.2s · +1 schema -2 operations`, without the names part when the spec kept the same names. */\nfunction logRebuild({ diff: { schemas, operations }, durationMs }: { diff: BuildDiff; durationMs: number }): void {\n const specChange = [\n schemas.added && styleText('green', `+${pluralize(schemas.added, 'schema')}`),\n schemas.removed && styleText('red', `-${pluralize(schemas.removed, 'schema')}`),\n operations.added && styleText('green', `+${pluralize(operations.added, 'operation')}`),\n operations.removed && styleText('red', `-${pluralize(operations.removed, 'operation')}`),\n ]\n .filter(Boolean)\n .join(' ')\n logStep([`Rebuilt in ${formatMs(durationMs)}`, specChange].filter(Boolean).join(styleText('dim', ' · ')))\n}\n\n/**\n * Runs the full Kubb generation lifecycle for the given CLI options.\n * Loads configs, sets up the reporters (CLI `--reporter` picks which of `config.reporters` to trigger),\n * checks for a newer version, and calls `generate` for each config entry.\n */\nexport async function run({ input, configPath, logLevel: logLevelKey, watch, reporters: cliReporters, dryRun }: GenerateCommandOptions): Promise<void> {\n // Started first so the registry request overlaps the banner and the config load.\n const latest = fetchLatestVersion()\n const logLevel = logLevelMap[logLevelKey as keyof typeof logLevelMap] ?? logLevelMap.info\n const hooks = new Hookable<KubbHooks>()\n\n // CLI `--reporter` selects which reporters to trigger by name, defaulting to `cli`. `defineConfig`\n // registers the built-in reporters on the config; a config exported without it falls back to them below.\n const requestedNames: Array<ReporterName> = cliReporters?.length ? cliReporters : ['cli']\n\n // The `json` reporter owns stdout, so the command writes nothing of its own around it.\n const json = requestedNames.includes('json')\n const quiet = logLevel <= logLevelMap.silent || json\n\n // Errors raised outside a build have no report entry. In `json` mode they go to a stderr logger,\n // so they are never silent and stdout stays one JSON document.\n const errorHooks = json ? new Hookable<KubbHooks>() : hooks\n if (json) setupReporters(errorHooks, { logLevel, reporters: [cliReporter], writer: createPlainWriter(console.error) })\n\n // The config loads while the banner plays; the output still prints in order once the banner is done.\n const banner = quiet ? undefined : logBanner(version)\n const loading = getConfigs({\n configPath,\n input,\n watch,\n logLevel: logLevelKey as CLIOptions['logLevel'],\n })\n // Handled below; this keeps a rejection during the banner from counting as unhandled.\n loading.catch(() => undefined)\n await banner\n\n if (!quiet) {\n logIntro({ title: 'Configuration' })\n }\n\n // Load the config first so `config.reporters` can pick the reporters. A failure here has no\n // reporter installed yet, so fall back to the default `cli` reporter to surface it.\n const configSpinner = createSpinner()\n let configs: Array<Config>\n let resolvedConfigPath: string\n try {\n if (!quiet) configSpinner.start('Loading config')\n\n const loaded = await loading\n configs = loaded.configs\n resolvedConfigPath = loaded.configPath\n\n if (!quiet) configSpinner.stop(`Loaded ${styleText('dim', path.relative(process.cwd(), resolvedConfigPath))}`)\n } catch (error) {\n if (!quiet) configSpinner.error('Config failed loading')\n\n if (!json) setupReporters(hooks, { logLevel, reporters: [cliReporter] })\n // A diagnostic thrown while the config file runs, such as invalid extension options, sits in the cause chain.\n await Diagnostics.emit(errorHooks, error)\n\n if (!quiet) logOutro(styleText('red', '✗ Configuration failed'))\n process.exit(1)\n }\n\n // Without a reporter nothing is printed, not even an error, so a config written without\n // `defineConfig` gets the same built-ins it would have registered.\n const available = configs[0]?.reporters?.length ? configs[0].reporters : [cliReporter, jsonReporter, fileReporter, htmlReporter]\n const reporters = selectReporters(available, requestedNames)\n setupReporters(hooks, { logLevel, reporters, dryRun })\n\n await hooks.callHook('kubb:lifecycle:start', { version })\n\n // Inside the bootstrap group, so an update notice reads as part of the setup rather than as part\n // of the first config's generation.\n await checkForUpdate({ hooks, latest })\n\n if (!quiet) logOutro(`${pluralize(configs.length, 'config')} ready`)\n\n try {\n let anyFailed = false\n // One tracker, one key listener and one build queue serve every watched config, so several configs never mix diffs or answer `r` twice.\n const tracker = watch ? trackBuild(hooks) : undefined\n const rebuilds: Array<() => Promise<void>> = []\n let armKeys: (() => void) | undefined\n // Configs share the hooks emitter, so every build, from any watcher or the `r` key, waits for the one before it.\n let queue = Promise.resolve()\n for (const config of configs) {\n const effectiveInput = input ?? config.input\n const inputKind = typeof effectiveInput === 'string' ? getInputKind(effectiveInput) : undefined\n const watchPath = inputKind === 'file' ? (effectiveInput as string) : undefined\n if (watchPath && tracker) {\n const label = styleText('yellow', `Watching ${path.relative(process.cwd(), watchPath)}`)\n let previous: BuildSnapshot | undefined\n // Don't removeAll() between builds, that would also drop logger and lifecycle\n // listeners. Plugin listeners are already disposed by safeBuild's dispose()\n // in its finally block, so re-running generate() on the same hooks emitter is safe.\n const build = async () => {\n const hrStart = process.hrtime()\n const succeeded = await generate({ input, config, hooks, dryRun })\n const snapshot = tracker.take()\n if (previous) logRebuild({ diff: diffBuilds(previous, snapshot), durationMs: getElapsedMs(hrStart) })\n previous = snapshot\n\n logStep(armKeys ? `${label} ${styleText('dim', 'r rebuild · q quit')}` : label)\n armKeys?.()\n if (succeeded) {\n logSpacer()\n logTip()\n }\n }\n // A trigger that lands while this config's build is queued joins it; one that lands during the build queues one more. Never rejects.\n let pending = false\n const rebuild = (): Promise<void> => {\n if (pending) return queue\n pending = true\n queue = queue\n .then(() => {\n pending = false\n return build()\n })\n .catch((error) => void Diagnostics.emit(errorHooks, error))\n return queue\n }\n rebuilds.push(rebuild)\n if (!quiet) {\n armKeys ??= listenForKeys({\n rebuild: () => rebuilds.forEach((trigger) => void trigger()),\n quit: (code) => void Promise.resolve(hooks.callHook('kubb:lifecycle:end')).finally(() => process.exit(code)),\n })\n }\n\n // The watcher ignores its startup state, so run the first build here; a failing one keeps watching so the user can fix the input.\n await rebuild()\n\n await startWatcher([watchPath], rebuild, { info: logInfo, error: logError })\n } else {\n if (tracker && !quiet) logWarn('Watch mode only follows a local `input` file, so this config is generated once.')\n try {\n const succeeded = await generate({ input, config, hooks, dryRun })\n if (!succeeded) anyFailed = true\n } catch (configError) {\n await Diagnostics.emit(errorHooks, configError)\n anyFailed = true\n }\n }\n }\n\n await hooks.callHook('kubb:lifecycle:end')\n\n // Watch mode prints a tip after each successful build. Regular generate commands need to\n // print one explicitly after the lifecycle group has closed so it stays outside the group.\n if (!quiet && !watch && !anyFailed) {\n logTip()\n }\n\n if (anyFailed) {\n process.exit(1)\n }\n } catch (error) {\n await Diagnostics.emit(errorHooks, error)\n process.exit(1)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"run-B1jaIDea.cjs","names":["trackRun","process","memoryStorage","createKubb","isOutdated","version","Diagnostics","styleText","pluralize","formatMs","logLevelMap","Hookable","cliReporter","createPlainWriter","logBanner","getConfigs","createSpinner","path","jsonReporter","fileReporter","htmlReporter","selectReporters","trackBuild","getInputKind","diffBuilds","getElapsedMs","listenForKeys","startWatcher","logInfo","logError"],"sources":["../src/runners/generate/run.ts"],"sourcesContent":["import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, formatters, getElapsedMs, linters } from '@internals/utils'\nimport {\n Hookable,\n type CLIOptions,\n cliReporter,\n type Config,\n createKubb,\n Diagnostics,\n fileReporter,\n getInputKind,\n htmlReporter,\n jsonReporter,\n type KubbHooks,\n logLevel as logLevelMap,\n memoryStorage,\n type ReporterName,\n} from '@kubb/core'\nimport { version } from '../../../package.json'\nimport { trackRun } from '../../Telemetry.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport setupReporters, { selectReporters } from '../../loggers/reporters.ts'\nimport { createPlainWriter } from '../../loggers/plainWriter.ts'\nimport { logIntro, logOutro, logSpacer, logTip } from '../../ui/intro.ts'\nimport { logError, logInfo, logStep, logWarn } from '../../ui/log.ts'\nimport { logBanner } from '../../ui/mascot.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { getConfigs } from '../../config.ts'\nimport { isOutdated } from '../../utils/registry.ts'\nimport { type BuildDiff, type BuildSnapshot, diffBuilds, listenForKeys, startWatcher, trackBuild } from './utils.ts'\n\n/** NPM registry endpoint used to check for @kubb/cli updates. */\nconst KUBB_NPM_PACKAGE_URL = 'https://registry.npmjs.org/@kubb/cli/latest' as const\n\n/** Upper bound in milliseconds for the npm update check, so a slow registry never stalls a run. */\nconst UPDATE_CHECK_TIMEOUT_MS = 3_000\n\n/** The formatter names from `Config['output'].format`, without `'auto'` (detection, not a tool) and `false` (skip). */\ntype FormatterName = Exclude<NonNullable<Config['output']['format']>, 'auto' | false>\ntype LinterName = Exclude<NonNullable<Config['output']['lint']>, 'auto' | false>\n\n// Pinned here, not in `@internals/utils` (which must not import `@kubb/core`): a tool added to the union without a descriptor fails to compile.\nformatters satisfies Record<FormatterName, unknown>\nlinters satisfies Record<LinterName, unknown>\n\ntype GenerateProps = {\n input?: string\n config: Config\n hooks: Hookable<KubbHooks>\n /**\n * When `true`, generates in memory instead of writing to disk, skips formatting, linting, and\n * post-generate commands, and prints what would change on disk.\n */\n dryRun?: boolean\n}\n\nexport async function generate(options: GenerateProps): Promise<boolean> {\n const { input, hooks, dryRun = false } = options\n\n const report = trackRun({ command: 'generate', hrStart: process.hrtime() })\n\n const config: Config = {\n ...options.config,\n input: input ?? options.config.input,\n // Dry-run never touches disk, regardless of the config's own storage driver.\n storage: dryRun ? memoryStorage() : options.config.storage,\n // Also keeps core's `hasOutputPasses` false, so dry-run skips the output manifest write too.\n output: dryRun ? { ...options.config.output, format: false, lint: false, postGenerate: [] } : options.config.output,\n }\n\n // Core formats, lints and runs `output.postGenerate` after an error-free build, and reports\n // their failures as coded diagnostics that reach the summary, the json report and the exit code.\n const kubb = createKubb(config, { hooks })\n const result = await kubb.generate()\n\n await report({\n // A setup that threw leaves no driver, so read the configured plugins instead.\n plugins: kubb.config.plugins.flatMap((p) =>\n p && typeof p === 'object' ? [{ name: p.meta?.name ?? p.name ?? '', options: (p.options ?? {}) as Record<string, unknown> }] : [],\n ),\n filesCreated: result.files.length,\n status: result.success ? 'success' : 'failed',\n })\n\n return result.success\n}\n\ntype GenerateCommandOptions = {\n input?: string\n configPath?: string\n logLevel: string\n watch: boolean\n reporters?: Array<ReporterName>\n dryRun?: boolean\n}\n\n/** The latest published version, `undefined` when the registry does not answer in time. Never rejects. */\nasync function fetchLatestVersion(): Promise<string | undefined> {\n try {\n const res = await fetch(KUBB_NPM_PACKAGE_URL, { signal: AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS) })\n const data = (await res.json()) as { version: string }\n return data.version\n } catch {\n // Ignore network errors\n return undefined\n }\n}\n\nasync function checkForUpdate({ hooks, latest }: { hooks: Hookable<KubbHooks>; latest: Promise<string | undefined> }): Promise<void> {\n const latestVersion = await latest\n if (latestVersion && isOutdated({ installed: version, latest: latestVersion })) {\n await Diagnostics.emit(hooks, Diagnostics.update({ currentVersion: version, latestVersion }))\n }\n}\n\n/** Prints `Rebuilt in 1.2s · +1 schema -2 operations`, without the names part when the spec kept the same names. */\nfunction logRebuild({ diff: { schemas, operations }, durationMs }: { diff: BuildDiff; durationMs: number }): void {\n const specChange = [\n schemas.added && styleText('green', `+${pluralize(schemas.added, 'schema')}`),\n schemas.removed && styleText('red', `-${pluralize(schemas.removed, 'schema')}`),\n operations.added && styleText('green', `+${pluralize(operations.added, 'operation')}`),\n operations.removed && styleText('red', `-${pluralize(operations.removed, 'operation')}`),\n ]\n .filter(Boolean)\n .join(' ')\n logStep([`Rebuilt in ${formatMs(durationMs)}`, specChange].filter(Boolean).join(styleText('dim', ' · ')))\n}\n\n/**\n * Runs the full Kubb generation lifecycle for the given CLI options.\n * Loads configs, sets up the reporters (CLI `--reporter` picks which of `config.reporters` to trigger),\n * checks for a newer version, and calls `generate` for each config entry.\n */\nexport async function run({ input, configPath, logLevel: logLevelKey, watch, reporters: cliReporters, dryRun }: GenerateCommandOptions): Promise<void> {\n // Started first so the registry request overlaps the banner and the config load.\n const latest = fetchLatestVersion()\n const logLevel = logLevelMap[logLevelKey as keyof typeof logLevelMap] ?? logLevelMap.info\n const hooks = new Hookable<KubbHooks>()\n\n // CLI `--reporter` selects which reporters to trigger by name, defaulting to `cli`. `defineConfig`\n // registers the built-in reporters on the config; a config exported without it falls back to them below.\n const requestedNames: Array<ReporterName> = cliReporters?.length ? cliReporters : ['cli']\n\n // The `json` reporter owns stdout, so the command writes nothing of its own around it.\n const json = requestedNames.includes('json')\n const quiet = logLevel <= logLevelMap.silent || json\n\n // Errors raised outside a build have no report entry. In `json` mode they go to a stderr logger,\n // so they are never silent and stdout stays one JSON document.\n const errorHooks = json ? new Hookable<KubbHooks>() : hooks\n if (json) setupReporters(errorHooks, { logLevel, reporters: [cliReporter], writer: createPlainWriter(console.error) })\n\n // The config loads while the banner plays; the output still prints in order once the banner is done.\n const banner = quiet ? undefined : logBanner(version)\n const loading = getConfigs({\n configPath,\n input,\n watch,\n logLevel: logLevelKey as CLIOptions['logLevel'],\n })\n // Handled below; this keeps a rejection during the banner from counting as unhandled.\n loading.catch(() => undefined)\n await banner\n\n if (!quiet) {\n logIntro({ title: 'Configuration' })\n }\n\n // Load the config first so `config.reporters` can pick the reporters. A failure here has no\n // reporter installed yet, so fall back to the default `cli` reporter to surface it.\n const configSpinner = createSpinner()\n let configs: Array<Config>\n let resolvedConfigPath: string\n try {\n if (!quiet) configSpinner.start('Loading config')\n\n const loaded = await loading\n configs = loaded.configs\n resolvedConfigPath = loaded.configPath\n\n if (!quiet) configSpinner.stop(`Loaded ${styleText('dim', path.relative(process.cwd(), resolvedConfigPath))}`)\n } catch (error) {\n if (!quiet) configSpinner.error('Config failed loading')\n\n if (!json) setupReporters(hooks, { logLevel, reporters: [cliReporter] })\n // A diagnostic thrown while the config file runs, such as invalid extension options, sits in the cause chain.\n await Diagnostics.emit(errorHooks, error)\n\n if (!quiet) logOutro(styleText('red', '✗ Configuration failed'))\n process.exit(1)\n }\n\n // Without a reporter nothing is printed, not even an error, so a config written without\n // `defineConfig` gets the same built-ins it would have registered.\n const available = configs[0]?.reporters?.length ? configs[0].reporters : [cliReporter, jsonReporter, fileReporter, htmlReporter]\n const reporters = selectReporters(available, requestedNames)\n setupReporters(hooks, { logLevel, reporters, dryRun })\n\n await hooks.callHook('kubb:lifecycle:start', { version })\n\n // Inside the bootstrap group, so an update notice reads as part of the setup rather than as part\n // of the first config's generation.\n await checkForUpdate({ hooks, latest })\n\n if (!quiet) logOutro(`${pluralize(configs.length, 'config')} ready`)\n\n try {\n let anyFailed = false\n // One tracker, one key listener and one build queue serve every watched config, so several configs never mix diffs or answer `r` twice.\n const tracker = watch ? trackBuild(hooks) : undefined\n const rebuilds: Array<() => Promise<void>> = []\n let armKeys: (() => void) | undefined\n // Configs share the hooks emitter, so every build, from any watcher or the `r` key, waits for the one before it.\n let queue = Promise.resolve()\n for (const config of configs) {\n const effectiveInput = input ?? config.input\n const inputKind = typeof effectiveInput === 'string' ? getInputKind(effectiveInput) : undefined\n const watchPath = inputKind === 'file' ? (effectiveInput as string) : undefined\n if (watchPath && tracker) {\n const label = styleText('yellow', `Watching ${path.relative(process.cwd(), watchPath)}`)\n let previous: BuildSnapshot | undefined\n // Don't removeAll() between builds, that would also drop logger and lifecycle\n // listeners. Plugin listeners are already disposed by safeBuild's dispose()\n // in its finally block, so re-running generate() on the same hooks emitter is safe.\n const build = async () => {\n const hrStart = process.hrtime()\n const succeeded = await generate({ input, config, hooks, dryRun })\n const snapshot = tracker.take()\n if (previous) logRebuild({ diff: diffBuilds(previous, snapshot), durationMs: getElapsedMs(hrStart) })\n previous = snapshot\n\n logStep(armKeys ? `${label} ${styleText('dim', 'r rebuild · q quit')}` : label)\n armKeys?.()\n if (succeeded) {\n logSpacer()\n logTip()\n }\n }\n // A trigger that lands while this config's build is queued joins it; one that lands during the build queues one more. Never rejects.\n let pending = false\n const rebuild = (): Promise<void> => {\n if (pending) return queue\n pending = true\n queue = queue\n .then(() => {\n pending = false\n return build()\n })\n .catch((error) => void Diagnostics.emit(errorHooks, error))\n return queue\n }\n rebuilds.push(rebuild)\n if (!quiet) {\n armKeys ??= listenForKeys({\n rebuild: () => rebuilds.forEach((trigger) => void trigger()),\n quit: (code) => void Promise.resolve(hooks.callHook('kubb:lifecycle:end')).finally(() => process.exit(code)),\n })\n }\n\n // The watcher ignores its startup state, so run the first build here; a failing one keeps watching so the user can fix the input.\n await rebuild()\n\n await startWatcher([watchPath], rebuild, { info: logInfo, error: logError })\n } else {\n if (tracker && !quiet) logWarn('Watch mode only follows a local `input` file, so this config is generated once.')\n try {\n const succeeded = await generate({ input, config, hooks, dryRun })\n if (!succeeded) anyFailed = true\n } catch (configError) {\n await Diagnostics.emit(errorHooks, configError)\n anyFailed = true\n }\n }\n }\n\n await hooks.callHook('kubb:lifecycle:end')\n\n // Watch mode prints a tip after each successful build. Regular generate commands need to\n // print one explicitly after the lifecycle group has closed so it stays outside the group.\n if (!quiet && !watch && !anyFailed) {\n logTip()\n }\n\n if (anyFailed) {\n process.exit(1)\n }\n } catch (error) {\n await Diagnostics.emit(errorHooks, error)\n process.exit(1)\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import "./rolldown-runtime-CRm0XQPb.js";
2
2
  import { n as toError } from "./errors-DmC83ALX.js";
3
- import { n as trackRun } from "./Telemetry-DrKtRFON.js";
3
+ import { n as trackRun } from "./Telemetry-I67lvF8y.js";
4
4
  import { styleText } from "node:util";
5
5
  import process from "node:process";
6
6
  //#region src/runners/mcp/run.ts
@@ -29,4 +29,4 @@ async function run() {
29
29
  //#endregion
30
30
  export { run };
31
31
 
32
- //# sourceMappingURL=run-5QXtkjqO.js.map
32
+ //# sourceMappingURL=run-Bg5jzlvC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-5QXtkjqO.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 const server = startMcpServer()\n // Report once the client introduces itself, so the event names the client (e.g. `claude-code`, `cursor-vscode`).\n server.on('initialize', ({ clientInfo }) => void report({ status: 'success', mcpClient: clientInfo.name }), { once: true })\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;EAG7F,eAAK,CAAC,CAAC,GAAG,eAAe,EAAE,iBAAiB,KAAK,OAAO;GAAE,QAAQ;GAAW,WAAW,WAAW;EAAK,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;CAC5H,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,QAAQ,WAAW;CACrB;AACF"}
1
+ {"version":3,"file":"run-Bg5jzlvC.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 const server = startMcpServer()\n // Report once the client introduces itself, so the event names the client (e.g. `claude-code`, `cursor-vscode`).\n server.on('initialize', ({ clientInfo }) => void report({ status: 'success', mcpClient: clientInfo.name }), { once: true })\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;EAG7F,eAAK,CAAC,CAAC,GAAG,eAAe,EAAE,iBAAiB,KAAK,OAAO;GAAE,QAAQ;GAAW,WAAW,WAAW;EAAK,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;CAC5H,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,QAAQ,WAAW;CACrB;AACF"}
@@ -1 +1 @@
1
- export { t as connect, a as login, c as runStudio } from "./run-CC_Ef181.js";
1
+ export { t as connect, a as login, c as runStudio } from "./run-CmOibezr.js";
@@ -1,11 +1,11 @@
1
1
  import "./rolldown-runtime-CRm0XQPb.js";
2
2
  import { n as toError } from "./errors-DmC83ALX.js";
3
- import { n as trackRun, r as version, s as isCIEnvironment } from "./Telemetry-DrKtRFON.js";
4
- import { c as createSpinner } from "./utils-2v3vv0xg.js";
5
- import { _ as isRichOutput, a as logOutro, c as logBlock, d as logStep, g as canUseTTY, h as plainWriter, i as logIntro, n as toPermissionFlag, s as logTip } from "./text-CFjUgZY-.js";
3
+ import { n as trackRun, r as version, s as isCIEnvironment } from "./Telemetry-I67lvF8y.js";
4
+ import { c as createSpinner } from "./utils-BU7XZRZo.js";
5
+ import { _ as isRichOutput, a as logOutro, c as logBlock, d as logStep, g as canUseTTY, h as plainWriter, i as logIntro, n as toPermissionFlag, s as logTip } from "./text-DvPK4YDj.js";
6
6
  import { r as KUBB_CONFIG_FILENAME, t as getConfigs } from "./config-CbjbW2J5.js";
7
7
  import { a as readCredentials, n as getCredentialsPath, o as writeCredentials, r as getMachineId, t as clearCredentials } from "./credentials-CZK6zPLv.js";
8
- import { n as setupReporters } from "./reporters-BPwAeHx6.js";
8
+ import { n as setupReporters } from "./reporters-BQaxBft9.js";
9
9
  import { styleText } from "node:util";
10
10
  import { hostname } from "node:os";
11
11
  import process from "node:process";
@@ -286,7 +286,7 @@ async function connect(options, context = {}) {
286
286
  let unwatch;
287
287
  try {
288
288
  if (!context.prepared) {
289
- const { getWorkerStatus } = await import("./background-BoG8TJzG.js");
289
+ const { getWorkerStatus } = await import("./background-nkOdMBvH.js");
290
290
  if ((await getWorkerStatus()).running) throw new Diagnostics.Error({
291
291
  code: Diagnostics.code.unknown,
292
292
  severity: "error",
@@ -354,7 +354,7 @@ async function connect(options, context = {}) {
354
354
  await hooks.callHook("kubb:lifecycle:end");
355
355
  unwatch?.();
356
356
  if (background) {
357
- const { startWorker } = await import("./background-BoG8TJzG.js");
357
+ const { startWorker } = await import("./background-nkOdMBvH.js");
358
358
  await startWorker(options);
359
359
  if (options.logLevel !== "silent") logOutro("Running in the background · kubb studio stop");
360
360
  return;
@@ -427,4 +427,4 @@ async function runStudio(values, action, { block = false, json = false } = {}) {
427
427
  //#endregion
428
428
  export { login as a, runStudio as c, loadConfigs as i, watchKeys as l, formatCountdown as n, prepareConnection as o, formatPermissionRows as r, resolvePermissions as s, connect as t };
429
429
 
430
- //# sourceMappingURL=run-CC_Ef181.js.map
430
+ //# sourceMappingURL=run-CmOibezr.js.map