@kubb/cli 5.12.8 → 5.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/{Telemetry-B3ls8iy8.cjs → Telemetry-0Sr_THx9.cjs} +2 -2
- package/dist/{Telemetry-B3ls8iy8.cjs.map → Telemetry-0Sr_THx9.cjs.map} +1 -1
- package/dist/{Telemetry-Cwis9NRC.js → Telemetry-B4hk3xGv.js} +2 -2
- package/dist/{Telemetry-Cwis9NRC.js.map → Telemetry-B4hk3xGv.js.map} +1 -1
- package/dist/{background-BuZJ6isn.cjs → background-6xlebN_Y.cjs} +2 -2
- package/dist/{background-BuZJ6isn.cjs.map → background-6xlebN_Y.cjs.map} +1 -1
- package/dist/{background-nDhk-eNv.js → background-B7oEWLZs.js} +1 -1
- package/dist/{background-BpyuKytZ.js → background-DY4LTodc.js} +2 -2
- package/dist/{background-BpyuKytZ.js.map → background-DY4LTodc.js.map} +1 -1
- package/dist/{config-1tiH3heq.cjs → config-BG_Nr2CZ.cjs} +17 -1
- package/dist/config-BG_Nr2CZ.cjs.map +1 -0
- package/dist/{config-CbjbW2J5.js → config-CNqgDSu3.js} +12 -2
- package/dist/config-CNqgDSu3.js.map +1 -0
- package/dist/config-DWDpFSn1.js +1 -0
- package/dist/credentials-CZK6zPLv.js.map +1 -1
- package/dist/credentials-DDaKqtJn.cjs.map +1 -1
- package/dist/index.cjs +1275 -97
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1276 -98
- package/dist/index.js.map +1 -1
- package/dist/{registry-DxHGGUfy.cjs → registry-9AEIs-Cm.cjs} +3 -3
- package/dist/{registry-DxHGGUfy.cjs.map → registry-9AEIs-Cm.cjs.map} +1 -1
- package/dist/{registry-D8Vxs2q6.js → registry-DLasg7du.js} +3 -3
- package/dist/{registry-D8Vxs2q6.js.map → registry-DLasg7du.js.map} +1 -1
- package/dist/{reporters-DMvezNR1.js → reporters-BfeB9jOt.js} +4 -4
- package/dist/{reporters-DMvezNR1.js.map → reporters-BfeB9jOt.js.map} +1 -1
- package/dist/{reporters-BRt7Cmp0.cjs → reporters-xwOZPZ42.cjs} +4 -4
- package/dist/{reporters-BRt7Cmp0.cjs.map → reporters-xwOZPZ42.cjs.map} +1 -1
- package/dist/{run-8K8KvqtO.js → run--OOU4YSR.js} +5 -5
- package/dist/{run-8K8KvqtO.js.map → run--OOU4YSR.js.map} +1 -1
- package/dist/{run-BPi2eh0e.js → run-BDmTZPT7.js} +7 -7
- package/dist/{run-BPi2eh0e.js.map → run-BDmTZPT7.js.map} +1 -1
- package/dist/{run-BFqPilTx.cjs → run-BTzmKup3.cjs} +2 -2
- package/dist/{run-BFqPilTx.cjs.map → run-BTzmKup3.cjs.map} +1 -1
- package/dist/{run-C61yKdb4.cjs → run-Bgr0F6xv.cjs} +5 -5
- package/dist/{run-C61yKdb4.cjs.map → run-Bgr0F6xv.cjs.map} +1 -1
- package/dist/{run-Be6_6_PJ.cjs → run-C2syKtAg.cjs} +7 -7
- package/dist/{run-Be6_6_PJ.cjs.map → run-C2syKtAg.cjs.map} +1 -1
- package/dist/{run-CfkP7AY1.js → run-C9Q5R-p9.js} +1 -1
- package/dist/{run-BJUijhbO.js → run-DoUk-2Xb.js} +2 -2
- package/dist/{run-BJUijhbO.js.map → run-DoUk-2Xb.js.map} +1 -1
- package/dist/{run-DZgSH5YE.js → run-kRFuEqeA.js} +14 -8
- package/dist/run-kRFuEqeA.js.map +1 -0
- package/dist/{run-Bk-PyLaA.cjs → run-w92b045L.cjs} +14 -8
- package/dist/run-w92b045L.cjs.map +1 -0
- package/dist/{snapshot-BApwIb2T.cjs → snapshot-B4eWToMC.cjs} +6 -6
- package/dist/{snapshot-BApwIb2T.cjs.map → snapshot-B4eWToMC.cjs.map} +1 -1
- package/dist/{snapshot-F8ShCYAC.js → snapshot-O36QFuVw.js} +6 -6
- package/dist/{snapshot-F8ShCYAC.js.map → snapshot-O36QFuVw.js.map} +1 -1
- package/dist/{status-D1O1SZi5.js → status-C5_IHiDc.js} +3 -3
- package/dist/{status-D1O1SZi5.js.map → status-C5_IHiDc.js.map} +1 -1
- package/dist/{status-CNvgGbU7.cjs → status-CteZmcug.cjs} +3 -3
- package/dist/{status-CNvgGbU7.cjs.map → status-CteZmcug.cjs.map} +1 -1
- package/dist/studioWorker.js +2 -2
- package/dist/{summary-D6hq3I9C.js → summary-B1aj8T_V.js} +3 -3
- package/dist/{summary-D6hq3I9C.js.map → summary-B1aj8T_V.js.map} +1 -1
- package/dist/{summary-D2g0ii83.cjs → summary-BuKuPfE_.cjs} +3 -3
- package/dist/{summary-D2g0ii83.cjs.map → summary-BuKuPfE_.cjs.map} +1 -1
- package/dist/{text-BBQbTT22.js → text-CaZG0KF2.js} +2 -2
- package/dist/{text-BBQbTT22.js.map → text-CaZG0KF2.js.map} +1 -1
- package/dist/{text-1NAngHDI.cjs → text-DVPYqR74.cjs} +2 -2
- package/dist/{text-1NAngHDI.cjs.map → text-DVPYqR74.cjs.map} +1 -1
- package/dist/{utils-DNOlQ-6B.js → utils--q06lp55.js} +4 -4
- package/dist/{utils-DNOlQ-6B.js.map → utils--q06lp55.js.map} +1 -1
- package/dist/{utils-N757uO9x.cjs → utils-Ckbz012p.cjs} +9 -3
- package/dist/{utils-N757uO9x.cjs.map → utils-Ckbz012p.cjs.map} +1 -1
- package/package.json +11 -10
- package/dist/config-1tiH3heq.cjs.map +0 -1
- package/dist/config-CbjbW2J5.js.map +0 -1
- package/dist/config-cP7k9YwA.js +0 -1
- package/dist/run-Bk-PyLaA.cjs.map +0 -1
- package/dist/run-DZgSH5YE.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Diagnostics","command","defineWithTypes","dryRunId","command","define","define","command","command","connectCommand","command","command","define","command","connectCommand","define","command","process","command","define","connectCommand","startCommand","loginCommand","logoutCommand","statusCommand","snapshotCommand","command","define","styleText","process","path","fs","x","read","Diagnostics","write","process","formatMs","getElapsedMs","isRichOutput","clack","createSpinner","getErrorMessage","Diagnostics","toShortId","clack","run","process","logCommandSummary","isInteractiveRun","styleText","registryUrl","toRegistryId","path","findConfigFile","withSpinner","fetchRegistryIndex","readInstalledPackages","read","closestIds","incompatibility","installSpec","command","define","clack","Diagnostics","KUBB_CONFIG_FILENAME","getConfigs","createKubb","run","process","createSpinner","styleText","isInteractiveRun","fetchRegistryIndex","registryUrl","incompatibility","exists","path","pluralize","initDefaults","KUBB_PACKAGE_NAME","version","installSpec","write","formatMs","getElapsedMs","command","defineWithTypes","dryRunId","readInstalledPackages","fetchRegistryIndex","getErrorMessage","isOutdated","run","process","registryUrl","styleText","command","define","createSpinner","path","readOutputFiles","Hookable","diffFiles","pluralize","getErrorMessage","run","process","logCommandSummary","isInteractiveRun","styleText","toRegistryId","withSpinner","fetchRegistryIndex","registryUrl","readInstalledPackages","bumpOf","isOutdated","incompatibility","clack","toShortId","installSpec","findConfigFile","defineWithTypes","dryRunId","isTelemetryDisabled","styleText","cli","generateCommand","initCommand","validateCommand","mcpCommand","studioCommand","addCommand","updateCommand","listCommand","wantsMascot","getBanner","version","dryrun"],"sources":["../src/commands/shared.ts","../src/commands/generate.ts","../src/commands/mcp.ts","../src/commands/studio/studioCommand.ts","../src/commands/studio/connect.ts","../src/commands/studio/login.ts","../src/commands/studio/logout.ts","../src/commands/studio/snapshot.ts","../src/commands/studio/background.ts","../src/commands/studio/status.ts","../src/commands/studio/index.ts","../src/commands/validate.ts","../src/deprecatedFlags.ts","../../../internals/shared/src/init.ts","../src/runners/init/utils.ts","../src/runners/installWithSpinner.ts","../src/runners/add/run.ts","../src/runners/init/run.ts","../src/ui/table.ts","../src/runners/list/run.ts","../src/runners/update/run.ts","../src/index.ts"],"sourcesContent":["import { pluginId as dryRunId } from '@gunshi/plugin-dryrun'\nimport type { DryRunExtension } from '@gunshi/plugin-dryrun'\n\nexport { dryRunId }\n\n/** Extension shape gunshi's command context carries with `@gunshi/plugin-dryrun`; the `extensions` type parameter of `defineWithTypes`. */\nexport type DryRunExtensions = {\n [dryRunId]: DryRunExtension\n}\n\nexport const configArg = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n short: 'c',\n },\n} as const\n\nexport const yesArg = {\n yes: {\n type: 'boolean',\n description: 'Skip the confirmation',\n short: 'y',\n default: false,\n },\n} as const\n\nexport const logLevelArg = {\n logLevel: {\n type: 'enum',\n choices: ['silent', 'info', 'verbose'] as const,\n description: 'Info, silent or verbose',\n short: 'l',\n default: 'info',\n toKebab: true,\n },\n} as const\n\nexport const studioConnectionArgs = {\n url: {\n type: 'string',\n description: 'Base URL of the Kubb Studio instance',\n },\n token: {\n type: 'string',\n description: 'Organization CI API key for `snapshot`. Defaults to KUBB_TOKEN',\n },\n} as const\n\nexport const studioPermissionArgs = {\n allowRead: {\n type: 'boolean',\n description: 'Read the source of files a generation produced. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowReadAst: {\n type: 'boolean',\n description: 'Read the parsed spec (the Kubb AST). Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowWrite: {\n type: 'boolean',\n description: 'Write generated files to disk. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowConfigEdit: {\n type: 'boolean',\n description: 'Let Studio change plugin options in kubb.config.ts. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowInstall: {\n type: 'boolean',\n description: 'Let Studio install extensions from the registry with kubb add; needs --allow-config-edit too. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowUpdate: {\n type: 'boolean',\n description: 'Let Studio update installed extensions with kubb update. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowSaveInput: {\n type: 'boolean',\n description: 'Let Studio save the spec it sends as the input in kubb.config.ts; needs --allow-config-edit too. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowExec: {\n type: 'boolean',\n description: 'Run the formatter, the linter, and output.postGenerate after a generation',\n default: false,\n toKebab: true,\n },\n} as const\n","import { defineWithTypes } from 'gunshi'\nimport { Diagnostics, type ReporterName } from '@kubb/core'\nimport { configArg, dryRunId, type DryRunExtensions, logLevelArg } from './shared.ts'\n\nconst REPORTER_NAMES: Array<ReporterName> = ['cli', 'json', 'file', 'html']\n\n/**\n * Splits and validates the comma-separated `--reporter` value against the known reporter names.\n */\nfunction parseReporters(value: string): Array<ReporterName> {\n const names = value\n .split(',')\n .map((name) => name.trim())\n .filter(Boolean)\n\n for (const name of names) {\n if (!REPORTER_NAMES.includes(name as ReporterName)) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `must be one of cli, json, file, html (got \"${name}\")`,\n help: 'Use one of cli, json, file, html.',\n })\n }\n }\n\n return names as Array<ReporterName>\n}\n\n/**\n * Resolves the effective log level, letting the `--verbose` and `--silent` flags win over `--log-level`.\n */\nfunction resolveLogLevel({ verbose, silent, logLevel }: { verbose: boolean; silent: boolean; logLevel: string }): string {\n if (verbose) return 'verbose'\n if (silent) return 'silent'\n return logLevel\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'generate',\n // The runner plays the animated mascot itself, so the shared header would print it twice.\n rendering: { header: null },\n description: 'Generate types, clients, hooks, and schemas from an OpenAPI specification.',\n examples: [\n 'kubb generate # generate from kubb.config.ts',\n 'kubb generate ./openapi.yaml # generate from this spec instead of the config input',\n 'kubb generate --config kubb.config.ts',\n 'kubb generate --watch # regenerate whenever the spec changes',\n 'kubb generate --dry-run # preview the run without writing files',\n 'kubb generate --reporter html # write an HTML run report',\n 'kubb studio # connect this project to Kubb Studio and generate from the browser',\n 'kubb studio --allow-write # let Studio write the generated files to disk',\n 'kubb studio login # pair this machine with Studio without connecting',\n ].join('\\n'),\n toKebab: true,\n args: {\n input: {\n type: 'positional',\n required: false,\n description: 'Path to the OpenAPI specification, overriding the config',\n },\n ...configArg,\n ...logLevelArg,\n watch: {\n type: 'boolean',\n description: 'Watch mode: rebuilds when the local input file changes',\n short: 'w',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Override logLevel to verbose',\n default: false,\n },\n silent: {\n type: 'boolean',\n description: 'Override logLevel to silent',\n short: 's',\n default: false,\n },\n reporter: {\n type: 'custom',\n description: 'Reporters that render the run: cli, json, file, html. Comma-separated. Overrides config.reporters',\n metavar: 'cli|json|file|html',\n parse: parseReporters,\n },\n },\n async run(ctx) {\n const { values } = ctx\n const logLevel = resolveLogLevel(values)\n const { run } = await import('../runners/generate/run.ts')\n\n await run({\n input: values.input,\n configPath: values.config,\n logLevel,\n watch: values.watch,\n reporters: values.reporter,\n dryRun: ctx.extensions[dryRunId].enabled,\n })\n },\n})\n","import { define } from 'gunshi'\n\n/** The runner is imported when the command runs, so listing `kubb --help` never loads `@kubb/mcp`. */\nexport const command = define({\n name: 'mcp',\n description: 'Start an MCP server for code generation from an AI assistant.',\n examples: ['kubb mcp', '# Then add to your MCP client config:', '# { \"mcpServers\": { \"kubb\": { \"command\": \"npx\", \"args\": [\"kubb\", \"mcp\"] } } }'].join('\\n'),\n // gunshi prints the header to stdout, which the MCP stdio transport owns.\n rendering: { header: null },\n async run() {\n const { run } = await import('../runners/mcp/run.ts')\n await run()\n },\n})\n","import { type Args, define } from 'gunshi'\nimport type { StudioOptions, StudioValues } from '../../runners/studio/run.ts'\n\n/**\n * Defines a `kubb studio` subcommand. The runner, and with it `@kubb/studio`, loads only when the\n * command runs, so `kubb --help` never does.\n */\nexport function studioCommand({\n action,\n block,\n ...definition\n}: {\n name: string\n description: string\n examples?: string\n args?: Args\n /** Opens a block a later `logOutro` closes, for a command that keeps running. */\n block?: boolean\n /** The command body, given the options built from its flags. */\n action: (options: StudioOptions) => Promise<unknown>\n}) {\n return define({\n ...definition,\n toKebab: true,\n async run({ values }) {\n const { runStudio } = await import('../../runners/studio/run.ts')\n await runStudio(values as StudioValues, action, { block })\n },\n })\n}\n","import { configArg, logLevelArg, studioConnectionArgs, studioPermissionArgs } from '../shared.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'connect',\n description: 'Connect this project to Kubb Studio and generate from the browser.',\n examples: [\n 'kubb studio connect',\n 'kubb studio connect --allow-read',\n 'kubb studio connect --allow-write --allow-exec',\n 'kubb studio connect --url http://localhost:3000',\n ].join('\\n'),\n args: {\n ...configArg,\n ...studioConnectionArgs,\n ...studioPermissionArgs,\n open: {\n type: 'boolean',\n description: 'Open the approval page in a browser while pairing',\n default: true,\n negatable: true,\n },\n ...logLevelArg,\n },\n block: true,\n async action(options) {\n const { connect } = await import('../../runners/studio/run.ts')\n await connect(options)\n },\n})\n","import { command as connectCommand } from './connect.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'login',\n description: 'Pair this machine with Kubb Studio without connecting.',\n examples: ['kubb studio login', 'kubb studio login --url http://localhost:3000'].join('\\n'),\n args: connectCommand.args,\n async action(options) {\n const { login } = await import('../../runners/studio/run.ts')\n await login(options)\n },\n})\n","import { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'logout',\n description: 'Forget the stored Kubb Studio token.',\n examples: 'kubb studio logout',\n args: {},\n async action() {\n const { stopWorker } = await import('../../runners/studio/background.ts')\n const { clearCredentials } = await import('../../runners/studio/credentials.ts')\n await stopWorker()\n await clearCredentials()\n console.log('Signed out of Kubb Studio.')\n },\n})\n","import { define } from 'gunshi'\nimport { configArg, logLevelArg, studioConnectionArgs } from '../shared.ts'\n\nexport const command = define({\n name: 'snapshot',\n description: 'Generate and publish a Kubb Studio snapshot from CI.',\n examples: ['kubb studio snapshot', 'kubb studio snapshot --json'].join('\\n'),\n toKebab: true,\n args: {\n ...configArg,\n ...studioConnectionArgs,\n id: {\n type: 'string',\n description: 'Stable identity for the CI agent, such as a pull request. Auto-detected on GitHub Actions, GitLab CI, Bitbucket Pipelines and CircleCI',\n },\n baseId: {\n type: 'string',\n description:\n \"Identity of another CI agent, such as the base branch's, to also compare this snapshot with. Auto-detected on GitHub pull requests and GitLab merge requests\",\n toKebab: true,\n },\n name: {\n type: 'string',\n description: 'Package name for the generated tarball. Defaults to the name in package.json',\n },\n packageVersion: {\n type: 'string',\n description: 'Package version for the generated tarball. Defaults to the version in package.json',\n toKebab: true,\n },\n json: {\n type: 'boolean',\n description: 'Print the result as one JSON object instead of a summary',\n default: false,\n },\n ...logLevelArg,\n },\n async run(ctx) {\n const { runner } = await import('../../runners/studio/snapshot.ts')\n await runner(ctx)\n },\n})\n","import { define } from 'gunshi'\nimport { command as connectCommand } from './connect.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'start',\n description: 'Keep this project connected to Kubb Studio in the background.',\n args: connectCommand.args,\n async action(options) {\n const { startWorker } = await import('../../runners/studio/background.ts')\n await startWorker(options)\n },\n})\n\nexport const stopCommand = define({\n name: 'stop',\n description: \"Stop this project's background connection and keep its pairing.\",\n async run() {\n const { stopWorker } = await import('../../runners/studio/background.ts')\n await stopWorker()\n console.log('Background connection stopped.')\n },\n})\n","import process from 'node:process'\nimport { studioConnectionArgs } from '../shared.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'status',\n description: 'Show the project worker, Kubb Studio pairing, and saved permissions.',\n examples: 'kubb studio status',\n args: { url: studioConnectionArgs.url },\n async action(options) {\n const { getWorkerLogPath, getWorkerStatus } = await import('../../runners/studio/background.ts')\n const { readCredentials } = await import('../../runners/studio/credentials.ts')\n const { formatStatus } = await import('../../runners/studio/status.ts')\n\n const [worker, credentials] = await Promise.all([getWorkerStatus(), readCredentials()])\n console.log(\n ['', ...formatStatus({ studioUrl: options.studioUrl, credentials, worker, project: process.cwd(), logPath: getWorkerLogPath() }), ''].join('\\n'),\n )\n },\n})\n","import { define } from 'gunshi'\nimport { command as connectCommand } from './connect.ts'\nimport { command as loginCommand } from './login.ts'\nimport { command as logoutCommand } from './logout.ts'\nimport { command as snapshotCommand } from './snapshot.ts'\nimport { command as startCommand, stopCommand } from './background.ts'\nimport { command as statusCommand } from './status.ts'\n\nexport const command = define({\n ...connectCommand,\n name: 'studio',\n description: 'Connect this project to Kubb Studio, or manage its pairing and snapshots.',\n examples: ['kubb studio', 'kubb studio --allow-read', 'kubb studio login', 'kubb studio status', 'kubb studio logout', 'kubb studio snapshot'].join('\\n'),\n subCommands: {\n start: startCommand,\n stop: stopCommand,\n connect: connectCommand,\n login: loginCommand,\n logout: logoutCommand,\n status: statusCommand,\n snapshot: snapshotCommand,\n },\n})\n\n/**\n * Sends `kubb studio --flag value` to `kubb studio connect`, the same runner. gunshi picks a\n * subcommand from the first token that is not a flag, so `--url http://…` would read the URL as one.\n */\nexport function routeStudioFlags(args: Array<string>): Array<string> {\n const [name, next] = args\n if (name !== 'studio' || !next?.startsWith('-') || next === '--help' || next === '-h') return args\n\n return ['studio', 'connect', ...args.slice(1)]\n}\n","import { define } from 'gunshi'\nimport { configArg } from './shared.ts'\n\n/** The runner is imported when the command runs, so listing `kubb --help` never loads `@kubb/adapter-oas`. */\nexport const command = define({\n name: 'validate',\n description: 'Check a specification with the configured adapter before generating.',\n examples: ['kubb validate ./openapi.yaml', 'kubb validate https://petstore3.swagger.io/api/v3/openapi.json'].join('\\n'),\n args: {\n ...configArg,\n input: {\n type: 'positional',\n description: 'Path or URL to the specification to validate',\n required: true,\n },\n },\n async run({ values }) {\n const { run } = await import('../runners/validate/run.ts')\n await run({ input: values.input, configPath: values.config })\n },\n})\n","import { styleText } from 'node:util'\n\n/**\n * Maps each camelCase flag removed in favor of kebab-case (kubb-labs/kubb#4046) to its\n * replacement. Drop this table, and the rewrite it drives, once the deprecation window ends.\n */\nconst DEPRECATED_FLAGS: Record<string, string> = {\n allowWrite: 'allow-write',\n allowConfigEdit: 'allow-config-edit',\n allowExec: 'allow-exec',\n logLevel: 'log-level',\n dryRun: 'dry-run',\n packageVersion: 'package-version',\n}\n\n/** Flags a single command renamed, rewritten only for that command, since the old name is a common word. */\nconst DEPRECATED_COMMAND_FLAGS: Record<string, Record<string, string>> = {\n update: { check: 'dry-run' },\n}\n\nconst FLAG_PATTERN = /^--([a-zA-Z][\\w-]*)(=.*)?$/\n\n/**\n * Rewrites a deprecated camelCase flag to its kebab-case replacement and warns on stderr, so a\n * script written against the old flag names keeps working during the deprecation window instead\n * of failing with an unknown-option error.\n */\nexport function resolveDeprecatedFlags(args: Array<string>): Array<string> {\n const commandFlags = DEPRECATED_COMMAND_FLAGS[args[0] ?? ''] ?? {}\n\n return args.map((arg) => {\n const match = FLAG_PATTERN.exec(arg)\n const name = match?.[1]\n const replacement = name ? (DEPRECATED_FLAGS[name] ?? commandFlags[name]) : undefined\n\n if (!name || !replacement) {\n return arg\n }\n\n console.error(\n `${styleText('yellow', 'Warning:')} --${name} is deprecated, use --${replacement} instead. --${name} will be removed in a future major version.`,\n )\n\n return `--${replacement}${match?.[2] ?? ''}`\n })\n}\n","/** The `kubb.config.ts` `kubb init` writes before `kubb add` puts each plugin in. */\nexport function generateConfigFile({ inputPath, outputPath }: { inputPath: string; outputPath: string }): string {\n return `import { defineConfig } from 'kubb/config'\n\nexport default defineConfig({\n input: '${inputPath}',\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [],\n})\n`\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { read, write } from '@internals/utils'\nimport { Diagnostics, type ExtensionManifest, type RegistryEntry } from '@kubb/core'\nimport { x } from 'tinyexec'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\n/** Metadata describing a package manager's lock file and commands. */\nexport type PackageManagerInfo = {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file names that identify this package manager in a project root. */\n lockFiles: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to create a `package.json`. */\n initCommand: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary before a `package.json` script name. */\n runCommand: ReadonlyArray<string>\n}\n\n/** Metadata for each supported package manager, keyed by its short name. */\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFiles: ['pnpm-lock.yaml'],\n initCommand: ['init'],\n installCommand: ['add', '-D'],\n runCommand: [],\n },\n yarn: {\n name: 'yarn',\n lockFiles: ['yarn.lock'],\n initCommand: ['init', '-y'],\n installCommand: ['add', '-D'],\n runCommand: [],\n },\n bun: {\n name: 'bun',\n lockFiles: ['bun.lock', 'bun.lockb'],\n initCommand: ['init', '-y'],\n installCommand: ['add', '-d'],\n runCommand: ['run'],\n },\n npm: {\n name: 'npm',\n lockFiles: ['package-lock.json'],\n initCommand: ['init', '-y'],\n installCommand: ['install', '--save-dev'],\n runCommand: ['run'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n scripts?: Record<string, string>\n}\n\n/** Detects the package manager for `cwd`: the `packageManager` field in `package.json`, then a lock file, then `npm`. */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) as PackageJson\n const pmField = packageJson.packageManager\n if (typeof pmField === 'string') {\n const name = pmField.split('@')[0]\n if (name && name in packageManagers) {\n return packageManagers[name as PackageManagerName]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n for (const pm of Object.values(packageManagers)) {\n if (pm.lockFiles.some((lockFile) => fs.existsSync(path.join(cwd, lockFile)))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n\n/**\n * Initializes a new `package.json` at `cwd` using the detected package manager.\n */\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n await x(packageManager.name, [...packageManager.initCommand], {\n nodeOptions: { cwd, stdio: 'inherit' },\n throwOnError: true,\n })\n}\n\n/** How many trailing lines of a failed install's output the error keeps. */\nconst INSTALL_OUTPUT_LINES = 20\nconst INSTALL_TIMEOUT_MS = 5 * 60_000\n\n/**\n * Installs the given packages at `cwd` using the detected package manager. Each output line goes\n * to `onLine`, so the caller can show it while the install runs; a failed install also keeps the\n * end of the output in the error.\n */\nexport async function installPackages(\n packages: Array<string>,\n packageManager: PackageManagerInfo,\n cwd: string = process.cwd(),\n onLine?: (line: string) => void,\n): Promise<void> {\n const args = [...packageManager.installCommand, ...packages]\n // No stdin, so a package manager that wants input fails instead of waiting. The timeout ends a stalled install.\n const result = x(packageManager.name, args, {\n nodeOptions: { cwd, stdio: ['ignore', 'pipe', 'pipe'] },\n timeout: INSTALL_TIMEOUT_MS,\n throwOnError: false,\n })\n const lines: Array<string> = []\n for await (const line of result) {\n lines.push(line)\n onLine?.(line)\n }\n if (result.exitCode === 0) return\n if (result.exitCode === undefined) throw new Error(`\\`${packageManager.name} ${args.join(' ')}\\` timed out after ${INSTALL_TIMEOUT_MS / 60_000} minutes`)\n\n const output = lines.slice(-INSTALL_OUTPUT_LINES).join('\\n')\n throw new Error(`\\`${packageManager.name} ${args.join(' ')}\\` failed with exit code ${result.exitCode}${output ? `:\\n${output}` : ''}`)\n}\n\n/**\n * What the selected plugins' `manifests` say is missing from the selection: a `dependencies`\n * entry, or a `client` plugin next to a `consumer`. Empty when nothing is missing.\n * `optionalDependencies` are skipped, since `kubb init` writes the default options.\n */\nexport function missingPluginDependencies(manifests: Array<ExtensionManifest>): Array<string> {\n const selected = manifests.map((manifest) => manifest.name)\n const hasClient = manifests.some((manifest) => manifest.role === 'client')\n return manifests.flatMap((manifest) => [\n ...(manifest.dependencies ?? []).filter((name) => !selected.includes(name)).map((name) => `${manifest.name} needs ${name}.`),\n ...(manifest.role === 'consumer' && !hasClient ? [`${manifest.name} needs a client plugin, such as plugin-axios or plugin-fetch.`] : []),\n ])\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJson> {\n try {\n return JSON.parse(await read(path.join(cwd, 'package.json'))) as PackageJson\n } catch {\n return {}\n }\n}\n\nconst SPEC_FILE = /^(openapi|swagger)[\\w.-]*\\.(ya?ml|json)$/i\nconst SKIPPED_DIRS = new Set(['node_modules', 'dist', 'build', 'coverage'])\n\n/**\n * Finds OpenAPI spec files up to `depth` folders below `cwd`, shallowest first, as `./`-relative\n * paths. Walks one level at a time and stops after `limit` files, so a large repo stays fast.\n */\nexport async function findSpecFiles(cwd: string, { depth = 3, limit = 20 }: { depth?: number; limit?: number } = {}): Promise<Array<string>> {\n const found: Array<string> = []\n let level: Array<string> = ['']\n for (let current = 0; current <= depth && level.length && found.length < limit; current++) {\n const listings = await Promise.all(\n level.map(async (dir) => ({ dir, entries: await fs.promises.readdir(path.join(cwd, dir), { withFileTypes: true }).catch(() => []) })),\n )\n level = []\n for (const { dir, entries } of listings) {\n for (const entry of entries.toSorted((a, b) => a.name.localeCompare(b.name))) {\n if (entry.isFile() && SPEC_FILE.test(entry.name)) found.push(`./${path.posix.join(dir, entry.name)}`)\n if (entry.isDirectory() && !entry.name.startsWith('.') && !SKIPPED_DIRS.has(entry.name)) level.push(path.posix.join(dir, entry.name))\n }\n }\n }\n return found.slice(0, limit)\n}\n\n/** The spec version and operation count, when the file states them. */\nexport type SpecInfo = { version?: string; operations?: number }\n\nconst SPEC_HEAD_BYTES = 256 * 1024\nconst METHOD = '(?:get|put|post|delete|options|head|patch|trace)'\n\n/**\n * Reads the OpenAPI or Swagger version and counts the operations from the first 256 KB of the\n * file, so a large spec is never parsed. The count is left out when the file is longer.\n */\nexport async function readSpecInfo(file: string): Promise<SpecInfo> {\n const handle = await fs.promises.open(file)\n try {\n const buffer = Buffer.alloc(SPEC_HEAD_BYTES)\n const { bytesRead } = await handle.read(buffer, 0, SPEC_HEAD_BYTES, 0)\n const head = buffer.toString('utf-8', 0, bytesRead)\n const complete = bytesRead < SPEC_HEAD_BYTES\n const version = head.match(/^\\s*[\"']?(?:openapi|swagger)[\"']?\\s*:\\s*[\"']?(\\d[\\d.]*)/m)?.[1]\n // shortcut: counts method keys at any depth, so a schema property named `get` counts too; use the adapter when that matters.\n const methods = new RegExp(`^\\\\s*[\"']?${METHOD}[\"']?\\\\s*:\\\\s*(?:\\\\{|$)`, 'gm')\n return { version, operations: complete ? (head.match(methods)?.length ?? 0) : undefined }\n } finally {\n await handle.close()\n }\n}\n\n/** Finds a plugin by registry id, slug, or short name, so `ts`, `plugin-ts`, and `kubb-labs/plugin-ts` all match. */\nexport function findPlugin({ plugins, id }: { plugins: Array<RegistryEntry>; id: string }): RegistryEntry | undefined {\n const ids = id.includes('/') ? [id] : [`kubb-labs/${id}`, `kubb-labs/plugin-${id}`]\n return plugins.find((entry) => ids.includes(entry.id))\n}\n\n/**\n * Turns the comma-separated `--plugins` value into registry entries.\n *\n * @throws when an id is not in `plugins`.\n */\nexport function parsePluginsFlag({ plugins, value }: { plugins: Array<RegistryEntry>; value: string }): Array<RegistryEntry> {\n const ids = value\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean)\n const unknown = ids.filter((id) => !findPlugin({ plugins, id }))\n if (unknown.length)\n throw new Diagnostics.Error({\n code: Diagnostics.code.pluginNotFound,\n severity: 'error',\n message: `Not in the Kubb registry: ${unknown.join(', ')}. Browse the plugins at https://kubb.dev/extensions.`,\n help: 'Use plugin ids from https://kubb.dev/extensions, such as plugin-ts or ts.',\n })\n return ids.map((id) => findPlugin({ plugins, id })!)\n}\n\n/** Adds `\"generate\": \"kubb generate\"` to the `package.json` scripts at `cwd`. Returns `false`, and changes nothing, when a `generate` script exists. */\nexport async function addGenerateScript(cwd: string): Promise<boolean> {\n const file = path.join(cwd, 'package.json')\n const source = await read(file)\n const packageJson = JSON.parse(source) as PackageJson\n if (packageJson.scripts?.generate !== undefined) return false\n const indent = source.match(/^[ \\t]+/m)?.[0] ?? ' '\n const updated = { ...packageJson, scripts: { ...packageJson.scripts, generate: 'kubb generate' } }\n await write(file, JSON.stringify(updated, null, indent))\n return true\n}\n\n/** Reads the `generate` script from the `package.json` at `cwd`. */\nexport async function generateScript(cwd: string): Promise<string | undefined> {\n return (await readPackageJson(cwd)).scripts?.generate\n}\n","import process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { isRichOutput } from '../utils/env.ts'\nimport { createSpinner } from '../ui/spinner.ts'\nimport { installPackages, type PackageManagerInfo } from './init/utils.ts'\n\n/** How many package manager lines stay visible under the install title while it runs. */\nconst LOG_LINES = 6\n\n/**\n * Installs `packages` and reports how long it took. A rich terminal shows the package manager's\n * last lines under the title while the install runs and clears them when it succeeds; a plain one\n * prints the start and end lines. A failed install keeps the output, reports the failure and rethrows.\n */\nexport async function installWithSpinner({\n packages,\n names,\n packageManager,\n cwd,\n install = installPackages,\n}: {\n packages: Array<string>\n names: string\n packageManager: PackageManagerInfo\n cwd: string\n /** Runs the install itself, so a dry run can skip it. */\n install?: typeof installPackages\n}): Promise<void> {\n const start = process.hrtime()\n const task = createTask(`Installing ${names} with ${packageManager.name}`)\n try {\n await install(packages, packageManager, cwd, task.message)\n } catch (error) {\n task.error('Install failed')\n throw error\n }\n task.success(`Installed ${names} with ${packageManager.name} in ${formatMs(getElapsedMs(start))}`)\n}\n\ntype Task = { message: (line: string) => void; error: (text: string) => void; success: (text: string) => void }\n\n// clack's taskLog prints nothing at the end outside a TTY, so a plain terminal keeps the spinner writer.\n// The failure keeps no log: the thrown error already carries the last lines.\nfunction createTask(title: string): Task {\n if (isRichOutput()) {\n const log = clack.taskLog({ title, limit: LOG_LINES })\n return { message: (line) => log.message(line), error: (text) => log.error(text, { showLog: false }), success: (text) => log.success(text) }\n }\n const spinner = createSpinner()\n spinner.start(title)\n return { message: () => {}, error: (text) => spinner.error(text), success: (text) => spinner.stop(text) }\n}\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { define } from 'gunshi'\nimport { findConfigFile } from '@internals/shared'\nimport { getErrorMessage, read } from '@internals/utils'\nimport { Diagnostics, type ExtensionManifest, readInstalledPackages, type RegistryDetail, type RegistryEntry } from '@kubb/core'\nimport { configArg, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { closestIds, fetchRegistryIndex, incompatibility, installSpec, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\n\nexport type AddOptions = {\n /**\n * `owner/slug`, or a bare `slug` for an official extension. Asked for when omitted.\n */\n id?: string\n configPath?: string\n yes: boolean\n install: boolean\n}\n\ntype ConfigTarget = Pick<RegistryDetail, 'artifact' | 'manifest'>\n\n/** The import and the `defineConfig` property to merge into `kubb.config.ts` by hand. */\nfunction toSnippet({ artifact, manifest }: ConfigTarget): string {\n const call = `${manifest.export}()`\n const property: Record<ExtensionManifest['kind'], string> = {\n plugin: `plugins: [..., ${call}],`,\n adapter: `adapter: ${call},`,\n parser: `parsers: [..., ${call}],`,\n }\n return [`import { ${manifest.export} } from '${artifact.package}'`, '', property[manifest.kind]].join('\\n')\n}\n\n/** The `add-plugin` edits for `details`, and the manifests the edits read their export names from. */\nfunction toConfigEdits(details: Array<ConfigTarget>) {\n return {\n edits: details.map(({ artifact }) => ({ operation: 'add-plugin' as const, plugin: artifact.package })),\n extensions: new Map(details.map(({ artifact, manifest }) => [artifact.package, { package: artifact.package, version: artifact.version, manifest }])),\n }\n}\n\n/** The lines adding `details` would put in the config `source`, trimmed, or why it could not add them. */\nasync function previewConfig({ details, source }: { details: Array<ConfigTarget>; source: string }): Promise<{ lines: Array<string> } | { reason: string }> {\n try {\n const { applyConfigEdits } = await import('@kubb/studio')\n const result = applyConfigEdits({ source, ...toConfigEdits(details) })\n const failed = result.outcomes.find((outcome) => !outcome.applied)\n if (failed) return { reason: failed.reason ?? 'the config file was not changed' }\n const remaining = source.split('\\n')\n const lines = result.source.split('\\n').filter((line) => {\n const index = remaining.indexOf(line)\n if (index !== -1) remaining.splice(index, 1)\n return index === -1\n })\n return { lines: lines.map((line) => line.trim()) }\n } catch (error) {\n return { reason: getErrorMessage(error) }\n }\n}\n\nasync function selectExtension({\n entries,\n versions,\n registry,\n}: {\n entries: Array<RegistryEntry>\n versions: Map<string, unknown>\n registry: string\n}): Promise<string | undefined> {\n if (!entries.length)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `The registry at ${registry} lists no extensions.`,\n help: 'Check that `KUBB_REGISTRY` points at a Kubb registry, or unset it to use https://kubb.dev/registry.',\n })\n\n // Filters in memory, so typing never waits on the network.\n const searchText = new Map(entries.map((entry) => [entry.id, `${entry.id} ${entry.manifest.displayName} ${entry.manifest.description}`.toLowerCase()]))\n const options = entries\n .toSorted((a, b) => a.id.localeCompare(b.id))\n .map((entry) => {\n const installed = versions.has(entry.artifact.package)\n return { value: entry.id, label: toShortId(entry.id), hint: installed ? 'installed' : summarize(entry.manifest.description), disabled: installed }\n })\n\n const id = await clack.autocomplete({\n message: `Add an extension · ${entries.length} in the registry`,\n placeholder: 'Search',\n options,\n filter: (search, option) => searchText.get(option.value)?.includes(search.toLowerCase()) ?? false,\n })\n return clack.isCancel(id) ? undefined : id\n}\n\n/** Asks whether to also add the required plugins the config lacks. `--yes` adds them. */\nasync function confirmDependencies({\n entry,\n missing,\n yes,\n}: {\n entry: RegistryEntry\n missing: Array<RegistryEntry>\n yes: boolean\n}): Promise<boolean | undefined> {\n if (!missing.length || yes) return true\n const names = missing.map((dependency) => dependency.manifest.name).join(', ')\n const answer = await clack.select({\n message: `${entry.manifest.name} needs ${names}. Add ${names} as well?`,\n options: [\n { value: true, label: `Yes, add ${missing.length === 1 ? 'both' : 'all'}`, hint: 'recommended' },\n { value: false, label: `Only ${entry.manifest.name}`, hint: 'generate fails until you add it' },\n ],\n initialValue: true,\n })\n return clack.isCancel(answer) ? undefined : answer\n}\n\n/** The first sentence of a registry description, cut to one terminal line. */\nexport function summarize(description: string, max = 64): string {\n const sentence = description.split(/\\.\\s/)[0]!.replace(/\\.$/, '')\n return sentence.length > max ? `${sentence.slice(0, max - 1).trimEnd()}…` : sentence\n}\n\n/**\n * Installs an extension from the Kubb registry at its reviewed version and, for a plugin, adds it to\n * `kubb.config.ts`, offering to add the plugins it needs as well. Without an id, asks which one.\n * Previews the packages and config lines before asking. Refuses when the running Kubb or Node.js\n * version is outside its compatibility.\n */\nexport async function run({ id: input, configPath, yes, install }: AddOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n const installedPackages: Array<string> = []\n const configured: Array<RegistryEntry> = []\n logIntro({ title: isInteractiveRun({ yes }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Add ')) })\n\n try {\n const registry = registryUrl()\n if (!input && yes)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'Pass a registry id, such as plugin-zod, when using --yes.',\n help: 'Run `kubb add plugin-zod --yes`, or drop `--yes` to pick from a list.',\n })\n const inputId = input ? toRegistryId(input) : undefined\n const foundConfig = configPath ? path.resolve(configPath) : findConfigFile(cwd)\n const [entries, installed, configSource] = await withSpinner({\n message: 'Reading the registry',\n promise: Promise.all([\n fetchRegistryIndex({ registry }),\n readInstalledPackages({ root: cwd }),\n foundConfig ? read(foundConfig).catch(() => undefined) : undefined,\n ]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const id = inputId ?? (await selectExtension({ entries, versions, registry }))\n if (!id) {\n summary('Add canceled', 'canceled', [' No changes made'])\n return\n }\n const entry = entries.find((candidate) => candidate.id === id)\n if (!entry) {\n const suggestions = closestIds({ input: id, ids: entries.map((entry) => entry.id) }).map(toShortId)\n summary(`No extension named ${input ?? id}`, 'failed', [\n ...suggestions.map((suggestion) => ` kubb add ${suggestion}`),\n ' Browse all kubb.dev/extensions',\n ])\n process.exitCode = 1\n return\n }\n const { artifact, manifest } = entry\n const kind = manifest.kind.charAt(0).toUpperCase() + manifest.kind.slice(1)\n\n const problem = incompatibility(manifest)\n if (problem)\n throw new Diagnostics.Error({\n code: Diagnostics.code.incompatibleExtension,\n severity: 'error',\n message: problem,\n help: 'Upgrade Kubb or Node.js to a version the extension supports.',\n })\n\n const configFile = manifest.kind === 'plugin' ? foundConfig : undefined\n if (manifest.kind === 'plugin' && !configFile)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'No kubb.config.ts found. Run `kubb init` first, or pass --config.',\n help: 'Run `kubb init` to create a config, or pass its path with `--config`.',\n })\n const configName = configFile ? path.relative(cwd, configFile) || configFile : undefined\n\n const byName = new Map(entries.map((candidate) => [candidate.manifest.name, candidate]))\n const inConfig = (name: string) => {\n const dependency = byName.get(name)\n return dependency ? !!configSource?.includes(`${dependency.manifest.export}(`) : installed.some((item) => item.manifest?.name === name)\n }\n const dependencies = manifest.dependencies ?? []\n const missing = configFile ? dependencies.filter((name) => !inConfig(name)).flatMap((name) => byName.get(name) ?? []) : []\n const withDependencies = await confirmDependencies({ entry, missing, yes })\n if (withDependencies === undefined) {\n summary('Add canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n const targets = [...(withDependencies ? missing : []), entry]\n const specs = targets.filter((target) => target === entry || !versions.has(target.artifact.package)).map((target) => installSpec(target.artifact))\n\n const dependencyStatus = (name: string) => {\n if (inConfig(name)) return `${name} ${styleText('green', '✓ installed')}`\n return targets.some((target) => target.manifest.name === name) ? `${name} ${styleText('cyan', '+ adding')}` : `${name} ${styleText('yellow', 'missing')}`\n }\n const preview = configFile && configSource !== undefined ? await previewConfig({ details: targets, source: configSource }) : undefined\n logStep(`${kind} ${styleText('cyan', manifest.name)} v${artifact.version} · ${summarize(manifest.description)}`)\n logBlock([\n ...(dependencies.length ? [`Needs ${dependencies.map(dependencyStatus).join(' ')}`] : []),\n install ? `Installs ${specs.join(' ')}` : 'Installs nothing (--no-install)',\n ...(configName ? [`Config ${configName}`] : [`Config prints the ${manifest.kind} snippet to add`]),\n ...(preview && 'lines' in preview ? preview.lines.map((line) => styleText('green', ` + ${line}`)) : []),\n ...(preview && 'reason' in preview ? [styleText('yellow', ` cannot edit it: ${preview.reason}`)] : []),\n ])\n\n const confirmed = yes || (await clack.confirm({ message: 'Add it?', initialValue: true }))\n if (clack.isCancel(confirmed) || !confirmed) {\n summary('Add canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const packages = () => (install ? `${installedPackages.length} installed with ${packageManager.name}` : 'installation skipped (--no-install)')\n if (install) {\n const names = targets.filter((target) => specs.includes(installSpec(target.artifact))).map((target) => target.artifact.package)\n await installWithSpinner({ packages: specs, names: names.join(', '), packageManager, cwd })\n installedPackages.push(...names)\n }\n\n const unconfigured: Array<RegistryEntry> = configFile ? [] : [entry]\n if (configFile) {\n for (const target of targets) {\n try {\n const { writeConfigEdits } = await import('@kubb/studio')\n const { outcomes, changed } = await writeConfigEdits({ filePath: configFile, ...toConfigEdits([target]) })\n if (!outcomes[0]?.applied) throw new Error(outcomes[0]?.reason ?? 'the config file was not changed')\n if (changed) configured.push(target)\n logStep(`${target.manifest.export}() configured in ${configName}`)\n } catch (error) {\n logWarn(`Could not edit ${configName}: ${getErrorMessage(error)}`)\n unconfigured.push(target)\n }\n }\n }\n\n const manual = unconfigured.length > 0\n // A plugin the command could not write into the config is a failure a caller can act on; an adapter or parser never gets written.\n if (manual && manifest.kind === 'plugin') process.exitCode = 1\n if (manual)\n logBlock([\n 'Add the import to your Kubb config and merge the property into its defineConfig call:',\n '',\n ...unconfigured.map((target) => toSnippet(target)),\n ])\n const dependenciesMissing = !withDependencies && missing.length > 0\n const title = manual\n ? `${kind} needs configuration`\n : dependenciesMissing\n ? 'Plugin configured; dependencies missing'\n : configured.length\n ? install\n ? 'Plugin ready'\n : 'Plugin configured'\n : 'Plugin already configured'\n summary(title, manual || dependenciesMissing ? 'warning' : 'success', [\n ` Packages ${packages()}`,\n ...configured.map((target) => styleText('green', ` + ${target.manifest.export}()`)),\n '',\n ...(!install ? [`Install ${specs.join(' ')} to use it.`] : []),\n ...(dependenciesMissing ? [`Missing plugins ${missing.map((target) => target.manifest.name).join(', ')}`] : []),\n manual ? 'Add the snippet above, then run kubb generate.' : 'Next kubb generate',\n `Options kubb.dev/extensions/${entry.id}`,\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Add failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = define({\n name: 'add',\n description: 'Find and install plugins, adapters, and parsers from the Kubb registry.',\n examples: [\n 'kubb add',\n 'kubb add plugin-zod',\n 'kubb add kubb-labs/plugin-react-query',\n 'kubb add acme/plugin-x --yes',\n 'kubb add plugin-zod --no-install',\n ].join('\\n'),\n toKebab: true,\n args: {\n id: {\n type: 'positional',\n description: 'Registry id: owner/slug, or a slug for an official extension. Asked for when omitted',\n required: false,\n },\n ...configArg,\n ...yesArg,\n install: {\n type: 'boolean',\n description: 'Install the package. Pass --no-install to only edit the config',\n negatable: true,\n default: true,\n },\n },\n run: ({ values }) => run({ id: values.id, configPath: values.config, yes: values.yes, install: values.install }),\n})\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { DryRunExtension } from '@gunshi/plugin-dryrun'\nimport { defineWithTypes } from 'gunshi'\nimport { generateConfigFile, initDefaults, KUBB_CONFIG_FILENAME, KUBB_PACKAGE_NAME } from '@internals/shared'\nimport { exists, formatMs, getElapsedMs, write } from '@internals/utils'\nimport { createKubb, Diagnostics, type RegistryEntry } from '@kubb/core'\nimport { dryRunId, type DryRunExtensions } from '../../commands/shared.ts'\nimport { getConfigs } from '../../config.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport { isInteractiveRun, logIntro, logOutro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { fetchRegistryIndex, incompatibility, installSpec, registryUrl } from '../../utils/registry.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport {\n addGenerateScript,\n detectPackageManager,\n findPlugin,\n findSpecFiles,\n generateScript,\n initPackageJson,\n installPackages,\n missingPluginDependencies,\n type PackageManagerInfo,\n parsePluginsFlag,\n readSpecInfo,\n} from './utils.ts'\nimport { version } from '../../../package.json'\n\nfunction cancelAndExit(message = 'Operation canceled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (clack.isCancel(value)) cancelAndExit()\n return value as Exclude<T, symbol>\n}\n\ntype InitOptions = {\n /**\n * When `true`, skips all interactive prompts and uses the detected or default values.\n */\n yes: boolean\n /**\n * Input path flag value from `--input`. When provided, skips the input prompt.\n */\n input?: string\n /**\n * Output directory flag value from `--output`. When provided, skips the output prompt.\n */\n output?: string\n /**\n * Comma-separated plugin list from `--plugins`, e.g. `'plugin-ts,zod'`. When provided, skips the plugin selection prompt.\n */\n plugins?: string\n /**\n * Dry-run extension from `@gunshi/plugin-dryrun`. When enabled, package installation, file\n * writes, and the first run are skipped.\n */\n dryRun: DryRunExtension\n}\n\ntype Choices = {\n inputPath: string\n outputPath: string\n plugins: Array<RegistryEntry>\n}\n\n/** The full `kubb.config.ts` for `choices`, with each plugin added the way `kubb add` adds it. */\nasync function buildConfig({ inputPath, outputPath, plugins }: Choices): Promise<string> {\n const { applyConfigEdits } = await import('@kubb/studio')\n const { source, outcomes } = applyConfigEdits({\n source: generateConfigFile({ inputPath, outputPath }),\n edits: plugins.map((entry) => ({ operation: 'add-plugin', plugin: entry.artifact.package })),\n extensions: new Map(plugins.map(({ artifact, manifest }) => [artifact.package, { package: artifact.package, version: artifact.version, manifest }])),\n })\n const failed = outcomes.find((outcome) => !outcome.applied)\n if (failed && failed.edit.operation === 'add-plugin')\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `Could not add ${failed.edit.plugin} to ${KUBB_CONFIG_FILENAME}: ${failed.reason}`,\n help: `Run kubb init without that plugin, then add it with kubb add.`,\n })\n return source\n}\n\n/** Generates from the config at `configPath` without reporters, and returns how many files it wrote. */\nasync function firstRun(configPath: string): Promise<number> {\n const { configs } = await getConfigs({ configPath })\n let files = 0\n for (const config of configs) {\n const result = await createKubb(config).generate()\n if (!result.success) throw new Error(result.diagnostics.flatMap((diagnostic) => (diagnostic.severity === 'error' ? [diagnostic.message] : [])).join('\\n'))\n files += result.files.length\n }\n return files\n}\n\n/** The command that runs `kubb generate`: the `generate` script when it runs Kubb, otherwise `npx kubb generate`. */\nfunction generateCommand({ packageManager, script, watch }: { packageManager: PackageManagerInfo; script: string | undefined; watch: boolean }): string {\n if (script !== 'kubb generate') return `npx kubb generate${watch ? ' --watch' : ''}`\n const run = [packageManager.name, ...packageManager.runCommand, 'generate'].join(' ')\n if (!watch) return run\n return packageManager.name === 'npm' ? `${run} -- --watch` : `${run} --watch`\n}\n\n/**\n * Runs the Kubb setup wizard: detects the package manager and specs, asks for the spec, plugins, and\n * output folder, shows the config for review, then installs, writes `kubb.config.ts`, adds a\n * `generate` script, and runs the first generation.\n * Pass `yes: true` to skip all prompts and print one line per step.\n */\nexport async function run({ yes, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n /** Runs `task` behind a spinner, or prints one line when it is done in `--yes` mode. */\n async function step<T>({ start, task, done, failed }: { start: string; task: () => Promise<T>; done: (result: T) => string; failed: string }): Promise<T> {\n const spinner = createSpinner()\n if (!yes) spinner.start(start)\n try {\n const result = await task()\n if (yes) console.log(`${styleText('green', '✓')} ${done(result)}`)\n else spinner.stop(done(result))\n return result\n } catch (error) {\n if (!yes) spinner.error(failed)\n throw error\n }\n }\n\n if (!yes) logIntro({ title: isInteractiveRun({ yes, dryRun: dryRun.enabled }) ? undefined : 'Set up Kubb' })\n\n try {\n // Start the registry fetch now but await it only at the plugin step, so the first prompt never waits on the network\n const registry = fetchRegistryIndex({ registry: registryUrl() }).then((entries) =>\n entries.filter((entry) => entry.kind === 'plugin' && !incompatibility(entry.manifest)),\n )\n registry.catch(() => {})\n // Warm the module cache for buildConfig while the user answers, so the review shows up without waiting\n if (!yes) import('@kubb/studio').catch(() => {})\n\n if (!(await exists(path.join(cwd, 'package.json')))) {\n if (!yes) {\n const shouldInit = unwrap(await clack.confirm({ message: 'No package.json found. Would you like to create one?', initialValue: true }))\n if (!shouldInit) cancelAndExit()\n }\n\n const packageManager = detectPackageManager(cwd)\n await step({\n start: `Initializing package.json with ${packageManager.name}`,\n task: () => initPackageJson(cwd, packageManager),\n done: () => `Created package.json with ${packageManager.name}`,\n failed: 'Could not create package.json',\n })\n }\n\n const packageManager = detectPackageManager(cwd)\n const specs = await findSpecFiles(cwd)\n\n if (!yes) {\n logStep(`Package manager ${packageManager.name}`)\n if (specs[0]) {\n const { version: specVersion, operations } = await readSpecInfo(path.join(cwd, specs[0]))\n const details = [\n specs[0].slice(2),\n specVersion ? `${specVersion.startsWith('2') ? 'Swagger' : 'OpenAPI'} ${specVersion}` : undefined,\n operations === undefined ? undefined : pluralize(operations, 'operation'),\n specs.length > 1 ? `+${specs.length - 1} more` : undefined,\n ]\n logStep(`Found ${details.filter(Boolean).join(' · ')}`)\n }\n }\n\n // `--plugins` and `--yes` need the registry before any prompt; the interactive path reads it at the plugin step\n const plugins = pluginsFlag || yes ? await registry : undefined\n const defaultPlugins = (entries: Array<RegistryEntry>) => initDefaults.plugins.flatMap((id) => findPlugin({ plugins: entries, id }) ?? [])\n\n const flagPlugins = pluginsFlag && plugins ? parsePluginsFlag({ plugins, value: pluginsFlag }) : undefined\n\n let choices: Choices = {\n inputPath: inputFlag ?? specs[0] ?? initDefaults.inputPath,\n outputPath: outputFlag ?? initDefaults.outputPath,\n plugins: flagPlugins ?? (plugins ? defaultPlugins(plugins) : []),\n }\n if (yes && !choices.plugins.length) {\n throw new Error('The registry has no default plugin. Pass --plugins to choose one.')\n }\n\n async function askInput(current: string): Promise<string> {\n const choice = specs.length\n ? unwrap(\n await clack.select({\n message: 'Which spec should Kubb read?',\n options: [\n ...specs.map((spec) => ({ value: spec, label: spec, hint: 'found in this repo' })),\n { value: 'url', label: 'A URL' },\n { value: 'file', label: 'Another file' },\n ],\n initialValue: specs.includes(current) ? current : /^https?:\\/\\//.test(current) ? 'url' : 'file',\n }),\n )\n : /^https?:\\/\\//.test(current)\n ? 'url'\n : 'file'\n if (specs.includes(choice)) return choice\n const isUrl = choice === 'url'\n const initial = isUrl === /^https?:\\/\\//.test(current) && !specs.includes(current) ? current : undefined\n return unwrap(\n await clack.text({\n message: isUrl ? 'Spec URL' : 'Spec path',\n placeholder: isUrl ? 'https://example.com/openapi.yaml' : initDefaults.inputPath,\n initialValue: initial,\n defaultValue: isUrl ? undefined : initDefaults.inputPath,\n validate: (value) => {\n if (isUrl && !/^https?:\\/\\//.test(value ?? '')) return 'Enter an http(s) URL'\n },\n }),\n )\n }\n\n async function askPlugins(previous: Array<RegistryEntry>): Promise<Array<RegistryEntry>> {\n const plugins = await registry\n const current = previous.length ? previous : defaultPlugins(plugins)\n const width = Math.max(...plugins.map((entry) => entry.manifest.displayName.length))\n const nameWidth = Math.max(...plugins.map((entry) => entry.manifest.name.length))\n const values = unwrap(\n await clack.multiselect({\n message: 'What should Kubb generate?',\n options: plugins.map(({ id, manifest }) => ({\n value: id,\n label: `${manifest.displayName.padEnd(width)} ${styleText('dim', manifest.name.padEnd(nameWidth))}`.trimEnd(),\n })),\n initialValues: current.map((entry) => entry.id),\n required: true,\n }),\n )\n return plugins.filter((entry) => values.includes(entry.id))\n }\n\n // Flags for all three choices leave nothing to ask or review, as before the review step existed\n const answered = yes || Boolean(inputFlag && outputFlag && pluginsFlag)\n if (!answered) {\n let firstPass = true\n while (true) {\n // The first pass skips the questions a flag answered; \"Change a choice\" asks them all again.\n choices = {\n inputPath: firstPass && inputFlag ? inputFlag : await askInput(choices.inputPath),\n plugins: firstPass && flagPlugins ? flagPlugins : await askPlugins(choices.plugins),\n outputPath:\n firstPass && outputFlag\n ? outputFlag\n : unwrap(await clack.text({ message: 'Output folder', placeholder: choices.outputPath, defaultValue: choices.outputPath })),\n }\n firstPass = false\n const missing = missingPluginDependencies(choices.plugins.map((entry) => entry.manifest))\n if (missing.length) {\n logWarn(`${missing.join('\\n')}\\nAdd the missing plugins.`)\n continue\n }\n const config = await buildConfig(choices)\n const packages = [KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)]\n logStep(`Review ${KUBB_CONFIG_FILENAME}`)\n logBlock([...config.trimEnd().split('\\n'), '', `${styleText('dim', 'Installs')} ${packages.join(' ')} with ${packageManager.name}`])\n const configExists = await exists(path.join(cwd, KUBB_CONFIG_FILENAME))\n const confirmed = unwrap(\n await clack.select({\n message: configExists ? `${KUBB_CONFIG_FILENAME} exists. Overwrite it?` : 'Create it?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'Change a choice' },\n ],\n }),\n )\n if (confirmed) break\n }\n }\n\n // Check the selection against the plugins' manifests before installing anything\n const missing = missingPluginDependencies(choices.plugins.map((entry) => entry.manifest))\n if (missing.length) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.missingDependency,\n severity: 'error',\n message: `${missing.join('\\n')}\\nAdd the missing plugins and run kubb init again.`,\n })\n }\n\n const configPath = path.join(cwd, KUBB_CONFIG_FILENAME)\n if (answered && !yes && (await exists(configPath))) {\n const overwrite = unwrap(await clack.confirm({ message: `${KUBB_CONFIG_FILENAME} exists. Overwrite it?`, initialValue: false }))\n if (!overwrite) cancelAndExit('Keeping existing configuration.')\n }\n\n // Install `kubb` at the running CLI's version and each plugin at the version the registry pins\n const packagesToInstall = [`${KUBB_PACKAGE_NAME}@${version}`, ...choices.plugins.map((entry) => installSpec(entry.artifact))]\n const packageNames = [KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)]\n const dry = { message: `install ${packagesToInstall.length} packages with ${packageManager.name}` }\n if (yes) {\n await step({\n start: '',\n task: async () => void (await dryRun.run(() => installPackages(packagesToInstall, packageManager, cwd), dry)),\n done: () => `Installed ${packageNames.join(' ')} with ${packageManager.name}`,\n failed: 'Installation failed',\n })\n } else {\n await installWithSpinner({\n packages: packagesToInstall,\n names: `${packagesToInstall.length} packages`,\n packageManager,\n cwd,\n install: async (packages, packageManager, cwd, onLine) => void (await dryRun.run(() => installPackages(packages, packageManager, cwd, onLine), dry)),\n })\n }\n\n await step({\n start: `Writing ${KUBB_CONFIG_FILENAME}`,\n task: async () => dryRun.run(async () => void (await write(configPath, await buildConfig(choices))), { message: `write ${KUBB_CONFIG_FILENAME}` }),\n done: () => `Wrote ${KUBB_CONFIG_FILENAME}`,\n failed: `Could not write ${KUBB_CONFIG_FILENAME}`,\n })\n\n const scriptAdded = await dryRun.run(() => addGenerateScript(cwd), {\n message: 'add a generate script to package.json',\n resolve: async () => (await generateScript(cwd)) === undefined,\n })\n if (scriptAdded && !yes) logStep('Added \"generate\": \"kubb generate\" to package.json')\n\n const script = scriptAdded ? 'kubb generate' : await generateScript(cwd)\n const runStart = process.hrtime()\n try {\n await dryRun.run(\n () =>\n step({\n start: 'Running the first generation',\n task: () => firstRun(configPath),\n done: (files) =>\n yes\n ? `Generated ${pluralize(files, 'file')} in ${choices.outputPath}`\n : `First run ${pluralize(files, 'file')} in ${choices.outputPath} · ${formatMs(getElapsedMs(runStart))}`,\n failed: 'First run failed',\n }),\n { message: 'run the first generation', resolve: () => 0 },\n )\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error))\n const message = `Kubb is set up, but the first run failed. Fix the error, then run ${generateCommand({ packageManager, script, watch: false })}.`\n if (yes) console.log(message)\n else logOutro(styleText('yellow', message))\n process.exitCode = 1\n return\n }\n\n if (yes) {\n console.log(`Kubb is set up. Run ${generateCommand({ packageManager, script, watch: false })} after changing the spec.`)\n return\n }\n logOutro(`${styleText('green', '✓ Kubb is set up')}\\n ${styleText('dim', 'Next')} ${generateCommand({ packageManager, script, watch: true })}`)\n } catch (error) {\n logError(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n logError(error.message)\n }\n process.exit(1)\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'init',\n description: 'Set up a config, install plugins, and run the first generation.',\n examples: [\n 'kubb init',\n 'kubb init --yes',\n 'kubb init --input ./openapi.yaml --output ./src/gen --plugins plugin-ts,plugin-zod',\n 'kubb init --yes --input ./openapi.yaml --plugins ts,zod --output src/api',\n 'kubb init --plugins plugin-ts,plugin-axios,plugin-react-query',\n 'kubb init --yes --dry-run',\n ].join('\\n'),\n toKebab: true,\n args: {\n yes: {\n type: 'boolean',\n description: 'Skip prompts and use the detected spec, the default plugin, and the default output folder',\n short: 'y',\n default: false,\n },\n input: {\n type: 'string',\n description: 'Path to the OpenAPI specification',\n short: 'i',\n metavar: 'path',\n },\n output: {\n type: 'string',\n description: 'Output directory for generated files',\n short: 'o',\n metavar: 'path',\n },\n plugins: {\n type: 'string',\n description:\n 'Comma-separated Kubb registry ids of the plugins to add, the same ids `kubb add` takes (plugin-ts, plugin-zod, acme/plugin-x), or short names (ts, zod)',\n metavar: 'plugin-ts,plugin-zod,...',\n },\n },\n run: ({ values, extensions }) => run({ yes: values.yes, input: values.input, output: values.output, plugins: values.plugins, dryRun: extensions[dryRunId] }),\n})\n","/** Pads each column to its widest cell, one line per row. */\nexport function formatTable(rows: ReadonlyArray<ReadonlyArray<string>>): Array<string> {\n const widths = Array.from({ length: Math.max(0, ...rows.map((row) => row.length)) }, (_, index) => Math.max(...rows.map((row) => row[index]?.length ?? 0)))\n return rows.map((row) =>\n row\n .map((cell, index) => cell.padEnd(widths[index]!))\n .join(' ')\n .trimEnd(),\n )\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getErrorMessage } from '@internals/utils'\nimport { define } from 'gunshi'\nimport { readInstalledPackages, type RegistryEntry } from '@kubb/core'\nimport { logOutro } from '../../ui/intro.ts'\nimport { logBlock, logError, logWarn } from '../../ui/log.ts'\nimport { formatTable } from '../../ui/table.ts'\nimport { fetchRegistryIndex, isOutdated, registryUrl } from '../../utils/registry.ts'\n\nexport type ListRow = {\n id?: string\n package: string\n installed?: string\n registry?: string\n update: boolean\n}\n\n/**\n * The installed packages that ship a `kubb-extension.json` or have a registry entry, with the\n * version the registry pins.\n */\nexport async function listExtensions({ cwd, registry }: { cwd: string; registry: string }): Promise<Array<ListRow>> {\n const [installed, entries] = await Promise.all([\n readInstalledPackages({ root: cwd }),\n fetchRegistryIndex({ registry }).catch((error: unknown): Array<RegistryEntry> => {\n logWarn(`Showing installed extensions only: ${getErrorMessage(error)}`)\n return []\n }),\n ])\n const byPackage = new Map(entries.map((entry) => [entry.artifact.package, entry]))\n\n return installed.flatMap(({ package: name, version, manifest }): Array<ListRow> => {\n const entry = byPackage.get(name)\n if (!entry && !manifest) return []\n const latest = entry?.artifact.version\n return [{ id: entry?.id, package: name, installed: version, registry: latest, update: !!latest && isOutdated({ installed: version, latest }) }]\n })\n}\n\n/** Prints the installed extensions as a table. */\nexport async function run(): Promise<void> {\n try {\n const rows = await listExtensions({ cwd: process.cwd(), registry: registryUrl() })\n if (!rows.length) {\n logOutro('No installed extensions found.')\n return\n }\n\n const header = ['ID', 'PACKAGE', 'INSTALLED', 'REGISTRY', 'UPDATE']\n const cells = rows.map((row) => [row.id ?? '-', row.package, row.installed ?? '-', row.registry ?? '-', row.update ? 'yes' : 'no'])\n const [head, ...body] = formatTable([header, ...cells])\n logBlock([styleText('dim', head!), ...body])\n } catch (error) {\n logError(getErrorMessage(error))\n process.exitCode = 1\n }\n}\n\nexport const command = define({\n name: 'list',\n description: 'List installed extensions, their versions, and available updates.',\n examples: 'kubb list',\n run: () => run(),\n})\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { defineWithTypes } from 'gunshi'\nimport { findConfigFile } from '@internals/shared'\nimport { getErrorMessage } from '@internals/utils'\nimport { Hookable, type KubbHooks, readInstalledPackages, type RegistryEntry } from '@kubb/core'\nimport { pluralize } from '../../ui/text.ts'\nimport { dryRunId, type DryRunExtensions, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner, withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { formatTable } from '../../ui/table.ts'\nimport { bumpOf, fetchRegistryIndex, incompatibility, installSpec, isOutdated, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport { diffFiles, type FileChange, readOutputFiles } from '../generate/utils.ts'\n\nexport type UpdateOptions = {\n /**\n * Registry ids to update. Empty updates every installed extension the registry lists.\n */\n ids: Array<string>\n /**\n * List the updates without installing anything.\n */\n dryRun: boolean\n yes: boolean\n}\n\n/**\n * Generates every config in this process, the way `kubb generate` does, and returns the output files\n * it changed. Runs after the install, so the config loads the new versions. `undefined` when the\n * config fails to load or a build fails.\n */\nasync function regenerate({\n cwd,\n configPath,\n}: {\n cwd: string\n configPath: string\n}): Promise<{ files: Array<FileChange>; unchanged: number; output: string } | undefined> {\n const spinner = createSpinner()\n spinner.start('Generating with the new versions')\n try {\n // Imported here, so the config loader and the generate path never slow down `kubb --help`.\n const [{ getConfigs }, { generate }] = await Promise.all([import('../../config.ts'), import('../generate/run.ts')])\n const { configs } = await getConfigs({ configPath })\n const dirs = configs.map((config) => path.resolve(config.root ?? cwd, config.output.path))\n const before = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const hooks = new Hookable<KubbHooks>()\n for (const config of configs) {\n if (!(await generate({ config, hooks }))) throw new Error('Generation failed')\n }\n const after = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const diff = diffFiles(before, after)\n spinner.stop(diff.files.length ? `Generated: ${pluralize(diff.files.length, 'file')} changed` : 'Generated: no files changed')\n return { ...diff, output: dirs.map((dir) => path.relative(cwd, dir) || '.').join(', ') }\n } catch (error) {\n spinner.error(`Generation failed: ${getErrorMessage(error)}`)\n return undefined\n }\n}\n\n/**\n * Moves installed extensions to the version the registry pins. Shows each version change with its\n * bump, asks which to install with majors left out, installs them, and regenerates to show which\n * files changed. With `dryRun`, only lists the updates and installs nothing.\n */\nexport async function run({ ids, dryRun, yes }: UpdateOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const installedPackages: Array<string> = []\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n logIntro({ title: isInteractiveRun({ yes, dryRun }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Update ')) })\n\n try {\n const wanted = new Set(ids.map(toRegistryId))\n const [entries, installed] = await withSpinner({\n message: 'Checking the registry',\n promise: Promise.all([fetchRegistryIndex({ registry: registryUrl() }), readInstalledPackages({ root: cwd })]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const tracked = entries.filter((entry) => versions.has(entry.artifact.package) && (!wanted.size || wanted.has(entry.id)))\n for (const id of wanted) {\n if (!tracked.some((entry) => entry.id === id)) logWarn(`${id} is not installed, or not in the registry.`)\n }\n\n const current = ({ artifact }: RegistryEntry) => versions.get(artifact.package)\n const isMajor = (entry: RegistryEntry) => bumpOf({ installed: current(entry), latest: entry.artifact.version }) === 'major'\n const outdated = tracked.filter((entry) => isOutdated({ installed: current(entry), latest: entry.artifact.version }))\n const proposals = outdated.filter((entry) => {\n const problem = incompatibility(entry.manifest)\n if (problem) logWarn(`Skipped ${entry.id}: ${problem}`)\n return !problem\n })\n\n if (!proposals.length) {\n const title = outdated.length ? 'No compatible updates available' : 'Already up to date'\n summary(tracked.length ? title : 'No installed extensions to update', outdated.length ? 'warning' : 'success', [\n ` ${tracked.length - outdated.length} of ${tracked.length} up to date`,\n ...(ids.length ? ['', `No updates for ${ids.join(', ')}.`] : []),\n ])\n return\n }\n\n if (tracked.length) {\n const header = ['Extension', 'Current', 'Latest', '']\n const rows = tracked.map((entry) => {\n if (!outdated.includes(entry)) return [entry.artifact.package, current(entry) ?? '-', 'up to date', '']\n const bump = bumpOf({ installed: current(entry), latest: entry.artifact.version }) ?? ''\n return [entry.artifact.package, current(entry) ?? 'not installed', entry.artifact.version, bump === 'major' ? 'major · breaking' : bump]\n })\n const lines = formatTable([header, ...rows])\n logStep(`Checked ${pluralize(tracked.length, 'extension')} against the registry`)\n logBlock([\n styleText('dim', lines[0]!),\n ...lines.slice(1).map((line, index) => {\n if (!outdated.includes(tracked[index]!)) return styleText('dim', line)\n return line.endsWith('major · breaking') ? styleText('yellow', line) : line\n }),\n ])\n }\n\n if (dryRun) {\n summary('Updates available', 'planned', [`Dry run: nothing was installed. Run kubb update to install ${proposals.length === 1 ? 'it' : 'them'}.`])\n return\n }\n\n // A major can break the generated code, so it is only picked for you when you named it.\n const defaults = proposals.filter((entry) => wanted.has(entry.id) || !isMajor(entry))\n const chosen = yes\n ? defaults.map((entry) => entry.id)\n : await clack.multiselect({\n message: 'Select the updates to install',\n options: proposals.map((entry) => ({\n value: entry.id,\n label: entry.artifact.package,\n hint: `${current(entry) ?? 'not installed'} → ${entry.artifact.version}`,\n })),\n initialValues: defaults.map((entry) => entry.id),\n required: false,\n })\n if (clack.isCancel(chosen)) {\n summary('Update canceled', 'canceled', [' No changes made'])\n return\n }\n const selected = proposals.filter((entry) => chosen.includes(entry.id))\n\n const skipped = proposals\n .filter((entry) => !selected.includes(entry))\n .map((entry) => {\n const kind = entry.manifest.kind.charAt(0).toUpperCase() + entry.manifest.kind.slice(1)\n return ` ${styleText('dim', 'Skipped')} ${kind} ${entry.artifact.package} ${entry.artifact.version} ${styleText('dim', `run kubb update ${toShortId(entry.id)} later`)}`\n })\n if (!selected.length) {\n summary('No updates installed', 'canceled', [' No updates selected.', ...skipped])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const names = selected.map(({ artifact }) => artifact.package).join(', ')\n await installWithSpinner({\n packages: selected.map(({ artifact }) => installSpec(artifact)),\n names,\n packageManager,\n cwd,\n })\n installedPackages.push(...selected.map((entry) => entry.artifact.package))\n\n // Regenerating rewrites output files, so it is asked for. `--yes` only accepts the install.\n const foundConfig = findConfigFile(cwd)\n const regenerateNow =\n foundConfig && !yes && (await clack.confirm({ message: 'Regenerate now? This rewrites the generated files.', initialValue: true })) === true\n const configPath = regenerateNow ? foundConfig : undefined\n const changed = configPath ? await regenerate({ cwd, configPath }) : undefined\n\n const generationFailed = Boolean(configPath && !changed)\n const fileCounts = { A: 0, M: 0, D: 0 }\n for (const file of changed?.files ?? []) fileCounts[file.status]++\n summary(generationFailed ? 'Extensions updated; generation failed' : 'Update complete', generationFailed ? 'warning' : 'success', [\n ` Packages ${selected.length} installed with ${packageManager.name}${skipped.length ? ` · ${skipped.length} skipped` : ''}`,\n ...skipped,\n ...(changed ? [` Files ${fileCounts.A} added · ${fileCounts.M} modified · ${fileCounts.D} deleted`] : []),\n ...(!configPath ? [' Regeneration not run'] : []),\n ...(generationFailed ? ['', 'Fix the generation error, then run kubb generate.'] : []),\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Update failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'update',\n description: 'Update installed extensions, regenerate, and summarize file changes.',\n examples: ['kubb update', 'kubb update --dry-run', 'kubb update plugin-zod plugin-ts --yes'].join('\\n'),\n args: {\n ids: {\n type: 'positional',\n description: 'Registry ids to update, all installed extensions when omitted',\n multiple: true,\n },\n ...yesArg,\n },\n run: ({ values, extensions }) => run({ ids: values.ids ?? [], dryRun: extensions[dryRunId].enabled, yes: values.yes }),\n})\n","import { styleText } from 'node:util'\nimport dryrun from '@gunshi/plugin-dryrun'\nimport { cli } from 'gunshi'\nimport { isDisabled as isTelemetryDisabled } from './Telemetry.ts'\nimport { version } from '../package.json'\nimport { getBanner, wantsMascot } from './ui/mascot.ts'\nimport { command as generateCommand } from './commands/generate.ts'\nimport { command as mcpCommand } from './commands/mcp.ts'\nimport { command as studioCommand, routeStudioFlags } from './commands/studio/index.ts'\nimport { command as validateCommand } from './commands/validate.ts'\nimport { resolveDeprecatedFlags } from './deprecatedFlags.ts'\nimport { command as addCommand } from './runners/add/run.ts'\nimport { command as initCommand } from './runners/init/run.ts'\nimport { command as listCommand } from './runners/list/run.ts'\nimport { command as updateCommand } from './runners/update/run.ts'\n\n/** Flags that short-circuit execution (help and version). The telemetry notice is suppressed for these. */\nconst QUIET_FLAGS = new Set<string>(['--help', '-h', '--version', '-v', '--json'])\n\n/**\n * Entry point for the `kubb` CLI. Prints the telemetry notice unless telemetry is disabled or a\n * quiet flag is passed, then runs the given command, or `generate` when none is given.\n */\nexport async function run(argv: Array<string> = process.argv.slice(2)): Promise<void> {\n const args = routeStudioFlags(resolveDeprecatedFlags(argv))\n const isQuietFlag = args.some((arg) => QUIET_FLAGS.has(arg))\n // `--reporter json` and `--json` own stdout, so the header must not land there.\n const isJsonOutput =\n args.includes('--json') || args.some((arg, index) => /^--reporter=.*\\bjson\\b/.test(arg) || (arg === '--reporter' && /\\bjson\\b/.test(args[index + 1] ?? '')))\n\n // stderr, so the notice never lands in a stream a client parses, such as `kubb mcp` stdio.\n if (!isTelemetryDisabled() && !isQuietFlag) {\n console.error(\n `${styleText('yellow', 'Notice:')} Kubb collects anonymous telemetry data to help improve the tool. No personal data or file contents are collected. \\nTo disable, set ${styleText('cyan', 'KUBB_DISABLE_TELEMETRY=1')}.\\n`,\n )\n }\n\n // validate, mcp and studio import their runner when they run, so an optional peer (@kubb/adapter-oas, @kubb/mcp, @kubb/studio) loads only then.\n await cli(args, generateCommand, {\n name: 'kubb',\n version,\n // Not `generateCommand.description`: gunshi prints this on every subcommand's help too, so\n // `kubb studio --help` would open with a paragraph about generating types.\n description: 'Generate code from an OpenAPI specification, manage Kubb extensions, or connect the project to Kubb Studio.',\n subCommands: {\n generate: generateCommand,\n init: initCommand,\n validate: validateCommand,\n mcp: mcpCommand,\n studio: studioCommand,\n add: addCommand,\n update: updateCommand,\n list: listCommand,\n },\n fallbackToEntry: true,\n // The mascot opens only the long-running commands; `generate` turns this off and plays its animated banner instead.\n renderHeader: isJsonOutput\n ? null\n : async (ctx) => {\n if (!wantsMascot({ commandPath: ctx.commandPath, values: ctx.values })) return ''\n\n // Gunshi adds a blank line after returned headers; the first prompt already supplies its guide.\n ctx.log(getBanner(version, ctx.commandPath.join(' ') || 'generate'))\n return ''\n },\n strict: true,\n plugins: [dryrun({ name: 'dry-run' })],\n onErrorCommand: async (_ctx, error) => {\n process.exitCode = 1\n console.error(error)\n },\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Diagnostics","command","defineWithTypes","dryRunId","command","define","define","command","command","connectCommand","command","command","define","command","connectCommand","define","command","process","command","define","connectCommand","startCommand","loginCommand","logoutCommand","statusCommand","snapshotCommand","command","define","styleText","parse","getErrorMessage","isPackageName","getErrorMessage","read","writeRaw","process","path","fs","x","read","Diagnostics","write","process","formatMs","getElapsedMs","isRichOutput","clack","createSpinner","Diagnostics","toShortId","clack","run","process","logCommandSummary","isInteractiveRun","styleText","registryUrl","toRegistryId","path","findConfigFile","withSpinner","fetchRegistryIndex","readInstalledPackages","read","closestIds","incompatibility","BUNDLED_PACKAGES","installSpec","getErrorMessage","command","define","clack","Diagnostics","KUBB_CONFIG_FILENAME","getConfigs","createKubb","run","process","createSpinner","styleText","isInteractiveRun","fetchRegistryIndex","registryUrl","incompatibility","exists","path","pluralize","initDefaults","KUBB_PACKAGE_NAME","version","installSpec","write","formatMs","getElapsedMs","command","defineWithTypes","dryRunId","readInstalledPackages","fetchRegistryIndex","getErrorMessage","isOutdated","run","process","registryUrl","styleText","command","define","run","process","logCommandSummary","isInteractiveRun","styleText","toRegistryId","path","findConfigFile","Diagnostics","withSpinner","fetchRegistryIndex","registryUrl","readInstalledPackages","read","closestIds","toShortId","BUNDLED_PACKAGES","clack","getErrorMessage","command","define","createSpinner","path","readOutputFiles","Hookable","diffFiles","pluralize","getErrorMessage","run","process","logCommandSummary","isInteractiveRun","styleText","toRegistryId","withSpinner","fetchRegistryIndex","registryUrl","readInstalledPackages","bumpOf","isOutdated","incompatibility","clack","toShortId","installSpec","findConfigFile","defineWithTypes","dryRunId","isTelemetryDisabled","styleText","cli","generateCommand","initCommand","validateCommand","mcpCommand","studioCommand","addCommand","updateCommand","removeCommand","listCommand","wantsMascot","getBanner","version","dryrun"],"sources":["../../../internals/utils/src/casing.ts","../src/commands/shared.ts","../src/commands/generate.ts","../src/commands/mcp.ts","../src/commands/studio/studioCommand.ts","../src/commands/studio/connect.ts","../src/commands/studio/login.ts","../src/commands/studio/logout.ts","../src/commands/studio/snapshot.ts","../src/commands/studio/background.ts","../src/commands/studio/status.ts","../src/commands/studio/index.ts","../src/commands/validate.ts","../src/deprecatedFlags.ts","../../../internals/shared/src/init.ts","../../../internals/shared/src/configFile/ast.ts","../../../internals/shared/src/configFile/types.ts","../../../internals/shared/src/configFile/rules.ts","../../../internals/shared/src/configFile/text.ts","../../../internals/shared/src/configFile/configFile.ts","../src/runners/init/utils.ts","../src/runners/installWithSpinner.ts","../src/runners/add/run.ts","../src/runners/init/run.ts","../src/ui/table.ts","../src/runners/list/run.ts","../src/runners/remove/run.ts","../src/runners/update/run.ts","../src/index.ts"],"sourcesContent":["type Options = {\n /**\n * Text prepended before casing is applied.\n */\n prefix?: string\n /**\n * Text appended before casing is applied.\n */\n suffix?: string\n}\n\n/**\n * Shared implementation for camelCase and PascalCase conversion.\n * Splits on common word boundaries (spaces, hyphens, underscores, dots, slashes, colons)\n * and capitalizes each word according to `pascal`.\n *\n * When `pascal` is `true` the first word is also capitalized (PascalCase), otherwise only subsequent words are.\n */\nfunction convert(text: string, pascal: boolean): string {\n return text\n .trim()\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .replace(/(\\d)([a-z])/g, '$1 $2')\n .split(/[\\s\\-_./\\\\:]+/)\n .filter(Boolean)\n .map((word, i) => {\n if (word.length > 1 && word === word.toUpperCase()) return word\n const head = i === 0 && !pascal ? word.charAt(0).toLowerCase() : word.charAt(0).toUpperCase()\n return head + word.slice(1)\n })\n .join('')\n .replace(/[^a-zA-Z0-9]/g, '')\n}\n\n// Plugins resolve the same names over and over (about 47,000 calls for a 1,000 schema spec), so\n// results are kept. Clearing at the limit bounds the memory a long-running process spends on it.\nconst cache = new Map<string, string>()\nconst cacheLimit = 10_000\n\nfunction toCamelOrPascal(text: string, pascal: boolean): string {\n const key = `${pascal ? 'P' : 'c'}${text}`\n const cached = cache.get(key)\n if (cached !== undefined) return cached\n\n const result = convert(text, pascal)\n if (cache.size >= cacheLimit) cache.clear()\n cache.set(key, result)\n return result\n}\n\n/**\n * Converts `text` to camelCase.\n *\n * @example Word boundaries\n * `camelCase('hello-world') // 'helloWorld'`\n *\n * @example With a prefix\n * `camelCase('tag', { prefix: 'create' }) // 'createTag'`\n */\nexport function camelCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, false)\n}\n\n/**\n * Converts `text` to PascalCase.\n *\n * @example Word boundaries\n * `pascalCase('hello-world') // 'HelloWorld'`\n *\n * @example With a suffix\n * `pascalCase('tag', { suffix: 'schema' }) // 'TagSchema'`\n */\nexport function pascalCase(text: string, { prefix = '', suffix = '' }: Options = {}): string {\n return toCamelOrPascal(`${prefix} ${text} ${suffix}`, true)\n}\n","import { pluginId as dryRunId } from '@gunshi/plugin-dryrun'\nimport type { DryRunExtension } from '@gunshi/plugin-dryrun'\n\nexport { dryRunId }\n\n/** Extension shape gunshi's command context carries with `@gunshi/plugin-dryrun`; the `extensions` type parameter of `defineWithTypes`. */\nexport type DryRunExtensions = {\n [dryRunId]: DryRunExtension\n}\n\nexport const configArg = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n short: 'c',\n },\n} as const\n\nexport const yesArg = {\n yes: {\n type: 'boolean',\n description: 'Skip the confirmation',\n short: 'y',\n default: false,\n },\n} as const\n\nexport const logLevelArg = {\n logLevel: {\n type: 'enum',\n choices: ['silent', 'info', 'verbose'] as const,\n description: 'Info, silent or verbose',\n short: 'l',\n default: 'info',\n toKebab: true,\n },\n} as const\n\nexport const studioConnectionArgs = {\n url: {\n type: 'string',\n description: 'Base URL of the Kubb Studio instance',\n },\n token: {\n type: 'string',\n description: 'Organization CI API key for `snapshot`. Defaults to KUBB_TOKEN',\n },\n} as const\n\nexport const studioPermissionArgs = {\n allowRead: {\n type: 'boolean',\n description: 'Read the source of files a generation produced. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowReadAst: {\n type: 'boolean',\n description: 'Read the parsed spec (the Kubb AST). Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowWrite: {\n type: 'boolean',\n description: 'Write generated files to disk. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowConfigEdit: {\n type: 'boolean',\n description: 'Let Studio change plugin options in kubb.config.ts. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowInstall: {\n type: 'boolean',\n description: 'Let Studio install extensions from the registry with kubb add; needs --allow-config-edit too. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowUpdate: {\n type: 'boolean',\n description: 'Let Studio update installed extensions with kubb update. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowRemove: {\n type: 'boolean',\n description:\n 'Let Studio remove extensions with kubb remove, which edits kubb.config.ts and uninstalls packages; needs --allow-config-edit too. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowSaveInput: {\n type: 'boolean',\n description: 'Let Studio save the spec it sends as the input in kubb.config.ts; needs --allow-config-edit too. Asked for once per project when omitted',\n default: false,\n toKebab: true,\n },\n allowExec: {\n type: 'boolean',\n description: 'Run the formatter, the linter, and output.postGenerate after a generation',\n default: false,\n toKebab: true,\n },\n} as const\n","import { defineWithTypes } from 'gunshi'\nimport { Diagnostics, type ReporterName } from '@kubb/core'\nimport { configArg, dryRunId, type DryRunExtensions, logLevelArg } from './shared.ts'\n\nconst REPORTER_NAMES: Array<ReporterName> = ['cli', 'json', 'file', 'html']\n\n/**\n * Splits and validates the comma-separated `--reporter` value against the known reporter names.\n */\nfunction parseReporters(value: string): Array<ReporterName> {\n const names = value\n .split(',')\n .map((name) => name.trim())\n .filter(Boolean)\n\n for (const name of names) {\n if (!REPORTER_NAMES.includes(name as ReporterName)) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `must be one of cli, json, file, html (got \"${name}\")`,\n help: 'Use one of cli, json, file, html.',\n })\n }\n }\n\n return names as Array<ReporterName>\n}\n\n/**\n * Resolves the effective log level, letting the `--verbose` and `--silent` flags win over `--log-level`.\n */\nfunction resolveLogLevel({ verbose, silent, logLevel }: { verbose: boolean; silent: boolean; logLevel: string }): string {\n if (verbose) return 'verbose'\n if (silent) return 'silent'\n return logLevel\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'generate',\n // The runner plays the animated mascot itself, so the shared header would print it twice.\n rendering: { header: null },\n description: 'Generate types, clients, hooks, and schemas from an OpenAPI specification.',\n examples: [\n 'kubb generate # generate from kubb.config.ts',\n 'kubb generate ./openapi.yaml # generate from this spec instead of the config input',\n 'kubb generate --config kubb.config.ts',\n 'kubb generate --watch # regenerate whenever the spec changes',\n 'kubb generate --dry-run # preview the run without writing files',\n 'kubb generate --reporter html # write an HTML run report',\n 'kubb studio # connect this project to Kubb Studio and generate from the browser',\n 'kubb studio --allow-write # let Studio write the generated files to disk',\n 'kubb studio login # pair this machine with Studio without connecting',\n ].join('\\n'),\n toKebab: true,\n args: {\n input: {\n type: 'positional',\n required: false,\n description: 'Path to the OpenAPI specification, overriding the config',\n },\n ...configArg,\n ...logLevelArg,\n watch: {\n type: 'boolean',\n description: 'Watch mode: rebuilds when the local input file changes',\n short: 'w',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Override logLevel to verbose',\n default: false,\n },\n silent: {\n type: 'boolean',\n description: 'Override logLevel to silent',\n short: 's',\n default: false,\n },\n reporter: {\n type: 'custom',\n description: 'Reporters that render the run: cli, json, file, html. Comma-separated. Overrides config.reporters',\n metavar: 'cli|json|file|html',\n parse: parseReporters,\n },\n },\n async run(ctx) {\n const { values } = ctx\n const logLevel = resolveLogLevel(values)\n const { run } = await import('../runners/generate/run.ts')\n\n await run({\n input: values.input,\n configPath: values.config,\n logLevel,\n watch: values.watch,\n reporters: values.reporter,\n dryRun: ctx.extensions[dryRunId].enabled,\n })\n },\n})\n","import { define } from 'gunshi'\n\n/** The runner is imported when the command runs, so listing `kubb --help` never loads `@kubb/mcp`. */\nexport const command = define({\n name: 'mcp',\n description: 'Start an MCP server for code generation from an AI assistant.',\n examples: ['kubb mcp', '# Then add to your MCP client config:', '# { \"mcpServers\": { \"kubb\": { \"command\": \"npx\", \"args\": [\"kubb\", \"mcp\"] } } }'].join('\\n'),\n // gunshi prints the header to stdout, which the MCP stdio transport owns.\n rendering: { header: null },\n async run() {\n const { run } = await import('../runners/mcp/run.ts')\n await run()\n },\n})\n","import { type Args, define } from 'gunshi'\nimport type { StudioOptions, StudioValues } from '../../runners/studio/run.ts'\n\n/**\n * Defines a `kubb studio` subcommand. The runner, and with it `@kubb/studio`, loads only when the\n * command runs, so `kubb --help` never does.\n */\nexport function studioCommand({\n action,\n block,\n ...definition\n}: {\n name: string\n description: string\n examples?: string\n args?: Args\n /** Opens a block a later `logOutro` closes, for a command that keeps running. */\n block?: boolean\n /** The command body, given the options built from its flags. */\n action: (options: StudioOptions) => Promise<unknown>\n}) {\n return define({\n ...definition,\n toKebab: true,\n async run({ values }) {\n const { runStudio } = await import('../../runners/studio/run.ts')\n await runStudio(values as StudioValues, action, { block })\n },\n })\n}\n","import { configArg, logLevelArg, studioConnectionArgs, studioPermissionArgs } from '../shared.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'connect',\n description: 'Connect this project to Kubb Studio and generate from the browser.',\n examples: [\n 'kubb studio connect',\n 'kubb studio connect --allow-read',\n 'kubb studio connect --allow-write --allow-exec',\n 'kubb studio connect --url http://localhost:3000',\n ].join('\\n'),\n args: {\n ...configArg,\n ...studioConnectionArgs,\n ...studioPermissionArgs,\n open: {\n type: 'boolean',\n description: 'Open the approval page in a browser while pairing',\n default: true,\n negatable: true,\n },\n ...logLevelArg,\n },\n block: true,\n async action(options) {\n const { connect } = await import('../../runners/studio/run.ts')\n await connect(options)\n },\n})\n","import { command as connectCommand } from './connect.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'login',\n description: 'Pair this machine with Kubb Studio without connecting.',\n examples: ['kubb studio login', 'kubb studio login --url http://localhost:3000'].join('\\n'),\n args: connectCommand.args,\n async action(options) {\n const { login } = await import('../../runners/studio/run.ts')\n await login(options)\n },\n})\n","import { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'logout',\n description: 'Forget the stored Kubb Studio token.',\n examples: 'kubb studio logout',\n args: {},\n async action() {\n const { stopWorker } = await import('../../runners/studio/background.ts')\n const { clearCredentials } = await import('../../runners/studio/credentials.ts')\n await stopWorker()\n await clearCredentials()\n console.log('Signed out of Kubb Studio.')\n },\n})\n","import { define } from 'gunshi'\nimport { configArg, logLevelArg, studioConnectionArgs } from '../shared.ts'\n\nexport const command = define({\n name: 'snapshot',\n description: 'Generate and publish a Kubb Studio snapshot from CI.',\n examples: ['kubb studio snapshot', 'kubb studio snapshot --json'].join('\\n'),\n toKebab: true,\n args: {\n ...configArg,\n ...studioConnectionArgs,\n id: {\n type: 'string',\n description: 'Stable identity for the CI agent, such as a pull request. Auto-detected on GitHub Actions, GitLab CI, Bitbucket Pipelines and CircleCI',\n },\n baseId: {\n type: 'string',\n description:\n \"Identity of another CI agent, such as the base branch's, to also compare this snapshot with. Auto-detected on GitHub pull requests and GitLab merge requests\",\n toKebab: true,\n },\n name: {\n type: 'string',\n description: 'Package name for the generated tarball. Defaults to the name in package.json',\n },\n packageVersion: {\n type: 'string',\n description: 'Package version for the generated tarball. Defaults to the version in package.json',\n toKebab: true,\n },\n json: {\n type: 'boolean',\n description: 'Print the result as one JSON object instead of a summary',\n default: false,\n },\n ...logLevelArg,\n },\n async run(ctx) {\n const { runner } = await import('../../runners/studio/snapshot.ts')\n await runner(ctx)\n },\n})\n","import { define } from 'gunshi'\nimport { command as connectCommand } from './connect.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'start',\n description: 'Keep this project connected to Kubb Studio in the background.',\n args: connectCommand.args,\n async action(options) {\n const { startWorker } = await import('../../runners/studio/background.ts')\n await startWorker(options)\n },\n})\n\nexport const stopCommand = define({\n name: 'stop',\n description: \"Stop this project's background connection and keep its pairing.\",\n async run() {\n const { stopWorker } = await import('../../runners/studio/background.ts')\n await stopWorker()\n console.log('Background connection stopped.')\n },\n})\n","import process from 'node:process'\nimport { studioConnectionArgs } from '../shared.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'status',\n description: 'Show the project worker, Kubb Studio pairing, and saved permissions.',\n examples: 'kubb studio status',\n args: { url: studioConnectionArgs.url },\n async action(options) {\n const { getWorkerLogPath, getWorkerStatus } = await import('../../runners/studio/background.ts')\n const { readCredentials } = await import('../../runners/studio/credentials.ts')\n const { formatStatus } = await import('../../runners/studio/status.ts')\n\n const [worker, credentials] = await Promise.all([getWorkerStatus(), readCredentials()])\n console.log(\n ['', ...formatStatus({ studioUrl: options.studioUrl, credentials, worker, project: process.cwd(), logPath: getWorkerLogPath() }), ''].join('\\n'),\n )\n },\n})\n","import { define } from 'gunshi'\nimport { command as connectCommand } from './connect.ts'\nimport { command as loginCommand } from './login.ts'\nimport { command as logoutCommand } from './logout.ts'\nimport { command as snapshotCommand } from './snapshot.ts'\nimport { command as startCommand, stopCommand } from './background.ts'\nimport { command as statusCommand } from './status.ts'\n\nexport const command = define({\n ...connectCommand,\n name: 'studio',\n description: 'Connect this project to Kubb Studio, or manage its pairing and snapshots.',\n examples: ['kubb studio', 'kubb studio --allow-read', 'kubb studio login', 'kubb studio status', 'kubb studio logout', 'kubb studio snapshot'].join('\\n'),\n subCommands: {\n start: startCommand,\n stop: stopCommand,\n connect: connectCommand,\n login: loginCommand,\n logout: logoutCommand,\n status: statusCommand,\n snapshot: snapshotCommand,\n },\n})\n\n/**\n * Sends `kubb studio --flag value` to `kubb studio connect`, the same runner. gunshi picks a\n * subcommand from the first token that is not a flag, so `--url http://…` would read the URL as one.\n */\nexport function routeStudioFlags(args: Array<string>): Array<string> {\n const [name, next] = args\n if (name !== 'studio' || !next?.startsWith('-') || next === '--help' || next === '-h') return args\n\n return ['studio', 'connect', ...args.slice(1)]\n}\n","import { define } from 'gunshi'\nimport { configArg } from './shared.ts'\n\n/** The runner is imported when the command runs, so listing `kubb --help` never loads `@kubb/adapter-oas`. */\nexport const command = define({\n name: 'validate',\n description: 'Check a specification with the configured adapter before generating.',\n examples: ['kubb validate ./openapi.yaml', 'kubb validate https://petstore3.swagger.io/api/v3/openapi.json'].join('\\n'),\n args: {\n ...configArg,\n input: {\n type: 'positional',\n description: 'Path or URL to the specification to validate',\n required: true,\n },\n },\n async run({ values }) {\n const { run } = await import('../runners/validate/run.ts')\n await run({ input: values.input, configPath: values.config })\n },\n})\n","import { styleText } from 'node:util'\n\n/**\n * Maps each camelCase flag removed in favor of kebab-case (kubb-labs/kubb#4046) to its\n * replacement. Drop this table, and the rewrite it drives, once the deprecation window ends.\n */\nconst DEPRECATED_FLAGS: Record<string, string> = {\n allowWrite: 'allow-write',\n allowConfigEdit: 'allow-config-edit',\n allowExec: 'allow-exec',\n logLevel: 'log-level',\n dryRun: 'dry-run',\n packageVersion: 'package-version',\n}\n\n/** Flags a single command renamed, rewritten only for that command, since the old name is a common word. */\nconst DEPRECATED_COMMAND_FLAGS: Record<string, Record<string, string>> = {\n update: { check: 'dry-run' },\n}\n\nconst FLAG_PATTERN = /^--([a-zA-Z][\\w-]*)(=.*)?$/\n\n/**\n * Rewrites a deprecated camelCase flag to its kebab-case replacement and warns on stderr, so a\n * script written against the old flag names keeps working during the deprecation window instead\n * of failing with an unknown-option error.\n */\nexport function resolveDeprecatedFlags(args: Array<string>): Array<string> {\n const commandFlags = DEPRECATED_COMMAND_FLAGS[args[0] ?? ''] ?? {}\n\n return args.map((arg) => {\n const match = FLAG_PATTERN.exec(arg)\n const name = match?.[1]\n const replacement = name ? (DEPRECATED_FLAGS[name] ?? commandFlags[name]) : undefined\n\n if (!name || !replacement) {\n return arg\n }\n\n console.error(\n `${styleText('yellow', 'Warning:')} --${name} is deprecated, use --${replacement} instead. --${name} will be removed in a future major version.`,\n )\n\n return `--${replacement}${match?.[2] ?? ''}`\n })\n}\n","/** The `kubb.config.ts` `kubb init` writes before `kubb add` puts each plugin in. */\nexport function generateConfigFile({ inputPath, outputPath }: { inputPath: string; outputPath: string }): string {\n return `import { defineConfig } from 'kubb/config'\n\nexport default defineConfig({\n input: '${inputPath}',\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [],\n})\n`\n}\n","import { getErrorMessage } from '@internals/utils'\nimport { type Comment, type Expression, type Program, parse } from 'yuku-parser'\n\nexport type {\n ArrayExpression,\n AssignmentExpression,\n BindingProperty,\n CallExpression,\n Comment,\n Expression,\n ImportDeclaration,\n ObjectExpression,\n ObjectPropertyKind,\n Program,\n RestElement,\n SpreadElement,\n VariableDeclaration,\n} from 'yuku-parser'\n\n/** Node types the config editor reads from the yuku AST. */\nexport const nodeTypes = {\n arrayExpression: 'ArrayExpression',\n arrowFunctionExpression: 'ArrowFunctionExpression',\n assignmentExpression: 'AssignmentExpression',\n blockStatement: 'BlockStatement',\n callExpression: 'CallExpression',\n exportDefaultDeclaration: 'ExportDefaultDeclaration',\n expressionStatement: 'ExpressionStatement',\n functionExpression: 'FunctionExpression',\n identifier: 'Identifier',\n importDeclaration: 'ImportDeclaration',\n importSpecifier: 'ImportSpecifier',\n literal: 'Literal',\n memberExpression: 'MemberExpression',\n objectExpression: 'ObjectExpression',\n objectPattern: 'ObjectPattern',\n property: 'Property',\n returnStatement: 'ReturnStatement',\n spreadElement: 'SpreadElement',\n tSAsExpression: 'TSAsExpression',\n tSSatisfiesExpression: 'TSSatisfiesExpression',\n templateLiteral: 'TemplateLiteral',\n unaryExpression: 'UnaryExpression',\n variableDeclaration: 'VariableDeclaration',\n} as const\n\nexport const commentTypes = { line: 'Line' } as const\nexport const propertyKinds = { init: 'init' } as const\nexport const unaryOperators = { minus: '-', plus: '+' } as const\nconst diagnosticSeverities = { error: 'error' } as const\n\n/** A parsed file: its statements and every comment in it, or why it could not be parsed. */\ntype ParsedSource = { program: Program; comments: Array<Comment> } | { reason: string }\n\n/**\n * Parses `source` as a TypeScript module. Never throws: a syntax error, or a native parser that\n * cannot load on this platform, comes back as a `reason`.\n */\nexport function parseSource(source: string): ParsedSource {\n try {\n // Parentheses are dropped, so `export default (defineConfig({}))` reads as the call itself.\n const { program, comments, diagnostics } = parse(source, { lang: 'ts', sourceType: 'module', preserveParens: false })\n if (diagnostics.some((diagnostic) => diagnostic.severity === diagnosticSeverities.error)) return { reason: 'the config file could not be parsed' }\n return { program, comments }\n } catch (error) {\n return { reason: `the config parser could not load on this platform: ${getErrorMessage(error)}` }\n }\n}\n\n/** Parses `source` as one expression, such as a commented-out `pluginTs({ ... })` call. */\nexport function parseExpression(source: string): Expression | undefined {\n const parsed = parseSource(source)\n if ('reason' in parsed) return undefined\n const [statement] = parsed.program.body\n return parsed.program.body.length === 1 && statement?.type === nodeTypes.expressionStatement ? statement.expression : undefined\n}\n","import type { ExtensionKind, ExtensionManifest } from '@kubb/core'\n\n/** Which `defineConfig(...)` entry an edit targets: its index or `name`, the first entry when omitted. */\nexport type ConfigRef = string | number\n\n/** A literal option value that survives a JSON round trip. */\nexport type OptionValue = string | number | boolean | null | Array<OptionValue> | { [key: string]: OptionValue }\n\nexport const extensionKinds = { plugin: 'plugin', adapter: 'adapter', parser: 'parser' } as const satisfies Record<string, ExtensionKind>\n\nexport const ConfigEditOperation = {\n SET_OPTION: 'set-option',\n REMOVE_OPTION: 'remove-option',\n ADD_PLUGIN: 'add-plugin',\n REMOVE_EXTENSION: 'remove-extension',\n DISABLE_PLUGIN: 'disable-plugin',\n ENABLE_PLUGIN: 'enable-plugin',\n SET_INPUT: 'set-input',\n SET_OUTPUT: 'set-output',\n REMOVE_OUTPUT: 'remove-output',\n} as const\nexport type ConfigEditOperation = (typeof ConfigEditOperation)[keyof typeof ConfigEditOperation]\n\n/**\n * One change to `kubb.config.ts`. `plugin` is the package name, and `kind` picks the `plugins` entry\n * (default), the `adapter`, or a `parsers` entry. `path` walks nested option objects.\n */\nexport type ConfigEdit =\n | { operation: typeof ConfigEditOperation.SET_OPTION; config?: ConfigRef; kind?: ExtensionKind; plugin: string; path: Array<string>; value: unknown }\n | { operation: typeof ConfigEditOperation.REMOVE_OPTION; config?: ConfigRef; kind?: ExtensionKind; plugin: string; path: Array<string> }\n /** With `kind: 'parser'`, adds to `parsers`. A config without `parsers` gets the defaults written next to it, so they keep running. */\n | {\n operation: typeof ConfigEditOperation.ADD_PLUGIN\n config?: ConfigRef\n kind?: typeof extensionKinds.plugin | typeof extensionKinds.parser\n plugin: string\n options?: Record<string, unknown>\n }\n /** Deletes every call of a plugin, or a parser with `kind: 'parser'`, a disabled block included, and the imports nothing else uses. */\n | {\n operation: typeof ConfigEditOperation.REMOVE_EXTENSION\n config?: ConfigRef\n kind?: typeof extensionKinds.plugin | typeof extensionKinds.parser\n plugin: string\n }\n | { operation: typeof ConfigEditOperation.DISABLE_PLUGIN; config?: ConfigRef; plugin: string }\n | { operation: typeof ConfigEditOperation.ENABLE_PLUGIN; config?: ConfigRef; plugin: string }\n | { operation: typeof ConfigEditOperation.SET_INPUT; config?: ConfigRef; input: string }\n | { operation: typeof ConfigEditOperation.SET_OUTPUT; config?: ConfigRef; path: Array<string>; value: unknown }\n | { operation: typeof ConfigEditOperation.REMOVE_OUTPUT; config?: ConfigRef; path: Array<string> }\n\n/** Option keys, each with whether Studio may write it. `locked` lists the code paths inside a partly literal object. */\nexport type OptionsView = Record<string, { literal: boolean; value?: OptionValue; locked?: Array<Array<string>> }>\n\n/** A factory call in `plugins`, `adapter`, or `parsers`. `importName` is the local name, alias included. */\nexport type PluginView = {\n importName: string\n packageName: string\n options: OptionsView\n /** The call is commented out by `disable-plugin`. */\n disabled?: true\n}\n\nexport type ConfigView = {\n name?: string\n plugins: Array<PluginView>\n adapter?: PluginView\n parsers?: Array<PluginView>\n /** The root `output` members Studio may set, absent when `output` is not an object literal. */\n output?: OptionsView\n}\n\n/** The config file as Studio may edit it, or why it cannot. */\nexport type ConfigFileView = { managed: true; configs: Array<ConfigView> } | { managed: false; reason: string }\n\nexport type ConfigEditOutcome = {\n edit: ConfigEdit\n applied: boolean\n reason?: string\n}\n\nexport type ExtensionEntry = {\n package: string\n version: string\n manifest: ExtensionManifest\n /** Ships with `kubb` at its version, so updating `kubb` updates it and `kubb update` cannot. */\n bundled?: true\n}\n\n/** Installed extensions by package name, the only ones Studio may import besides `@kubb/plugin-*`. */\nexport type InstalledExtensions = ReadonlyMap<string, ExtensionEntry>\n","import { type ExtensionKind, isPackageName } from '@kubb/core'\nimport { camelCase } from '@internals/utils'\nimport { extensionKinds, type InstalledExtensions, type OptionValue } from './types.ts'\n\n/** `@kubb/plugin-ts` becomes `plugin-ts`, the `name` Kubb plugin factories use. */\nexport function toPluginName(packageName: string): string {\n return packageName.split('/').pop() ?? packageName\n}\n\n/** `@kubb/plugin-react-query` becomes `pluginReactQuery`, the export a plugin package uses by convention. */\nexport function toExportName(packageName: string): string {\n return camelCase(toPluginName(packageName))\n}\n\nconst KUBB_PLUGIN_SPECIFIER = /^@kubb\\/plugin-[\\w.-]+$/\n\n/** Only a `@kubb/plugin-*` package or an installed extension of `kind` may be imported, never a path or URL. */\nexport function isAllowedPlugin({\n packageName,\n extensions,\n kind = extensionKinds.plugin,\n}: {\n packageName: string\n extensions: InstalledExtensions\n kind?: ExtensionKind\n}): boolean {\n if (!isPackageName(packageName)) return false\n return (kind === extensionKinds.plugin && KUBB_PLUGIN_SPECIFIER.test(packageName)) || extensions.get(packageName)?.manifest.kind === kind\n}\n\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\n/** Whether `key` can be an option key without reaching the object's prototype. */\nexport function isSafeKey(key: string): boolean {\n return !UNSAFE_KEYS.has(key)\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) return false\n const prototype = Object.getPrototypeOf(value)\n return prototype === null || prototype === Object.prototype\n}\n\n/** Whether `value` survives a JSON round trip, so an edit never writes a lossy copy into the file. */\nexport function isOptionValue(value: unknown): value is OptionValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true\n if (typeof value === 'number') return Number.isFinite(value)\n if (Array.isArray(value)) return value.every(isOptionValue)\n if (isPlainObject(value)) return Object.entries(value).every(([key, entry]) => isSafeKey(key) && isOptionValue(entry))\n\n return false\n}\n\n/** The root `output` members Studio may set, with the values each takes. */\nconst OUTPUT_VALUES: Record<string, (value: unknown) => boolean> = {\n barrel: (value) => value === false || (isPlainObject(value) && Object.keys(value).length === 1 && (value.type === 'named' || value.type === 'all')),\n format: (value) => value === false || ['auto', 'prettier', 'biome', 'oxfmt'].includes(value as string),\n lint: (value) => value === false || ['auto', 'eslint', 'biome', 'oxlint'].includes(value as string),\n clean: (value) => typeof value === 'boolean',\n defaultBanner: (value) => value === false || value === 'simple' || value === 'full',\n}\n\nexport function isOutputKey(key: string): boolean {\n return Object.hasOwn(OUTPUT_VALUES, key)\n}\n\nexport function isOutputValue({ key, value }: { key: string; value: unknown }): boolean {\n return isOutputKey(key) && OUTPUT_VALUES[key]!(value)\n}\n\nexport function pickOutput<T>(output: Record<string, T>): Record<string, T> {\n return Object.fromEntries(Object.entries(output).filter(([key]) => isOutputKey(key)))\n}\n","import { type ArrayExpression, nodeTypes, type ObjectExpression } from './ast.ts'\nimport type { OptionValue } from './types.ts'\n\n/**\n * A valid JavaScript identifier, so an import name can only ever print as `import { name } from`,\n * never as source that breaks out of the import statement.\n */\nexport const IDENTIFIER_PATTERN = /^[A-Za-z_$][\\w$]*$/\n\nexport const quotes = { single: `'`, double: `\"` } as const\nexport type Quote = (typeof quotes)[keyof typeof quotes]\n\n/** `source` with the text between `start` and `end` replaced by `text`. */\nexport function replaceText(source: string, start: number, end: number, text = ''): string {\n return `${source.slice(0, start)}${text}${source.slice(end)}`\n}\n\n/** The 1-based line and 0-based column of `offset` in `source`. */\nexport function getPosition(source: string, offset: number): { line: number; column: number } {\n return { line: source.slice(0, offset).split('\\n').length, column: offset - source.lastIndexOf('\\n', offset - 1) - 1 }\n}\n\n/** Writes `value` as a single-line literal with the file's quote style. */\nexport function printValue(value: OptionValue, quote: Quote): string {\n if (typeof value === 'string') {\n // JSON's escaping covers every character that could end the literal or the line.\n const escaped = JSON.stringify(value).slice(1, -1)\n return quote === quotes.double ? `\"${escaped}\"` : `'${escaped.replaceAll(`\\\\\"`, `\"`).replaceAll(`'`, `\\\\'`)}'`\n }\n if (value === null || typeof value !== 'object') return String(value)\n if (Array.isArray(value)) return `[${value.map((item) => printValue(item, quote)).join(', ')}]`\n\n const entries = Object.entries(value)\n return entries.length ? `{ ${entries.map(([key, item]) => `${printKey(key, quote)}: ${printValue(item, quote)}`).join(', ')} }` : '{}'\n}\n\n/** An object key as source text: bare when it is an identifier, quoted otherwise. */\nexport function printKey(key: string, quote: Quote): string {\n return IDENTIFIER_PATTERN.test(key) ? key : printValue(key, quote)\n}\n\n/** `value` wrapped in one object per key of `path`: `wrapPath(['enum', 'type'], 'enum')` is `{ enum: { type: 'enum' } }`. */\nexport function wrapPath(path: Array<string>, value: OptionValue): OptionValue {\n return path.reduceRight<OptionValue>((inner, key) => ({ [key]: inner }), value)\n}\n\n/**\n * Adds `text` as the last item of an object or array literal, following its layout: on a line of\n * its own with the last item's indentation when the literal spans lines, inline otherwise.\n */\nexport function appendItem(source: string, container: ObjectExpression | ArrayExpression, text: string): string {\n const { start, end } = container\n const items: Array<{ start: number; end: number } | null> = container.type === nodeTypes.objectExpression ? container.properties : container.elements\n const last = items.filter((item) => item !== null).at(-1)\n\n if (!last) {\n const inner = source.slice(start + 1, end - 1)\n // A comment inside the empty literal stays, after the new item.\n if (inner.trim()) return replaceText(source, start + 1, start + 1, /^\\s/.test(inner) ? `${text},` : `${text}, `)\n return replaceText(source, start, end, container.type === nodeTypes.objectExpression ? `{ ${text} }` : `[${text}]`)\n }\n\n const between = source.slice(last.end, end - 1)\n // The closing bracket shares the last item's line: add the item inline.\n if (!between.includes('\\n')) return replaceText(source, last.end, last.end, `, ${text}`)\n\n const lineStart = source.lastIndexOf('\\n', last.start - 1) + 1\n const indent = source.slice(lineStart).match(/^[ \\t]*/)?.[0] ?? ''\n // After the last item's comma and any comment on its line, so neither moves. `between` holds a\n // newline, so one always follows.\n const lineEnd = source.indexOf('\\n', last.end)\n const comma = /^\\s*,/.test(between)\n\n return `${source.slice(0, last.end)}${comma ? '' : ','}${source.slice(last.end, lineEnd)}\\n${indent}${text}${comma ? ',' : ''}${source.slice(lineEnd)}`\n}\n\n/** Drops the item at `index` from an object or array literal, with its own lines when it sits on them alone. */\nexport function removeItem(source: string, node: ObjectExpression | ArrayExpression, index: number): string {\n const items: Array<{ start: number; end: number }> =\n node.type === nodeTypes.objectExpression ? node.properties : node.elements.filter((element) => element !== null)\n if (items.length === 1) return replaceText(source, node.start, node.end, node.type === nodeTypes.objectExpression ? '{}' : '[]')\n\n const { start, end } = items[index]!\n const lineStart = source.lastIndexOf('\\n', start - 1) + 1\n const nextNewline = source.indexOf('\\n', end)\n const lineEnd = nextNewline === -1 ? source.length : nextNewline\n if (!source.slice(lineStart, start).trim() && /^\\s*,?\\s*(\\/\\/.*)?$/.test(source.slice(end, lineEnd))) {\n return replaceText(source, lineStart, Math.min(lineEnd + 1, source.length))\n }\n\n const next = items[index + 1]\n return next ? replaceText(source, start, next.start) : replaceText(source, items[index - 1]!.end, end)\n}\n","import type { ExtensionKind } from '@kubb/core'\nimport { getErrorMessage, read, writeRaw } from '@internals/utils'\nimport {\n type AssignmentExpression,\n type BindingProperty,\n type CallExpression,\n type Comment,\n type Expression,\n type ImportDeclaration,\n type ObjectExpression,\n type ObjectPropertyKind,\n type Program,\n type RestElement,\n type SpreadElement,\n type VariableDeclaration,\n commentTypes,\n nodeTypes,\n parseExpression,\n parseSource,\n propertyKinds,\n unaryOperators,\n} from './ast.ts'\nimport { isAllowedPlugin, isOptionValue, isOutputKey, isOutputValue, isSafeKey, pickOutput, toExportName } from './rules.ts'\nimport { appendItem, getPosition, IDENTIFIER_PATTERN, printKey, printValue, quotes, type Quote, removeItem, replaceText, wrapPath } from './text.ts'\nimport {\n type ConfigEdit,\n ConfigEditOperation,\n type ConfigEditOutcome,\n type ConfigFileView,\n type ConfigRef,\n type ConfigView,\n extensionKinds,\n type InstalledExtensions,\n type OptionsView,\n type OptionValue,\n type PluginView,\n} from './types.ts'\n\n/** The marker `disable-plugin` writes, with the block's line count so `enable-plugin` restores exactly those lines. */\nconst DISABLED_MARKER_PATTERN = /^kubb:disabled (.+)\\s+(\\d+)$/\n\nconst OPERATIONS = new Set<string>(Object.values(ConfigEditOperation))\nconst OPTION_OPERATIONS = new Set<string>([ConfigEditOperation.SET_OPTION, ConfigEditOperation.REMOVE_OPTION])\nconst OUTPUT_OPERATIONS = new Set<string>([ConfigEditOperation.SET_OUTPUT, ConfigEditOperation.REMOVE_OUTPUT])\nconst KINDS = new Set<string>(Object.values(extensionKinds))\n\n/** Identifiers the editor matches by name. */\nconst identifiers = { defineConfig: 'defineConfig', require: 'require', module: 'module', exports: 'exports' } as const\n\nconst moduleKinds = { esm: 'esm', cjs: 'cjs' } as const\ntype ModuleKind = (typeof moduleKinds)[keyof typeof moduleKinds]\n\ntype EditResult = { source: string } | { reason: string }\ntype ParsedConfig = { program: Program; comments: Array<Comment>; configs: Array<ObjectExpression>; kind: ModuleKind }\ntype ValueNode = Expression | SpreadElement | null | undefined\ntype Import = { from: string; exported: string }\ntype FactoryCall = { importName: string; exportName: string; packageName: string; call: CallExpression }\ntype DisabledBlock = { packageName: string; line: number; end: number; code: Array<string> }\ntype OutputEdit = Extract<ConfigEdit, { operation: typeof ConfigEditOperation.SET_OUTPUT | typeof ConfigEditOperation.REMOVE_OUTPUT }>\ntype OptionEdit = Extract<ConfigEdit, { operation: typeof ConfigEditOperation.SET_OPTION | typeof ConfigEditOperation.REMOVE_OPTION }>\ntype AddPluginEdit = Extract<ConfigEdit, { operation: typeof ConfigEditOperation.ADD_PLUGIN }>\ntype DisablePluginEdit = Extract<ConfigEdit, { operation: typeof ConfigEditOperation.DISABLE_PLUGIN }>\ntype RemoveExtensionEdit = Extract<ConfigEdit, { operation: typeof ConfigEditOperation.REMOVE_EXTENSION }>\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value !== ''\n}\n\n/** Edits cross the wire, so their shape is checked before anything reads them. */\nfunction validateEdit(edit: ConfigEdit): string | undefined {\n const { operation, plugin, config, path, kind, input } = (typeof edit === 'object' && edit !== null ? edit : {}) as Record<string, unknown>\n\n if (typeof operation !== 'string' || !OPERATIONS.has(operation)) return `unknown operation ${JSON.stringify(operation)}`\n if (config !== undefined && typeof config !== 'string' && !Number.isSafeInteger(config)) return 'config must name an entry or give its index'\n\n if (operation === ConfigEditOperation.SET_INPUT) {\n return typeof input === 'string' && input.trim() !== '' ? undefined : 'the edit names no input'\n }\n\n const isOption = OPTION_OPERATIONS.has(operation)\n const isOutput = OUTPUT_OPERATIONS.has(operation)\n\n if (!isOutput && !isNonEmptyString(plugin)) return 'the edit names no plugin'\n\n if (kind !== undefined) {\n if (typeof kind !== 'string' || !KINDS.has(kind)) return `unknown kind ${JSON.stringify(kind)}`\n const takesKind = operation === ConfigEditOperation.ADD_PLUGIN || operation === ConfigEditOperation.REMOVE_EXTENSION\n if (takesKind && kind === extensionKinds.adapter) return `${operation} takes a plugin or a parser, since a config has one adapter`\n if (!isOption && !takesKind) return `${operation} edits the plugins array, so it takes no kind`\n }\n\n if (!isOption && !isOutput) return undefined\n\n if (!Array.isArray(path) || !path.every(isNonEmptyString)) return 'path must be a list of option names'\n if (path.length === 0) return 'no option path given'\n\n const unsafe = path.find((key) => !isSafeKey(key))\n if (unsafe !== undefined) return `${unsafe} cannot be used as an option name`\n\n if (isOutput && !isOutputKey(path[0]!)) return `output.${path[0]} can only be changed in the config file`\n\n return undefined\n}\n\n// Finding the config\n\n/** Steps through `as`/`satisfies` and `() => ...` wrappers to the config object. */\nfunction unwrapValue(node: ValueNode): ValueNode {\n if (!node) return undefined\n if (node.type === nodeTypes.tSAsExpression || node.type === nodeTypes.tSSatisfiesExpression) return unwrapValue(node.expression)\n if (node.type !== nodeTypes.arrowFunctionExpression && node.type !== nodeTypes.functionExpression) return node\n if (node.body?.type !== nodeTypes.blockStatement) return unwrapValue(node.body as Expression | null)\n\n const returned = node.body.body.find((statement) => statement.type === nodeTypes.returnStatement)\n return unwrapValue(returned?.type === nodeTypes.returnStatement ? returned.argument : undefined)\n}\n\nfunction isModuleExports(node: AssignmentExpression['left']): boolean {\n return (\n node.type === nodeTypes.memberExpression &&\n !node.computed &&\n node.object.type === nodeTypes.identifier &&\n node.object.name === identifiers.module &&\n node.property.type === nodeTypes.identifier &&\n node.property.name === identifiers.exports\n )\n}\n\n/** The exported config value and how the file exports it. */\nfunction findExport(program: Program): { exported: ValueNode; kind: ModuleKind } {\n for (const node of program.body) {\n if (node.type === nodeTypes.exportDefaultDeclaration) {\n // A `function` or `class` declaration is never a `defineConfig(...)` call, so `findConfigs` refuses it.\n return { exported: node.declaration as Expression, kind: moduleKinds.esm }\n }\n if (node.type === nodeTypes.expressionStatement && node.expression.type === nodeTypes.assignmentExpression && isModuleExports(node.expression.left)) {\n return { exported: node.expression.right, kind: moduleKinds.cjs }\n }\n }\n return { exported: undefined, kind: moduleKinds.esm }\n}\n\n/** Every config object in `export default` or `module.exports = defineConfig(...)`, or why the file is unmanaged. */\nfunction findConfigs(source: string): ParsedConfig | { reason: string } {\n const parsed = parseSource(source)\n if ('reason' in parsed) return parsed\n\n const { exported, kind } = findExport(parsed.program)\n const value = unwrapValue(exported)\n if (!value) return { reason: 'no `export default` or `module.exports` found' }\n if (value.type !== nodeTypes.callExpression || value.callee.type !== nodeTypes.identifier || value.callee.name !== identifiers.defineConfig) {\n return { reason: 'the exported config is not a defineConfig(...) call' }\n }\n\n const argument = unwrapValue(value.arguments[0])\n if (!argument) return { reason: 'defineConfig(...) was called without a config' }\n\n const entries = argument.type === nodeTypes.arrayExpression ? argument.elements.map((element) => unwrapValue(element)) : [argument]\n const configs = entries.filter((entry): entry is ObjectExpression => entry?.type === nodeTypes.objectExpression)\n if (configs.length !== entries.length) return { reason: 'config is not an object literal' }\n\n return { ...parsed, configs, kind }\n}\n\nfunction findConfigEntry(configs: Array<ObjectExpression>, ref: ConfigRef | undefined): ObjectExpression | undefined {\n return typeof ref === 'string' ? configs.find((entry) => getConfigName(entry) === ref) : configs[ref ?? 0]\n}\n\n// Reading object literals\n\nfunction getKey(entry: ObjectPropertyKind | BindingProperty | RestElement): string | undefined {\n if (entry.type !== nodeTypes.property || entry.computed) return undefined\n if (entry.key.type === nodeTypes.identifier) return entry.key.name\n return entry.key.type === nodeTypes.literal && typeof entry.key.value === 'string' ? entry.key.value : undefined\n}\n\n/** The last one wins when the key repeats, as at runtime. */\nfunction findProperty(node: ObjectExpression, key: string): { member: ObjectPropertyKind; index: number } | undefined {\n const index = node.properties.findLastIndex((entry) => getKey(entry) === key)\n return index === -1 ? undefined : { member: node.properties[index]!, index }\n}\n\nfunction getValue(node: ObjectExpression, key: string): ValueNode {\n const member = findProperty(node, key)?.member\n return member?.type === nodeTypes.property ? member.value : member\n}\n\nfunction getConfigName(config: ObjectExpression): string | undefined {\n const name = getValue(config, 'name')\n return name?.type === nodeTypes.literal && typeof name.value === 'string' ? name.value : undefined\n}\n\nfunction isOverridden(node: ObjectExpression, index: number): boolean {\n return node.properties.slice(index + 1).some((entry) => entry.type === nodeTypes.spreadElement)\n}\n\n/** `key: value`, not a method, getter, setter, or `{ key }` shorthand. */\nfunction isPlainProperty(member: Extract<ObjectPropertyKind, { type: typeof nodeTypes.property }>): boolean {\n return !member.method && !member.shorthand && member.kind === propertyKinds.init\n}\n\n/** A literal's value, `undefined` for code. */\nfunction readLiteral(node: ValueNode): OptionValue | undefined {\n switch (node?.type) {\n case nodeTypes.literal:\n // A bigint or a regex is code, not a value JSON can carry. A regex Node cannot compile also has a `null` value.\n return 'regex' in node || 'bigint' in node ? undefined : (node.value as OptionValue)\n case nodeTypes.templateLiteral:\n return node.expressions.length ? undefined : (node.quasis[0]?.value.cooked ?? '')\n case nodeTypes.unaryExpression: {\n const value = readLiteral(node.argument)\n if (typeof value !== 'number') return undefined\n if (node.operator === unaryOperators.minus) return -value\n if (node.operator === unaryOperators.plus) return value\n return undefined\n }\n case nodeTypes.arrayExpression: {\n const values = node.elements.map((element) => readLiteral(element))\n return values.every((value) => value !== undefined) ? values : undefined\n }\n case nodeTypes.objectExpression: {\n const entries: Record<string, OptionValue> = {}\n for (const entry of node.properties) {\n if (entry.type !== nodeTypes.property) return undefined\n const key = getKey(entry)\n const value = readLiteral(entry.value)\n // A `__proto__` key would replace the object's prototype instead of adding an entry.\n if (key === undefined || !isSafeKey(key) || value === undefined) return undefined\n entries[key] = value\n }\n return entries\n }\n }\n return undefined\n}\n\n// Imports and factory calls\n\nfunction getRequirePath(node: ValueNode): string | undefined {\n if (node?.type !== nodeTypes.callExpression || node.callee.type !== nodeTypes.identifier || node.callee.name !== identifiers.require) return undefined\n const [argument] = node.arguments\n return argument?.type === nodeTypes.literal && typeof argument.value === 'string' ? argument.value : undefined\n}\n\n/** `import { exported as local } from '...'`. A default or namespace import has no exported name, so its local name stands in. */\nfunction importBindings(statement: ImportDeclaration): Array<[string, Import]> {\n return statement.specifiers.map((specifier) => {\n const imported = specifier.type === nodeTypes.importSpecifier ? specifier.imported : specifier.local\n const exported = imported.type === nodeTypes.identifier ? imported.name : imported.value\n return [specifier.local.name, { from: statement.source.value, exported }]\n })\n}\n\n/** `const { exported: local } = require('...')`. */\nfunction requireBindings(statement: VariableDeclaration): Array<[string, Import]> {\n return statement.declarations.flatMap((declarator): Array<[string, Import]> => {\n const from = getRequirePath(declarator.init)\n if (from === undefined || declarator.id.type !== nodeTypes.objectPattern) return []\n\n return declarator.id.properties.flatMap((entry): Array<[string, Import]> => {\n if (entry.type !== nodeTypes.property || entry.value.type !== nodeTypes.identifier) return []\n return [[entry.value.name, { from, exported: getKey(entry) ?? entry.value.name }]]\n })\n })\n}\n\nfunction getImports(program: Program): Map<string, Import> {\n return new Map(\n program.body.flatMap((statement) => {\n if (statement.type === nodeTypes.importDeclaration) return importBindings(statement)\n if (statement.type === nodeTypes.variableDeclaration) return requireBindings(statement)\n return []\n }),\n )\n}\n\nfunction isImportStatement(node: Program['body'][number], kind: ModuleKind): boolean {\n if (kind === moduleKinds.esm) return node.type === nodeTypes.importDeclaration\n return node.type === nodeTypes.variableDeclaration && node.declarations.some((declarator) => getRequirePath(declarator.init) !== undefined)\n}\n\n/** The quote of the first string literal in the file, so new code matches it. */\nfunction detectQuote(node: unknown): Quote | undefined {\n if (!node || typeof node !== 'object') return undefined\n const { type, raw } = node as { type?: string; raw?: unknown }\n if (type === nodeTypes.literal && typeof raw === 'string' && (raw[0] === quotes.single || raw[0] === quotes.double)) return raw[0]\n for (const child of Object.values(node)) {\n const quote = detectQuote(child)\n if (quote) return quote\n }\n return undefined\n}\n\n/** The `adapter` value, or the elements of the `plugins` or `parsers` array. */\nfunction factoryNodes(config: ObjectExpression, kind: ExtensionKind): Array<ValueNode> {\n if (kind === extensionKinds.adapter) return [getValue(config, 'adapter')]\n const array = getValue(config, `${kind}s`)\n return array?.type === nodeTypes.arrayExpression ? array.elements : []\n}\n\n/** The factory calls of one kind whose callee the file imports. */\nfunction findCalls(program: Program, config: ObjectExpression, kind: ExtensionKind = extensionKinds.plugin): Array<FactoryCall> {\n const imports = getImports(program)\n return factoryNodes(config, kind).flatMap((node) => {\n if (node?.type !== nodeTypes.callExpression || node.callee.type !== nodeTypes.identifier) return []\n const imported = imports.get(node.callee.name)\n return imported ? [{ importName: node.callee.name, exportName: imported.exported, packageName: imported.from, call: node }] : []\n })\n}\n\n// Disabled plugins\n\n/** Whether nothing but whitespace precedes `offset` on its line. */\nfunction startsLine(source: string, offset: number): boolean {\n return source.slice(source.lastIndexOf('\\n', offset - 1) + 1, offset).trim() === ''\n}\n\n/** The `disable-plugin` blocks in this config, read from marker comments since the call is no longer a node. */\nfunction findDisabled(source: string, comments: Array<Comment>, config: ObjectExpression): Array<DisabledBlock> {\n const lines = source.split('\\n')\n\n return comments.flatMap((comment) => {\n const match = comment.type === commentTypes.line ? comment.value.trim().match(DISABLED_MARKER_PATTERN) : null\n // Only markers inside this entry, on a line of their own, so another entry or a trailing comment never matches.\n if (!match || comment.start < config.start || comment.end > config.end || !startsLine(source, comment.start)) return []\n\n const line = getPosition(source, comment.start).line\n const end = line + Number(match[2])\n const code = lines.slice(line, end).map((text) => text.replace(/^(\\s*)\\/\\/ ?/, '$1').replace(/^\\s+$/, ''))\n return [{ packageName: match[1]!, line, end, code }]\n })\n}\n\n// Reading options\n\n/** Literal members as `value` and code paths as `locked`, `undefined` for a computed key. */\nfunction readEditable(node: ObjectExpression, prefix: Array<string> = []): { value: Record<string, OptionValue>; locked: Array<Array<string>> } | undefined {\n const value: Record<string, OptionValue> = {}\n const locked: Array<Array<string>> = []\n\n for (const [index, entry] of node.properties.entries()) {\n if (entry.type === nodeTypes.spreadElement) continue\n const key = getKey(entry)\n if (key === undefined) return undefined\n if (findProperty(node, key)?.index !== index) continue\n\n const path = [...prefix, key]\n // A `__proto__` key replaces the prototype, so it reads as code.\n if (!isSafeKey(key)) {\n locked.push(path)\n continue\n }\n\n const member = isOverridden(node, index) ? undefined : entry.value\n const literal = readLiteral(member)\n if (literal !== undefined) {\n value[key] = literal\n continue\n }\n if (member?.type !== nodeTypes.objectExpression) {\n locked.push(path)\n continue\n }\n\n const nested = readEditable(member, path)\n if (!nested) return undefined\n value[key] = nested.value\n locked.push(...nested.locked)\n }\n return { value, locked }\n}\n\nfunction readObjectOptions(options: ObjectExpression): OptionsView {\n const entries: OptionsView = {}\n for (const [index, entry] of options.properties.entries()) {\n const key = getKey(entry)\n if (key === undefined || !isSafeKey(key)) continue\n\n const member = entry.type === nodeTypes.property && !isOverridden(options, index) ? entry.value : undefined\n const value = readLiteral(member)\n if (value !== undefined) {\n entries[key] = { literal: true, value }\n continue\n }\n entries[key] = { literal: false, ...(member?.type === nodeTypes.objectExpression ? readEditable(member) : undefined) }\n }\n return entries\n}\n\nfunction readCallOptions(call: CallExpression): OptionsView {\n const options = call.arguments[0]\n return options?.type === nodeTypes.objectExpression ? readObjectOptions(options) : {}\n}\n\nfunction readDisabledOptions(code: Array<string>): OptionsView {\n const call = parseExpression(code.join('\\n').trim().replace(/,$/, ''))\n return call?.type === nodeTypes.callExpression ? readCallOptions(call) : {}\n}\n\nfunction toPluginView({ importName, packageName, call }: FactoryCall): PluginView {\n return { importName, packageName, options: readCallOptions(call) }\n}\n\n/** Active and disabled plugins, in source order so a disabled plugin keeps its place. */\nfunction readPlugins({ source, parsed, config }: { source: string; parsed: ParsedConfig; config: ObjectExpression }): Array<PluginView> {\n const importNames = new Map([...getImports(parsed.program)].map(([local, { from }]) => [from, local]))\n\n const active = findCalls(parsed.program, config).map((call) => ({ line: getPosition(source, call.call.start).line, plugin: toPluginView(call) }))\n const disabled = findDisabled(source, parsed.comments, config).map(({ packageName, line, code }) => ({\n line,\n plugin: {\n importName: importNames.get(packageName) ?? toExportName(packageName),\n packageName,\n options: readDisabledOptions(code),\n disabled: true as const,\n },\n }))\n\n return [...active, ...disabled].sort((a, b) => a.line - b.line).map(({ plugin }) => plugin)\n}\n\nfunction readConfigView({ source, parsed, config }: { source: string; parsed: ParsedConfig; config: ObjectExpression }): ConfigView {\n const [adapter] = findCalls(parsed.program, config, extensionKinds.adapter).map(toPluginView)\n const parsers = findCalls(parsed.program, config, extensionKinds.parser).map(toPluginView)\n const output = getOutput(config)\n\n return {\n name: getConfigName(config),\n plugins: readPlugins({ source, parsed, config }),\n ...(adapter && { adapter }),\n ...(parsers.length ? { parsers } : {}),\n ...(!('reason' in output) && { output: pickOutput(readObjectOptions(output.object)) }),\n }\n}\n\n/** Which plugins the file declares and which options Studio may write. */\nexport function readConfig(source: string): ConfigFileView {\n const parsed = findConfigs(source)\n if ('reason' in parsed) return { managed: false, reason: parsed.reason }\n\n return { managed: true, configs: parsed.configs.map((config) => readConfigView({ source, parsed, config })) }\n}\n\n/** The modules the file imports, empty when it cannot be parsed. */\nexport function readImports(source: string): Array<string> {\n const parsed = parseSource(source)\n if ('reason' in parsed) return []\n return [...new Set([...getImports(parsed.program).values()].map(({ from }) => from))]\n}\n\n// Editing options\n\ntype FoundPath = { object: ObjectExpression; index: number; value: Expression } | { object: ObjectExpression; missing: number } | { reason: string }\n\n/** Follows `path` to its literal, or to the first missing key. Refuses a value set in code. */\nfunction findPath(options: ObjectExpression, path: Array<string>): FoundPath {\n let object = options\n\n for (const [depth, key] of path.entries()) {\n const found = findProperty(object, key)\n if (!found) return { object, missing: depth }\n if (isOverridden(object, found.index)) {\n return { reason: `${path.slice(0, depth + 1).join('.')} can be overridden by a spread after it, so it is customized in code` }\n }\n\n const { member, index } = found\n const isLast = depth === path.length - 1\n if (isLast) {\n return member.type === nodeTypes.property && readLiteral(member.value) !== undefined\n ? { object, index, value: member.value }\n : { reason: `${path.join('.')} is customized in code` }\n }\n if (member.type !== nodeTypes.property || member.value.type !== nodeTypes.objectExpression) {\n return { reason: `${key} is not an object, so ${path.join('.')} cannot be reached` }\n }\n object = member.value\n }\n return { reason: 'no option path given' }\n}\n\nfunction setAtPath({\n source,\n options,\n path,\n value,\n quote,\n}: {\n source: string\n options: ObjectExpression\n path: Array<string>\n value: OptionValue\n quote: Quote\n}): EditResult {\n const target = findPath(options, path)\n if ('reason' in target) return target\n if ('missing' in target) {\n const [key, ...rest] = path.slice(target.missing)\n return { source: appendItem(source, target.object, `${printKey(key!, quote)}: ${printValue(wrapPath(rest, value), quote)}`) }\n }\n return { source: replaceText(source, target.value.start, target.value.end, printValue(value, quote)) }\n}\n\nfunction removeAtPath({ source, options, path }: { source: string; options: ObjectExpression; path: Array<string> }): EditResult {\n const target = findPath(options, path)\n if ('reason' in target) return target\n if ('missing' in target) return { source }\n return { source: removeItem(source, target.object, target.index) }\n}\n\nfunction setOption(source: string, call: CallExpression, path: Array<string>, value: unknown, quote: Quote): EditResult {\n if (!isOptionValue(value)) return { reason: 'the value is not a literal that can be written to a config file' }\n\n const options = call.arguments[0]\n if (!options) {\n const closing = call.end - 1\n if (source[closing] !== ')') return { reason: 'the factory call could not be located in the file' }\n return { source: replaceText(source, closing, closing, printValue(wrapPath(path, value), quote)) }\n }\n if (options.type !== nodeTypes.objectExpression) return { reason: 'the factory was not called with an object literal' }\n return setAtPath({ source, options, path, value, quote })\n}\n\nfunction removeOption(source: string, call: CallExpression, path: Array<string>): EditResult {\n const options = call.arguments[0]\n if (!options) return { source }\n if (options.type !== nodeTypes.objectExpression) return { reason: 'the factory was not called with an object literal' }\n return removeAtPath({ source, options, path })\n}\n\nfunction editOption({\n source,\n parsed,\n config,\n edit,\n quote,\n extensions,\n}: {\n source: string\n parsed: ParsedConfig\n config: ObjectExpression\n edit: OptionEdit\n quote: Quote\n extensions: InstalledExtensions\n}): EditResult {\n const kind = edit.kind ?? extensionKinds.plugin\n // A package can ship several factories (`parserTs`, `parserTsx`), so prefer the export its manifest names.\n const calls = findCalls(parsed.program, config, kind).filter((entry) => entry.packageName === edit.plugin)\n const exportName = extensions.get(edit.plugin)?.manifest.export ?? toExportName(edit.plugin)\n const call = (calls.find((entry) => entry.exportName === exportName) ?? calls[0])?.call\n\n if (!call) {\n if (kind === extensionKinds.adapter) return { reason: `${edit.plugin} is not the config's adapter` }\n const disabled = kind === extensionKinds.plugin && findDisabled(source, parsed.comments, config).some((block) => block.packageName === edit.plugin)\n return { reason: disabled ? `${edit.plugin} is disabled, enable it first` : `${edit.plugin} is not in the ${kind}s array` }\n }\n\n if (edit.operation === ConfigEditOperation.SET_OPTION) return setOption(source, call, edit.path, edit.value, quote)\n return removeOption(source, call, edit.path)\n}\n\n// Editing the config's own fields\n\nfunction setInput(source: string, config: ObjectExpression, input: string, quote: Quote): EditResult {\n const value = printValue(input, quote)\n const found = findProperty(config, 'input')\n if (!found) return { source: appendItem(source, config, `input: ${value}`) }\n if (found.member.type !== nodeTypes.property || !isPlainProperty(found.member)) return { reason: 'input is not a plain property' }\n if (isOverridden(config, found.index)) return { reason: 'a spread after input could override it' }\n return { source: replaceText(source, found.member.value.start, found.member.value.end, value) }\n}\n\nfunction getOutput(config: ObjectExpression): { object: ObjectExpression } | { reason: string } {\n const found = findProperty(config, 'output')\n if (found?.member.type !== nodeTypes.property || found.member.value.type !== nodeTypes.objectExpression) return { reason: 'output is not an object literal' }\n if (isOverridden(config, found.index)) return { reason: 'a spread after output could override it' }\n return { object: found.member.value }\n}\n\nfunction editOutput({ source, config, edit, quote }: { source: string; config: ObjectExpression; edit: OutputEdit; quote: Quote }): EditResult {\n const output = getOutput(config)\n if ('reason' in output) return output\n if (edit.operation === ConfigEditOperation.REMOVE_OUTPUT) return removeAtPath({ source, options: output.object, path: edit.path })\n\n const [key, ...rest] = edit.path\n if (!isOptionValue(edit.value) || !isOutputValue({ key: key!, value: wrapPath(rest, edit.value) }))\n return { reason: `the value is not one output.${key} takes` }\n return setAtPath({ source, options: output.object, path: edit.path, value: edit.value, quote })\n}\n\n// Adding, disabling, and enabling plugins\n\n/** Adds the import after the last one, matching its semicolon style. */\nfunction addImport({\n source,\n parsed,\n importNames,\n moduleSpecifier,\n quote,\n}: {\n source: string\n parsed: ParsedConfig\n importNames: Array<string>\n moduleSpecifier: string\n quote: Quote\n}): string {\n const lastImport = parsed.program.body.findLast((node) => isImportStatement(node, parsed.kind))\n const afterLine = lastImport ? getPosition(source, lastImport.end).line : 0\n const lines = source.split('\\n')\n\n const semicolon = afterLine > 0 && lines[afterLine - 1]?.trimEnd().endsWith(';') ? ';' : ''\n const specifier = `${quote}${moduleSpecifier}${quote}`\n const statement =\n parsed.kind === moduleKinds.esm ? `import { ${importNames.join(', ')} } from ${specifier}` : `const { ${importNames.join(', ')} } = require(${specifier})`\n\n lines.splice(afterLine, 0, `${statement}${semicolon}`)\n if (afterLine === 0) lines.splice(1, 0, '')\n\n return lines.join('\\n')\n}\n\n/**\n * The parsers `defineConfig` applies when a config sets no `parsers`, by import name. Adding a parser\n * to such a config writes these too, or the new array would replace them.\n */\nconst DEFAULT_PARSERS = [\n { importName: 'parserTs', packageName: '@kubb/parser-ts' },\n { importName: 'parserTsx', packageName: '@kubb/parser-ts' },\n { importName: 'parserMd', packageName: '@kubb/parser-md' },\n] as const\n\n/**\n * Adds a plugin to `plugins`, or with `kind: 'parser'` a parser to `parsers`. Replaying the same add\n * is a no-op, while an import name taken by another package is an error.\n */\nfunction addPlugin({\n source,\n parsed,\n config,\n edit,\n quote,\n extensions,\n}: {\n source: string\n parsed: ParsedConfig\n config: ObjectExpression\n edit: AddPluginEdit\n quote: Quote\n extensions: InstalledExtensions\n}): EditResult {\n const kind = edit.kind ?? extensionKinds.plugin\n const isParser = kind === extensionKinds.parser\n if (!isAllowedPlugin({ packageName: edit.plugin, extensions, kind })) {\n return {\n reason: isParser ? `\"${edit.plugin}\" is not an installed Kubb parser` : `\"${edit.plugin}\" is not a @kubb/plugin-* package or an installed Kubb plugin`,\n }\n }\n\n const importName = extensions.get(edit.plugin)?.manifest.export ?? toExportName(edit.plugin)\n if (!IDENTIFIER_PATTERN.test(importName)) return { reason: `\"${importName}\" is not a valid import name` }\n // A package can ship several parsers (`parserTs` and `parserTsx`), so a parser is matched by its export too.\n if (findCalls(parsed.program, config, kind).some((entry) => entry.packageName === edit.plugin && (!isParser || entry.exportName === importName))) {\n return { source }\n }\n\n const options = edit.options ?? {}\n if (!isOptionValue(options)) return { reason: 'the options are not literals that can be written to a config file' }\n\n const key = `${kind}s`\n const array = getValue(config, key)\n if (array ? array.type !== nodeTypes.arrayExpression : !isParser) return { reason: `${key} is not an array literal` }\n // A config without `parsers` runs the defaults, so the new array lists them before the added parser.\n const defaults = isParser && !array ? DEFAULT_PARSERS.filter((parser) => parser.importName !== importName) : []\n\n // The missing imports by package, so `parserTs` and `parserTsx` share one line.\n const imports = getImports(parsed.program)\n const missing = new Map<string, Array<string>>()\n for (const item of [...defaults, { importName, packageName: edit.plugin }]) {\n const from = imports.get(item.importName)?.from\n if (from && from !== item.packageName) return { reason: `${item.importName} is already imported from ${from}` }\n if (!from) missing.set(item.packageName, [...(missing.get(item.packageName) ?? []), item.importName])\n }\n\n // The array sits below the imports, so adding to it first leaves the import lines where they are.\n const call = `${importName}(${Object.keys(options).length ? printValue(options, quote) : ''})`\n const next =\n array?.type === nodeTypes.arrayExpression\n ? appendItem(source, array, call)\n : appendItem(source, config, `parsers: [${[...defaults.map((parser) => `${parser.importName}()`), call].join(', ')}]`)\n\n return {\n source: [...missing].reduceRight(\n (current, [moduleSpecifier, importNames]) => addImport({ source: current, parsed, importNames, moduleSpecifier, quote }),\n next,\n ),\n }\n}\n\n/** One item per line, so a call can be commented out alone. Skipped when comments sit between items. */\nfunction splitPlugins(source: string, config: ObjectExpression): string | undefined {\n const array = getValue(config, 'plugins')\n if (array?.type !== nodeTypes.arrayExpression) return undefined\n\n const items = array.elements.flatMap((element) => (element ? [element] : []))\n const { start, end } = array\n const gaps = [source.slice(start + 1, items[0]?.start ?? end - 1), ...items.map((item, index) => source.slice(item.end, items[index + 1]?.start ?? end - 1))]\n if (!items.length || gaps.some((gap) => !/^[\\s,]*$/.test(gap))) return undefined\n\n const lineStart = source.lastIndexOf('\\n', start - 1) + 1\n const indent = source.slice(lineStart).match(/^[ \\t]*/)?.[0] ?? ''\n const lines = items.map((item) => `${indent} ${source.slice(item.start, item.end)},`)\n\n return replaceText(source, start, end, `[\\n${lines.join('\\n')}\\n${indent}]`)\n}\n\nfunction disablePlugin(source: string, program: Program, config: ObjectExpression, plugin: string): EditResult {\n const call = findCalls(program, config).find((entry) => entry.packageName === plugin)?.call\n if (!call) return { reason: `${plugin} is not in the plugins array` }\n\n const start = getPosition(source, call.start)\n const end = getPosition(source, call.end)\n const lines = source.split('\\n')\n const from = start.line - 1\n const to = end.line - 1\n const firstLine = lines[from] ?? ''\n\n // Only safe when the call sits alone on its lines: anything else on its first line, or on its last\n // line besides a trailing comma, would be swallowed into the comment and corrupt the file.\n if (firstLine.slice(0, start.column).trim() || !/^,?\\s*$/.test((lines[to] ?? '').slice(end.column))) {\n return { reason: `${plugin} shares a line with other code, so it cannot be commented out safely` }\n }\n\n const indent = firstLine.match(/^\\s*/)?.[0] ?? ''\n const commented = lines.slice(from, to + 1).map((line) => (line.trim() ? `${indent}// ${line.slice(indent.length)}` : `${indent}//`))\n lines.splice(from, commented.length, `${indent}// kubb:disabled ${plugin} ${commented.length}`, ...commented)\n\n return { source: lines.join('\\n') }\n}\n\n/** Disables the plugin, first putting a one-line `plugins: [a(), b()]` (what `add-plugin` writes) on separate lines. */\nfunction disablePluginInConfig({\n source,\n parsed,\n config,\n edit,\n}: {\n source: string\n parsed: ParsedConfig\n config: ObjectExpression\n edit: DisablePluginEdit\n}): EditResult {\n const result = disablePlugin(source, parsed.program, config, edit.plugin)\n if (!('reason' in result) || !result.reason.includes('shares a line')) return result\n\n const split = splitPlugins(source, config)\n if (split === undefined) return result\n\n const reparsed = findConfigs(split)\n const reparsedConfig = 'reason' in reparsed ? undefined : findConfigEntry(reparsed.configs, edit.config)\n if ('reason' in reparsed || !reparsedConfig) return result\n\n return disablePlugin(split, reparsed.program, reparsedConfig, edit.plugin)\n}\n\nfunction enablePlugin(source: string, comments: Array<Comment>, config: ObjectExpression, plugin: string): EditResult {\n const block = findDisabled(source, comments, config).find((entry) => entry.packageName === plugin)\n if (!block) return { reason: `${plugin} is not disabled` }\n\n const lines = source.split('\\n')\n lines.splice(block.line - 1, block.end - block.line + 1, ...block.code)\n return { source: lines.join('\\n') }\n}\n\n// Removing extensions\n\n/** Drops the import statements of `packageName` once nothing else in the file uses their names. */\nfunction removeUnusedImports(source: string, packageName: string): string {\n const parsed = parseSource(source)\n if ('reason' in parsed) return source\n\n // From the last statement up, so the offsets of the earlier ones stay valid.\n return parsed.program.body.reduceRight((current, statement) => {\n const bindings =\n statement.type === nodeTypes.importDeclaration\n ? importBindings(statement)\n : statement.type === nodeTypes.variableDeclaration\n ? requireBindings(statement)\n : []\n if (!bindings.length || bindings.some(([, { from }]) => from !== packageName)) return current\n\n const rest = replaceText(current, statement.start, statement.end)\n if (bindings.some(([local]) => new RegExp(`(?<![\\\\w$])${local.replaceAll('$', '\\\\$')}(?![\\\\w$])`).test(rest))) return current\n\n const lineStart = current.lastIndexOf('\\n', statement.start - 1) + 1\n const lineEnd = current.indexOf('\\n', statement.end)\n const after = lineEnd === -1 ? current.length : lineEnd + 1\n // At the top of the file, the blank line after the import goes too, so the file does not start with one.\n return replaceText(current, lineStart, lineStart === 0 && current[after] === '\\n' ? after + 1 : after)\n }, source)\n}\n\n/**\n * Removes every call of a plugin or parser package, and the block `disable-plugin` commented out,\n * then its unused imports. Removing what the config does not hold is a no-op. Refuses to empty\n * `parsers`, since a config with no parser cannot print files.\n */\nfunction removeExtension(source: string, edit: RemoveExtensionEdit): EditResult {\n const kind = edit.kind ?? extensionKinds.plugin\n let current = source\n\n // One call at a time, re-parsing in between, since each removal moves the ones after it.\n for (;;) {\n const parsed = findConfigs(current)\n if ('reason' in parsed) return parsed\n const config = findConfigEntry(parsed.configs, edit.config)\n if (!config) return { reason: `no config entry found for ${JSON.stringify(edit.config)}` }\n\n const array = getValue(config, `${kind}s`)\n const calls = findCalls(parsed.program, config, kind).filter((entry) => entry.packageName === edit.plugin)\n const block = findDisabled(current, parsed.comments, config).find((entry) => entry.packageName === edit.plugin)\n\n if (calls[0] && array?.type === nodeTypes.arrayExpression) {\n const elements = array.elements.filter((element) => element !== null)\n if (kind === extensionKinds.parser && elements.length === calls.length) return { reason: `${edit.plugin} is the last parser in the parsers array` }\n current = removeItem(current, array, elements.indexOf(calls[0].call))\n continue\n }\n if (block && kind === extensionKinds.plugin) {\n const lines = current.split('\\n')\n lines.splice(block.line - 1, block.end - block.line + 1)\n current = lines.join('\\n')\n continue\n }\n return { source: current === source ? source : removeUnusedImports(current, edit.plugin) }\n }\n}\n\n// Applying edits\n\n/** Every edit re-parses the file, since the previous one rewrote it. */\nfunction applyEdit({ source, edit, extensions }: { source: string; edit: ConfigEdit; extensions: InstalledExtensions }): EditResult {\n const parsed = findConfigs(source)\n if ('reason' in parsed) return parsed\n\n const config = findConfigEntry(parsed.configs, edit.config)\n if (!config) return { reason: `no config entry found for ${JSON.stringify(edit.config)}` }\n const quote = detectQuote(parsed.program) ?? quotes.single\n\n switch (edit.operation) {\n case ConfigEditOperation.SET_INPUT:\n return setInput(source, config, edit.input, quote)\n case ConfigEditOperation.SET_OUTPUT:\n case ConfigEditOperation.REMOVE_OUTPUT:\n return editOutput({ source, config, edit, quote })\n case ConfigEditOperation.DISABLE_PLUGIN:\n return disablePluginInConfig({ source, parsed, config, edit })\n case ConfigEditOperation.ENABLE_PLUGIN:\n return enablePlugin(source, parsed.comments, config, edit.plugin)\n case ConfigEditOperation.ADD_PLUGIN:\n return addPlugin({ source, parsed, config, edit, quote, extensions })\n case ConfigEditOperation.REMOVE_EXTENSION:\n return removeExtension(source, edit)\n case ConfigEditOperation.SET_OPTION:\n case ConfigEditOperation.REMOVE_OPTION:\n return editOption({ source, parsed, config, edit, quote, extensions })\n }\n}\n\n/** Applies edits in place, touching only the text each targets. A refused edit is reported and the rest still run. */\nexport function editConfig({ source, edits, extensions = new Map() }: { source: string; edits: Array<ConfigEdit>; extensions?: InstalledExtensions }): {\n source: string\n outcomes: Array<ConfigEditOutcome>\n changed: boolean\n} {\n let current = source\n\n const outcomes = edits.map((edit): ConfigEditOutcome => {\n const invalid = validateEdit(edit)\n if (invalid) return { edit, applied: false, reason: invalid }\n\n try {\n const result = applyEdit({ source: current, edit, extensions })\n if ('reason' in result) return { edit, applied: false, reason: result.reason }\n current = result.source\n return { edit, applied: true }\n } catch (error) {\n return { edit, applied: false, reason: getErrorMessage(error) }\n }\n })\n\n return { source: current, outcomes, changed: current !== source }\n}\n\n/** Applies `edits` to `filePath`, writing only when something changed. */\nexport async function editConfigFile({ filePath, edits, extensions }: { filePath: string; edits: Array<ConfigEdit>; extensions?: InstalledExtensions }) {\n const current = await read(filePath)\n const result = editConfig({ source: current, edits, extensions })\n if (result.changed) await writeRaw(filePath, result.source)\n return result\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { read, write } from '@internals/utils'\nimport { Diagnostics, type ExtensionManifest, type RegistryEntry } from '@kubb/core'\nimport { x } from 'tinyexec'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\n/** Metadata describing a package manager's lock file and commands. */\nexport type PackageManagerInfo = {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file names that identify this package manager in a project root. */\n lockFiles: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to create a `package.json`. */\n initCommand: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary to uninstall a dependency. */\n removeCommand: ReadonlyArray<string>\n /** Subcommands passed to the package manager binary before a `package.json` script name. */\n runCommand: ReadonlyArray<string>\n}\n\n/** Metadata for each supported package manager, keyed by its short name. */\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFiles: ['pnpm-lock.yaml'],\n initCommand: ['init'],\n installCommand: ['add', '-D'],\n removeCommand: ['remove'],\n runCommand: [],\n },\n yarn: {\n name: 'yarn',\n lockFiles: ['yarn.lock'],\n initCommand: ['init', '-y'],\n installCommand: ['add', '-D'],\n removeCommand: ['remove'],\n runCommand: [],\n },\n bun: {\n name: 'bun',\n lockFiles: ['bun.lock', 'bun.lockb'],\n initCommand: ['init', '-y'],\n installCommand: ['add', '-d'],\n removeCommand: ['remove'],\n runCommand: ['run'],\n },\n npm: {\n name: 'npm',\n lockFiles: ['package-lock.json'],\n initCommand: ['init', '-y'],\n installCommand: ['install', '--save-dev'],\n removeCommand: ['uninstall'],\n runCommand: ['run'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n scripts?: Record<string, string>\n}\n\n/** Detects the package manager for `cwd`: the `packageManager` field in `package.json`, then a lock file, then `npm`. */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8')) as PackageJson\n const pmField = packageJson.packageManager\n if (typeof pmField === 'string') {\n const name = pmField.split('@')[0]\n if (name && name in packageManagers) {\n return packageManagers[name as PackageManagerName]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n for (const pm of Object.values(packageManagers)) {\n if (pm.lockFiles.some((lockFile) => fs.existsSync(path.join(cwd, lockFile)))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n\n/**\n * Initializes a new `package.json` at `cwd` using the detected package manager.\n */\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n await x(packageManager.name, [...packageManager.initCommand], {\n nodeOptions: { cwd, stdio: 'inherit' },\n throwOnError: true,\n })\n}\n\n/** How many trailing lines of a failed install's output the error keeps. */\nconst INSTALL_OUTPUT_LINES = 20\nconst INSTALL_TIMEOUT_MS = 5 * 60_000\n\n/**\n * Installs the given packages at `cwd` using the detected package manager. Each output line goes\n * to `onLine`, so the caller can show it while the install runs; a failed install also keeps the\n * end of the output in the error.\n */\nexport async function installPackages(\n packages: Array<string>,\n packageManager: PackageManagerInfo,\n cwd: string = process.cwd(),\n onLine?: (line: string) => void,\n command: ReadonlyArray<string> = packageManager.installCommand,\n): Promise<void> {\n const args = [...command, ...packages]\n // No stdin, so a package manager that wants input fails instead of waiting. The timeout ends a stalled install.\n const result = x(packageManager.name, args, {\n nodeOptions: { cwd, stdio: ['ignore', 'pipe', 'pipe'] },\n timeout: INSTALL_TIMEOUT_MS,\n throwOnError: false,\n })\n const lines: Array<string> = []\n for await (const line of result) {\n lines.push(line)\n onLine?.(line)\n }\n if (result.exitCode === 0) return\n if (result.exitCode === undefined) throw new Error(`\\`${packageManager.name} ${args.join(' ')}\\` timed out after ${INSTALL_TIMEOUT_MS / 60_000} minutes`)\n\n const output = lines.slice(-INSTALL_OUTPUT_LINES).join('\\n')\n throw new Error(`\\`${packageManager.name} ${args.join(' ')}\\` failed with exit code ${result.exitCode}${output ? `:\\n${output}` : ''}`)\n}\n\n/**\n * Uninstalls the given packages at `cwd` with the package manager's remove command, like {@link installPackages}.\n */\nexport function uninstallPackages(packages: Array<string>, packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n return installPackages(packages, packageManager, cwd, undefined, packageManager.removeCommand)\n}\n\n/**\n * What the selected plugins' `manifests` say is missing from the selection: a `dependencies`\n * entry, or a `client` plugin next to a `consumer`. Empty when nothing is missing.\n * `optionalDependencies` are skipped, since `kubb init` writes the default options.\n */\nexport function missingPluginDependencies(manifests: Array<ExtensionManifest>): Array<string> {\n const selected = manifests.map((manifest) => manifest.name)\n const hasClient = manifests.some((manifest) => manifest.role === 'client')\n return manifests.flatMap((manifest) => [\n ...(manifest.dependencies ?? []).filter((name) => !selected.includes(name)).map((name) => `${manifest.name} needs ${name}.`),\n ...(manifest.role === 'consumer' && !hasClient ? [`${manifest.name} needs a client plugin, such as plugin-axios or plugin-fetch.`] : []),\n ])\n}\n\nasync function readPackageJson(cwd: string): Promise<PackageJson> {\n try {\n return JSON.parse(await read(path.join(cwd, 'package.json'))) as PackageJson\n } catch {\n return {}\n }\n}\n\nconst SPEC_FILE = /^(openapi|swagger)[\\w.-]*\\.(ya?ml|json)$/i\nconst SKIPPED_DIRS = new Set(['node_modules', 'dist', 'build', 'coverage'])\n\n/**\n * Finds OpenAPI spec files up to `depth` folders below `cwd`, shallowest first, as `./`-relative\n * paths. Walks one level at a time and stops after `limit` files, so a large repo stays fast.\n */\nexport async function findSpecFiles(cwd: string, { depth = 3, limit = 20 }: { depth?: number; limit?: number } = {}): Promise<Array<string>> {\n const found: Array<string> = []\n let level: Array<string> = ['']\n for (let current = 0; current <= depth && level.length && found.length < limit; current++) {\n const listings = await Promise.all(\n level.map(async (dir) => ({ dir, entries: await fs.promises.readdir(path.join(cwd, dir), { withFileTypes: true }).catch(() => []) })),\n )\n level = []\n for (const { dir, entries } of listings) {\n for (const entry of entries.toSorted((a, b) => a.name.localeCompare(b.name))) {\n if (entry.isFile() && SPEC_FILE.test(entry.name)) found.push(`./${path.posix.join(dir, entry.name)}`)\n if (entry.isDirectory() && !entry.name.startsWith('.') && !SKIPPED_DIRS.has(entry.name)) level.push(path.posix.join(dir, entry.name))\n }\n }\n }\n return found.slice(0, limit)\n}\n\n/** The spec version and operation count, when the file states them. */\nexport type SpecInfo = { version?: string; operations?: number }\n\nconst SPEC_HEAD_BYTES = 256 * 1024\nconst METHOD = '(?:get|put|post|delete|options|head|patch|trace)'\n\n/**\n * Reads the OpenAPI or Swagger version and counts the operations from the first 256 KB of the\n * file, so a large spec is never parsed. The count is left out when the file is longer.\n */\nexport async function readSpecInfo(file: string): Promise<SpecInfo> {\n const handle = await fs.promises.open(file)\n try {\n const buffer = Buffer.alloc(SPEC_HEAD_BYTES)\n const { bytesRead } = await handle.read(buffer, 0, SPEC_HEAD_BYTES, 0)\n const head = buffer.toString('utf-8', 0, bytesRead)\n const complete = bytesRead < SPEC_HEAD_BYTES\n const version = head.match(/^\\s*[\"']?(?:openapi|swagger)[\"']?\\s*:\\s*[\"']?(\\d[\\d.]*)/m)?.[1]\n // shortcut: counts method keys at any depth, so a schema property named `get` counts too; use the adapter when that matters.\n const methods = new RegExp(`^\\\\s*[\"']?${METHOD}[\"']?\\\\s*:\\\\s*(?:\\\\{|$)`, 'gm')\n return { version, operations: complete ? (head.match(methods)?.length ?? 0) : undefined }\n } finally {\n await handle.close()\n }\n}\n\n/** Finds a plugin by registry id, slug, or short name, so `ts`, `plugin-ts`, and `kubb-labs/plugin-ts` all match. */\nexport function findPlugin({ plugins, id }: { plugins: Array<RegistryEntry>; id: string }): RegistryEntry | undefined {\n const ids = id.includes('/') ? [id] : [`kubb-labs/${id}`, `kubb-labs/plugin-${id}`]\n return plugins.find((entry) => ids.includes(entry.id))\n}\n\n/**\n * Turns the comma-separated `--plugins` value into registry entries.\n *\n * @throws when an id is not in `plugins`.\n */\nexport function parsePluginsFlag({ plugins, value }: { plugins: Array<RegistryEntry>; value: string }): Array<RegistryEntry> {\n const ids = value\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean)\n const unknown = ids.filter((id) => !findPlugin({ plugins, id }))\n if (unknown.length)\n throw new Diagnostics.Error({\n code: Diagnostics.code.pluginNotFound,\n severity: 'error',\n message: `Not in the Kubb registry: ${unknown.join(', ')}. Browse the plugins at https://kubb.dev/extensions.`,\n help: 'Use plugin ids from https://kubb.dev/extensions, such as plugin-ts or ts.',\n })\n return ids.map((id) => findPlugin({ plugins, id })!)\n}\n\n/** Adds `\"generate\": \"kubb generate\"` to the `package.json` scripts at `cwd`. Returns `false`, and changes nothing, when a `generate` script exists. */\nexport async function addGenerateScript(cwd: string): Promise<boolean> {\n const file = path.join(cwd, 'package.json')\n const source = await read(file)\n const packageJson = JSON.parse(source) as PackageJson\n if (packageJson.scripts?.generate !== undefined) return false\n const indent = source.match(/^[ \\t]+/m)?.[0] ?? ' '\n const updated = { ...packageJson, scripts: { ...packageJson.scripts, generate: 'kubb generate' } }\n await write(file, JSON.stringify(updated, null, indent))\n return true\n}\n\n/** Reads the `generate` script from the `package.json` at `cwd`. */\nexport async function generateScript(cwd: string): Promise<string | undefined> {\n return (await readPackageJson(cwd)).scripts?.generate\n}\n","import process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { isRichOutput } from '../utils/env.ts'\nimport { createSpinner } from '../ui/spinner.ts'\nimport { installPackages, type PackageManagerInfo } from './init/utils.ts'\n\n/** How many package manager lines stay visible under the install title while it runs. */\nconst LOG_LINES = 6\n\n/**\n * Installs `packages` and reports how long it took. A rich terminal shows the package manager's\n * last lines under the title while the install runs and clears them when it succeeds; a plain one\n * prints the start and end lines. A failed install keeps the output, reports the failure and rethrows.\n */\nexport async function installWithSpinner({\n packages,\n names,\n packageManager,\n cwd,\n install = installPackages,\n}: {\n packages: Array<string>\n names: string\n packageManager: PackageManagerInfo\n cwd: string\n /** Runs the install itself, so a dry run can skip it. */\n install?: typeof installPackages\n}): Promise<void> {\n const start = process.hrtime()\n const task = createTask(`Installing ${names} with ${packageManager.name}`)\n try {\n await install(packages, packageManager, cwd, task.message)\n } catch (error) {\n task.error('Install failed')\n throw error\n }\n task.success(`Installed ${names} with ${packageManager.name} in ${formatMs(getElapsedMs(start))}`)\n}\n\ntype Task = { message: (line: string) => void; error: (text: string) => void; success: (text: string) => void }\n\n// clack's taskLog prints nothing at the end outside a TTY, so a plain terminal keeps the spinner writer.\n// The failure keeps no log: the thrown error already carries the last lines.\nfunction createTask(title: string): Task {\n if (isRichOutput()) {\n const log = clack.taskLog({ title, limit: LOG_LINES })\n return { message: (line) => log.message(line), error: (text) => log.error(text, { showLog: false }), success: (text) => log.success(text) }\n }\n const spinner = createSpinner()\n spinner.start(title)\n return { message: () => {}, error: (text) => spinner.error(text), success: (text) => spinner.stop(text) }\n}\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { define } from 'gunshi'\nimport { BUNDLED_PACKAGES, ConfigEditOperation, extensionKinds, editConfig, editConfigFile, findConfigFile, readImports } from '@internals/shared'\nimport { getErrorMessage, read } from '@internals/utils'\nimport { Diagnostics, type ExtensionManifest, readInstalledPackages, type RegistryDetail, type RegistryEntry } from '@kubb/core'\nimport { configArg, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { closestIds, fetchRegistryIndex, incompatibility, installSpec, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\n\nexport type AddOptions = {\n /**\n * `owner/slug`, or a bare `slug` for an official extension. Asked for when omitted.\n */\n id?: string\n configPath?: string\n yes: boolean\n install: boolean\n}\n\ntype ConfigTarget = Pick<RegistryDetail, 'artifact' | 'manifest'>\n\n/** The import and the `defineConfig` property to merge into `kubb.config.ts` by hand. */\nfunction toSnippet({ artifact, manifest }: ConfigTarget): string {\n const call = `${manifest.export}()`\n const property: Record<ExtensionManifest['kind'], string> = {\n plugin: `plugins: [..., ${call}],`,\n adapter: `adapter: ${call},`,\n parser: `parsers: [..., ${call}],`,\n }\n return [`import { ${manifest.export} } from '${artifact.package}'`, '', property[manifest.kind]].join('\\n')\n}\n\n/** The `add-plugin` edits for `details`, and the manifests the edits read their export names from. */\nfunction toConfigEdits(details: Array<ConfigTarget>) {\n return {\n edits: details.map(({ artifact, manifest }) => ({\n operation: ConfigEditOperation.ADD_PLUGIN,\n ...(manifest.kind === extensionKinds.parser ? { kind: extensionKinds.parser } : {}),\n plugin: artifact.package,\n })),\n extensions: new Map(details.map(({ artifact, manifest }) => [artifact.package, { package: artifact.package, version: artifact.version, manifest }])),\n }\n}\n\n/** The lines adding `details` would put in the config `source`, trimmed, or why it could not add them. */\nfunction previewConfig({ details, source }: { details: Array<ConfigTarget>; source: string }): { lines: Array<string>; source: string } | { reason: string } {\n const result = editConfig({ source, ...toConfigEdits(details) })\n const failed = result.outcomes.find((outcome) => !outcome.applied)\n if (failed) return { reason: failed.reason ?? 'the config file was not changed' }\n const remaining = source.split('\\n')\n const lines = result.source.split('\\n').filter((line) => {\n const index = remaining.indexOf(line)\n if (index !== -1) remaining.splice(index, 1)\n return index === -1\n })\n return { lines: lines.map((line) => line.trim()), source: result.source }\n}\n\nasync function selectExtension({\n entries,\n versions,\n registry,\n}: {\n entries: Array<RegistryEntry>\n versions: Map<string, unknown>\n registry: string\n}): Promise<string | undefined> {\n if (!entries.length)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `The registry at ${registry} lists no extensions.`,\n help: 'Check that `KUBB_REGISTRY` points at a Kubb registry, or unset it to use https://kubb.dev/registry.',\n })\n\n // Filters in memory, so typing never waits on the network.\n const searchText = new Map(entries.map((entry) => [entry.id, `${entry.id} ${entry.manifest.displayName} ${entry.manifest.description}`.toLowerCase()]))\n const options = entries\n .toSorted((a, b) => a.id.localeCompare(b.id))\n .map((entry) => {\n const installed = versions.has(entry.artifact.package)\n return { value: entry.id, label: toShortId(entry.id), hint: installed ? 'installed' : summarize(entry.manifest.description), disabled: installed }\n })\n\n const id = await clack.autocomplete({\n message: `Add an extension · ${entries.length} in the registry`,\n placeholder: 'Search',\n options,\n filter: (search, option) => searchText.get(option.value)?.includes(search.toLowerCase()) ?? false,\n })\n return clack.isCancel(id) ? undefined : id\n}\n\n/** Asks whether to also add the required plugins the config lacks. `--yes` adds them. */\nasync function confirmDependencies({\n entry,\n missing,\n yes,\n}: {\n entry: RegistryEntry\n missing: Array<RegistryEntry>\n yes: boolean\n}): Promise<boolean | undefined> {\n if (!missing.length || yes) return true\n const names = missing.map((dependency) => dependency.manifest.name).join(', ')\n const answer = await clack.select({\n message: `${entry.manifest.name} needs ${names}. Add ${names} as well?`,\n options: [\n { value: true, label: `Yes, add ${missing.length === 1 ? 'both' : 'all'}`, hint: 'recommended' },\n { value: false, label: `Only ${entry.manifest.name}`, hint: 'generate fails until you add it' },\n ],\n initialValue: true,\n })\n return clack.isCancel(answer) ? undefined : answer\n}\n\n/** The first sentence of a registry description, cut to one terminal line. */\nexport function summarize(description: string, max = 64): string {\n const sentence = description.split(/\\.\\s/)[0]!.replace(/\\.$/, '')\n return sentence.length > max ? `${sentence.slice(0, max - 1).trimEnd()}…` : sentence\n}\n\n/**\n * Installs an extension from the Kubb registry at its reviewed version and, for a plugin or a parser,\n * adds it to `kubb.config.ts`, offering to add the plugins it needs as well. An adapter is never\n * written: the command prints the snippet to swap it in by hand. Without an id, asks which one.\n * Previews the packages and config lines before asking. Refuses when the running Kubb or Node.js\n * version is outside its compatibility.\n */\nexport async function run({ id: input, configPath, yes, install }: AddOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n const installedPackages: Array<string> = []\n const configured: Array<RegistryEntry> = []\n logIntro({ title: isInteractiveRun({ yes }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Add ')) })\n\n try {\n const registry = registryUrl()\n if (!input && yes)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'Pass a registry id, such as plugin-zod, when using --yes.',\n help: 'Run `kubb add plugin-zod --yes`, or drop `--yes` to pick from a list.',\n })\n const inputId = input ? toRegistryId(input) : undefined\n const foundConfig = configPath ? path.resolve(configPath) : findConfigFile(cwd)\n const [entries, installed, configSource] = await withSpinner({\n message: 'Reading the registry',\n promise: Promise.all([\n fetchRegistryIndex({ registry }),\n readInstalledPackages({ root: cwd }),\n foundConfig ? read(foundConfig).catch(() => undefined) : undefined,\n ]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const id = inputId ?? (await selectExtension({ entries, versions, registry }))\n if (!id) {\n summary('Add canceled', 'canceled', [' No changes made'])\n return\n }\n const entry = entries.find((candidate) => candidate.id === id)\n if (!entry) {\n const suggestions = closestIds({ input: id, ids: entries.map((entry) => entry.id) }).map(toShortId)\n summary(`No extension named ${input ?? id}`, 'failed', [\n ...suggestions.map((suggestion) => ` kubb add ${suggestion}`),\n ' Browse all kubb.dev/extensions',\n ])\n process.exitCode = 1\n return\n }\n const { artifact, manifest } = entry\n const kind = manifest.kind.charAt(0).toUpperCase() + manifest.kind.slice(1)\n\n const problem = incompatibility(manifest)\n if (problem)\n throw new Diagnostics.Error({\n code: Diagnostics.code.incompatibleExtension,\n severity: 'error',\n message: problem,\n help: 'Upgrade Kubb or Node.js to a version the extension supports.',\n })\n\n const configFile = manifest.kind === extensionKinds.adapter ? undefined : foundConfig\n if (manifest.kind !== extensionKinds.adapter && !configFile)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'No kubb.config.ts found. Run `kubb init` first, or pass --config.',\n help: 'Run `kubb init` to create a config, or pass its path with `--config`.',\n })\n const configName = configFile ? path.relative(cwd, configFile) || configFile : undefined\n\n const byName = new Map(entries.map((candidate) => [candidate.manifest.name, candidate]))\n const inConfig = (name: string) => {\n const dependency = byName.get(name)\n return dependency ? !!configSource?.includes(`${dependency.manifest.export}(`) : installed.some((item) => item.manifest?.name === name)\n }\n const dependencies = manifest.dependencies ?? []\n const missing = configFile ? dependencies.filter((name) => !inConfig(name)).flatMap((name) => byName.get(name) ?? []) : []\n const withDependencies = await confirmDependencies({ entry, missing, yes })\n if (withDependencies === undefined) {\n summary('Add canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n const targets = [...(withDependencies ? missing : []), entry]\n\n const dependencyStatus = (name: string) => {\n if (inConfig(name)) return `${name} ${styleText('green', '✓ installed')}`\n return targets.some((target) => target.manifest.name === name) ? `${name} ${styleText('cyan', '+ adding')}` : `${name} ${styleText('yellow', 'missing')}`\n }\n const preview = configFile && configSource !== undefined ? previewConfig({ details: targets, source: configSource }) : undefined\n // The default parsers written next to a new parser come with `kubb`. A strict node_modules layout\n // only lets the config import direct dependencies, so they are installed at the project's `kubb` version.\n const before = readImports(configSource ?? '')\n const added = preview && 'lines' in preview ? readImports(preview.source).filter((name) => !before.includes(name)) : []\n const bundled = BUNDLED_PACKAGES.filter(\n (name) => added.includes(name) && !versions.has(name) && !targets.some((target) => target.artifact.package === name),\n )\n const kubbVersion = versions.get('kubb')\n const specs = [\n ...targets.filter((target) => target === entry || !versions.has(target.artifact.package)).map((target) => installSpec(target.artifact)),\n ...bundled.map((name) => (kubbVersion ? `${name}@${kubbVersion}` : name)),\n ]\n logStep(`${kind} ${styleText('cyan', manifest.name)} v${artifact.version} · ${summarize(manifest.description)}`)\n logBlock([\n ...(dependencies.length ? [`Needs ${dependencies.map(dependencyStatus).join(' ')}`] : []),\n install ? `Installs ${specs.join(' ')}` : 'Installs nothing (--no-install)',\n ...(configName ? [`Config ${configName}`] : [`Config prints the ${manifest.kind} snippet to add`]),\n ...(preview && 'lines' in preview ? preview.lines.map((line) => styleText('green', ` + ${line}`)) : []),\n ...(preview && 'reason' in preview ? [styleText('yellow', ` cannot edit it: ${preview.reason}`)] : []),\n ])\n\n const confirmed = yes || (await clack.confirm({ message: 'Add it?', initialValue: true }))\n if (clack.isCancel(confirmed) || !confirmed) {\n summary('Add canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const packages = () => (install ? `${installedPackages.length} installed with ${packageManager.name}` : 'installation skipped (--no-install)')\n if (install) {\n const names = [...targets.filter((target) => specs.includes(installSpec(target.artifact))).map((target) => target.artifact.package), ...bundled]\n await installWithSpinner({ packages: specs, names: names.join(', '), packageManager, cwd })\n installedPackages.push(...names)\n }\n\n const unconfigured: Array<RegistryEntry> = configFile ? [] : [entry]\n if (configFile) {\n for (const target of targets) {\n try {\n const { outcomes, changed } = await editConfigFile({ filePath: configFile, ...toConfigEdits([target]) })\n if (!outcomes[0]?.applied) throw new Error(outcomes[0]?.reason ?? 'the config file was not changed')\n if (changed) configured.push(target)\n logStep(`${target.manifest.export}() configured in ${configName}`)\n } catch (error) {\n logWarn(`Could not edit ${configName}: ${getErrorMessage(error)}`)\n unconfigured.push(target)\n }\n }\n }\n\n const manual = unconfigured.length > 0\n // A plugin or parser the command could not write into the config is a failure a caller can act on; an adapter never gets written.\n if (manual && manifest.kind !== extensionKinds.adapter) process.exitCode = 1\n if (manual)\n logBlock([\n 'Add the import to your Kubb config and merge the property into its defineConfig call:',\n '',\n ...unconfigured.map((target) => toSnippet(target)),\n ])\n const dependenciesMissing = !withDependencies && missing.length > 0\n const title = manual\n ? `${kind} needs configuration`\n : dependenciesMissing\n ? 'Plugin configured; dependencies missing'\n : configured.length\n ? install\n ? `${kind} ready`\n : `${kind} configured`\n : `${kind} already configured`\n summary(title, manual || dependenciesMissing ? 'warning' : 'success', [\n ` Packages ${packages()}`,\n ...configured.map((target) => styleText('green', ` + ${target.manifest.export}()`)),\n '',\n ...(!install ? [`Install ${specs.join(' ')} to use it.`] : []),\n ...(dependenciesMissing ? [`Missing plugins ${missing.map((target) => target.manifest.name).join(', ')}`] : []),\n manual ? 'Add the snippet above, then run kubb generate.' : 'Next kubb generate',\n `Options kubb.dev/extensions/${entry.id}`,\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Add failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = define({\n name: 'add',\n description: 'Find and install plugins, adapters, and parsers from the Kubb registry.',\n examples: [\n 'kubb add',\n 'kubb add plugin-zod',\n 'kubb add kubb-labs/plugin-react-query',\n 'kubb add acme/plugin-x --yes',\n 'kubb add plugin-zod --no-install',\n ].join('\\n'),\n toKebab: true,\n args: {\n id: {\n type: 'positional',\n description: 'Registry id: owner/slug, or a slug for an official extension. Asked for when omitted',\n required: false,\n },\n ...configArg,\n ...yesArg,\n install: {\n type: 'boolean',\n description: 'Install the package. Pass --no-install to only edit the config',\n negatable: true,\n default: true,\n },\n },\n run: ({ values }) => run({ id: values.id, configPath: values.config, yes: values.yes, install: values.install }),\n})\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { DryRunExtension } from '@gunshi/plugin-dryrun'\nimport { defineWithTypes } from 'gunshi'\nimport { ConfigEditOperation, editConfig, generateConfigFile, initDefaults, KUBB_CONFIG_FILENAME, KUBB_PACKAGE_NAME } from '@internals/shared'\nimport { exists, formatMs, getElapsedMs, write } from '@internals/utils'\nimport { createKubb, Diagnostics, type RegistryEntry } from '@kubb/core'\nimport { dryRunId, type DryRunExtensions } from '../../commands/shared.ts'\nimport { getConfigs } from '../../config.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport { isInteractiveRun, logIntro, logOutro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { fetchRegistryIndex, incompatibility, installSpec, registryUrl } from '../../utils/registry.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport {\n addGenerateScript,\n detectPackageManager,\n findPlugin,\n findSpecFiles,\n generateScript,\n initPackageJson,\n installPackages,\n missingPluginDependencies,\n type PackageManagerInfo,\n parsePluginsFlag,\n readSpecInfo,\n} from './utils.ts'\nimport { version } from '../../../package.json'\n\nfunction cancelAndExit(message = 'Operation canceled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (clack.isCancel(value)) cancelAndExit()\n return value as Exclude<T, symbol>\n}\n\ntype InitOptions = {\n /**\n * When `true`, skips all interactive prompts and uses the detected or default values.\n */\n yes: boolean\n /**\n * Input path flag value from `--input`. When provided, skips the input prompt.\n */\n input?: string\n /**\n * Output directory flag value from `--output`. When provided, skips the output prompt.\n */\n output?: string\n /**\n * Comma-separated plugin list from `--plugins`, e.g. `'plugin-ts,zod'`. When provided, skips the plugin selection prompt.\n */\n plugins?: string\n /**\n * Dry-run extension from `@gunshi/plugin-dryrun`. When enabled, package installation, file\n * writes, and the first run are skipped.\n */\n dryRun: DryRunExtension\n}\n\ntype Choices = {\n inputPath: string\n outputPath: string\n plugins: Array<RegistryEntry>\n}\n\n/** The full `kubb.config.ts` for `choices`, with each plugin added the way `kubb add` adds it. */\nfunction buildConfig({ inputPath, outputPath, plugins }: Choices): string {\n const { source, outcomes } = editConfig({\n source: generateConfigFile({ inputPath, outputPath }),\n edits: plugins.map((entry) => ({ operation: ConfigEditOperation.ADD_PLUGIN, plugin: entry.artifact.package })),\n extensions: new Map(plugins.map(({ artifact, manifest }) => [artifact.package, { package: artifact.package, version: artifact.version, manifest }])),\n })\n const failed = outcomes.find((outcome) => !outcome.applied)\n if (failed && failed.edit.operation === ConfigEditOperation.ADD_PLUGIN)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `Could not add ${failed.edit.plugin} to ${KUBB_CONFIG_FILENAME}: ${failed.reason}`,\n help: `Run kubb init without that plugin, then add it with kubb add.`,\n })\n return source\n}\n\n/** Generates from the config at `configPath` without reporters, and returns how many files it wrote. */\nasync function firstRun(configPath: string): Promise<number> {\n const { configs } = await getConfigs({ configPath })\n let files = 0\n for (const config of configs) {\n const result = await createKubb(config).generate()\n if (!result.success) throw new Error(result.diagnostics.flatMap((diagnostic) => (diagnostic.severity === 'error' ? [diagnostic.message] : [])).join('\\n'))\n files += result.files.length\n }\n return files\n}\n\n/** The command that runs `kubb generate`: the `generate` script when it runs Kubb, otherwise `npx kubb generate`. */\nfunction generateCommand({ packageManager, script, watch }: { packageManager: PackageManagerInfo; script: string | undefined; watch: boolean }): string {\n if (script !== 'kubb generate') return `npx kubb generate${watch ? ' --watch' : ''}`\n const run = [packageManager.name, ...packageManager.runCommand, 'generate'].join(' ')\n if (!watch) return run\n return packageManager.name === 'npm' ? `${run} -- --watch` : `${run} --watch`\n}\n\n/**\n * Runs the Kubb setup wizard: detects the package manager and specs, asks for the spec, plugins, and\n * output folder, shows the config for review, then installs, writes `kubb.config.ts`, adds a\n * `generate` script, and runs the first generation.\n * Pass `yes: true` to skip all prompts and print one line per step.\n */\nexport async function run({ yes, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n /** Runs `task` behind a spinner, or prints one line when it is done in `--yes` mode. */\n async function step<T>({ start, task, done, failed }: { start: string; task: () => Promise<T>; done: (result: T) => string; failed: string }): Promise<T> {\n const spinner = createSpinner()\n if (!yes) spinner.start(start)\n try {\n const result = await task()\n if (yes) console.log(`${styleText('green', '✓')} ${done(result)}`)\n else spinner.stop(done(result))\n return result\n } catch (error) {\n if (!yes) spinner.error(failed)\n throw error\n }\n }\n\n if (!yes) logIntro({ title: isInteractiveRun({ yes, dryRun: dryRun.enabled }) ? undefined : 'Set up Kubb' })\n\n try {\n // Start the registry fetch now but await it only at the plugin step, so the first prompt never waits on the network\n const registry = fetchRegistryIndex({ registry: registryUrl() }).then((entries) =>\n entries.filter((entry) => entry.kind === 'plugin' && !incompatibility(entry.manifest)),\n )\n registry.catch(() => {})\n\n if (!(await exists(path.join(cwd, 'package.json')))) {\n if (!yes) {\n const shouldInit = unwrap(await clack.confirm({ message: 'No package.json found. Would you like to create one?', initialValue: true }))\n if (!shouldInit) cancelAndExit()\n }\n\n const packageManager = detectPackageManager(cwd)\n await step({\n start: `Initializing package.json with ${packageManager.name}`,\n task: () => initPackageJson(cwd, packageManager),\n done: () => `Created package.json with ${packageManager.name}`,\n failed: 'Could not create package.json',\n })\n }\n\n const packageManager = detectPackageManager(cwd)\n const specs = await findSpecFiles(cwd)\n\n if (!yes) {\n logStep(`Package manager ${packageManager.name}`)\n if (specs[0]) {\n const { version: specVersion, operations } = await readSpecInfo(path.join(cwd, specs[0]))\n const details = [\n specs[0].slice(2),\n specVersion ? `${specVersion.startsWith('2') ? 'Swagger' : 'OpenAPI'} ${specVersion}` : undefined,\n operations === undefined ? undefined : pluralize(operations, 'operation'),\n specs.length > 1 ? `+${specs.length - 1} more` : undefined,\n ]\n logStep(`Found ${details.filter(Boolean).join(' · ')}`)\n }\n }\n\n // `--plugins` and `--yes` need the registry before any prompt; the interactive path reads it at the plugin step\n const plugins = pluginsFlag || yes ? await registry : undefined\n const defaultPlugins = (entries: Array<RegistryEntry>) => initDefaults.plugins.flatMap((id) => findPlugin({ plugins: entries, id }) ?? [])\n\n const flagPlugins = pluginsFlag && plugins ? parsePluginsFlag({ plugins, value: pluginsFlag }) : undefined\n\n let choices: Choices = {\n inputPath: inputFlag ?? specs[0] ?? initDefaults.inputPath,\n outputPath: outputFlag ?? initDefaults.outputPath,\n plugins: flagPlugins ?? (plugins ? defaultPlugins(plugins) : []),\n }\n if (yes && !choices.plugins.length) {\n throw new Error('The registry has no default plugin. Pass --plugins to choose one.')\n }\n\n async function askInput(current: string): Promise<string> {\n const choice = specs.length\n ? unwrap(\n await clack.select({\n message: 'Which spec should Kubb read?',\n options: [\n ...specs.map((spec) => ({ value: spec, label: spec, hint: 'found in this repo' })),\n { value: 'url', label: 'A URL' },\n { value: 'file', label: 'Another file' },\n ],\n initialValue: specs.includes(current) ? current : /^https?:\\/\\//.test(current) ? 'url' : 'file',\n }),\n )\n : /^https?:\\/\\//.test(current)\n ? 'url'\n : 'file'\n if (specs.includes(choice)) return choice\n const isUrl = choice === 'url'\n const initial = isUrl === /^https?:\\/\\//.test(current) && !specs.includes(current) ? current : undefined\n return unwrap(\n await clack.text({\n message: isUrl ? 'Spec URL' : 'Spec path',\n placeholder: isUrl ? 'https://example.com/openapi.yaml' : initDefaults.inputPath,\n initialValue: initial,\n defaultValue: isUrl ? undefined : initDefaults.inputPath,\n validate: (value) => {\n if (isUrl && !/^https?:\\/\\//.test(value ?? '')) return 'Enter an http(s) URL'\n },\n }),\n )\n }\n\n async function askPlugins(previous: Array<RegistryEntry>): Promise<Array<RegistryEntry>> {\n const plugins = await registry\n const current = previous.length ? previous : defaultPlugins(plugins)\n const width = Math.max(...plugins.map((entry) => entry.manifest.displayName.length))\n const nameWidth = Math.max(...plugins.map((entry) => entry.manifest.name.length))\n const values = unwrap(\n await clack.multiselect({\n message: 'What should Kubb generate?',\n options: plugins.map(({ id, manifest }) => ({\n value: id,\n label: `${manifest.displayName.padEnd(width)} ${styleText('dim', manifest.name.padEnd(nameWidth))}`.trimEnd(),\n })),\n initialValues: current.map((entry) => entry.id),\n required: true,\n }),\n )\n return plugins.filter((entry) => values.includes(entry.id))\n }\n\n // Flags for all three choices leave nothing to ask or review, as before the review step existed\n const answered = yes || Boolean(inputFlag && outputFlag && pluginsFlag)\n if (!answered) {\n let firstPass = true\n while (true) {\n // The first pass skips the questions a flag answered; \"Change a choice\" asks them all again.\n choices = {\n inputPath: firstPass && inputFlag ? inputFlag : await askInput(choices.inputPath),\n plugins: firstPass && flagPlugins ? flagPlugins : await askPlugins(choices.plugins),\n outputPath:\n firstPass && outputFlag\n ? outputFlag\n : unwrap(await clack.text({ message: 'Output folder', placeholder: choices.outputPath, defaultValue: choices.outputPath })),\n }\n firstPass = false\n const missing = missingPluginDependencies(choices.plugins.map((entry) => entry.manifest))\n if (missing.length) {\n logWarn(`${missing.join('\\n')}\\nAdd the missing plugins.`)\n continue\n }\n const config = buildConfig(choices)\n const packages = [KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)]\n logStep(`Review ${KUBB_CONFIG_FILENAME}`)\n logBlock([...config.trimEnd().split('\\n'), '', `${styleText('dim', 'Installs')} ${packages.join(' ')} with ${packageManager.name}`])\n const configExists = await exists(path.join(cwd, KUBB_CONFIG_FILENAME))\n const confirmed = unwrap(\n await clack.select({\n message: configExists ? `${KUBB_CONFIG_FILENAME} exists. Overwrite it?` : 'Create it?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'Change a choice' },\n ],\n }),\n )\n if (confirmed) break\n }\n }\n\n // Check the selection against the plugins' manifests before installing anything\n const missing = missingPluginDependencies(choices.plugins.map((entry) => entry.manifest))\n if (missing.length) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.missingDependency,\n severity: 'error',\n message: `${missing.join('\\n')}\\nAdd the missing plugins and run kubb init again.`,\n })\n }\n\n const configPath = path.join(cwd, KUBB_CONFIG_FILENAME)\n if (answered && !yes && (await exists(configPath))) {\n const overwrite = unwrap(await clack.confirm({ message: `${KUBB_CONFIG_FILENAME} exists. Overwrite it?`, initialValue: false }))\n if (!overwrite) cancelAndExit('Keeping existing configuration.')\n }\n\n // Install `kubb` at the running CLI's version and each plugin at the version the registry pins\n const packagesToInstall = [`${KUBB_PACKAGE_NAME}@${version}`, ...choices.plugins.map((entry) => installSpec(entry.artifact))]\n const packageNames = [KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)]\n const dry = { message: `install ${packagesToInstall.length} packages with ${packageManager.name}` }\n if (yes) {\n await step({\n start: '',\n task: async () => void (await dryRun.run(() => installPackages(packagesToInstall, packageManager, cwd), dry)),\n done: () => `Installed ${packageNames.join(' ')} with ${packageManager.name}`,\n failed: 'Installation failed',\n })\n } else {\n await installWithSpinner({\n packages: packagesToInstall,\n names: `${packagesToInstall.length} packages`,\n packageManager,\n cwd,\n install: async (packages, packageManager, cwd, onLine) => void (await dryRun.run(() => installPackages(packages, packageManager, cwd, onLine), dry)),\n })\n }\n\n await step({\n start: `Writing ${KUBB_CONFIG_FILENAME}`,\n task: async () => dryRun.run(async () => void (await write(configPath, buildConfig(choices))), { message: `write ${KUBB_CONFIG_FILENAME}` }),\n done: () => `Wrote ${KUBB_CONFIG_FILENAME}`,\n failed: `Could not write ${KUBB_CONFIG_FILENAME}`,\n })\n\n const scriptAdded = await dryRun.run(() => addGenerateScript(cwd), {\n message: 'add a generate script to package.json',\n resolve: async () => (await generateScript(cwd)) === undefined,\n })\n if (scriptAdded && !yes) logStep('Added \"generate\": \"kubb generate\" to package.json')\n\n const script = scriptAdded ? 'kubb generate' : await generateScript(cwd)\n const runStart = process.hrtime()\n try {\n await dryRun.run(\n () =>\n step({\n start: 'Running the first generation',\n task: () => firstRun(configPath),\n done: (files) =>\n yes\n ? `Generated ${pluralize(files, 'file')} in ${choices.outputPath}`\n : `First run ${pluralize(files, 'file')} in ${choices.outputPath} · ${formatMs(getElapsedMs(runStart))}`,\n failed: 'First run failed',\n }),\n { message: 'run the first generation', resolve: () => 0 },\n )\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error))\n const message = `Kubb is set up, but the first run failed. Fix the error, then run ${generateCommand({ packageManager, script, watch: false })}.`\n if (yes) console.log(message)\n else logOutro(styleText('yellow', message))\n process.exitCode = 1\n return\n }\n\n if (yes) {\n console.log(`Kubb is set up. Run ${generateCommand({ packageManager, script, watch: false })} after changing the spec.`)\n return\n }\n logOutro(`${styleText('green', '✓ Kubb is set up')}\\n ${styleText('dim', 'Next')} ${generateCommand({ packageManager, script, watch: true })}`)\n } catch (error) {\n logError(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n logError(error.message)\n }\n process.exit(1)\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'init',\n description: 'Set up a config, install plugins, and run the first generation.',\n examples: [\n 'kubb init',\n 'kubb init --yes',\n 'kubb init --input ./openapi.yaml --output ./src/gen --plugins plugin-ts,plugin-zod',\n 'kubb init --yes --input ./openapi.yaml --plugins ts,zod --output src/api',\n 'kubb init --plugins plugin-ts,plugin-axios,plugin-react-query',\n 'kubb init --yes --dry-run',\n ].join('\\n'),\n toKebab: true,\n args: {\n yes: {\n type: 'boolean',\n description: 'Skip prompts and use the detected spec, the default plugin, and the default output folder',\n short: 'y',\n default: false,\n },\n input: {\n type: 'string',\n description: 'Path to the OpenAPI specification',\n short: 'i',\n metavar: 'path',\n },\n output: {\n type: 'string',\n description: 'Output directory for generated files',\n short: 'o',\n metavar: 'path',\n },\n plugins: {\n type: 'string',\n description:\n 'Comma-separated Kubb registry ids of the plugins to add, the same ids `kubb add` takes (plugin-ts, plugin-zod, acme/plugin-x), or short names (ts, zod)',\n metavar: 'plugin-ts,plugin-zod,...',\n },\n },\n run: ({ values, extensions }) => run({ yes: values.yes, input: values.input, output: values.output, plugins: values.plugins, dryRun: extensions[dryRunId] }),\n})\n","/** Pads each column to its widest cell, one line per row. */\nexport function formatTable(rows: ReadonlyArray<ReadonlyArray<string>>): Array<string> {\n const widths = Array.from({ length: Math.max(0, ...rows.map((row) => row.length)) }, (_, index) => Math.max(...rows.map((row) => row[index]?.length ?? 0)))\n return rows.map((row) =>\n row\n .map((cell, index) => cell.padEnd(widths[index]!))\n .join(' ')\n .trimEnd(),\n )\n}\n","import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getErrorMessage } from '@internals/utils'\nimport { define } from 'gunshi'\nimport { readInstalledPackages, type RegistryEntry } from '@kubb/core'\nimport { logOutro } from '../../ui/intro.ts'\nimport { logBlock, logError, logWarn } from '../../ui/log.ts'\nimport { formatTable } from '../../ui/table.ts'\nimport { fetchRegistryIndex, isOutdated, registryUrl } from '../../utils/registry.ts'\n\nexport type ListRow = {\n id?: string\n package: string\n installed?: string\n registry?: string\n update: boolean\n}\n\n/**\n * The installed packages that ship a `kubb-extension.json` or have a registry entry, with the\n * version the registry pins.\n */\nexport async function listExtensions({ cwd, registry }: { cwd: string; registry: string }): Promise<Array<ListRow>> {\n const [installed, entries] = await Promise.all([\n readInstalledPackages({ root: cwd }),\n fetchRegistryIndex({ registry }).catch((error: unknown): Array<RegistryEntry> => {\n logWarn(`Showing installed extensions only: ${getErrorMessage(error)}`)\n return []\n }),\n ])\n const byPackage = new Map(entries.map((entry) => [entry.artifact.package, entry]))\n\n return installed.flatMap(({ package: name, version, manifest }): Array<ListRow> => {\n const entry = byPackage.get(name)\n if (!entry && !manifest) return []\n const latest = entry?.artifact.version\n return [{ id: entry?.id, package: name, installed: version, registry: latest, update: !!latest && isOutdated({ installed: version, latest }) }]\n })\n}\n\n/** Prints the installed extensions as a table. */\nexport async function run(): Promise<void> {\n try {\n const rows = await listExtensions({ cwd: process.cwd(), registry: registryUrl() })\n if (!rows.length) {\n logOutro('No installed extensions found.')\n return\n }\n\n const header = ['ID', 'PACKAGE', 'INSTALLED', 'REGISTRY', 'UPDATE']\n const cells = rows.map((row) => [row.id ?? '-', row.package, row.installed ?? '-', row.registry ?? '-', row.update ? 'yes' : 'no'])\n const [head, ...body] = formatTable([header, ...cells])\n logBlock([styleText('dim', head!), ...body])\n } catch (error) {\n logError(getErrorMessage(error))\n process.exitCode = 1\n }\n}\n\nexport const command = define({\n name: 'list',\n description: 'List installed extensions, their versions, and available updates.',\n examples: 'kubb list',\n run: () => run(),\n})\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { define } from 'gunshi'\nimport { BUNDLED_PACKAGES, ConfigEditOperation, extensionKinds, editConfig, editConfigFile, findConfigFile, readConfig, readImports } from '@internals/shared'\nimport { getErrorMessage, read } from '@internals/utils'\nimport { Diagnostics, readInstalledPackages } from '@kubb/core'\nimport { configArg, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep } from '../../ui/log.ts'\nimport { withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { closestIds, fetchRegistryIndex, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager, uninstallPackages } from '../init/utils.ts'\n\nexport type RemoveOptions = {\n /**\n * `owner/slug`, or a bare `slug` for an official extension.\n */\n id: string\n configPath?: string\n yes: boolean\n uninstall: boolean\n}\n\n/** The lines of `before` that `after` no longer has, trimmed. */\nfunction removedLines({ before, after }: { before: string; after: string }): Array<string> {\n const remaining = after.split('\\n')\n return before\n .split('\\n')\n .filter((line) => {\n const index = remaining.indexOf(line)\n if (index !== -1) remaining.splice(index, 1)\n return index === -1 && line.trim() !== ''\n })\n .map((line) => line.trim())\n}\n\n/**\n * Removes a plugin or parser from `kubb.config.ts` and uninstalls its package. Refuses the adapter,\n * which the config needs, and an extension another one in the config depends on. Previews the\n * change before asking.\n */\nexport async function run({ id: input, configPath, yes, uninstall }: RemoveOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n const fail = (title: string, lines: ReadonlyArray<string>) => {\n summary(title, 'failed', lines)\n process.exitCode = 1\n }\n logIntro({ title: isInteractiveRun({ yes }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Remove ')) })\n\n try {\n const id = toRegistryId(input)\n const configFile = configPath ? path.resolve(configPath) : findConfigFile(cwd)\n if (!configFile)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'No kubb.config.ts found. Pass its path with --config.',\n help: 'Run `kubb remove <id> --config <path>`.',\n })\n const configName = path.relative(cwd, configFile) || configFile\n const [entries, installed, source] = await withSpinner({\n message: 'Reading the registry',\n promise: Promise.all([fetchRegistryIndex({ registry: registryUrl() }), readInstalledPackages({ root: cwd }), read(configFile)]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const entry = entries.find((candidate) => candidate.id === id)\n if (!entry) {\n const suggestions = closestIds({ input: id, ids: entries.map((candidate) => candidate.id) }).map(toShortId)\n return fail(\n `No extension named ${input}`,\n suggestions.map((suggestion) => ` kubb remove ${suggestion}`),\n )\n }\n const { artifact, manifest } = entry\n const kind = manifest.kind.charAt(0).toUpperCase() + manifest.kind.slice(1)\n if (manifest.kind === extensionKinds.adapter)\n return fail('The adapter cannot be removed', [` A config needs one adapter. Change it in ${configName} by hand.`])\n\n // Only calls that run count: a plugin Studio switched off is a comment, as in Studio's own check.\n const view = readConfig(source)\n const running = new Set(\n view.managed\n ? view.configs.flatMap((config) => [...config.plugins, ...(config.parsers ?? [])].filter((call) => !call.disabled).map((call) => call.packageName))\n : [],\n )\n const dependents = entries.filter(\n (other) => other.id !== entry.id && other.manifest.dependencies?.includes(manifest.name) && running.has(other.artifact.package),\n )\n if (dependents.length) {\n const names = dependents.map((other) => other.manifest.name).join(', ')\n return fail(`${names} ${dependents.length === 1 ? 'needs' : 'need'} ${manifest.name}`, [` Remove ${names} first.`])\n }\n\n const edits = [\n {\n operation: ConfigEditOperation.REMOVE_EXTENSION,\n ...(manifest.kind === extensionKinds.parser ? { kind: extensionKinds.parser } : {}),\n plugin: artifact.package,\n },\n ]\n const preview = editConfig({ source, edits })\n const outcome = preview.outcomes[0]\n if (!outcome?.applied) return fail(`Could not edit ${configName}`, [` ${outcome?.reason ?? 'the config file was not changed'}`])\n\n // Bundled extensions leave the config but stay installed.\n const bundled = BUNDLED_PACKAGES.includes(artifact.package)\n // Another `defineConfig` entry can still import it, and uninstalling it then breaks the config.\n const stillImported = readImports(preview.source).includes(artifact.package)\n const uninstalls = uninstall && !bundled && !stillImported && versions.has(artifact.package)\n if (!preview.changed && !uninstalls) {\n summary(`${manifest.name} is not in the project`, 'success', [' No changes made'])\n return\n }\n\n const packageLine = (() => {\n if (uninstalls) return `Uninstalls ${artifact.package}`\n if (bundled) return `Keeps ${artifact.package}, which ships with kubb`\n if (stillImported) return `Keeps ${artifact.package}, which another config entry still imports`\n return 'Uninstalls nothing'\n })()\n logStep(`${kind} ${styleText('cyan', manifest.name)} v${versions.get(artifact.package) ?? artifact.version}`)\n logBlock([\n `Config ${configName}`,\n ...removedLines({ before: source, after: preview.source }).map((line) => styleText('red', ` - ${line}`)),\n packageLine,\n ])\n\n const confirmed = yes || (await clack.confirm({ message: 'Remove it?', initialValue: true }))\n if (clack.isCancel(confirmed) || !confirmed) {\n summary('Remove canceled', 'canceled', [` ${kind} ${manifest.name}`, ' No changes made'])\n return\n }\n\n if (preview.changed) {\n const written = await editConfigFile({ filePath: configFile, edits })\n if (!written.outcomes[0]?.applied) return fail(`Could not edit ${configName}`, [` ${written.outcomes[0]?.reason ?? 'the config file was not changed'}`])\n logStep(`${manifest.export}() removed from ${configName}`)\n }\n const packageManager = detectPackageManager(cwd)\n if (uninstalls)\n await withSpinner({\n message: `Uninstalling ${artifact.package} with ${packageManager.name}`,\n promise: uninstallPackages([artifact.package], packageManager, cwd),\n })\n\n summary(`${kind} removed`, 'success', [\n ` Packages ${uninstalls ? `${artifact.package} uninstalled with ${packageManager.name}` : 'none uninstalled'}`,\n '',\n 'Next kubb generate',\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n fail('Remove failed', [' See the error above'])\n }\n}\n\nexport const command = define({\n name: 'remove',\n description: 'Remove a plugin or parser from kubb.config.ts and uninstall its package.',\n examples: ['kubb remove plugin-zod', 'kubb remove acme/plugin-x --yes', 'kubb remove plugin-zod --no-uninstall'].join('\\n'),\n toKebab: true,\n args: {\n id: {\n type: 'positional',\n description: 'Registry id: owner/slug, or a slug for an official extension',\n required: true,\n },\n ...configArg,\n ...yesArg,\n uninstall: {\n type: 'boolean',\n description: 'Uninstall the package. Pass --no-uninstall to only edit the config',\n negatable: true,\n default: true,\n },\n },\n run: ({ values }) => run({ id: values.id, configPath: values.config, yes: values.yes, uninstall: values.uninstall }),\n})\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { defineWithTypes } from 'gunshi'\nimport { findConfigFile } from '@internals/shared'\nimport { getErrorMessage } from '@internals/utils'\nimport { Hookable, type KubbHooks, readInstalledPackages, type RegistryEntry } from '@kubb/core'\nimport { pluralize } from '../../ui/text.ts'\nimport { dryRunId, type DryRunExtensions, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner, withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { formatTable } from '../../ui/table.ts'\nimport { bumpOf, fetchRegistryIndex, incompatibility, installSpec, isOutdated, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport { diffFiles, type FileChange, readOutputFiles } from '../generate/utils.ts'\n\nexport type UpdateOptions = {\n /**\n * Registry ids to update. Empty updates every installed extension the registry lists.\n */\n ids: Array<string>\n /**\n * List the updates without installing anything.\n */\n dryRun: boolean\n yes: boolean\n}\n\n/**\n * Generates every config in this process, the way `kubb generate` does, and returns the output files\n * it changed. Runs after the install, so the config loads the new versions. `undefined` when the\n * config fails to load or a build fails.\n */\nasync function regenerate({\n cwd,\n configPath,\n}: {\n cwd: string\n configPath: string\n}): Promise<{ files: Array<FileChange>; unchanged: number; output: string } | undefined> {\n const spinner = createSpinner()\n spinner.start('Generating with the new versions')\n try {\n // Imported here, so the config loader and the generate path never slow down `kubb --help`.\n const [{ getConfigs }, { generate }] = await Promise.all([import('../../config.ts'), import('../generate/run.ts')])\n const { configs } = await getConfigs({ configPath })\n const dirs = configs.map((config) => path.resolve(config.root ?? cwd, config.output.path))\n const before = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const hooks = new Hookable<KubbHooks>()\n for (const config of configs) {\n if (!(await generate({ config, hooks }))) throw new Error('Generation failed')\n }\n const after = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const diff = diffFiles(before, after)\n spinner.stop(diff.files.length ? `Generated: ${pluralize(diff.files.length, 'file')} changed` : 'Generated: no files changed')\n return { ...diff, output: dirs.map((dir) => path.relative(cwd, dir) || '.').join(', ') }\n } catch (error) {\n spinner.error(`Generation failed: ${getErrorMessage(error)}`)\n return undefined\n }\n}\n\n/**\n * Moves installed extensions to the version the registry pins. Shows each version change with its\n * bump, asks which to install with majors left out, installs them, and regenerates to show which\n * files changed. With `dryRun`, only lists the updates and installs nothing.\n */\nexport async function run({ ids, dryRun, yes }: UpdateOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const installedPackages: Array<string> = []\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n logIntro({ title: isInteractiveRun({ yes, dryRun }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Update ')) })\n\n try {\n const wanted = new Set(ids.map(toRegistryId))\n const [entries, installed] = await withSpinner({\n message: 'Checking the registry',\n promise: Promise.all([fetchRegistryIndex({ registry: registryUrl() }), readInstalledPackages({ root: cwd })]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const tracked = entries.filter((entry) => versions.has(entry.artifact.package) && (!wanted.size || wanted.has(entry.id)))\n for (const id of wanted) {\n if (tracked.some((entry) => entry.id === id)) continue\n logWarn(`${id} is not installed, or not in the registry.`)\n // A caller that named it, such as Studio, must not read the run as a successful update.\n process.exitCode = 1\n }\n\n const current = ({ artifact }: RegistryEntry) => versions.get(artifact.package)\n const isMajor = (entry: RegistryEntry) => bumpOf({ installed: current(entry), latest: entry.artifact.version }) === 'major'\n const outdated = tracked.filter((entry) => isOutdated({ installed: current(entry), latest: entry.artifact.version }))\n const proposals = outdated.filter((entry) => {\n const problem = incompatibility(entry.manifest)\n if (problem) logWarn(`Skipped ${entry.id}: ${problem}`)\n return !problem\n })\n\n if (!proposals.length) {\n const title = outdated.length ? 'No compatible updates available' : 'Already up to date'\n summary(tracked.length ? title : 'No installed extensions to update', outdated.length ? 'warning' : 'success', [\n ` ${tracked.length - outdated.length} of ${tracked.length} up to date`,\n ...(ids.length ? ['', `No updates for ${ids.join(', ')}.`] : []),\n ])\n return\n }\n\n if (tracked.length) {\n const header = ['Extension', 'Current', 'Latest', '']\n const rows = tracked.map((entry) => {\n if (!outdated.includes(entry)) return [entry.artifact.package, current(entry) ?? '-', 'up to date', '']\n const bump = bumpOf({ installed: current(entry), latest: entry.artifact.version }) ?? ''\n return [entry.artifact.package, current(entry) ?? 'not installed', entry.artifact.version, bump === 'major' ? 'major · breaking' : bump]\n })\n const lines = formatTable([header, ...rows])\n logStep(`Checked ${pluralize(tracked.length, 'extension')} against the registry`)\n logBlock([\n styleText('dim', lines[0]!),\n ...lines.slice(1).map((line, index) => {\n if (!outdated.includes(tracked[index]!)) return styleText('dim', line)\n return line.endsWith('major · breaking') ? styleText('yellow', line) : line\n }),\n ])\n }\n\n if (dryRun) {\n summary('Updates available', 'planned', [`Dry run: nothing was installed. Run kubb update to install ${proposals.length === 1 ? 'it' : 'them'}.`])\n return\n }\n\n // A major can break the generated code, so it is only picked for you when you named it.\n const defaults = proposals.filter((entry) => wanted.has(entry.id) || !isMajor(entry))\n const chosen = yes\n ? defaults.map((entry) => entry.id)\n : await clack.multiselect({\n message: 'Select the updates to install',\n options: proposals.map((entry) => ({\n value: entry.id,\n label: entry.artifact.package,\n hint: `${current(entry) ?? 'not installed'} → ${entry.artifact.version}`,\n })),\n initialValues: defaults.map((entry) => entry.id),\n required: false,\n })\n if (clack.isCancel(chosen)) {\n summary('Update canceled', 'canceled', [' No changes made'])\n return\n }\n const selected = proposals.filter((entry) => chosen.includes(entry.id))\n\n const skipped = proposals\n .filter((entry) => !selected.includes(entry))\n .map((entry) => {\n const kind = entry.manifest.kind.charAt(0).toUpperCase() + entry.manifest.kind.slice(1)\n return ` ${styleText('dim', 'Skipped')} ${kind} ${entry.artifact.package} ${entry.artifact.version} ${styleText('dim', `run kubb update ${toShortId(entry.id)} later`)}`\n })\n if (!selected.length) {\n summary('No updates installed', 'canceled', [' No updates selected.', ...skipped])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const names = selected.map(({ artifact }) => artifact.package).join(', ')\n await installWithSpinner({\n packages: selected.map(({ artifact }) => installSpec(artifact)),\n names,\n packageManager,\n cwd,\n })\n installedPackages.push(...selected.map((entry) => entry.artifact.package))\n\n // Regenerating rewrites output files, so it is asked for. `--yes` only accepts the install.\n const foundConfig = findConfigFile(cwd)\n const regenerateNow =\n foundConfig && !yes && (await clack.confirm({ message: 'Regenerate now? This rewrites the generated files.', initialValue: true })) === true\n const configPath = regenerateNow ? foundConfig : undefined\n const changed = configPath ? await regenerate({ cwd, configPath }) : undefined\n\n const generationFailed = Boolean(configPath && !changed)\n const fileCounts = { A: 0, M: 0, D: 0 }\n for (const file of changed?.files ?? []) fileCounts[file.status]++\n summary(generationFailed ? 'Extensions updated; generation failed' : 'Update complete', generationFailed ? 'warning' : 'success', [\n ` Packages ${selected.length} installed with ${packageManager.name}${skipped.length ? ` · ${skipped.length} skipped` : ''}`,\n ...skipped,\n ...(changed ? [` Files ${fileCounts.A} added · ${fileCounts.M} modified · ${fileCounts.D} deleted`] : []),\n ...(!configPath ? [' Regeneration not run'] : []),\n ...(generationFailed ? ['', 'Fix the generation error, then run kubb generate.'] : []),\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Update failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'update',\n description: 'Update installed extensions, regenerate, and summarize file changes.',\n examples: ['kubb update', 'kubb update --dry-run', 'kubb update plugin-zod plugin-ts --yes'].join('\\n'),\n args: {\n ids: {\n type: 'positional',\n description: 'Registry ids to update, all installed extensions when omitted',\n multiple: true,\n },\n ...yesArg,\n },\n run: ({ values, extensions }) => run({ ids: values.ids ?? [], dryRun: extensions[dryRunId].enabled, yes: values.yes }),\n})\n","import { styleText } from 'node:util'\nimport dryrun from '@gunshi/plugin-dryrun'\nimport { cli } from 'gunshi'\nimport { isDisabled as isTelemetryDisabled } from './Telemetry.ts'\nimport { version } from '../package.json'\nimport { getBanner, wantsMascot } from './ui/mascot.ts'\nimport { command as generateCommand } from './commands/generate.ts'\nimport { command as mcpCommand } from './commands/mcp.ts'\nimport { command as studioCommand, routeStudioFlags } from './commands/studio/index.ts'\nimport { command as validateCommand } from './commands/validate.ts'\nimport { resolveDeprecatedFlags } from './deprecatedFlags.ts'\nimport { command as addCommand } from './runners/add/run.ts'\nimport { command as initCommand } from './runners/init/run.ts'\nimport { command as listCommand } from './runners/list/run.ts'\nimport { command as removeCommand } from './runners/remove/run.ts'\nimport { command as updateCommand } from './runners/update/run.ts'\n\n/** Flags that short-circuit execution (help and version). The telemetry notice is suppressed for these. */\nconst QUIET_FLAGS = new Set<string>(['--help', '-h', '--version', '-v', '--json'])\n\n/**\n * Entry point for the `kubb` CLI. Prints the telemetry notice unless telemetry is disabled or a\n * quiet flag is passed, then runs the given command, or `generate` when none is given.\n */\nexport async function run(argv: Array<string> = process.argv.slice(2)): Promise<void> {\n const args = routeStudioFlags(resolveDeprecatedFlags(argv))\n const isQuietFlag = args.some((arg) => QUIET_FLAGS.has(arg))\n // `--reporter json` and `--json` own stdout, so the header must not land there.\n const isJsonOutput =\n args.includes('--json') || args.some((arg, index) => /^--reporter=.*\\bjson\\b/.test(arg) || (arg === '--reporter' && /\\bjson\\b/.test(args[index + 1] ?? '')))\n\n // stderr, so the notice never lands in a stream a client parses, such as `kubb mcp` stdio.\n if (!isTelemetryDisabled() && !isQuietFlag) {\n console.error(\n `${styleText('yellow', 'Notice:')} Kubb collects anonymous telemetry data to help improve the tool. No personal data or file contents are collected. \\nTo disable, set ${styleText('cyan', 'KUBB_DISABLE_TELEMETRY=1')}.\\n`,\n )\n }\n\n // validate, mcp and studio import their runner when they run, so an optional peer (@kubb/adapter-oas, @kubb/mcp, @kubb/studio) loads only then.\n await cli(args, generateCommand, {\n name: 'kubb',\n version,\n // Not `generateCommand.description`: gunshi prints this on every subcommand's help too, so\n // `kubb studio --help` would open with a paragraph about generating types.\n description: 'Generate code from an OpenAPI specification, manage Kubb extensions, or connect the project to Kubb Studio.',\n subCommands: {\n generate: generateCommand,\n init: initCommand,\n validate: validateCommand,\n mcp: mcpCommand,\n studio: studioCommand,\n add: addCommand,\n update: updateCommand,\n remove: removeCommand,\n list: listCommand,\n },\n fallbackToEntry: true,\n // The mascot opens only the long-running commands; `generate` turns this off and plays its animated banner instead.\n renderHeader: isJsonOutput\n ? null\n : async (ctx) => {\n if (!wantsMascot({ commandPath: ctx.commandPath, values: ctx.values })) return ''\n\n // Gunshi adds a blank line after returned headers; the first prompt already supplies its guide.\n ctx.log(getBanner(version, ctx.commandPath.join(' ') || 'generate'))\n return ''\n },\n strict: true,\n plugins: [dryrun({ name: 'dry-run' })],\n onErrorCommand: async (_ctx, error) => {\n process.exitCode = 1\n console.error(error)\n },\n })\n}\n"],"mappings":"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"}
|