@kubb/cli 5.14.5 → 5.15.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.
- package/bin/kubb.js +2 -1
- package/dist/{Telemetry-Dc79_cIA.js → Telemetry-B3edcFoB.js} +12 -86
- package/dist/Telemetry-B3edcFoB.js.map +1 -0
- package/dist/{Telemetry-Dc9DVxKQ.cjs → Telemetry-COWGqYmh.cjs} +14 -118
- package/dist/Telemetry-COWGqYmh.cjs.map +1 -0
- package/dist/{background-v5pDy3IJ.cjs → background-B24lIehn.cjs} +5 -6
- package/dist/{background-v5pDy3IJ.cjs.map → background-B24lIehn.cjs.map} +1 -1
- package/dist/{background-C877JFxE.js → background-D-7OGjvg.js} +1 -1
- package/dist/{background-3_KudPH-.js → background-_dKcGjM7.js} +5 -6
- package/dist/{background-3_KudPH-.js.map → background-_dKcGjM7.js.map} +1 -1
- package/dist/banner-BdTTDFkG.js +140 -0
- package/dist/banner-BdTTDFkG.js.map +1 -0
- package/dist/banner-wJFk-L-c.cjs +163 -0
- package/dist/banner-wJFk-L-c.cjs.map +1 -0
- package/dist/config-BL3HnFhb.js +1 -0
- package/dist/config-BWj9jBVj.cjs +62 -0
- package/dist/config-BWj9jBVj.cjs.map +1 -0
- package/dist/{config-CNqgDSu3.js → config-CQTxXvIG.js} +6 -52
- package/dist/config-CQTxXvIG.js.map +1 -0
- package/dist/{config-BG_Nr2CZ.cjs → config-CRrmj88c.cjs} +15 -62
- package/dist/config-CRrmj88c.cjs.map +1 -0
- package/dist/config-Uk3rbZfb.js +49 -0
- package/dist/config-Uk3rbZfb.js.map +1 -0
- package/dist/configFile-C0DIXNMD.js +993 -0
- package/dist/configFile-C0DIXNMD.js.map +1 -0
- package/dist/configFile-CoEpHdXG.cjs +1028 -0
- package/dist/configFile-CoEpHdXG.cjs.map +1 -0
- package/dist/{credentials-C8tjAhTo.js → credentials-B77iJx9H.js} +1 -1
- package/dist/{credentials-DDaKqtJn.cjs → credentials-DEsGwcGD.cjs} +3 -4
- package/dist/{credentials-DDaKqtJn.cjs.map → credentials-DEsGwcGD.cjs.map} +1 -1
- package/dist/{credentials-CZK6zPLv.js → credentials-osgjujE_.js} +3 -4
- package/dist/{credentials-CZK6zPLv.js.map → credentials-osgjujE_.js.map} +1 -1
- package/dist/env-C3xHRMez.js +1 -0
- package/dist/env-eu3XyKqJ.cjs +55 -0
- package/dist/env-eu3XyKqJ.cjs.map +1 -0
- package/dist/env-rv-VgSGN.js +34 -0
- package/dist/env-rv-VgSGN.js.map +1 -0
- package/dist/{errors-Cl69p_vI.cjs → errors-BponpdjN.cjs} +3 -4
- package/dist/{errors-Cl69p_vI.cjs.map → errors-BponpdjN.cjs.map} +1 -1
- package/dist/{errors-DmC83ALX.js → errors-wzqmMpMo.js} +3 -4
- package/dist/{errors-DmC83ALX.js.map → errors-wzqmMpMo.js.map} +1 -1
- package/dist/index.cjs +37 -2719
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.js +35 -2713
- package/dist/index.js.map +1 -1
- package/dist/installWithSpinner-DpnpxHq5.js +49 -0
- package/dist/installWithSpinner-DpnpxHq5.js.map +1 -0
- package/dist/installWithSpinner-ONGfIVUJ.cjs +56 -0
- package/dist/installWithSpinner-ONGfIVUJ.cjs.map +1 -0
- package/dist/{text-CEyJhBnh.js → intro-9PB8sE8z.js} +8 -52
- package/dist/intro-9PB8sE8z.js.map +1 -0
- package/dist/{text-CC2xdpGL.cjs → intro-YPaf1Imr.cjs} +12 -80
- package/dist/intro-YPaf1Imr.cjs.map +1 -0
- package/dist/isCIEnvironment-D6xtAAZ2.js +14 -0
- package/dist/isCIEnvironment-D6xtAAZ2.js.map +1 -0
- package/dist/isCIEnvironment-DiVOMI5Q.cjs +20 -0
- package/dist/isCIEnvironment-DiVOMI5Q.cjs.map +1 -0
- package/dist/mascot--q1xjKw1.js +63 -0
- package/dist/mascot--q1xjKw1.js.map +1 -0
- package/dist/mascot-JSA0j3Q_.cjs +80 -0
- package/dist/mascot-JSA0j3Q_.cjs.map +1 -0
- package/dist/mcp-CYPOFKnP.cjs +20 -0
- package/dist/mcp-CYPOFKnP.cjs.map +1 -0
- package/dist/mcp-CxeZR5vb.js +21 -0
- package/dist/mcp-CxeZR5vb.js.map +1 -0
- package/dist/package-D3Yss9Bb.js +5 -0
- package/dist/package-D3Yss9Bb.js.map +1 -0
- package/dist/package-aX0q9SZr.cjs +10 -0
- package/dist/package-aX0q9SZr.cjs.map +1 -0
- package/dist/{registry-ov1RYcD4.js → registry-B3eYk4LN.js} +7 -67
- package/dist/registry-B3eYk4LN.js.map +1 -0
- package/dist/{registry-BInbtBm7.cjs → registry-YE1pFWL-.cjs} +4 -82
- package/dist/registry-YE1pFWL-.cjs.map +1 -0
- package/dist/{reporters-DQz--AdE.cjs → reporters-2cgjvXwR.cjs} +32 -40
- package/dist/{reporters-DQz--AdE.cjs.map → reporters-2cgjvXwR.cjs.map} +1 -1
- package/dist/{reporters-BtD41K-C.js → reporters-BM430HdQ.js} +19 -27
- package/dist/{reporters-BtD41K-C.js.map → reporters-BM430HdQ.js.map} +1 -1
- package/dist/{rolldown-runtime-CPE0t6oh.cjs → rolldown-runtime-C3-Zg-KD.cjs} +1 -2
- package/dist/{rolldown-runtime-CRm0XQPb.js → rolldown-runtime-xo6NMXYd.js} +1 -2
- package/dist/run-1H9TGT8v.js +77 -0
- package/dist/run-1H9TGT8v.js.map +1 -0
- package/dist/run-B4zvF9WY.cjs +233 -0
- package/dist/run-B4zvF9WY.cjs.map +1 -0
- package/dist/run-BYP_t9dR.cjs +324 -0
- package/dist/run-BYP_t9dR.cjs.map +1 -0
- package/dist/{run-1oXPIkli.cjs → run-Bb19PlwV.cjs} +44 -37
- package/dist/run-Bb19PlwV.cjs.map +1 -0
- package/dist/{run-B03V0Poj.cjs → run-BoO7H8RA.cjs} +49 -41
- package/dist/run-BoO7H8RA.cjs.map +1 -0
- package/dist/run-BrM7-NSV.js +181 -0
- package/dist/run-BrM7-NSV.js.map +1 -0
- package/dist/{run-UsAMlUyy.js → run-C0KI-NE3.js} +9 -9
- package/dist/{run-UsAMlUyy.js.map → run-C0KI-NE3.js.map} +1 -1
- package/dist/run-CCLPt4hr.js +1 -0
- package/dist/run-CCsdLz3X.js +385 -0
- package/dist/run-CCsdLz3X.js.map +1 -0
- package/dist/{run-YMSJnvYl.js → run-CbX6tpqB.js} +31 -23
- package/dist/run-CbX6tpqB.js.map +1 -0
- package/dist/run-CrM4jsix.cjs +80 -0
- package/dist/run-CrM4jsix.cjs.map +1 -0
- package/dist/run-CvFakE3B.cjs +185 -0
- package/dist/run-CvFakE3B.cjs.map +1 -0
- package/dist/run-D-nn9-Wq.js +319 -0
- package/dist/run-D-nn9-Wq.js.map +1 -0
- package/dist/{run-cBSr2F1q.cjs → run-D5Z6nfzK.cjs} +5 -6
- package/dist/{run-cBSr2F1q.cjs.map → run-D5Z6nfzK.cjs.map} +1 -1
- package/dist/{run-BUzdEUaE.cjs → run-DCqmf5W1.cjs} +10 -10
- package/dist/{run-BUzdEUaE.cjs.map → run-DCqmf5W1.cjs.map} +1 -1
- package/dist/{run-BK-A9JDf.js → run-DFXhBS64.js} +5 -6
- package/dist/{run-BK-A9JDf.js.map → run-DFXhBS64.js.map} +1 -1
- package/dist/run-DgGZOC_x.cjs +389 -0
- package/dist/run-DgGZOC_x.cjs.map +1 -0
- package/dist/{run-DDwdeHgU.js → run-KqdudiWQ.js} +26 -20
- package/dist/run-KqdudiWQ.js.map +1 -0
- package/dist/run-RN_31Q4u.js +228 -0
- package/dist/run-RN_31Q4u.js.map +1 -0
- package/dist/shared-C0EtrdUm.cjs +123 -0
- package/dist/shared-C0EtrdUm.cjs.map +1 -0
- package/dist/shared-Ct9stKpp.js +94 -0
- package/dist/shared-Ct9stKpp.js.map +1 -0
- package/dist/{snapshot-BrwynBfC.cjs → snapshot-D7Ytw8S0.cjs} +13 -14
- package/dist/{snapshot-BrwynBfC.cjs.map → snapshot-D7Ytw8S0.cjs.map} +1 -1
- package/dist/{snapshot-D2E7nhEf.js → snapshot-n7dJGCWv.js} +10 -11
- package/dist/{snapshot-D2E7nhEf.js.map → snapshot-n7dJGCWv.js.map} +1 -1
- package/dist/spinner-BZaln7O8.js +160 -0
- package/dist/spinner-BZaln7O8.js.map +1 -0
- package/dist/spinner-CfB0sIPy.cjs +208 -0
- package/dist/spinner-CfB0sIPy.cjs.map +1 -0
- package/dist/{status-CxzhvjKs.cjs → status-Bc0_4T41.cjs} +7 -8
- package/dist/{status-CxzhvjKs.cjs.map → status-Bc0_4T41.cjs.map} +1 -1
- package/dist/{status-BHIOMCM0.js → status-DxSkp1cH.js} +6 -7
- package/dist/{status-BHIOMCM0.js.map → status-DxSkp1cH.js.map} +1 -1
- package/dist/studio-BpYwgFb0.cjs +218 -0
- package/dist/studio-BpYwgFb0.cjs.map +1 -0
- package/dist/studio-mw6HaPkr.js +215 -0
- package/dist/studio-mw6HaPkr.js.map +1 -0
- package/dist/studioWorker.js +4 -5
- package/dist/{summary-B219y888.js → summary-CbmQKA8l.js} +5 -6
- package/dist/{summary-B219y888.js.map → summary-CbmQKA8l.js.map} +1 -1
- package/dist/{summary-BOYsqub3.cjs → summary-Clvl5Hxs.cjs} +7 -8
- package/dist/{summary-BOYsqub3.cjs.map → summary-Clvl5Hxs.cjs.map} +1 -1
- package/dist/table-BlRe9YTZ.cjs +15 -0
- package/dist/table-BlRe9YTZ.cjs.map +1 -0
- package/dist/table-CR7iZJGo.js +10 -0
- package/dist/table-CR7iZJGo.js.map +1 -0
- package/dist/text-BmiI4s6N.js +13 -0
- package/dist/text-BmiI4s6N.js.map +1 -0
- package/dist/text-Ep3AulAS.cjs +24 -0
- package/dist/text-Ep3AulAS.cjs.map +1 -0
- package/dist/time-3BKoci3G.cjs +82 -0
- package/dist/time-3BKoci3G.cjs.map +1 -0
- package/dist/time-C-wU7VhC.js +65 -0
- package/dist/time-C-wU7VhC.js.map +1 -0
- package/dist/utils-BdibacYq.js +244 -0
- package/dist/utils-BdibacYq.js.map +1 -0
- package/dist/utils-CO89mxRU.cjs +290 -0
- package/dist/utils-CO89mxRU.cjs.map +1 -0
- package/dist/utils-CbJ6hS_t.js +222 -0
- package/dist/utils-CbJ6hS_t.js.map +1 -0
- package/dist/utils-CcARPB45.cjs +286 -0
- package/dist/utils-CcARPB45.cjs.map +1 -0
- package/dist/validate-8ZcWXfMt.js +28 -0
- package/dist/validate-8ZcWXfMt.js.map +1 -0
- package/dist/validate-CMSeDpGT.cjs +27 -0
- package/dist/validate-CMSeDpGT.cjs.map +1 -0
- package/package.json +7 -7
- package/dist/Telemetry-Dc79_cIA.js.map +0 -1
- package/dist/Telemetry-Dc9DVxKQ.cjs.map +0 -1
- package/dist/config-BG_Nr2CZ.cjs.map +0 -1
- package/dist/config-CNqgDSu3.js.map +0 -1
- package/dist/config-DWDpFSn1.js +0 -1
- package/dist/registry-BInbtBm7.cjs.map +0 -1
- package/dist/registry-ov1RYcD4.js.map +0 -1
- package/dist/run-1oXPIkli.cjs.map +0 -1
- package/dist/run-B03V0Poj.cjs.map +0 -1
- package/dist/run-DDwdeHgU.js.map +0 -1
- package/dist/run-YMSJnvYl.js.map +0 -1
- package/dist/run-v5aW1jjQ.js +0 -1
- package/dist/text-CC2xdpGL.cjs.map +0 -1
- package/dist/text-CEyJhBnh.js.map +0 -1
- package/dist/utils-8E1nF4C1.cjs +0 -645
- package/dist/utils-8E1nF4C1.cjs.map +0 -1
- package/dist/utils-D8VN40bN.js +0 -536
- package/dist/utils-D8VN40bN.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporters-DQz--AdE.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-2cgjvXwR.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":";;;;;;;;;;;;;;AA0BA,SAAgB,oBAAoB,EAAE,OAAO,QAAQ,YAAmG;CACtJ,MAAM,QAAQ,YAAqB,YAAYA,WAAAA,SAAY,UAAU,IAAA,GAAGC,UAAAA,UAAAA,CAAU,OAAO,IAAI,MAAM,EAAE,EAAE,EAAE,GAAG,YAAY;CACxH,MAAM,MAAqB;EACzB;EACA;EACA;EACA,QAAQ,YAAYD,WAAAA,SAAY;EAChC,OAAO,OAAO,aAAa;EAC3B,SAAS;EACT,WAAW;EACX;EACA,OAAO,QAAQ,SAAS,SAAS,KAAK;GAAC;GAAQ;GAAS,SAAA,GAAQC,UAAAA,UAAAA,CAAU,OAAO,IAAI;EAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EACjH,MAAM,MAAM,IAAI;GACd,OAAO,MAAM,KAAK,OAAO,GAAG,SAAU,IAAI,UAAU,KAAA,IAAY,GAAG,GAAG,IAAI,CAAE;EAC9E;CACF;CACA,OAAO;AACT;;AAGA,SAAgB,MAAM,uBAAO,IAAI,KAAK,GAAW;CAC/C,OAAO,KAAK,mBAAmB,SAAS;EAAE,QAAQ;EAAO,MAAM;EAAW,QAAQ;EAAW,QAAQ;CAAU,CAAC;AAClH;;AAGA,SAAgB,aAAa,QAAoC;CAC/D,MAAM,EAAE,UAAU;CAClB,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,OAAO,OAAO,OAAO,SAAS,WAAW,MAAM,OAAO,KAAA;AACxD;;;;;;ACzCA,SAAgB,iBACd,KACA,EAAE,SAAS,UAAU,MAAM,QAAQ,YACC;CACpC,MAAM,EAAE,QAAQ,QAAQ,OAAO,MAAM,OAAO,UAAU;CAEtD,SAAS,QAAQ;EACf,QAAQ,MAAM;EACd,SAAS,MAAM;EACf,KAAK,MAAM;EACX,OAAO,MAAM;EACb,SAAS,MAAM;CACjB;CAIA,SAAS,WAAW,QAAmB;EACrC,IAAI,CAAC,IAAI,WACP;EAEF,IAAI,YAAY;EAEhB,QAAQ,KAAK;EACb,SAAS,KAAK;EACd,OAAO,SAAS,WAAW,YAAA,GAAWC,UAAAA,UAAAA,CAAU,OAAO,SAAS,YAAY,CAAC,KAAA,GAAIA,UAAAA,UAAAA,CAAU,SAAS,wBAAwB,CAAC;CAC/H;CAEA,MAAM,KAAK,8BAA8B;EACvC,MAAM;CACR,CAAC;CAED,MAAM,0BAA0B,EAAE,aAAa;EAC7C,WAAW,QAAQ;EACnB,MAAM;EAEN,KAAK,MAAM,eAAe,OAAO,SAAS,UAAU;EACpD,SAAS,MAAM,WAAW,OAAO,SAAS,SAAS;EACnD,SAAS,QAAQ,MAAM;EAEvB,IAAI,QACF;EAGF,MAAM,QAAQ,aAAa,MAAM;EACjC,OAAO,MAAM,KAAK,EAAA,GAACA,UAAAA,UAAAA,CAAU,QAAQ,OAAO,QAAQ,MAAM,GAAG,SAAA,GAAQA,UAAAA,UAAAA,CAAU,OAAO,KAAK,IAAI,KAAA,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;EACpI,IAAI,YAAY;EAEhB,QAAQ,MAAM,cAAc;CAC9B,CAAC;CAED,MAAM,uBAAuB,OAAO,EAAE,cAAc,CAAC,QAAQ;EAC3D,QAAQ,KAAK;EACb,SAAS,KAAK;EACd,SAAS,MAAM,cAAc;EAC7B,MAAM,SAAS,MAAM;CACvB,CAAC;CAED,MAAM,KAAK,sBAAsB,YAAY;EAC3C,MAAM,SAAS,MAAM;EACrB,WAAW,QAAQ;EACnB,MAAM;CACR,CAAC;CAED,MAAM,iBAAkC,OAAO,EAAE,aAAa;EAC5D,IAAI,UAAU,CAAC,IAAI,WACjB;EAGF,QAAQ,KAAK;EACb,SAAS,KAAK;EACd,IAAI,OAAO,WAAW,MAAM;EAC5B,IAAI,YAAY;EAChB,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC;CAC9B;CAEA,OAAO,EAAE,cAAc;AACzB;;;;;ACjDA,MAAM,SAAS;CACb,QAAQ;EAAE,SAAS;EAAc,SAAS;EAAa,SAAS;CAAoB;CACpF,MAAM;EAAE,SAAS;EAAW,SAAS;EAAU,SAAS;CAAiB;CACzE,OAAO;EACL,SAAS;EACT,SAAS;EACT,SAAS;EACT,iBAAiB;CACnB;AACF;;AAGA,SAAS,gBAAgB,EAAE,SAAS,MAAM,QAAkF;CAC1H,OAAO,SAAS,MAAM,SAAS,GAAG,QAAQ,GAAG,KAAK,KAAK,GAAG,MAAM;AAClE;;;;;AAMA,SAAS,eAAe,OAA6C;CACnE,MAAM,QAAQ,MAAM,WAAW,SAAS,KAAK,KAAK,CAAC;CACnD,IAAI,UAAU,IACZ,OAAO,CAAC;CAGV,OAAO,MAAM,MAAM,OAAO,MAAM,eAAe,SAAS,KAAK,KAAK,CAAC,IAAI,CAAC;AAC1E;;AAGA,SAAgB,aAAa,EAAE,QAAQ,QAAQ,UAAU,MAAM,MAAM,SAAwB,SAAkB;CAC7G,MAAM,QAAQ;EACZ,OAAO;EACP,uBAAO,IAAI,IAAiE;CAC9E;CAEA,SAAS,WAAW,SAA4B;EAC9C,MAAM,QAAQ;GAAE,GAAG;GAAS,QAAQ;GAAO,SAASC,aAAAA,QAAQ,OAAO;GAAG,OAAO,CAAC;GAAG,QAAQ,CAAC;EAAE;EAC5F,QAAQ,MAAM,QAAQ,OAAO;CAC/B;CAEA,SAAS,WAAW;EAClB,MAAM,QAAQ,MAAM;EACpB,MAAM,QAAQ;EAEd,IAAI,CAAC,SAAS,QACZ;EAGF,MAAM,WAAWC,eAAAA,kBAAkBC,aAAAA,aAAa,MAAM,OAAO,CAAC;EAE9D,QAAQ,KAAK,MAAM,SAAS,GAAG,MAAM,QAAQ,SAAS,aAAa,GAAG,MAAM,QAAQ,MAAM,YAAY,MAAM,SAAS,WAAW,SAAS;EAEzI,IAAI,MAAM,MAAM,QACd,OAAO,MAAM,MAAM,KAAK;EAE1B,YAAY,MAAM,MAAM;CAC1B;CAEA,SAAS,YAAY,OAA8B;EACjD,MAAM,SAAS,eAAe,KAAK;EACnC,IAAI,OAAO,QACT,OAAO,IAAI,MAAM;CAErB;CAEA,MAAM,2BAA2B,WAAW,OAAO,MAAM,CAAC;CAC1D,MAAM,mBAAmB,QAAQ;CACjC,MAAM,yBAAyB,WAAW,OAAO,IAAI,CAAC;CACtD,MAAM,iBAAiB,QAAQ;CAC/B,MAAM,0BAA0B,WAAW,OAAO,KAAK,CAAC;CACxD,MAAM,kBAAkB,QAAQ;CAEhC,MAAM,kBAAkB,QAAQ;EAC9B,MAAM,EAAE,IAAI,SAAS,MAAM,MAAM,SAAS,UAAU;EACpD,IAAI,CAAC,IACH;EAGF,IAAI,CAAC,WAAW,MAAM,OACpB,MAAM,MAAM,SAAS;EAGvB,IAAI,QAAQ;GAEV,IAAI,CAAC,IAAI,SAAS;IAChB,IAAI,IAAI,QAAQ,QAAQ,IAAI,IAAI,MAAM;IACtC,IAAI,IAAI,QAAQ,QAAQ,MAAM,IAAI,MAAM;GAC1C;GACA;EACF;EAEA,MAAM,SAAS,MAAM,MAAM,IAAI,EAAE;EACjC,IAAI,CAAC,QACH;EAEF,MAAM,MAAM,OAAO,EAAE;EAErB,MAAM,SAAA,GAAQC,UAAAA,UAAAA,CAAU,OAAO,gBAAgB;GAAE;GAAS;GAAM;EAAK,CAAC,CAAC;EACvE,MAAM,SAAS,OAAO,UAAU,KAAK,MAAM,QAAQ,KAAK;EACxD,MAAM,SAAS,UACX,IAAA,GAAGA,UAAAA,UAAAA,CAAU,SAAS,GAAG,EAAE,GAAG,MAAM,MAAMF,eAAAA,kBAAkBC,aAAAA,aAAa,OAAO,OAAO,CAAC,MACxF,IAAA,GAAGC,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE,GAAG,MAAM,SAAS;EAE/C,MAAM,QAAQ,MAAM;EACpB,IAAI,OAAO;GACT,IAAI,MAAM,mBAAmB,CAAC,SAC5B,MAAM,MAAM,KAAK,MAAM;GAEzB,MAAM,OAAO,KAAK,GAAG,OAAO,KAAK;GACjC;EACF;EAEA,QAAQ,KAAK;EACb,OAAO,KAAK,KAAK,MAAM,CAAC;EACxB,YAAY,OAAO,KAAK;CAC1B,CAAC;CAGD,IAAI,CAAC,QAAQ;EACX,MAAM,cAAc,EAAE,SAAS,WAAW;GACxC,MAAM,YAAY,MAAA,GAAKA,UAAAA,UAAAA,CAAU,QAAQ,GAAG,GAAG,SAAS,IAAI;GAG5D,IAAI,MAAM,OAAO;IACf,MAAM,MAAM,MAAM,KAAK,SAAS;IAChC;GACF;GACA,IAAI,QAAQ,QAAQ,SAAS,GAC3B;GAEF,OAAO,KAAK,SAAS;EACvB,CAAC;EAED,MAAM,iBAAiB,EAAE,SAAS,WAAW;GAC3C,MAAM,YAAY,MAAA,GAAKA,UAAAA,UAAAA,CAAU,SAAS,GAAG,GAAG,SAAS,YAAYC,WAAAA,SAAY,OAAO,OAAO,KAAA,CAAS;GAGxG,IAAI,QAAQ,QAAQ,SAAS,GAC3B;GAEF,OAAO,QAAQ,SAAS;EAC1B,CAAC;EAED,MAAM,oBAAoB,EAAE,IAAI,SAAS,MAAM,WAAW;GACxD,IAAI,CAAC,IACH;GAEF,MAAM,MAAM,IAAI,IAAI;IAAE,SAASJ,aAAAA,QAAQ,OAAO;IAAG,OAAO,CAAC;GAAE,CAAC;GAC5D,QAAQ,QAAQ,KAAK,YAAA,GAAWG,UAAAA,UAAAA,CAAU,OAAO,gBAAgB;IAAE;IAAS;IAAM;GAAK,CAAC,CAAC,GAAG,CAAC;EAC/F,CAAC;EAED,MAAM,mBAAmB,EAAE,IAAI,WAAW;GACxC,MAAM,SAAS,MAAM,MAAM,IAAI,EAAE;GACjC,IAAI,CAAC,QACH;GAIF,IAAI,MAAM,OAAO;IACf,OAAO,MAAM,KAAK,IAAI;IACtB;GACF;GACA,OAAO,IAAI,CAAC,IAAI,CAAC;EACnB,CAAC;CACH;CAEA,OAAO;;EAEL,IAAI,QAAsB;GACxB,OAAO,MAAM;EACf;EACA,QAAQ;GACN,MAAM,QAAQ;GACd,MAAM,wBAAQ,IAAI,IAAI;EACxB;CACF;AACF;;;;;AC3MA,SAAgB,aAAa,EAAE,SAAS,QAAQ,YAA0G;CACxJ,MAAM,QAAQ,OAAO,MAAM,OAAO;CAClC,IAAI;EACF,MAAM,QAAQ,QAAQ,SAAS,QAAQ,QAAQ;EAC/C,IAAI,CAAC,OAAO,OAAO,KAAA;EACnB,MAAM,SAAS,OAAO,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI;EACtD,MAAM,OAAO,OAAO;EACpB,MAAM,SAAS,OAAO,GAAG,EAAE,CAAC,CAAE,SAAS;EACvC,MAAM,OAAO,MAAM,OAAO,MAAM;EAChC,MAAM,QAAQ,OAAO,IAAI,CAAC,CAAC;EAC3B,MAAM,UAAU,YAAA,GAAoBE,UAAAA,UAAAA,CAAU,OAAO,GAAG,WAAW,KAAA,IAAY,GAAG,SAAS,KAAK,IAAI,OAAO,MAAM,CAAC,CAAC,SAAS,KAAK,EAAE,GAAG;EACtI,MAAM,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,MAAM,OAAO,KAAK,SAAS,SAAS,CAAC,CAAC,CAAC;EAClG,OAAO;GACL;GACA;GACA,OAAO;IACL,GAAI,OAAO,IAAI,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,GAAG,MAAM,OAAO,IAAI,IAAI,CAAC;IAC7D,GAAG,OAAO,IAAI,EAAE,GAAG;IACnB,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,SAAS,CAAC,KAAA,GAAIA,UAAAA,UAAAA,CAAU,OAAO,MAAM;GACjE;EACF;CACF,QAAQ;EACN;CACF;AACF;;;ACvBA,SAAgB,eAAe,KAAoB,SAAkB,UAAoB,QAAgB;CACvG,MAAM,EAAE,QAAQ,QAAQ,OAAO,UAAU,MAAM,MAAM,UAAU;CAC/D,MAAM,EAAE,aAAa;CACrB,MAAM,gBAAyC;EAC7C;EACA,SAAS,YAAYC,WAAAA,SAAY;EAEjC,OAAO,KAAK,IAAIC,aAAAA,QAAQ,OAAO,WAAW,IAAI,GAAG,KAAK,aAAa,UAAU,IAAI;CACnF;CACA,MAAM,QAAQ;;EAEZ,UAAU,CAAC;;EAEX,aAAa,CAAC;;EAEd,MAAM,KAAA;CACR;;CAGA,eAAe,WAAW,SAA8D;EACtF,MAAM,EAAE,aAAa;EACrB,MAAM,EAAE,SAAS;EACjB,IAAI,CAAC,YAAY,CAAC,MAChB,OAAO;EAGT,MAAM,SAAS,MAAM,KAAK;EAC1B,MAAM,WAAW,UAAU,aAAa;GAAE,SAAS,KAAK;GAAS;GAAQ;EAAS,CAAC;EACnF,IAAI,CAAC,UACH,OAAO;EAET,OAAO;GAAE,GAAG;GAAe,UAAU;IAAE,OAAA,GAAMC,UAAAA,SAAAA,CAASD,aAAAA,QAAQ,IAAI,GAAG,KAAK,IAAI;IAAG,GAAG;GAAS;EAAE;CACjG;;;;CAKA,eAAe,cAAc,UAA4C;EACvE,IAAI,CAAC,SAAS,QACZ;EAEF,MAAM,YAAY,MAAM,QAAQ,IAAI,SAAS,IAAI,OAAO,YAAYE,WAAAA,YAAY,OAAO,SAAS,MAAM,WAAW,OAAO,CAAC,CAAC,CAAC;EAC3H,IAAI,CAAC,OAAO;GACV,KAAK,MAAM,SAAS,WAAW,OAAO,WAAW,KAAK;GACtD;EACF;EAMA,MAAM,QAAQ,CAAC,GAJE,IAAI,QACnB,SAAS,KAAK,SAAS,WAAW;GAAE,QAAQ,QAAQ,UAAU;GAAI,OAAO,UAAU;EAAQ,EAAE,IAC5F,EAAE,aAAa,MAEO,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,WAAW,CACvD,GAAI,SAAS,CAAC,KAAA,GAAIC,UAAAA,UAAAA,CAAU,QAAQ,MAAM,KAAK,EAAE,IAAI,CAAC,GACtD,GAAG,MAAM,SAAS,UAAU,CAAC,GAAG,MAAM,MAAM,KAAK,cAAc,KAAK,WAAW,GAAG,EAAE,CAAC,CACvF,CAAC;EACD,OAAO,WAAW,MAAM,MAAM,GAAG,EAAE,CAAC;CACtC;CAEA,MAAM,KAAK,cAAc,EAAE,SAAS,WAAW;EAC7C,IAAI,WAAWJ,WAAAA,SAAY,MACzB;EAGF,OAAO,KAAK,MAAA,GAAKI,UAAAA,UAAAA,CAAU,UAAU,GAAG,GAAG,SAAS,YAAYJ,WAAAA,SAAY,OAAO,OAAO,KAAA,CAAS,CAAC;CACtG,CAAC;CAGD,MAAM,KAAK,eAAe,EAAE,YAAY;EACtC,MAAM,QAAQ,OAAO;EACrB,IAAI,OACF,MAAM,SAAS;EAKjB,MAAM,UAAU,MAAM,SAAS,WAAWG,WAAAA,YAAY,QAAQ,KAAK,IAAI,MAAM,UAAU,GAAG,MAAM,KAAK,IAAI,MAAM;EAC/G,MAAM,OAAOA,WAAAA,YAAY,QAAQ,KAAK,IAAI,MAAM,WAAW,OAAO,KAAA;EAClE,MAAM,CAAC,WAAW,IAAI,GAAG,WAAWA,WAAAA,YAAY,OAAO;GAAE,MAAMA,WAAAA,YAAY,KAAK;GAAS,UAAU;GAAS;GAAS;GAAM,OAAO;EAAM,GAAG,aAAa;EAExJ,IAAI,CAAC,OAAO;GACV,QAAQ,KAAK;GACb,SAAS,KAAK;GACd,OAAO,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC;GACxC;EACF;EAGA,IAAI,QAAQ,QACV,QAAQ,KAAK,SAAS,QAAQ;OAE9B,OAAO,MAAM,KAAK,OAAO,CAAC;EAE5B,IAAI,QAAQ,QACV,OAAO,MAAM,QAAQ,IAAI,IAAI,CAAC;CAElC,CAAC;CAED,MAAM,KAAK,mBAAmB,OAAO,EAAE,iBAAiB;EAEtD,IAAI,UAAU,WAAW,aAAa,SACpC;EAGF,IAAI,IAAI,WAAW,CAACA,WAAAA,YAAY,SAAS,UAAU,GACjD;EAGF,QAAQ,KAAK;EACb,SAAS,KAAK;EAEd,IAAIA,WAAAA,YAAY,SAAS,UAAU,GAAG;GACpC,OAAO,OACL,CAAC,MAAM,WAAW,eAAe,UAAU,WAAW,cAAc,KAAK,0CAA0C,GACnH,6BACF;GACA;EACF;EAGA,IAAI,SAAS,IAAI,WAAW;GAC1B,MAAM,SAAS,KAAK,UAAU;GAC9B;EACF;EACA,MAAM,cAAc,CAAC,UAAU,CAAC;CAClC,CAAC;CAED,OAAO;EACL;;EAEA,QAAQ,QAAgB;GACtB,MAAM,QAAQ,aAAa,MAAM;GACjC,IAAI,SAAS,OAAO,SAAS,WAAA,GAAUE,WAAAA,aAAAA,CAAa,KAAK,MAAM,QAAQ;IACrE,MAAM,QAAA,GAAOC,UAAAA,QAAAA,CAAQ,OAAO,MAAM,KAAK;IAEvC,IAAI;IACJ,MAAM,OAAO;KACX;KACA,SAAS,OAAO;KAChB,IAAI,SAAS;MACX,OAAQ,WAAWC,gBAAAA,KAAK,IAAI,CAAC,CAAC,YAAY,KAAA,CAAS;KACrD;IACF;GACF;EACF;;EAEA,QAAQ;GACN,OAAO,cAAc,MAAM,SAAS,OAAO,CAAC,CAAC;EAC/C;;EAEA,cAAsB;GACpB,MAAM,EAAE,QAAQ,aAAaJ,WAAAA,YAAY,MAAM,MAAM,WAAW;GAChE,MAAM,SAAS,CAAC,UAAUK,aAAAA,UAAU,QAAQ,OAAO,GAAG,YAAYA,aAAAA,UAAU,UAAU,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;GAC5H,IAAI,CAAC,SAAS,CAAC,QACb,OAAO;GAET,MAAM,UAAUL,WAAAA,YAAY,cAAc,MAAM,WAAW;GAC3D,OAAO,aAAa,SAAS,QAAQ,SAAS,QAAQ,QAAQ,KAAK,IAAI,MAAM;EAC/E;EACA,QAAQ;GACN,OAAO,OAAO,OAAO;IAAE,UAAU,CAAC;IAAG,aAAa,CAAC;IAAG,MAAM,KAAA;GAAU,CAAC;EACzE;CACF;AACF;;;ACxKA,SAAgB,eAAe,EAAE,QAAQ,QAAQ,MAAM,SAAwB,SAAkB;CAC/F,MAAM,QAAQ;EACZ,UAAU;EACV,YAAY;EACZ,gBAAgB;;EAEhB,UAAU;CACZ;CAEA,SAAS,KAAK,SAAkB;EAC9B,MAAM,WAAW,MAAM;EACvB,IAAI,CAAC,UACH;EAEF,MAAM,WAAW;EACjB,SAAS,KAAK,YAAY,KAAA,IAAY,KAAK,KAAK,OAAO,CAAC;CAC1D;CAEA,IAAI,CAAC,QAAQ;EACX,MAAM,gCAAgC,EAAE,YAAY;GAClD,QAAQ,KAAK;GACb,MAAM,aAAa,MAAM;GACzB,MAAM,iBAAiB;GAEvB,MAAM,WAAW,OAAO,SAAS,MAAM,MAAM;GAC7C,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM,WAAW,eAAe,UAAU,GAAGM,aAAAA,UAAU,MAAM,QAAQ,MAAM,GAAG,CAAC;EAC9G,CAAC;EAED,MAAM,iCAAiC,EAAE,YAAY;GACnD,KAAK,MAAM,EAAE,MAAM,YAAY,OAAO;IACpC,MAAM;IACN,MAAM,UAAU,QAAQ,GAAG,MAAM,WAAW,eAAe,UAAU,IAAA,GAAGC,UAAAA,SAAAA,CAAS,OAAO,MAAM,KAAK,IAAI,GAAG;GAC5G;EACF,CAAC;EAED,MAAM,8BAA8B,EAAE,OAAO,gBAAgB;GAC3D,MAAM,UAAU,UAAU,UAAA,GAASC,UAAAA,UAAAA,CAAU,OAAO,MAAM,UAAU,OAAO,WAAW,IAAI;GAC1F,KACE,MAAM,WACF,aAAaF,aAAAA,UAAU,MAAM,gBAAgB,MAAM,EAAE,cACrD,SAASA,aAAAA,UAAU,MAAM,SAAS,UAAU,QAAQ,MAAM,IAAI,SACpE;EACF,CAAC;CACH;CAEA,OAAO;EACL;EACA;EACA,QAAQ;GACN,KAAK;GACL,OAAO,OAAO,OAAO;IAAE,YAAY;IAAG,gBAAgB;IAAG,UAAU;GAAM,CAAC;EAC5E;CACF;AACF;;;ACtDA,SAAS,cAAc,EAAE,SAAS,QAAQ,eAAkF;CAC1H,MAAM,KAAK,cAAc,IAAA,GAAGG,UAAAA,UAAAA,CAAU,OAAO,MAAM,cAAc,OAAO,EAAE,CAAC,EAAE,KAAK;CAClF,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,OAAO,MAAM,CAAC,EAAE,IAAI,QAAQ,OAAO,EAAE,EAAE,GAAG,KAAK;AACrE;;;;;AAMA,SAAgB,cAAc,KAAoB,SAAkB;CAClE,MAAM,EAAE,QAAQ,QAAQ,OAAO,UAAU,MAAM,UAAU;CAEzD,MAAM,KAAK,wBAAwB,EAAE,MAAM,aAAa;EACtD,IAAI,WAAWC,WAAAA,SAAY,MACzB;EAGF,QAAQ,KAAK;EAEb,IAAI,SAAS,MAAM;GACjB,OAAO,KAAK,KAAK,+EAA+E,CAAC;GACjG;EACF;EACA,OAAO,KAAK,KAAK,oCAAoC,UAAU,QAAQ,OAAO,EAAE,CAAC;CACnF,CAAC;CAED,MAAM,KAAK,gBAAgB,EAAE,SAAS,iBAAiB;EACrD,IAAI,WAAWA,WAAAA,SAAY,MACzB;EAEF,MAAM,SAAS,aAAa,UAAUC,aAAAA,iBAAiB,UAAU,EAAE,gBAAgB;EAEnF,MAAM,SAAS,QAAQ;EACvB,QAAQ,KAAK;EACb,OAAO,KAAK,KAAK,KAAK,UAAU,QAAQ,CAAC;EACzC,IAAI,QAAQ,QAAQ,MAAM,gBAAgB;CAC5C,CAAC;CAGD,MAAM,KAAK,iBAAiB,EAAE,YAAY;EACxC,IAAI,QAAQ,QAAQ;GAClB,QAAQ,KAAK,MAAM,SAAS,QAAQ;GACpC;EACF;EACA,OAAO,MAAM,KAAK,MAAM,OAAO,CAAC;CAClC,CAAC;CAED,IAAI,QACF;CAIF,IAAI,MAAgE;CAEpE,MAAM,KAAK,qBAAqB,EAAE,KAAK,UAAU,EAAE,QAAQ,MAAM,cAAc;EAC7E,IAAI,UAAU;EACd,QAAQ,KAAK;EAEb,MAAM,WAAW;GAAC,IAAI;GAAS,SAAS,QAAQ,YAAY,SAAS,KAAA;GAAW,WAAW;EAAQ,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;EAC/H,OAAO,QAAQ,KAAK,mBAAA,GAAkBF,UAAAA,UAAAA,CAAU,QAAQ,GAAG,EAAE,IAAA,GAAGA,UAAAA,UAAAA,CAAU,OAAO,KAAK,UAAU,GAAG,CAAC;EACpG,QAAQ,MAAM,gBAAgB;CAChC,CAAC;CAED,MAAM,KAAK,+BAA+B;EACxC,IAAI,IAAI,SAAS,QAAQ,QAAQ,KAAK,YAAY,CAAC;CACrD,CAAC;CAED,MAAM,KAAK,wBAAwB,EAAE,cAAc,CAAC,GAAG,eAAe,GAAG,QAAQ,UAAUG,aAAAA,QAAQ,OAAO,QAAQ;EAChH,MAAM;GAAE,WAAW;GAAc,IAAIC,aAAAA,aAAa,OAAO;GAAG,QAAQ,WAAW,WAAWC,WAAAA,YAAY,MAAM,WAAW,CAAC,CAAC,SAAS;EAAE;CACtI,CAAC;CAED,MAAM,KAAK,mBAAmB,EAAE,SAAS,MAAM,aAAa,aAAa;EACvE,QAAQ,KAAK;EACb,MAAM,OAAO,YAAY,cAAc,MAAM,GAAGC,aAAAA,UAAU,IAAI,WAAW,MAAM,EAAE,MAAMC,aAAAA,SAAS,IAAI,EAAE,EAAE,KAAK;EAC7G,MAAM,SAAS,SACX,IAAA,GAAGP,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE,GAAG,KAAK,SAASM,aAAAA,UAAU,IAAI,QAAQ,OAAO,IAAI,SAAS,gBACpF,IAAA,GAAGN,UAAAA,UAAAA,CAAU,SAAS,GAAG,EAAE,GAAG,QAAA,GAAOA,UAAAA,UAAAA,CAAU,OAAO,IAAI,KAAK,EAAE;EACrE,OAAO,KAAK,cAAc;GAAE;GAAS;GAAa;EAAO,CAAC,CAAC;EAC3D,MAAM;EACN,QAAQ,MAAM,gBAAgB;CAChC,CAAC;CAED,MAAM,KAAK,wBAAwB,EAAE,cAAc;EACjD,QAAQ,KAAK;EACb,OAAO,KAAK,MAAA,GAAKA,UAAAA,UAAAA,CAAU,OAAO,yCAAyCO,aAAAA,SAAS,OAAO,GAAG,CAAC,CAAC;CAClG,CAAC;AACH;;;ACzFA,SAAgB,cAAc,EAAE,QAAQ,QAAQ,QAAuB;CACrE,IAAI,UAAgC;CAEpC,SAAS,KAAK,SAAkB,SAAoB,WAAW;EAC7D,MAAM,SAAS;EACf,IAAI,CAAC,QACH;EAEF,UAAU;EAEV,IAAI,YAAY,KAAA,GAAW;GACzB,OAAO,MAAM;GACb;EACF;EACA,IAAI,WAAW,UAAU;GACvB,OAAO,MAAM,KAAK,OAAO,CAAC;GAC1B;EACF;EACA,OAAO,KAAK,KAAK,OAAO,CAAC;CAC3B;CAEA,OAAO;;EAEL,IAAI,SAAkB;GACpB,OAAO,YAAY;EACrB;EACA,MAAM,SAAiB;GACrB,IAAI,QACF;GAGF,UAAU,OAAO,QAAQ;GACzB,QAAQ,MAAM,KAAK,OAAO,CAAC;EAC7B;EACA;;EAEA,QAAQ,MAAuB;GAC7B,IAAI,CAAC,SACH,OAAO;GAET,QAAQ,QAAQ,IAAI;GACpB,OAAO;EACT;EACA,aAAa,KAAK;CACpB;AACF;;;ACvCA,MAAM,iBAAiB;AAEvB,SAAS,cAAc;CACrB,OAAO;EACL,cAAc;EACd,kBAAkB;EAClB,eAAe;;EAEf,SAASC,aAAAA,QAAQ,OAAO;;EAExB,aAAa,CAAC;;EAEd,MAAM;GAAE,OAAO;GAAG,yBAAS,IAAI,IAAY;GAAG,yBAAS,IAAI,IAAgD;EAAE;EAC7G,cAAc;CAChB;AACF;;AAGA,SAAgB,WAAW,EAAE,QAAQ,QAAQ,OAAO,MAAM,SAAwB,SAAkB,UAAoB;CACtH,MAAM,QAAQ,YAAY;;CAG1B,SAAS,oBAAmC;EAC1C,MAAM,QAAuB,CAAC;EAC9B,MAAM,WAAWC,aAAAA,SAASC,aAAAA,aAAa,MAAM,OAAO,CAAC;EACrD,MAAM,EAAE,YAAY,mBAAmB,SAAS;EAEhD,IAAI,MAAM,eAAe,GAAG;GAC1B,MAAM,SAAS,MAAM,gBAAgB,IAAI,KAAA,GAAIC,UAAAA,UAAAA,CAAU,OAAO,IAAI,MAAM,cAAc,SAAS,MAAM;GACrG,MAAM,KAAK,YAAA,GAAWA,UAAAA,UAAAA,CAAU,SAAS,MAAM,iBAAiB,SAAS,CAAC,EAAE,GAAG,MAAM,eAAe,QAAQ;EAC9G;EAEA,IAAI,aAAa,GACf,MAAM,KAAK,UAAA,GAASA,UAAAA,UAAAA,CAAU,SAAS,eAAe,SAAS,CAAC,EAAE,GAAG,YAAY;EAGnF,IAAI,MAAM,WAAW,GACnB,OAAO;EAGT,MAAM,KAAK,IAAA,GAAGA,UAAAA,UAAAA,CAAU,SAAS,QAAQ,EAAE,SAAS;EACpD,OAAO,MAAM,MAAA,GAAKA,UAAAA,UAAAA,CAAU,OAAO,KAAK,CAAC;CAC3C;CAEA,IAAI,CAAC,QAAQ;EACX,MAAM,qBAAqB,EAAE,YAAY,EAAE,SAAS,mBAAmB;GACrE,MAAM,KAAK,QAAQ,UAAU;GAC7B,MAAM,UAAU,GAAGC,aAAAA,UAAU,SAAS,QAAQ,EAAE,KAAKA,aAAAA,UAAU,YAAY,WAAW,EAAE,KAAKH,aAAAA,SAASC,aAAAA,aAAa,MAAM,OAAO,CAAC;GACjI,QAAQ,KAAK,iBAAA,GAAgBC,UAAAA,UAAAA,CAAU,OAAO,OAAO,GAAG;GACxD,QAAQ,MAAM,YAAY;EAC5B,CAAC;EAGD,IAAI,OAAO;GACT,MAAM,UAAU,KAAa,MAAc,WAAmB;IAC5D,MAAM,EAAE,OAAO,SAAS,YAAY,MAAM;IAC1C,QAAQ,IAAI,GAAG;IACf,QAAQ,IAAI,QAAQ;KAAE,QAAQ,QAAQ,IAAI,MAAM,CAAC,EAAE,SAAS,KAAK;KAAG,SAAS;IAAK,CAAC;IAGnF,MAAM,MAAM,KAAK,IAAI;IACrB,IAAI,MAAM,MAAM,eAAe,gBAAgB;IAC/C,MAAM,eAAe;IAErB,MAAM,WAAA,GAAUA,UAAAA,UAAAA,CAAU,OAAOF,aAAAA,SAASC,aAAAA,aAAa,MAAM,OAAO,CAAC,CAAC;IACtE,MAAM,OAAO,QACT,eAAeG,eAAAA,UAAU,QAAQ,MAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,GAAG,MAAM,UAAU,YAClF,eAAeD,aAAAA,UAAU,QAAQ,MAAM,MAAM,EAAE,IAAI;IACvD,MAAM,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe,WAAW,MAAM,CAAC;IACpF,MAAM,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,KACvB,CAAC,YAAY,SACZ,IAAA,GAAGD,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE,KAAK,WAAW,OAAO,KAAK,EAAE,KAAA,GAAIA,UAAAA,UAAAA,CAAU,OAAO,OAAO,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAA,GAAIA,UAAAA,UAAAA,CAAU,QAAQ,IAAI,OAAO,GAChJ;IACA,QAAQ,QAAQ,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;GAClD;GAEA,MAAM,yBAAyB,MAAM,EAAE,aAAa,OAAO,UAAU,KAAK,QAAQ,KAAK,QAAQ,UAAU,OAAO,IAAI,CAAC;GACrH,MAAM,4BAA4B,MAAM,EAAE,aAAa,OAAO,aAAa,KAAK,eAAe,KAAK,aAAa,OAAO,IAAI,CAAC;EAC/H;EAGA,MAAM,oBAAoB,EAAE,QAAQ,UAAU,cAAc;GAC1D,MAAM,UAAU,qBAAqB,gBAAgB;GACrD,MAAM,YAAY,KAAK,KAAK,GAAG,OAAO,KAAK,GAAG,UAAU,cAAc,SAAS,MAAMG,eAAAA,kBAAkB,QAAQ,GAAG,CAAC;EACrH,CAAC;EAED,MAAM,0BAA0B;GAC9B,MAAM,SAAS,MAAM,gBAAgB;GACrC,QAAQ,KAAK,kBAAkB,KAAK,KAAA,GAAW,SAAS,WAAW,SAAS;GAE5E,IAAI,MAAM,YAAY,QAAQ;IAC5B,OAAO,MAAM,MAAM,WAAW;IAC9B,MAAM,cAAc,CAAC;GACvB;EACF,CAAC;CACH;CAEA,OAAO;EACL;EACA,QAAQ;GACN,OAAO,OAAO,OAAO,YAAY,CAAC;EACpC;CACF;AACF;;;;;;;;;ACjGA,SAAgB,cAAc,EAAE,OAAO,QAAQ,YAE7C;CACA,MAAM,MAAM,oBAAoB;EAAE;EAAO;EAAQ;CAAS,CAAC;CAC3D,MAAM,UAAU,cAAc,GAAG;CACjC,MAAM,WAAW,eAAe,KAAK,OAAO;CAC5C,MAAM,OAAO,WAAW,KAAK,SAAS,QAAQ;CAC9C,MAAM,SAAS,aAAa,KAAK,OAAO;CACxC,MAAM,WAAW,eAAe,KAAK,SAAS,UAAU,MAAM;CAC9D,cAAc,KAAK,OAAO;CAC1B,OAAO,iBAAiB,KAAK;EAAE;EAAS;EAAU;EAAM;EAAQ;CAAS,CAAC;AAC5E;;;ACjBA,SAAS,eACP,SACA,EACE,UACA,WACA,QAAA,WAASC,cAAAA,OAAc,GACvB,SAAS,SAYL;CACN,MAAM,UAAU,UAAU,MAAM,aAAa,SAAS,SAAS,MAAM;CACrE,MAAM,WAAW,UAAU,SAAS,aAAa;EAC/C,IAAI,SAAS,SAAS,OAAO,OAAO,CAAC,QAAQ;EAC7C,IAAI,SAAS,OAAO,CAAC;EACrB,OAAO,EAAA,GAACC,WAAAA,kBAAAA,CAAkB,EAAE,QAAQ,cAAc;GAAE,OAAO;GAAS,QAAA;GAAQ;EAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;CAC1G,CAAC;CACD,MAAM,MAAuB,EAAE,SAAS;CACxC,MAAM,cAAc,SAAS,MAAM,aAAa,SAAS,gBAAgB,oBAAI,IAAI,IAA2B,IAAI,KAAA;CAChH,MAAM,uBAAO,IAAI,IAAY;CAC7B,IAAI,aACF,QAAQ,KAAK,oBAAoB,EAAE,QAAQ,YAAY;EACrD,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;GACzB,KAAK,IAAI,KAAK,IAAI;GAClB,MAAM,QAAQ,YAAY,IAAI,OAAO,IAAI,KAAK,CAAC;GAC/C,MAAM,KAAK,KAAK,IAAI;GACpB,YAAY,IAAI,OAAO,MAAM,KAAK;EACpC;CACF,CAAC;CAIH,IAAI,iBAAiB;CACrB,IAAI;CACJ,IAAI,QAAuB,CAAC;CAC5B,IAAI,aAAa;CACjB,MAAM,eAAe,SAAS,MAAM,aAAa,SAAS,SAAS,KAAK,KAAK,WAAWC,WAAAA,SAAY;CACpG,QAAQ,KAAK,yBAAyB,OAAO,EAAE,aAAa;EAC1D,aAAa,MAAM;EACnB,KAAK,MAAM;EACX,iBAAiB;EACjB,QAAQ,CAAC;EACT,cAAA,GAAaC,UAAAA,QAAAA,CAAQ,OAAO,MAAM,OAAO,OAAO,IAAI;EACpD,WAAW,iBAAiB,UAAU,OAAO,SAAS,SAAS,QAAQ,MAAMC,cAAAA,gBAAgB,UAAU,IAAI,KAAA;CAC7G,CAAC;CACD,QAAQ,KAAK,+BAA+B,OAAO,EAAE,YAAY;EAC/D,IAAI,CAAC,UAAU;EAEf,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,SAAS,IAAI,KAAK,IAAI,KAAKC,gBAAAA,aAAa,YAAY,KAAK,IAAI,GAAG;GACpE,MAAM,SAAS,OAAA,GAAMC,iBAAAA,SAAAA,CAAS,KAAK,MAAM,MAAM,CAAC,CAAC,YAAY,IAAI;GACjE,IAAI,WAAW,MAAM,SAAS,IAAI,KAAK,MAAM,MAAM;EACrD;CACF,CAAC;CACD,QAAQ,KAAK,8BAA8B,EAAE,OAAO,gBAAgB;EAClE,iBAAiB,UAAU;EAC3B,QAAQ,MAAM,KAAK,SAAS,KAAK,IAAI;CACvC,CAAC;CAED,QAAQ,KAAK,uBAAuB,OAAO,EAAE,QAAQ,SAAS,cAAc,CAAC,GAAG,eAAe,GAAG,SAAS,WAAW,UAAUC,aAAAA,QAAQ,OAAO,QAAQ;EACrJ,MAAM,SAA2B;GAAE;GAAQ;GAAa;GAAc;GAAgB;GAAQ;GAAQ;EAAQ;EAC9G,MAAM,YAAY,EAAE,GAAG,OAAO;EAC9B,IAAI,YAAY,WAAW,UAAU;GACnC,MAAM,WAAW,SAAS,OAAA,GAAMC,WAAAA,qBAAAA,CAAqB;IAAE;IAAS,QAAA,GAAOC,WAAAA,aAAAA,CAAa,EAAE,MAAM,OAAO,KAAK,CAAC;GAAE,CAAC,IAAI,KAAA;GAChH,MAAM,OAAO,MAAMC,cAAAA,WAAW;IAC5B;IACA;IACA,OAAO,QAAQ,OAAO,OAAO,KAAK;IAClC;IACA,eAAe;GACjB,CAAC;GACD,MAAM,UAAU;IAAE,OAAO;IAAG,UAAU;IAAG,SAAS;IAAG,YAAY;IAAG,cAAc;GAAE;GACpF,MAAM,SAAS;IAAE,GAAG;IAAS,GAAG;IAAY,GAAG;GAAU;GACzD,KAAK,MAAM,QAAQ,KAAK,OAAO;IAC7B,QAAQ,OAAO,KAAK,QAAQ;IAC5B,QAAQ,cAAc,KAAK,SAAS;IACpC,QAAQ,gBAAgB,KAAK,WAAW;GAC1C;GACA,UAAU,eAAe,QAAQ,QAAQ,QAAQ,WAAW,KAAK;GACjE,UAAU,iBAAiB,KAAK;GAChC,UAAU,cAAc;EAC1B;EACA,KAAK,MAAM,YAAY,UAAU;GAC/B,MAAM,UAAU,SAAS,oBAAoB,aAAa,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,QAAQ,YAAY;IAAE;IAAQ,OAAO,CAAC,GAAG,KAAK;GAAE,EAAE,IAAI,KAAA;GAC9I,MAAM,SAAS,OAAO;IAAE,GAAI,SAAS,SAAS,QAAQ,YAAY;IAAS,aAAa;GAAQ,GAAG,GAAG;EACxG;CACF,CAAC;CAED,QAAQ,KAAK,sBAAsB,YAAY;EAC7C,KAAK,MAAM,YAAY,UAAU,MAAM,SAAS,QAAQ,GAAG;CAC7D,CAAC;AACH;;AAKA,SAAgB,gBAAgB,WAAoC,OAA+C;CACjH,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,SAAS,SAAS,UAAU,MAAM,aAAa,SAAS,SAAS,IAAI,KAAK,CAAC,CAAC;AACzG"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import "./rolldown-runtime-
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import "./rolldown-runtime-xo6NMXYd.js";
|
|
2
|
+
import { n as getElapsedMs, t as formatMs } from "./time-C-wU7VhC.js";
|
|
3
|
+
import { i as isPathInside, o as read } from "./spinner-BZaln7O8.js";
|
|
4
|
+
import { a as readOutputFiles, r as diffOutput } from "./utils-BdibacYq.js";
|
|
5
|
+
import { n as formatMsWithColor, t as formatBar } from "./banner-BdTTDFkG.js";
|
|
6
|
+
import { d as writer } from "./intro-9PB8sE8z.js";
|
|
7
|
+
import { n as toPermissionFlag, t as pluralize } from "./text-BmiI4s6N.js";
|
|
5
8
|
import { styleText } from "node:util";
|
|
6
9
|
import process from "node:process";
|
|
7
10
|
import { readFile } from "node:fs/promises";
|
|
8
11
|
import { relative, resolve } from "node:path";
|
|
9
12
|
import { Diagnostics, cacheStorage, createCliReporter, createOutputManifest, getInputKind, logLevel } from "@kubb/core";
|
|
10
|
-
|
|
13
|
+
// src/loggers/features/context.ts
|
|
11
14
|
function createLoggerContext({ hooks, writer, logLevel: logLevel$5 }) {
|
|
12
15
|
const text = (message) => logLevel$5 >= logLevel.verbose ? `${styleText("dim", `[${clock()}]`)} ${message}` : message;
|
|
13
16
|
const ctx = {
|
|
@@ -45,8 +48,7 @@ function getInputPath(config) {
|
|
|
45
48
|
if (typeof input === "string") return input;
|
|
46
49
|
return typeof input?.path === "string" ? input.path : void 0;
|
|
47
50
|
}
|
|
48
|
-
|
|
49
|
-
//#region src/loggers/features/generation.ts
|
|
51
|
+
// src/loggers/features/generation.ts
|
|
50
52
|
/**
|
|
51
53
|
* One config's run: the group it opens, the state every feature resets at its start, and the
|
|
52
54
|
* closing line, which the lifecycle end draws too for a run that threw before its summary.
|
|
@@ -103,8 +105,7 @@ function createGeneration(ctx, { spinner, progress, walk, phases, problems }) {
|
|
|
103
105
|
};
|
|
104
106
|
return { renderSummary };
|
|
105
107
|
}
|
|
106
|
-
|
|
107
|
-
//#region src/loggers/features/phases.ts
|
|
108
|
+
// src/loggers/features/phases.ts
|
|
108
109
|
/**
|
|
109
110
|
* The three output phases, in the order the generate runner runs them.
|
|
110
111
|
*/
|
|
@@ -253,8 +254,7 @@ function createPhases({ writer, silent, logLevel: logLevel$4, text, line, onRun
|
|
|
253
254
|
}
|
|
254
255
|
};
|
|
255
256
|
}
|
|
256
|
-
|
|
257
|
-
//#region src/loggers/specFrame.ts
|
|
257
|
+
// src/loggers/specFrame.ts
|
|
258
258
|
/**
|
|
259
259
|
* Where `location` sits in `source` according to its adapter, with a code frame. `undefined` when the adapter cannot place it.
|
|
260
260
|
*/
|
|
@@ -283,8 +283,7 @@ function locateInSpec({ adapter, source, location }) {
|
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
|
-
|
|
287
|
-
//#region src/loggers/features/problems.ts
|
|
286
|
+
// src/loggers/features/problems.ts
|
|
288
287
|
/** Warnings, errors and diagnostics: printed as they come, or held back and grouped by plugin once a human's build ends. */
|
|
289
288
|
function createProblems(ctx, spinner, progress, phases) {
|
|
290
289
|
const { writer, silent, human, logLevel: logLevel$3, text, line, hooks } = ctx;
|
|
@@ -417,8 +416,7 @@ function createProblems(ctx, spinner, progress, phases) {
|
|
|
417
416
|
}
|
|
418
417
|
};
|
|
419
418
|
}
|
|
420
|
-
|
|
421
|
-
//#region src/loggers/features/progress.ts
|
|
419
|
+
// src/loggers/features/progress.ts
|
|
422
420
|
/** The progress bar over the file writes, and the counts the summary line shows. */
|
|
423
421
|
function createProgress({ writer, silent, text, onRun }, spinner) {
|
|
424
422
|
const state = {
|
|
@@ -466,8 +464,7 @@ function createProgress({ writer, silent, text, onRun }, spinner) {
|
|
|
466
464
|
}
|
|
467
465
|
};
|
|
468
466
|
}
|
|
469
|
-
|
|
470
|
-
//#region src/loggers/features/session.ts
|
|
467
|
+
// src/loggers/features/session.ts
|
|
471
468
|
/** One line of a Studio session's job log: the time, the command, who asked for it, and how it ended. */
|
|
472
469
|
function formatJobLine({ command, result, requestedBy }) {
|
|
473
470
|
const by = requestedBy ? `${styleText("dim", `by ${requestedBy}`.padEnd(16))} ` : "";
|
|
@@ -543,8 +540,7 @@ function createSession(ctx, spinner) {
|
|
|
543
540
|
writer.info(text(styleText("dim", `Retrying connection to Kubb Studio in ${formatMs(delayMs)}`)));
|
|
544
541
|
});
|
|
545
542
|
}
|
|
546
|
-
|
|
547
|
-
//#region src/loggers/features/spinner.ts
|
|
543
|
+
// src/loggers/features/spinner.ts
|
|
548
544
|
/** 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. */
|
|
549
545
|
function createSpinner({ writer, silent, text }) {
|
|
550
546
|
let spinner = null;
|
|
@@ -582,8 +578,7 @@ function createSpinner({ writer, silent, text }) {
|
|
|
582
578
|
reset: () => stop()
|
|
583
579
|
};
|
|
584
580
|
}
|
|
585
|
-
|
|
586
|
-
//#region src/loggers/features/walk.ts
|
|
581
|
+
// src/loggers/features/walk.ts
|
|
587
582
|
/** Milliseconds between redraws of the live generation block, about clack's spinner frame rate. */
|
|
588
583
|
const WALK_REDRAW_MS = 80;
|
|
589
584
|
function createState() {
|
|
@@ -668,8 +663,7 @@ function createWalk({ writer, silent, human, text, onRun }, spinner, progress) {
|
|
|
668
663
|
}
|
|
669
664
|
};
|
|
670
665
|
}
|
|
671
|
-
|
|
672
|
-
//#region src/loggers/features/index.ts
|
|
666
|
+
// src/loggers/features/index.ts
|
|
673
667
|
/**
|
|
674
668
|
* Wires a {@link LoggerWriter} onto the run's hooks. Each feature registers the hooks for one
|
|
675
669
|
* concern, so every writer reports the same run in the same order: one group per config, a step
|
|
@@ -697,8 +691,7 @@ function installLogger({ hooks, writer, logLevel }) {
|
|
|
697
691
|
problems
|
|
698
692
|
});
|
|
699
693
|
}
|
|
700
|
-
|
|
701
|
-
//#region src/loggers/reporters.ts
|
|
694
|
+
// src/loggers/reporters.ts
|
|
702
695
|
/** Installs the live logger and wires the selected reporters. `cli` renders its summary through the logger, and is skipped when `json` owns stdout. */
|
|
703
696
|
function setupReporters(context, { logLevel: logLevel$1, reporters, writer: writer$1 = writer(), dryRun = false }) {
|
|
704
697
|
const hasJson = reporters.some((reporter) => reporter.name === "json");
|
|
@@ -811,7 +804,6 @@ function setupReporters(context, { logLevel: logLevel$1, reporters, writer: writ
|
|
|
811
804
|
function selectReporters(reporters, names) {
|
|
812
805
|
return [...new Set(names)].flatMap((name) => reporters.find((reporter) => reporter.name === name) ?? []);
|
|
813
806
|
}
|
|
814
|
-
//#endregion
|
|
815
807
|
export { setupReporters as n, selectReporters as t };
|
|
816
808
|
|
|
817
|
-
//# sourceMappingURL=reporters-
|
|
809
|
+
//# sourceMappingURL=reporters-BM430HdQ.js.map
|