@kubb/cli 5.0.0-alpha.7 → 5.0.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/{agent-CjXjyuPe.js → agent-5mmp7QzF.js} +4 -4
  2. package/dist/{agent-CjXjyuPe.js.map → agent-5mmp7QzF.js.map} +1 -1
  3. package/dist/{agent-Cc-0-A8t.cjs → agent-BKphjOIF.cjs} +4 -4
  4. package/dist/{agent-Cc-0-A8t.cjs.map → agent-BKphjOIF.cjs.map} +1 -1
  5. package/dist/{agent-C6o_6GSJ.cjs → agent-BapvKB4r.cjs} +3 -3
  6. package/dist/{agent-C6o_6GSJ.cjs.map → agent-BapvKB4r.cjs.map} +1 -1
  7. package/dist/{agent-L50VNhXv.js → agent-CBrpIMMU.js} +3 -3
  8. package/dist/{agent-L50VNhXv.js.map → agent-CBrpIMMU.js.map} +1 -1
  9. package/dist/{constants-BTUap0zs.cjs → constants-D0XHAHeZ.cjs} +78 -8
  10. package/dist/constants-D0XHAHeZ.cjs.map +1 -0
  11. package/dist/{constants-CM3dJzjK.js → constants-DJM9zCXm.js} +73 -9
  12. package/dist/constants-DJM9zCXm.js.map +1 -0
  13. package/dist/{generate-BYqhZfbq.js → generate-BHNyeQXl.js} +4 -4
  14. package/dist/generate-BHNyeQXl.js.map +1 -0
  15. package/dist/{generate-yOyKmo19.cjs → generate-Cq5RDTBL.cjs} +4 -4
  16. package/dist/{generate-BYqhZfbq.js.map → generate-Cq5RDTBL.cjs.map} +1 -1
  17. package/dist/{generate-BP0WpC20.cjs → generate-DU5zzc54.cjs} +2 -2
  18. package/dist/{generate-BP0WpC20.cjs.map → generate-DU5zzc54.cjs.map} +1 -1
  19. package/dist/{generate-BX6LmxKo.js → generate-Rly1EXBN.js} +2 -2
  20. package/dist/{generate-BX6LmxKo.js.map → generate-Rly1EXBN.js.map} +1 -1
  21. package/dist/index.cjs +19 -14
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +19 -14
  25. package/dist/index.js.map +1 -1
  26. package/dist/{init-hmolV6B4.cjs → init-BK6inBTR.cjs} +2 -2
  27. package/dist/{init-hmolV6B4.cjs.map → init-BK6inBTR.cjs.map} +1 -1
  28. package/dist/{init-C-InrmSY.js → init-BQ6zfsnw.js} +2 -2
  29. package/dist/{init-C-InrmSY.js.map → init-BQ6zfsnw.js.map} +1 -1
  30. package/dist/{init-DkwG4Gbs.cjs → init-CN1JFyGX.cjs} +3 -3
  31. package/dist/{init-DkwG4Gbs.cjs.map → init-CN1JFyGX.cjs.map} +1 -1
  32. package/dist/{init-BqkRvRTM.js → init-iN7e1XwI.js} +3 -3
  33. package/dist/{init-BqkRvRTM.js.map → init-iN7e1XwI.js.map} +1 -1
  34. package/dist/{mcp-D2SHEg_d.js → mcp-BiGUvbWP.js} +2 -2
  35. package/dist/{mcp-D2SHEg_d.js.map → mcp-BiGUvbWP.js.map} +1 -1
  36. package/dist/{mcp-ChHFPRzD.cjs → mcp-CONmm_xT.cjs} +2 -2
  37. package/dist/{mcp-ChHFPRzD.cjs.map → mcp-CONmm_xT.cjs.map} +1 -1
  38. package/dist/{mcp-BnEafD5r.cjs → mcp-T7Q4nWbT.cjs} +3 -3
  39. package/dist/{mcp-BnEafD5r.cjs.map → mcp-T7Q4nWbT.cjs.map} +1 -1
  40. package/dist/{mcp-Cqn_PHUg.js → mcp-eP1S40LZ.js} +3 -3
  41. package/dist/{mcp-Cqn_PHUg.js.map → mcp-eP1S40LZ.js.map} +1 -1
  42. package/dist/{package-DZb6I8FQ.cjs → package-BJ6ionm6.cjs} +2 -2
  43. package/dist/package-BJ6ionm6.cjs.map +1 -0
  44. package/dist/package-BKZ0H3Zf.js +6 -0
  45. package/dist/package-BKZ0H3Zf.js.map +1 -0
  46. package/dist/{telemetry-DxiR7clS.js → telemetry-BF3SMlH6.js} +2 -2
  47. package/dist/{telemetry-DxiR7clS.js.map → telemetry-BF3SMlH6.js.map} +1 -1
  48. package/dist/{telemetry-Cn9X1I5B.cjs → telemetry-DZ7IrLAU.cjs} +2 -2
  49. package/dist/{telemetry-Cn9X1I5B.cjs.map → telemetry-DZ7IrLAU.cjs.map} +1 -1
  50. package/dist/{validate-l8vLmwKA.js → validate-BImbbx1t.js} +2 -2
  51. package/dist/{validate-l8vLmwKA.js.map → validate-BImbbx1t.js.map} +1 -1
  52. package/dist/{validate-Bgqwmhir.js → validate-DAZdX_0i.js} +3 -3
  53. package/dist/{validate-Bgqwmhir.js.map → validate-DAZdX_0i.js.map} +1 -1
  54. package/dist/{validate-9FoHgtvi.cjs → validate-DucFMytl.cjs} +3 -3
  55. package/dist/{validate-9FoHgtvi.cjs.map → validate-DucFMytl.cjs.map} +1 -1
  56. package/dist/{validate-Bbrn3Q-A.cjs → validate-ujLCYSWU.cjs} +2 -2
  57. package/dist/{validate-Bbrn3Q-A.cjs.map → validate-ujLCYSWU.cjs.map} +1 -1
  58. package/package.json +5 -5
  59. package/src/constants.ts +57 -10
  60. package/src/index.ts +5 -4
  61. package/src/loggers/clackLogger.ts +1 -2
  62. package/src/types.ts +11 -0
  63. package/src/utils/flags.ts +10 -0
  64. package/dist/constants-BTUap0zs.cjs.map +0 -1
  65. package/dist/constants-CM3dJzjK.js.map +0 -1
  66. package/dist/generate-yOyKmo19.cjs.map +0 -1
  67. package/dist/package-DLd3fZNd.js +0 -6
  68. package/dist/package-DLd3fZNd.js.map +0 -1
  69. package/dist/package-DZb6I8FQ.cjs.map +0 -1
  70. package/src/utils/getIntro.ts +0 -1
package/dist/index.cjs CHANGED
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("./chunk-ByKO4r7w.cjs");
3
3
  const require_define = require("./define-D6Kfm7-Z.cjs");
4
- const require_telemetry = require("./telemetry-Cn9X1I5B.cjs");
5
- const require_package = require("./package-DZb6I8FQ.cjs");
4
+ const require_telemetry = require("./telemetry-DZ7IrLAU.cjs");
5
+ const require_package = require("./package-BJ6ionm6.cjs");
6
+ const require_constants = require("./constants-D0XHAHeZ.cjs");
6
7
  let node_util = require("node:util");
7
8
  //#region ../../internals/utils/src/cli/schema.ts
8
9
  /**
@@ -200,28 +201,32 @@ function createCLI(options) {
200
201
  } };
201
202
  }
202
203
  //#endregion
204
+ //#region src/utils/flags.ts
205
+ /**
206
+ * Type guard that checks whether a raw string is a member of a typed flag set.
207
+ * Avoids the need for type assertions when working with `Set<T extends string>`.
208
+ */
209
+ function isFlag(set, value) {
210
+ for (const flag of set) if (flag === value) return true;
211
+ return false;
212
+ }
213
+ //#endregion
203
214
  //#region src/index.ts
204
215
  const cli = createCLI();
205
216
  function shouldShowTelemetryNotice(argv) {
206
217
  if (require_telemetry.isTelemetryDisabled()) return false;
207
- const quietFlags = new Set([
208
- "--help",
209
- "-h",
210
- "--version",
211
- "-v"
212
- ]);
213
- if (argv.some((arg) => quietFlags.has(arg))) return false;
218
+ if (argv.some((arg) => isFlag(require_constants.QUITE_FLAGS, arg))) return false;
214
219
  if (!process.stdout.isTTY) return false;
215
220
  return true;
216
221
  }
217
222
  async function run(argv = process.argv) {
218
223
  if (shouldShowTelemetryNotice(argv)) console.log(`${(0, node_util.styleText)("yellow", "Notice:")} Kubb collects anonymous telemetry data to help improve the tool. No personal data or file contents are collected. \nTo disable, set ${(0, node_util.styleText)("cyan", "KUBB_DISABLE_TELEMETRY=1")}.\n`);
219
224
  const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] = await Promise.all([
220
- Promise.resolve().then(() => require("./generate-BP0WpC20.cjs")),
221
- Promise.resolve().then(() => require("./validate-9FoHgtvi.cjs")),
222
- Promise.resolve().then(() => require("./mcp-BnEafD5r.cjs")),
223
- Promise.resolve().then(() => require("./agent-Cc-0-A8t.cjs")),
224
- Promise.resolve().then(() => require("./init-DkwG4Gbs.cjs"))
225
+ Promise.resolve().then(() => require("./generate-DU5zzc54.cjs")),
226
+ Promise.resolve().then(() => require("./validate-DucFMytl.cjs")),
227
+ Promise.resolve().then(() => require("./mcp-T7Q4nWbT.cjs")),
228
+ Promise.resolve().then(() => require("./agent-BKphjOIF.cjs")),
229
+ Promise.resolve().then(() => require("./init-CN1JFyGX.cjs"))
225
230
  ]);
226
231
  await cli.run([
227
232
  generateCommand,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["defineCLIAdapter","isTelemetryDisabled"],"sources":["../../../internals/utils/src/cli/schema.ts","../../../internals/utils/src/cli/help.ts","../../../internals/utils/src/cli/adapters/nodeAdapter.ts","../../../internals/utils/src/cli/parse.ts","../src/index.ts"],"sourcesContent":["import type { CommandDefinition, CommandSchema, OptionDefinition, OptionSchema } from './types.ts'\n\n/**\n * Serializes `CommandDefinition[]` to a plain, JSON-serializable structure.\n * Use to expose CLI capabilities to AI agents or MCP tools.\n */\nexport function getCommandSchema(defs: CommandDefinition[]): CommandSchema[] {\n return defs.map(serializeCommand)\n}\n\nfunction serializeCommand(def: CommandDefinition): CommandSchema {\n return {\n name: def.name,\n description: def.description,\n arguments: def.arguments,\n options: serializeOptions(def.options ?? {}),\n subCommands: def.subCommands ? def.subCommands.map(serializeCommand) : [],\n }\n}\n\nfunction serializeOptions(options: Record<string, OptionDefinition>): OptionSchema[] {\n return Object.entries(options).map(([name, opt]) => {\n const shortPart = opt.short ? `-${opt.short}, ` : ''\n const valuePart = opt.type === 'string' ? ` <${opt.hint ?? name}>` : ''\n const flags = `${shortPart}--${name}${valuePart}`\n\n return {\n name,\n flags,\n type: opt.type,\n description: opt.description,\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n ...(opt.hint ? { hint: opt.hint } : {}),\n ...(opt.enum ? { enum: opt.enum } : {}),\n ...(opt.required ? { required: opt.required } : {}),\n }\n })\n}\n","import { styleText } from 'node:util'\nimport { getCommandSchema } from './schema.ts'\nimport type { CommandDefinition, OptionSchema } from './types.ts'\n\n/** Prints formatted help output for a command using its `CommandDefinition`. */\nexport function renderHelp(def: CommandDefinition, parentName?: string): void {\n const schema = getCommandSchema([def])[0]!\n\n const programName = parentName ? `${parentName} ${schema.name}` : schema.name\n\n const argsPart = schema.arguments?.length ? ` ${schema.arguments.join(' ')}` : ''\n const subCmdPart = schema.subCommands.length ? ' <command>' : ''\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName}${argsPart}${subCmdPart} [options]\\n`)\n\n if (schema.description) {\n console.log(` ${schema.description}\\n`)\n }\n\n if (schema.subCommands.length) {\n console.log(styleText('bold', 'Commands:'))\n for (const sub of schema.subCommands) {\n console.log(` ${styleText('cyan', sub.name.padEnd(16))}${sub.description}`)\n }\n console.log()\n }\n\n const options: OptionSchema[] = [...schema.options, { name: 'help', flags: '-h, --help', type: 'boolean' as const, description: 'Show help' }]\n\n console.log(styleText('bold', 'Options:'))\n for (const opt of options) {\n const flags = styleText('cyan', opt.flags.padEnd(30))\n const defaultPart = opt.default !== undefined ? styleText('dim', ` (default: ${opt.default})`) : ''\n console.log(` ${flags}${opt.description}${defaultPart}`)\n }\n console.log()\n}\n","import { parseArgs, styleText } from 'node:util'\nimport { defineCLIAdapter } from '../define.ts'\nimport { renderHelp } from '../help.ts'\nimport type { CommandDefinition, OptionType, ParsedArgs, RunOptions } from '../types.ts'\n\ntype ParseOption = { type: OptionType; short?: string; default?: string | boolean }\ntype ParseOptions = Record<string, ParseOption>\n\nfunction buildParseOptions(def: CommandDefinition): ParseOptions {\n const result: ParseOptions = {\n help: { type: 'boolean', short: 'h' },\n }\n\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n result[name] = {\n type: opt.type,\n ...(opt.short ? { short: opt.short } : {}),\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n }\n }\n\n return result\n}\n\nasync function runCommand(def: CommandDefinition, argv: string[], parentName?: string): Promise<void> {\n const parseOptions = buildParseOptions(def)\n\n let parsed: ParsedArgs\n try {\n const result = parseArgs({\n args: argv,\n options: parseOptions,\n allowPositionals: true,\n strict: false,\n })\n parsed = { values: result.values as ParsedArgs['values'], positionals: result.positionals }\n } catch {\n renderHelp(def, parentName)\n process.exit(1)\n }\n\n if (parsed.values['help']) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n // Validate required options before running the command\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n if (opt.required && parsed.values[name] === undefined) {\n console.error(styleText('red', `Error: --${name} is required`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n }\n\n if (!def.run) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n try {\n await def.run(parsed)\n } catch (err) {\n console.error(styleText('red', `Error: ${err instanceof Error ? err.message : String(err)}`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n}\n\nfunction printRootHelp(programName: string, version: string, defs: CommandDefinition[]): void {\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName} <command> [options]\\n`)\n console.log(` Kubb generation — v${version}\\n`)\n console.log(styleText('bold', 'Commands:'))\n for (const def of defs) {\n console.log(` ${styleText('cyan', def.name.padEnd(16))}${def.description}`)\n }\n console.log()\n console.log(styleText('bold', 'Options:'))\n console.log(` ${styleText('cyan', '-v, --version'.padEnd(30))}Show version number`)\n console.log(` ${styleText('cyan', '-h, --help'.padEnd(30))}Show help`)\n console.log()\n console.log(`Run ${styleText('cyan', `${programName} <command> --help`)} for command-specific help.\\n`)\n}\n\n/** CLI adapter using `node:util parseArgs`. No external dependencies. */\nexport const nodeAdapter = defineCLIAdapter({\n renderHelp(def: CommandDefinition, parentName?: string): void {\n renderHelp(def, parentName)\n },\n\n async run(defs: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void> {\n const { programName, defaultCommandName, version } = opts\n\n const args = argv.length >= 2 && argv[0]?.includes('node') ? argv.slice(2) : argv\n\n if (args[0] === '--version' || args[0] === '-v') {\n console.log(version)\n process.exit(0)\n }\n\n if (args[0] === '--help' || args[0] === '-h') {\n printRootHelp(programName, version, defs)\n process.exit(0)\n }\n\n if (args.length === 0) {\n const defaultDef = defs.find((d) => d.name === defaultCommandName)\n if (defaultDef?.run) {\n await runCommand(defaultDef, [], programName)\n } else {\n printRootHelp(programName, version, defs)\n }\n return\n }\n\n const [first, ...rest] = args\n const isKnownSubcommand = defs.some((d) => d.name === first)\n\n let def: CommandDefinition | undefined\n let commandArgv: string[]\n let parentName: string | undefined\n\n if (isKnownSubcommand) {\n def = defs.find((d) => d.name === first)\n commandArgv = rest\n parentName = programName\n } else {\n def = defs.find((d) => d.name === defaultCommandName)\n commandArgv = args\n parentName = programName\n }\n\n if (!def) {\n console.error(`Unknown command: ${first}`)\n printRootHelp(programName, version, defs)\n process.exit(1)\n }\n\n if (def.subCommands?.length) {\n const [subName, ...subRest] = commandArgv\n const subDef = def.subCommands.find((s) => s.name === subName)\n\n if (subName === '--help' || subName === '-h') {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n if (!subDef) {\n renderHelp(def, parentName)\n process.exit(subName ? 1 : 0)\n }\n\n await runCommand(subDef, subRest, `${parentName} ${def.name}`)\n return\n }\n\n await runCommand(def, commandArgv, parentName)\n },\n})\n","import { nodeAdapter } from './adapters/nodeAdapter.ts'\nimport type { CLIAdapter, CommandDefinition, RunOptions } from './types.ts'\n\n/**\n * Create a CLI runner bound to a specific adapter.\n * Defaults to the built-in `nodeAdapter` (Node.js `node:util parseArgs`).\n */\nexport function createCLI(options?: { adapter?: CLIAdapter }): {\n run(commands: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void>\n} {\n const adapter = options?.adapter ?? nodeAdapter\n\n return {\n run(commands, argv, opts) {\n return adapter.run(commands, argv, opts)\n },\n }\n}\n","import { styleText } from 'node:util'\nimport { createCLI } from '@internals/utils'\nimport { version } from '../package.json'\nimport { isTelemetryDisabled } from './utils/telemetry.ts'\n\nconst cli = createCLI()\n\nfunction shouldShowTelemetryNotice(argv: string[]): boolean {\n if (isTelemetryDisabled()) {\n return false\n }\n // Skip when the user is just asking for help or version info\n const quietFlags = new Set(['--help', '-h', '--version', '-v'])\n if (argv.some((arg) => quietFlags.has(arg))) {\n return false\n }\n // Skip in non-interactive / scripting contexts\n if (!process.stdout.isTTY) {\n return false\n }\n return true\n}\n\nexport async function run(argv: string[] = process.argv): Promise<void> {\n if (shouldShowTelemetryNotice(argv)) {\n console.log(\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 const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] =\n await Promise.all([\n import('./commands/generate.ts'),\n import('./commands/validate.ts'),\n import('./commands/mcp.ts'),\n import('./commands/agent.ts'),\n import('./commands/init.ts'),\n ])\n\n await cli.run([generateCommand, validateCommand, mcpCommand, agentCommand, initCommand], argv, {\n programName: 'kubb',\n defaultCommandName: 'generate',\n version,\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["defineCLIAdapter","isTelemetryDisabled","QUITE_FLAGS"],"sources":["../../../internals/utils/src/cli/schema.ts","../../../internals/utils/src/cli/help.ts","../../../internals/utils/src/cli/adapters/nodeAdapter.ts","../../../internals/utils/src/cli/parse.ts","../src/utils/flags.ts","../src/index.ts"],"sourcesContent":["import type { CommandDefinition, CommandSchema, OptionDefinition, OptionSchema } from './types.ts'\n\n/**\n * Serializes `CommandDefinition[]` to a plain, JSON-serializable structure.\n * Use to expose CLI capabilities to AI agents or MCP tools.\n */\nexport function getCommandSchema(defs: CommandDefinition[]): CommandSchema[] {\n return defs.map(serializeCommand)\n}\n\nfunction serializeCommand(def: CommandDefinition): CommandSchema {\n return {\n name: def.name,\n description: def.description,\n arguments: def.arguments,\n options: serializeOptions(def.options ?? {}),\n subCommands: def.subCommands ? def.subCommands.map(serializeCommand) : [],\n }\n}\n\nfunction serializeOptions(options: Record<string, OptionDefinition>): OptionSchema[] {\n return Object.entries(options).map(([name, opt]) => {\n const shortPart = opt.short ? `-${opt.short}, ` : ''\n const valuePart = opt.type === 'string' ? ` <${opt.hint ?? name}>` : ''\n const flags = `${shortPart}--${name}${valuePart}`\n\n return {\n name,\n flags,\n type: opt.type,\n description: opt.description,\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n ...(opt.hint ? { hint: opt.hint } : {}),\n ...(opt.enum ? { enum: opt.enum } : {}),\n ...(opt.required ? { required: opt.required } : {}),\n }\n })\n}\n","import { styleText } from 'node:util'\nimport { getCommandSchema } from './schema.ts'\nimport type { CommandDefinition, OptionSchema } from './types.ts'\n\n/** Prints formatted help output for a command using its `CommandDefinition`. */\nexport function renderHelp(def: CommandDefinition, parentName?: string): void {\n const schema = getCommandSchema([def])[0]!\n\n const programName = parentName ? `${parentName} ${schema.name}` : schema.name\n\n const argsPart = schema.arguments?.length ? ` ${schema.arguments.join(' ')}` : ''\n const subCmdPart = schema.subCommands.length ? ' <command>' : ''\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName}${argsPart}${subCmdPart} [options]\\n`)\n\n if (schema.description) {\n console.log(` ${schema.description}\\n`)\n }\n\n if (schema.subCommands.length) {\n console.log(styleText('bold', 'Commands:'))\n for (const sub of schema.subCommands) {\n console.log(` ${styleText('cyan', sub.name.padEnd(16))}${sub.description}`)\n }\n console.log()\n }\n\n const options: OptionSchema[] = [...schema.options, { name: 'help', flags: '-h, --help', type: 'boolean' as const, description: 'Show help' }]\n\n console.log(styleText('bold', 'Options:'))\n for (const opt of options) {\n const flags = styleText('cyan', opt.flags.padEnd(30))\n const defaultPart = opt.default !== undefined ? styleText('dim', ` (default: ${opt.default})`) : ''\n console.log(` ${flags}${opt.description}${defaultPart}`)\n }\n console.log()\n}\n","import { parseArgs, styleText } from 'node:util'\nimport { defineCLIAdapter } from '../define.ts'\nimport { renderHelp } from '../help.ts'\nimport type { CommandDefinition, OptionType, ParsedArgs, RunOptions } from '../types.ts'\n\ntype ParseOption = { type: OptionType; short?: string; default?: string | boolean }\ntype ParseOptions = Record<string, ParseOption>\n\nfunction buildParseOptions(def: CommandDefinition): ParseOptions {\n const result: ParseOptions = {\n help: { type: 'boolean', short: 'h' },\n }\n\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n result[name] = {\n type: opt.type,\n ...(opt.short ? { short: opt.short } : {}),\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n }\n }\n\n return result\n}\n\nasync function runCommand(def: CommandDefinition, argv: string[], parentName?: string): Promise<void> {\n const parseOptions = buildParseOptions(def)\n\n let parsed: ParsedArgs\n try {\n const result = parseArgs({\n args: argv,\n options: parseOptions,\n allowPositionals: true,\n strict: false,\n })\n parsed = { values: result.values as ParsedArgs['values'], positionals: result.positionals }\n } catch {\n renderHelp(def, parentName)\n process.exit(1)\n }\n\n if (parsed.values['help']) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n // Validate required options before running the command\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n if (opt.required && parsed.values[name] === undefined) {\n console.error(styleText('red', `Error: --${name} is required`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n }\n\n if (!def.run) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n try {\n await def.run(parsed)\n } catch (err) {\n console.error(styleText('red', `Error: ${err instanceof Error ? err.message : String(err)}`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n}\n\nfunction printRootHelp(programName: string, version: string, defs: CommandDefinition[]): void {\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName} <command> [options]\\n`)\n console.log(` Kubb generation — v${version}\\n`)\n console.log(styleText('bold', 'Commands:'))\n for (const def of defs) {\n console.log(` ${styleText('cyan', def.name.padEnd(16))}${def.description}`)\n }\n console.log()\n console.log(styleText('bold', 'Options:'))\n console.log(` ${styleText('cyan', '-v, --version'.padEnd(30))}Show version number`)\n console.log(` ${styleText('cyan', '-h, --help'.padEnd(30))}Show help`)\n console.log()\n console.log(`Run ${styleText('cyan', `${programName} <command> --help`)} for command-specific help.\\n`)\n}\n\n/** CLI adapter using `node:util parseArgs`. No external dependencies. */\nexport const nodeAdapter = defineCLIAdapter({\n renderHelp(def: CommandDefinition, parentName?: string): void {\n renderHelp(def, parentName)\n },\n\n async run(defs: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void> {\n const { programName, defaultCommandName, version } = opts\n\n const args = argv.length >= 2 && argv[0]?.includes('node') ? argv.slice(2) : argv\n\n if (args[0] === '--version' || args[0] === '-v') {\n console.log(version)\n process.exit(0)\n }\n\n if (args[0] === '--help' || args[0] === '-h') {\n printRootHelp(programName, version, defs)\n process.exit(0)\n }\n\n if (args.length === 0) {\n const defaultDef = defs.find((d) => d.name === defaultCommandName)\n if (defaultDef?.run) {\n await runCommand(defaultDef, [], programName)\n } else {\n printRootHelp(programName, version, defs)\n }\n return\n }\n\n const [first, ...rest] = args\n const isKnownSubcommand = defs.some((d) => d.name === first)\n\n let def: CommandDefinition | undefined\n let commandArgv: string[]\n let parentName: string | undefined\n\n if (isKnownSubcommand) {\n def = defs.find((d) => d.name === first)\n commandArgv = rest\n parentName = programName\n } else {\n def = defs.find((d) => d.name === defaultCommandName)\n commandArgv = args\n parentName = programName\n }\n\n if (!def) {\n console.error(`Unknown command: ${first}`)\n printRootHelp(programName, version, defs)\n process.exit(1)\n }\n\n if (def.subCommands?.length) {\n const [subName, ...subRest] = commandArgv\n const subDef = def.subCommands.find((s) => s.name === subName)\n\n if (subName === '--help' || subName === '-h') {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n if (!subDef) {\n renderHelp(def, parentName)\n process.exit(subName ? 1 : 0)\n }\n\n await runCommand(subDef, subRest, `${parentName} ${def.name}`)\n return\n }\n\n await runCommand(def, commandArgv, parentName)\n },\n})\n","import { nodeAdapter } from './adapters/nodeAdapter.ts'\nimport type { CLIAdapter, CommandDefinition, RunOptions } from './types.ts'\n\n/**\n * Create a CLI runner bound to a specific adapter.\n * Defaults to the built-in `nodeAdapter` (Node.js `node:util parseArgs`).\n */\nexport function createCLI(options?: { adapter?: CLIAdapter }): {\n run(commands: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void>\n} {\n const adapter = options?.adapter ?? nodeAdapter\n\n return {\n run(commands, argv, opts) {\n return adapter.run(commands, argv, opts)\n },\n }\n}\n","/**\n * Type guard that checks whether a raw string is a member of a typed flag set.\n * Avoids the need for type assertions when working with `Set<T extends string>`.\n */\nexport function isFlag<T extends string>(set: ReadonlySet<T>, value: string): value is T {\n for (const flag of set) {\n if (flag === value) return true\n }\n return false\n}\n","import { styleText } from 'node:util'\nimport { createCLI } from '@internals/utils'\nimport { version } from '../package.json'\nimport { QUITE_FLAGS } from './constants.ts'\nimport { isFlag } from './utils/flags.ts'\nimport { isTelemetryDisabled } from './utils/telemetry.ts'\n\nconst cli = createCLI()\n\nfunction shouldShowTelemetryNotice(argv: Array<string>): boolean {\n if (isTelemetryDisabled()) {\n return false\n }\n // Skip when the user is just asking for help or version info\n if (argv.some((arg) => isFlag(QUITE_FLAGS, arg))) {\n return false\n }\n // Skip in non-interactive / scripting contexts\n if (!process.stdout.isTTY) {\n return false\n }\n return true\n}\n\nexport async function run(argv: Array<string> = process.argv): Promise<void> {\n if (shouldShowTelemetryNotice(argv)) {\n console.log(\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 const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] =\n await Promise.all([\n import('./commands/generate.ts'),\n import('./commands/validate.ts'),\n import('./commands/mcp.ts'),\n import('./commands/agent.ts'),\n import('./commands/init.ts'),\n ])\n\n await cli.run([generateCommand, validateCommand, mcpCommand, agentCommand, initCommand], argv, {\n programName: 'kubb',\n defaultCommandName: 'generate',\n version,\n })\n}\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { t as __name } from "./chunk--u3MIqq1.js";
2
2
 
3
3
  //#region src/index.d.ts
4
- declare function run(argv?: string[]): Promise<void>;
4
+ declare function run(argv?: Array<string>): Promise<void>;
5
5
  //#endregion
6
6
  export { run };
7
7
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import "./chunk--u3MIqq1.js";
2
2
  import { t as defineCLIAdapter } from "./define--M_JMcDC.js";
3
- import { n as isTelemetryDisabled } from "./telemetry-DxiR7clS.js";
4
- import { t as version } from "./package-DLd3fZNd.js";
3
+ import { n as isTelemetryDisabled } from "./telemetry-BF3SMlH6.js";
4
+ import { t as version } from "./package-BKZ0H3Zf.js";
5
+ import { r as QUITE_FLAGS } from "./constants-DJM9zCXm.js";
5
6
  import { parseArgs, styleText } from "node:util";
6
7
  //#region ../../internals/utils/src/cli/schema.ts
7
8
  /**
@@ -199,28 +200,32 @@ function createCLI(options) {
199
200
  } };
200
201
  }
201
202
  //#endregion
203
+ //#region src/utils/flags.ts
204
+ /**
205
+ * Type guard that checks whether a raw string is a member of a typed flag set.
206
+ * Avoids the need for type assertions when working with `Set<T extends string>`.
207
+ */
208
+ function isFlag(set, value) {
209
+ for (const flag of set) if (flag === value) return true;
210
+ return false;
211
+ }
212
+ //#endregion
202
213
  //#region src/index.ts
203
214
  const cli = createCLI();
204
215
  function shouldShowTelemetryNotice(argv) {
205
216
  if (isTelemetryDisabled()) return false;
206
- const quietFlags = new Set([
207
- "--help",
208
- "-h",
209
- "--version",
210
- "-v"
211
- ]);
212
- if (argv.some((arg) => quietFlags.has(arg))) return false;
217
+ if (argv.some((arg) => isFlag(QUITE_FLAGS, arg))) return false;
213
218
  if (!process.stdout.isTTY) return false;
214
219
  return true;
215
220
  }
216
221
  async function run(argv = process.argv) {
217
222
  if (shouldShowTelemetryNotice(argv)) console.log(`${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`);
218
223
  const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] = await Promise.all([
219
- import("./generate-BX6LmxKo.js"),
220
- import("./validate-Bgqwmhir.js"),
221
- import("./mcp-Cqn_PHUg.js"),
222
- import("./agent-CjXjyuPe.js"),
223
- import("./init-BqkRvRTM.js")
224
+ import("./generate-Rly1EXBN.js"),
225
+ import("./validate-DAZdX_0i.js"),
226
+ import("./mcp-eP1S40LZ.js"),
227
+ import("./agent-5mmp7QzF.js"),
228
+ import("./init-iN7e1XwI.js")
224
229
  ]);
225
230
  await cli.run([
226
231
  generateCommand,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../internals/utils/src/cli/schema.ts","../../../internals/utils/src/cli/help.ts","../../../internals/utils/src/cli/adapters/nodeAdapter.ts","../../../internals/utils/src/cli/parse.ts","../src/index.ts"],"sourcesContent":["import type { CommandDefinition, CommandSchema, OptionDefinition, OptionSchema } from './types.ts'\n\n/**\n * Serializes `CommandDefinition[]` to a plain, JSON-serializable structure.\n * Use to expose CLI capabilities to AI agents or MCP tools.\n */\nexport function getCommandSchema(defs: CommandDefinition[]): CommandSchema[] {\n return defs.map(serializeCommand)\n}\n\nfunction serializeCommand(def: CommandDefinition): CommandSchema {\n return {\n name: def.name,\n description: def.description,\n arguments: def.arguments,\n options: serializeOptions(def.options ?? {}),\n subCommands: def.subCommands ? def.subCommands.map(serializeCommand) : [],\n }\n}\n\nfunction serializeOptions(options: Record<string, OptionDefinition>): OptionSchema[] {\n return Object.entries(options).map(([name, opt]) => {\n const shortPart = opt.short ? `-${opt.short}, ` : ''\n const valuePart = opt.type === 'string' ? ` <${opt.hint ?? name}>` : ''\n const flags = `${shortPart}--${name}${valuePart}`\n\n return {\n name,\n flags,\n type: opt.type,\n description: opt.description,\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n ...(opt.hint ? { hint: opt.hint } : {}),\n ...(opt.enum ? { enum: opt.enum } : {}),\n ...(opt.required ? { required: opt.required } : {}),\n }\n })\n}\n","import { styleText } from 'node:util'\nimport { getCommandSchema } from './schema.ts'\nimport type { CommandDefinition, OptionSchema } from './types.ts'\n\n/** Prints formatted help output for a command using its `CommandDefinition`. */\nexport function renderHelp(def: CommandDefinition, parentName?: string): void {\n const schema = getCommandSchema([def])[0]!\n\n const programName = parentName ? `${parentName} ${schema.name}` : schema.name\n\n const argsPart = schema.arguments?.length ? ` ${schema.arguments.join(' ')}` : ''\n const subCmdPart = schema.subCommands.length ? ' <command>' : ''\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName}${argsPart}${subCmdPart} [options]\\n`)\n\n if (schema.description) {\n console.log(` ${schema.description}\\n`)\n }\n\n if (schema.subCommands.length) {\n console.log(styleText('bold', 'Commands:'))\n for (const sub of schema.subCommands) {\n console.log(` ${styleText('cyan', sub.name.padEnd(16))}${sub.description}`)\n }\n console.log()\n }\n\n const options: OptionSchema[] = [...schema.options, { name: 'help', flags: '-h, --help', type: 'boolean' as const, description: 'Show help' }]\n\n console.log(styleText('bold', 'Options:'))\n for (const opt of options) {\n const flags = styleText('cyan', opt.flags.padEnd(30))\n const defaultPart = opt.default !== undefined ? styleText('dim', ` (default: ${opt.default})`) : ''\n console.log(` ${flags}${opt.description}${defaultPart}`)\n }\n console.log()\n}\n","import { parseArgs, styleText } from 'node:util'\nimport { defineCLIAdapter } from '../define.ts'\nimport { renderHelp } from '../help.ts'\nimport type { CommandDefinition, OptionType, ParsedArgs, RunOptions } from '../types.ts'\n\ntype ParseOption = { type: OptionType; short?: string; default?: string | boolean }\ntype ParseOptions = Record<string, ParseOption>\n\nfunction buildParseOptions(def: CommandDefinition): ParseOptions {\n const result: ParseOptions = {\n help: { type: 'boolean', short: 'h' },\n }\n\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n result[name] = {\n type: opt.type,\n ...(opt.short ? { short: opt.short } : {}),\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n }\n }\n\n return result\n}\n\nasync function runCommand(def: CommandDefinition, argv: string[], parentName?: string): Promise<void> {\n const parseOptions = buildParseOptions(def)\n\n let parsed: ParsedArgs\n try {\n const result = parseArgs({\n args: argv,\n options: parseOptions,\n allowPositionals: true,\n strict: false,\n })\n parsed = { values: result.values as ParsedArgs['values'], positionals: result.positionals }\n } catch {\n renderHelp(def, parentName)\n process.exit(1)\n }\n\n if (parsed.values['help']) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n // Validate required options before running the command\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n if (opt.required && parsed.values[name] === undefined) {\n console.error(styleText('red', `Error: --${name} is required`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n }\n\n if (!def.run) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n try {\n await def.run(parsed)\n } catch (err) {\n console.error(styleText('red', `Error: ${err instanceof Error ? err.message : String(err)}`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n}\n\nfunction printRootHelp(programName: string, version: string, defs: CommandDefinition[]): void {\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName} <command> [options]\\n`)\n console.log(` Kubb generation — v${version}\\n`)\n console.log(styleText('bold', 'Commands:'))\n for (const def of defs) {\n console.log(` ${styleText('cyan', def.name.padEnd(16))}${def.description}`)\n }\n console.log()\n console.log(styleText('bold', 'Options:'))\n console.log(` ${styleText('cyan', '-v, --version'.padEnd(30))}Show version number`)\n console.log(` ${styleText('cyan', '-h, --help'.padEnd(30))}Show help`)\n console.log()\n console.log(`Run ${styleText('cyan', `${programName} <command> --help`)} for command-specific help.\\n`)\n}\n\n/** CLI adapter using `node:util parseArgs`. No external dependencies. */\nexport const nodeAdapter = defineCLIAdapter({\n renderHelp(def: CommandDefinition, parentName?: string): void {\n renderHelp(def, parentName)\n },\n\n async run(defs: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void> {\n const { programName, defaultCommandName, version } = opts\n\n const args = argv.length >= 2 && argv[0]?.includes('node') ? argv.slice(2) : argv\n\n if (args[0] === '--version' || args[0] === '-v') {\n console.log(version)\n process.exit(0)\n }\n\n if (args[0] === '--help' || args[0] === '-h') {\n printRootHelp(programName, version, defs)\n process.exit(0)\n }\n\n if (args.length === 0) {\n const defaultDef = defs.find((d) => d.name === defaultCommandName)\n if (defaultDef?.run) {\n await runCommand(defaultDef, [], programName)\n } else {\n printRootHelp(programName, version, defs)\n }\n return\n }\n\n const [first, ...rest] = args\n const isKnownSubcommand = defs.some((d) => d.name === first)\n\n let def: CommandDefinition | undefined\n let commandArgv: string[]\n let parentName: string | undefined\n\n if (isKnownSubcommand) {\n def = defs.find((d) => d.name === first)\n commandArgv = rest\n parentName = programName\n } else {\n def = defs.find((d) => d.name === defaultCommandName)\n commandArgv = args\n parentName = programName\n }\n\n if (!def) {\n console.error(`Unknown command: ${first}`)\n printRootHelp(programName, version, defs)\n process.exit(1)\n }\n\n if (def.subCommands?.length) {\n const [subName, ...subRest] = commandArgv\n const subDef = def.subCommands.find((s) => s.name === subName)\n\n if (subName === '--help' || subName === '-h') {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n if (!subDef) {\n renderHelp(def, parentName)\n process.exit(subName ? 1 : 0)\n }\n\n await runCommand(subDef, subRest, `${parentName} ${def.name}`)\n return\n }\n\n await runCommand(def, commandArgv, parentName)\n },\n})\n","import { nodeAdapter } from './adapters/nodeAdapter.ts'\nimport type { CLIAdapter, CommandDefinition, RunOptions } from './types.ts'\n\n/**\n * Create a CLI runner bound to a specific adapter.\n * Defaults to the built-in `nodeAdapter` (Node.js `node:util parseArgs`).\n */\nexport function createCLI(options?: { adapter?: CLIAdapter }): {\n run(commands: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void>\n} {\n const adapter = options?.adapter ?? nodeAdapter\n\n return {\n run(commands, argv, opts) {\n return adapter.run(commands, argv, opts)\n },\n }\n}\n","import { styleText } from 'node:util'\nimport { createCLI } from '@internals/utils'\nimport { version } from '../package.json'\nimport { isTelemetryDisabled } from './utils/telemetry.ts'\n\nconst cli = createCLI()\n\nfunction shouldShowTelemetryNotice(argv: string[]): boolean {\n if (isTelemetryDisabled()) {\n return false\n }\n // Skip when the user is just asking for help or version info\n const quietFlags = new Set(['--help', '-h', '--version', '-v'])\n if (argv.some((arg) => quietFlags.has(arg))) {\n return false\n }\n // Skip in non-interactive / scripting contexts\n if (!process.stdout.isTTY) {\n return false\n }\n return true\n}\n\nexport async function run(argv: string[] = process.argv): Promise<void> {\n if (shouldShowTelemetryNotice(argv)) {\n console.log(\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 const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] =\n await Promise.all([\n import('./commands/generate.ts'),\n import('./commands/validate.ts'),\n import('./commands/mcp.ts'),\n import('./commands/agent.ts'),\n import('./commands/init.ts'),\n ])\n\n await cli.run([generateCommand, validateCommand, mcpCommand, agentCommand, initCommand], argv, {\n programName: 'kubb',\n defaultCommandName: 'generate',\n version,\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../internals/utils/src/cli/schema.ts","../../../internals/utils/src/cli/help.ts","../../../internals/utils/src/cli/adapters/nodeAdapter.ts","../../../internals/utils/src/cli/parse.ts","../src/utils/flags.ts","../src/index.ts"],"sourcesContent":["import type { CommandDefinition, CommandSchema, OptionDefinition, OptionSchema } from './types.ts'\n\n/**\n * Serializes `CommandDefinition[]` to a plain, JSON-serializable structure.\n * Use to expose CLI capabilities to AI agents or MCP tools.\n */\nexport function getCommandSchema(defs: CommandDefinition[]): CommandSchema[] {\n return defs.map(serializeCommand)\n}\n\nfunction serializeCommand(def: CommandDefinition): CommandSchema {\n return {\n name: def.name,\n description: def.description,\n arguments: def.arguments,\n options: serializeOptions(def.options ?? {}),\n subCommands: def.subCommands ? def.subCommands.map(serializeCommand) : [],\n }\n}\n\nfunction serializeOptions(options: Record<string, OptionDefinition>): OptionSchema[] {\n return Object.entries(options).map(([name, opt]) => {\n const shortPart = opt.short ? `-${opt.short}, ` : ''\n const valuePart = opt.type === 'string' ? ` <${opt.hint ?? name}>` : ''\n const flags = `${shortPart}--${name}${valuePart}`\n\n return {\n name,\n flags,\n type: opt.type,\n description: opt.description,\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n ...(opt.hint ? { hint: opt.hint } : {}),\n ...(opt.enum ? { enum: opt.enum } : {}),\n ...(opt.required ? { required: opt.required } : {}),\n }\n })\n}\n","import { styleText } from 'node:util'\nimport { getCommandSchema } from './schema.ts'\nimport type { CommandDefinition, OptionSchema } from './types.ts'\n\n/** Prints formatted help output for a command using its `CommandDefinition`. */\nexport function renderHelp(def: CommandDefinition, parentName?: string): void {\n const schema = getCommandSchema([def])[0]!\n\n const programName = parentName ? `${parentName} ${schema.name}` : schema.name\n\n const argsPart = schema.arguments?.length ? ` ${schema.arguments.join(' ')}` : ''\n const subCmdPart = schema.subCommands.length ? ' <command>' : ''\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName}${argsPart}${subCmdPart} [options]\\n`)\n\n if (schema.description) {\n console.log(` ${schema.description}\\n`)\n }\n\n if (schema.subCommands.length) {\n console.log(styleText('bold', 'Commands:'))\n for (const sub of schema.subCommands) {\n console.log(` ${styleText('cyan', sub.name.padEnd(16))}${sub.description}`)\n }\n console.log()\n }\n\n const options: OptionSchema[] = [...schema.options, { name: 'help', flags: '-h, --help', type: 'boolean' as const, description: 'Show help' }]\n\n console.log(styleText('bold', 'Options:'))\n for (const opt of options) {\n const flags = styleText('cyan', opt.flags.padEnd(30))\n const defaultPart = opt.default !== undefined ? styleText('dim', ` (default: ${opt.default})`) : ''\n console.log(` ${flags}${opt.description}${defaultPart}`)\n }\n console.log()\n}\n","import { parseArgs, styleText } from 'node:util'\nimport { defineCLIAdapter } from '../define.ts'\nimport { renderHelp } from '../help.ts'\nimport type { CommandDefinition, OptionType, ParsedArgs, RunOptions } from '../types.ts'\n\ntype ParseOption = { type: OptionType; short?: string; default?: string | boolean }\ntype ParseOptions = Record<string, ParseOption>\n\nfunction buildParseOptions(def: CommandDefinition): ParseOptions {\n const result: ParseOptions = {\n help: { type: 'boolean', short: 'h' },\n }\n\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n result[name] = {\n type: opt.type,\n ...(opt.short ? { short: opt.short } : {}),\n ...(opt.default !== undefined ? { default: opt.default } : {}),\n }\n }\n\n return result\n}\n\nasync function runCommand(def: CommandDefinition, argv: string[], parentName?: string): Promise<void> {\n const parseOptions = buildParseOptions(def)\n\n let parsed: ParsedArgs\n try {\n const result = parseArgs({\n args: argv,\n options: parseOptions,\n allowPositionals: true,\n strict: false,\n })\n parsed = { values: result.values as ParsedArgs['values'], positionals: result.positionals }\n } catch {\n renderHelp(def, parentName)\n process.exit(1)\n }\n\n if (parsed.values['help']) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n // Validate required options before running the command\n for (const [name, opt] of Object.entries(def.options ?? {})) {\n if (opt.required && parsed.values[name] === undefined) {\n console.error(styleText('red', `Error: --${name} is required`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n }\n\n if (!def.run) {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n try {\n await def.run(parsed)\n } catch (err) {\n console.error(styleText('red', `Error: ${err instanceof Error ? err.message : String(err)}`))\n renderHelp(def, parentName)\n process.exit(1)\n }\n}\n\nfunction printRootHelp(programName: string, version: string, defs: CommandDefinition[]): void {\n console.log(`\\n${styleText('bold', 'Usage:')} ${programName} <command> [options]\\n`)\n console.log(` Kubb generation — v${version}\\n`)\n console.log(styleText('bold', 'Commands:'))\n for (const def of defs) {\n console.log(` ${styleText('cyan', def.name.padEnd(16))}${def.description}`)\n }\n console.log()\n console.log(styleText('bold', 'Options:'))\n console.log(` ${styleText('cyan', '-v, --version'.padEnd(30))}Show version number`)\n console.log(` ${styleText('cyan', '-h, --help'.padEnd(30))}Show help`)\n console.log()\n console.log(`Run ${styleText('cyan', `${programName} <command> --help`)} for command-specific help.\\n`)\n}\n\n/** CLI adapter using `node:util parseArgs`. No external dependencies. */\nexport const nodeAdapter = defineCLIAdapter({\n renderHelp(def: CommandDefinition, parentName?: string): void {\n renderHelp(def, parentName)\n },\n\n async run(defs: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void> {\n const { programName, defaultCommandName, version } = opts\n\n const args = argv.length >= 2 && argv[0]?.includes('node') ? argv.slice(2) : argv\n\n if (args[0] === '--version' || args[0] === '-v') {\n console.log(version)\n process.exit(0)\n }\n\n if (args[0] === '--help' || args[0] === '-h') {\n printRootHelp(programName, version, defs)\n process.exit(0)\n }\n\n if (args.length === 0) {\n const defaultDef = defs.find((d) => d.name === defaultCommandName)\n if (defaultDef?.run) {\n await runCommand(defaultDef, [], programName)\n } else {\n printRootHelp(programName, version, defs)\n }\n return\n }\n\n const [first, ...rest] = args\n const isKnownSubcommand = defs.some((d) => d.name === first)\n\n let def: CommandDefinition | undefined\n let commandArgv: string[]\n let parentName: string | undefined\n\n if (isKnownSubcommand) {\n def = defs.find((d) => d.name === first)\n commandArgv = rest\n parentName = programName\n } else {\n def = defs.find((d) => d.name === defaultCommandName)\n commandArgv = args\n parentName = programName\n }\n\n if (!def) {\n console.error(`Unknown command: ${first}`)\n printRootHelp(programName, version, defs)\n process.exit(1)\n }\n\n if (def.subCommands?.length) {\n const [subName, ...subRest] = commandArgv\n const subDef = def.subCommands.find((s) => s.name === subName)\n\n if (subName === '--help' || subName === '-h') {\n renderHelp(def, parentName)\n process.exit(0)\n }\n\n if (!subDef) {\n renderHelp(def, parentName)\n process.exit(subName ? 1 : 0)\n }\n\n await runCommand(subDef, subRest, `${parentName} ${def.name}`)\n return\n }\n\n await runCommand(def, commandArgv, parentName)\n },\n})\n","import { nodeAdapter } from './adapters/nodeAdapter.ts'\nimport type { CLIAdapter, CommandDefinition, RunOptions } from './types.ts'\n\n/**\n * Create a CLI runner bound to a specific adapter.\n * Defaults to the built-in `nodeAdapter` (Node.js `node:util parseArgs`).\n */\nexport function createCLI(options?: { adapter?: CLIAdapter }): {\n run(commands: CommandDefinition[], argv: string[], opts: RunOptions): Promise<void>\n} {\n const adapter = options?.adapter ?? nodeAdapter\n\n return {\n run(commands, argv, opts) {\n return adapter.run(commands, argv, opts)\n },\n }\n}\n","/**\n * Type guard that checks whether a raw string is a member of a typed flag set.\n * Avoids the need for type assertions when working with `Set<T extends string>`.\n */\nexport function isFlag<T extends string>(set: ReadonlySet<T>, value: string): value is T {\n for (const flag of set) {\n if (flag === value) return true\n }\n return false\n}\n","import { styleText } from 'node:util'\nimport { createCLI } from '@internals/utils'\nimport { version } from '../package.json'\nimport { QUITE_FLAGS } from './constants.ts'\nimport { isFlag } from './utils/flags.ts'\nimport { isTelemetryDisabled } from './utils/telemetry.ts'\n\nconst cli = createCLI()\n\nfunction shouldShowTelemetryNotice(argv: Array<string>): boolean {\n if (isTelemetryDisabled()) {\n return false\n }\n // Skip when the user is just asking for help or version info\n if (argv.some((arg) => isFlag(QUITE_FLAGS, arg))) {\n return false\n }\n // Skip in non-interactive / scripting contexts\n if (!process.stdout.isTTY) {\n return false\n }\n return true\n}\n\nexport async function run(argv: Array<string> = process.argv): Promise<void> {\n if (shouldShowTelemetryNotice(argv)) {\n console.log(\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 const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] =\n await Promise.all([\n import('./commands/generate.ts'),\n import('./commands/validate.ts'),\n import('./commands/mcp.ts'),\n import('./commands/agent.ts'),\n import('./commands/init.ts'),\n ])\n\n await cli.run([generateCommand, validateCommand, mcpCommand, agentCommand, initCommand], argv, {\n programName: 'kubb',\n defaultCommandName: 'generate',\n version,\n })\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
2
  const require_shell = require("./shell-7HPrTCJ5.cjs");
3
- const require_constants = require("./constants-BTUap0zs.cjs");
3
+ const require_constants = require("./constants-D0XHAHeZ.cjs");
4
4
  let node_util = require("node:util");
5
5
  let node_fs = require("node:fs");
6
6
  node_fs = require_chunk.__toESM(node_fs);
@@ -303,4 +303,4 @@ async function runInit({ yes, version }) {
303
303
  //#endregion
304
304
  exports.runInit = runInit;
305
305
 
306
- //# sourceMappingURL=init-hmolV6B4.cjs.map
306
+ //# sourceMappingURL=init-BK6inBTR.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-hmolV6B4.cjs","names":["fs","path","spawnAsync","pluginDefaultConfigs","process","clack","initDefaults","path","fs"],"sources":["../../../internals/utils/src/packageManager.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file name that uniquely identifies this package manager in a project root. */\n lockFile: string\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/**\n * Detects the active package manager for the given directory.\n * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.\n * Falls back to npm when no signal is found.\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = join(cwd, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(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 (existsSync(join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@internals/utils'\nimport { spawnAsync } from '@internals/utils'\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await spawnAsync(packageManager.name, commands[packageManager.name], { cwd })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { PackageManagerInfo } from '@internals/utils'\nimport { detectPackageManager } from '@internals/utils'\nimport { initDefaults, pluginDefaultConfigs } from '../constants.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst availablePlugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n const config = (pluginDefaultConfigs as Record<string, string>)[plugin.value] ?? `${plugin.importName}()`\n return ` ${config},`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nfunction cancelAndExit(message = 'Operation cancelled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n yes: boolean\n version: string\n}\n\nexport async function runInit({ yes, version }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n clack.intro(styleText('bgCyan', styleText('black', ' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n let inputPath: string\n if (yes) {\n inputPath = initDefaults.inputPath\n clack.log.info(`Using input path: ${styleText('cyan', inputPath)}`)\n } else {\n const inputPathResult = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPathResult)) {\n cancelAndExit()\n }\n inputPath = inputPathResult as string\n }\n\n // Prompt for output directory\n let outputPath: string\n if (yes) {\n outputPath = initDefaults.outputPath\n clack.log.info(`Using output path: ${styleText('cyan', outputPath)}`)\n } else {\n const outputPathResult = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPathResult)) {\n cancelAndExit()\n }\n outputPath = outputPathResult as string\n }\n\n // Plugin selection\n let selectedPlugins: PluginOption[]\n if (yes) {\n selectedPlugins = availablePlugins.filter((plugin) => (initDefaults.plugins as readonly string[]).includes(plugin.value))\n clack.log.info(`Using plugins: ${styleText('cyan', selectedPlugins.map((p) => p.label).join(', '))}`)\n } else {\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n cancelAndExit()\n }\n\n selectedPlugins = availablePlugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n }\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(availablePlugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n clack.outro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ' Or start a stream server with: npx kubb start') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"init-BK6inBTR.cjs","names":["fs","path","spawnAsync","pluginDefaultConfigs","process","clack","initDefaults","path","fs"],"sources":["../../../internals/utils/src/packageManager.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file name that uniquely identifies this package manager in a project root. */\n lockFile: string\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/**\n * Detects the active package manager for the given directory.\n * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.\n * Falls back to npm when no signal is found.\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = join(cwd, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(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 (existsSync(join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@internals/utils'\nimport { spawnAsync } from '@internals/utils'\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await spawnAsync(packageManager.name, commands[packageManager.name], { cwd })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { PackageManagerInfo } from '@internals/utils'\nimport { detectPackageManager } from '@internals/utils'\nimport { initDefaults, pluginDefaultConfigs } from '../constants.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst availablePlugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n const config = (pluginDefaultConfigs as Record<string, string>)[plugin.value] ?? `${plugin.importName}()`\n return ` ${config},`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nfunction cancelAndExit(message = 'Operation cancelled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n yes: boolean\n version: string\n}\n\nexport async function runInit({ yes, version }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n clack.intro(styleText('bgCyan', styleText('black', ' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n let inputPath: string\n if (yes) {\n inputPath = initDefaults.inputPath\n clack.log.info(`Using input path: ${styleText('cyan', inputPath)}`)\n } else {\n const inputPathResult = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPathResult)) {\n cancelAndExit()\n }\n inputPath = inputPathResult as string\n }\n\n // Prompt for output directory\n let outputPath: string\n if (yes) {\n outputPath = initDefaults.outputPath\n clack.log.info(`Using output path: ${styleText('cyan', outputPath)}`)\n } else {\n const outputPathResult = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPathResult)) {\n cancelAndExit()\n }\n outputPath = outputPathResult as string\n }\n\n // Plugin selection\n let selectedPlugins: PluginOption[]\n if (yes) {\n selectedPlugins = availablePlugins.filter((plugin) => (initDefaults.plugins as readonly string[]).includes(plugin.value))\n clack.log.info(`Using plugins: ${styleText('cyan', selectedPlugins.map((p) => p.label).join(', '))}`)\n } else {\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n cancelAndExit()\n }\n\n selectedPlugins = availablePlugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n }\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(availablePlugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n clack.outro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ' Or start a stream server with: npx kubb start') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import "./chunk--u3MIqq1.js";
2
2
  import { t as spawnAsync } from "./shell-DqqWsHCD.js";
3
- import { o as initDefaults, s as pluginDefaultConfigs } from "./constants-CM3dJzjK.js";
3
+ import { c as pluginDefaultConfigs, s as initDefaults } from "./constants-DJM9zCXm.js";
4
4
  import { styleText } from "node:util";
5
5
  import fs, { existsSync, readFileSync } from "node:fs";
6
6
  import path, { join } from "node:path";
@@ -299,4 +299,4 @@ async function runInit({ yes, version }) {
299
299
  //#endregion
300
300
  export { runInit };
301
301
 
302
- //# sourceMappingURL=init-C-InrmSY.js.map
302
+ //# sourceMappingURL=init-BQ6zfsnw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-C-InrmSY.js","names":["process"],"sources":["../../../internals/utils/src/packageManager.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file name that uniquely identifies this package manager in a project root. */\n lockFile: string\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/**\n * Detects the active package manager for the given directory.\n * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.\n * Falls back to npm when no signal is found.\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = join(cwd, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(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 (existsSync(join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@internals/utils'\nimport { spawnAsync } from '@internals/utils'\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await spawnAsync(packageManager.name, commands[packageManager.name], { cwd })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { PackageManagerInfo } from '@internals/utils'\nimport { detectPackageManager } from '@internals/utils'\nimport { initDefaults, pluginDefaultConfigs } from '../constants.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst availablePlugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n const config = (pluginDefaultConfigs as Record<string, string>)[plugin.value] ?? `${plugin.importName}()`\n return ` ${config},`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nfunction cancelAndExit(message = 'Operation cancelled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n yes: boolean\n version: string\n}\n\nexport async function runInit({ yes, version }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n clack.intro(styleText('bgCyan', styleText('black', ' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n let inputPath: string\n if (yes) {\n inputPath = initDefaults.inputPath\n clack.log.info(`Using input path: ${styleText('cyan', inputPath)}`)\n } else {\n const inputPathResult = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPathResult)) {\n cancelAndExit()\n }\n inputPath = inputPathResult as string\n }\n\n // Prompt for output directory\n let outputPath: string\n if (yes) {\n outputPath = initDefaults.outputPath\n clack.log.info(`Using output path: ${styleText('cyan', outputPath)}`)\n } else {\n const outputPathResult = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPathResult)) {\n cancelAndExit()\n }\n outputPath = outputPathResult as string\n }\n\n // Plugin selection\n let selectedPlugins: PluginOption[]\n if (yes) {\n selectedPlugins = availablePlugins.filter((plugin) => (initDefaults.plugins as readonly string[]).includes(plugin.value))\n clack.log.info(`Using plugins: ${styleText('cyan', selectedPlugins.map((p) => p.label).join(', '))}`)\n } else {\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n cancelAndExit()\n }\n\n selectedPlugins = availablePlugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n }\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(availablePlugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n clack.outro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ' Or start a stream server with: npx kubb start') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":";;;;;;;;;AAcA,MAAa,kBAAkE;CAC7E,MAAM;EACJ,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,MAAM;EACJ,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,KAAK;EACH,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,KAAK;EACH,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,WAAW,aAAa;EAC1C;CACF;;;;;;AAaD,SAAgB,qBAAqB,MAAc,QAAQ,KAAK,EAAsB;CACpF,MAAM,kBAAkB,KAAK,KAAK,eAAe;AACjD,KAAI,WAAW,gBAAgB,CAC7B,KAAI;EAEF,MAAM,UADc,KAAK,MAAM,aAAa,iBAAiB,QAAQ,CAAC,CAC1C;AAC5B,MAAI,OAAO,YAAY,UAAU;GAC/B,MAAM,OAAO,QAAQ,MAAM,IAAI,CAAC;AAChC,OAAI,QAAQ,QAAQ,gBAClB,QAAO,gBAAgB;;SAGrB;AAKV,MAAK,MAAM,MAAM,OAAO,OAAO,gBAAgB,CAC7C,KAAI,WAAW,KAAK,KAAK,GAAG,SAAS,CAAC,CACpC,QAAO;AAIX,QAAO,gBAAgB;;;;AClEzB,SAAgB,eAAe,MAAc,QAAQ,KAAK,EAAW;AACnE,QAAO,GAAG,WAAW,KAAK,KAAK,KAAK,eAAe,CAAC;;AAGtD,eAAsB,gBAAgB,KAAa,gBAAmD;AAQpG,OAAM,WAAW,eAAe,MAPuB;EACrD,KAAK,CAAC,QAAQ,KAAK;EACnB,MAAM,CAAC,OAAO;EACd,MAAM,CAAC,QAAQ,KAAK;EACpB,KAAK,CAAC,QAAQ,KAAK;EACpB,CAE8C,eAAe,OAAO,EAAE,KAAK,CAAC;;AAG/E,eAAsB,gBAAgB,UAAoB,gBAAoC,MAAc,QAAQ,KAAK,EAAiB;AACxI,OAAM,WAAW,eAAe,MAAM,CAAC,GAAG,eAAe,gBAAgB,GAAG,SAAS,EAAE,EAAE,KAAK,CAAC;;;;ACFjG,MAAM,mBAAmC;CACvC;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACF;AAED,SAAS,mBAAmB,iBAAiC,WAAmB,YAA4B;AAU1G,QAAO;EATS,gBAAgB,KAAK,WAAW,YAAY,OAAO,WAAW,WAAW,OAAO,YAAY,GAAG,CAAC,KAAK,KAAK,CAUlH;;;;;aAKG,UAAU;;;aAGV,WAAW;;;;EAhBA,gBACnB,KAAK,WAAW;AAEf,SAAO,OADS,qBAAgD,OAAO,UAAU,GAAG,OAAO,WAAW,IACjF;GACrB,CACD,KAAK,KAAK,CAeC;;;;;AAMhB,SAAS,cAAc,UAAU,wBAA+B;AAC9D,OAAM,OAAO,QAAQ;AACrB,WAAQ,KAAK,EAAE;;AAQjB,eAAsB,QAAQ,EAAE,KAAK,WAAuC;CAC1E,MAAM,MAAMA,UAAQ,KAAK;AAEzB,OAAM,MAAM,UAAU,UAAU,UAAU,SAAS,cAAc,CAAC,CAAC;AAEnE,KAAI;EAEF,IAAI;AACJ,MAAI,CAAC,eAAe,IAAI,EAAE;AACxB,OAAI,CAAC,KAAK;IACR,MAAM,aAAa,MAAM,MAAM,QAAQ;KACrC,SAAS;KACT,cAAc;KACf,CAAC;AAEF,QAAI,MAAM,SAAS,WAAW,IAAI,CAAC,WACjC,gBAAe;;AAInB,oBAAiB,qBAAqB,IAAI;GAE1C,MAAM,UAAU,MAAM,SAAS;AAC/B,WAAQ,MAAM,kCAAkC,eAAe,OAAO;AAEtE,SAAM,gBAAgB,KAAK,eAAe;AAE1C,WAAQ,KAAK,6BAA6B,eAAe,OAAO;SAC3D;AACL,oBAAiB,qBAAqB,IAAI;AAC1C,SAAM,IAAI,KAAK,6BAA6B,UAAU,QAAQ,eAAe,KAAK,GAAG;;EAIvF,IAAI;AACJ,MAAI,KAAK;AACP,eAAY,aAAa;AACzB,SAAM,IAAI,KAAK,qBAAqB,UAAU,QAAQ,UAAU,GAAG;SAC9D;GACL,MAAM,kBAAkB,MAAM,MAAM,KAAK;IACvC,SAAS;IACT,aAAa,aAAa;IAC1B,cAAc,aAAa;IAC3B,WAAW,UAAU;AACnB,SAAI,CAAC,MAAO,QAAO;;IAEtB,CAAC;AAEF,OAAI,MAAM,SAAS,gBAAgB,CACjC,gBAAe;AAEjB,eAAY;;EAId,IAAI;AACJ,MAAI,KAAK;AACP,gBAAa,aAAa;AAC1B,SAAM,IAAI,KAAK,sBAAsB,UAAU,QAAQ,WAAW,GAAG;SAChE;GACL,MAAM,mBAAmB,MAAM,MAAM,KAAK;IACxC,SAAS;IACT,aAAa,aAAa;IAC1B,cAAc,aAAa;IAC3B,WAAW,UAAU;AACnB,SAAI,CAAC,MAAO,QAAO;;IAEtB,CAAC;AAEF,OAAI,MAAM,SAAS,iBAAiB,CAClC,gBAAe;AAEjB,gBAAa;;EAIf,IAAI;AACJ,MAAI,KAAK;AACP,qBAAkB,iBAAiB,QAAQ,WAAY,aAAa,QAA8B,SAAS,OAAO,MAAM,CAAC;AACzH,SAAM,IAAI,KAAK,kBAAkB,UAAU,QAAQ,gBAAgB,KAAK,MAAM,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,GAAG;SAChG;GACL,MAAM,uBAAuB,MAAM,MAAM,YAAY;IACnD,SAAS;IACT,SAAS,iBAAiB,KAAK,YAAY;KACzC,OAAO,OAAO;KACd,OAAO,OAAO;KACd,MAAM,OAAO;KACd,EAAE;IACH,eAAe,CAAC,GAAG,aAAa,QAAQ;IACxC,UAAU;IACX,CAAC;AAEF,OAAI,MAAM,SAAS,qBAAqB,CACtC,gBAAe;AAGjB,qBAAkB,iBAAiB,QAAQ,WAAY,qBAAkC,SAAS,OAAO,MAAM,CAAC;;AAIlH,MAAI,CAAC,gBAAgB,MAAM,MAAM,EAAE,UAAU,aAAa,CACxD,iBAAgB,QAAQ,iBAAiB,MAAM,MAAM,EAAE,UAAU,aAAa,CAAE;EAIlF,MAAM,oBAAoB;GAAC;GAAc;GAAa;GAAe,GAAG,gBAAgB,KAAK,MAAM,EAAE,YAAY;GAAC;EAElH,MAAM,UAAU,MAAM,SAAS;AAC/B,UAAQ,MAAM,cAAc,kBAAkB,OAAO,iBAAiB,eAAe,OAAO;AAE5F,MAAI;AACF,SAAM,gBAAgB,mBAAmB,gBAAgB,IAAI;AAC7D,WAAQ,KAAK,aAAa,kBAAkB,OAAO,WAAW;WACvD,OAAO;AACd,WAAQ,KAAK,sBAAsB;AACnC,SAAM;;EAIR,MAAM,gBAAgB,MAAM,SAAS;AACrC,gBAAc,MAAM,0BAA0B;EAE9C,MAAM,gBAAgB,mBAAmB,iBAAiB,WAAW,WAAW;EAChF,MAAM,aAAa,KAAK,KAAK,KAAK,iBAAiB;AAEnD,MAAI,GAAG,WAAW,WAAW,EAAE;AAC7B,iBAAc,KAAK,gCAAgC;AAEnD,OAAI,CAAC,KAAK;IACR,MAAM,kBAAkB,MAAM,MAAM,QAAQ;KAC1C,SAAS;KACT,cAAc;KACf,CAAC;AAEF,QAAI,MAAM,SAAS,gBAAgB,IAAI,CAAC,gBACtC,eAAc,gEAAgE;;AAIlF,iBAAc,MAAM,6BAA6B;;AAGnD,KAAG,cAAc,YAAY,eAAe,QAAQ;AAEpD,gBAAc,KAAK,yBAAyB;AAE5C,QAAM,MACJ,UAAU,SAAS,aAAa,GAC9B,SACA,UAAU,OAAO,cAAc,GAC/B,OACA,UAAU,QAAQ,2CAA2C,YAAY,GACzE,OACA,UAAU,QAAQ,6CAA6C,GAC/D,OACA,UAAU,QAAQ,qDAAqD,GACvE,OACA,UAAU,QAAQ,iCAAiC,aAAa,GAChE,SACA,UAAU,OAAO,SAAS,eAAe,KAAK,WAAW,UAAU,CACtE;UACM,OAAO;AACd,QAAM,IAAI,MAAM,UAAU,OAAO,0CAA0C,CAAC;AAC5E,MAAI,iBAAiB,MACnB,OAAM,IAAI,MAAM,MAAM,QAAQ;AAEhC,YAAQ,KAAK,EAAE"}
1
+ {"version":3,"file":"init-BQ6zfsnw.js","names":["process"],"sources":["../../../internals/utils/src/packageManager.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file name that uniquely identifies this package manager in a project root. */\n lockFile: string\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/**\n * Detects the active package manager for the given directory.\n * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.\n * Falls back to npm when no signal is found.\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = join(cwd, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(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 (existsSync(join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@internals/utils'\nimport { spawnAsync } from '@internals/utils'\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await spawnAsync(packageManager.name, commands[packageManager.name], { cwd })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { PackageManagerInfo } from '@internals/utils'\nimport { detectPackageManager } from '@internals/utils'\nimport { initDefaults, pluginDefaultConfigs } from '../constants.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst availablePlugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n const config = (pluginDefaultConfigs as Record<string, string>)[plugin.value] ?? `${plugin.importName}()`\n return ` ${config},`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nfunction cancelAndExit(message = 'Operation cancelled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n yes: boolean\n version: string\n}\n\nexport async function runInit({ yes, version }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n clack.intro(styleText('bgCyan', styleText('black', ' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n let inputPath: string\n if (yes) {\n inputPath = initDefaults.inputPath\n clack.log.info(`Using input path: ${styleText('cyan', inputPath)}`)\n } else {\n const inputPathResult = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPathResult)) {\n cancelAndExit()\n }\n inputPath = inputPathResult as string\n }\n\n // Prompt for output directory\n let outputPath: string\n if (yes) {\n outputPath = initDefaults.outputPath\n clack.log.info(`Using output path: ${styleText('cyan', outputPath)}`)\n } else {\n const outputPathResult = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPathResult)) {\n cancelAndExit()\n }\n outputPath = outputPathResult as string\n }\n\n // Plugin selection\n let selectedPlugins: PluginOption[]\n if (yes) {\n selectedPlugins = availablePlugins.filter((plugin) => (initDefaults.plugins as readonly string[]).includes(plugin.value))\n clack.log.info(`Using plugins: ${styleText('cyan', selectedPlugins.map((p) => p.label).join(', '))}`)\n } else {\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n cancelAndExit()\n }\n\n selectedPlugins = availablePlugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n }\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(availablePlugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n clack.outro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ' Or start a stream server with: npx kubb start') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  require("./chunk-ByKO4r7w.cjs");
2
2
  const require_define = require("./define-D6Kfm7-Z.cjs");
3
- const require_package = require("./package-DZb6I8FQ.cjs");
3
+ const require_package = require("./package-BJ6ionm6.cjs");
4
4
  //#region src/commands/init.ts
5
5
  const command = require_define.defineCommand({
6
6
  name: "init",
@@ -12,7 +12,7 @@ const command = require_define.defineCommand({
12
12
  default: false
13
13
  } },
14
14
  async run({ values }) {
15
- const { runInit } = await Promise.resolve().then(() => require("./init-hmolV6B4.cjs"));
15
+ const { runInit } = await Promise.resolve().then(() => require("./init-BK6inBTR.cjs"));
16
16
  await runInit({
17
17
  yes: values.yes,
18
18
  version: require_package.version
@@ -22,4 +22,4 @@ const command = require_define.defineCommand({
22
22
  //#endregion
23
23
  exports.command = command;
24
24
 
25
- //# sourceMappingURL=init-DkwG4Gbs.cjs.map
25
+ //# sourceMappingURL=init-CN1JFyGX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-DkwG4Gbs.cjs","names":["defineCommand"],"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n options: {\n yes: { type: 'boolean', description: 'Skip prompts and use default options', short: 'y', default: false },\n },\n async run({ values }) {\n const { runInit } = await import('../runners/init.ts')\n\n await runInit({ yes: values.yes, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAUA,eAAAA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,KAAK;EAAE,MAAM;EAAW,aAAa;EAAwC,OAAO;EAAK,SAAS;EAAO,EAC1G;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,YAAY,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,sBAAA,CAAA;AAE1B,QAAM,QAAQ;GAAE,KAAK,OAAO;GAAK,SAAA,gBAAA;GAAS,CAAC;;CAE9C,CAAC"}
1
+ {"version":3,"file":"init-CN1JFyGX.cjs","names":["defineCommand"],"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n options: {\n yes: { type: 'boolean', description: 'Skip prompts and use default options', short: 'y', default: false },\n },\n async run({ values }) {\n const { runInit } = await import('../runners/init.ts')\n\n await runInit({ yes: values.yes, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAUA,eAAAA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,KAAK;EAAE,MAAM;EAAW,aAAa;EAAwC,OAAO;EAAK,SAAS;EAAO,EAC1G;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,YAAY,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,sBAAA,CAAA;AAE1B,QAAM,QAAQ;GAAE,KAAK,OAAO;GAAK,SAAA,gBAAA;GAAS,CAAC;;CAE9C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import "./chunk--u3MIqq1.js";
2
2
  import { n as defineCommand } from "./define--M_JMcDC.js";
3
- import { t as version } from "./package-DLd3fZNd.js";
3
+ import { t as version } from "./package-BKZ0H3Zf.js";
4
4
  //#region src/commands/init.ts
5
5
  const command = defineCommand({
6
6
  name: "init",
@@ -12,7 +12,7 @@ const command = defineCommand({
12
12
  default: false
13
13
  } },
14
14
  async run({ values }) {
15
- const { runInit } = await import("./init-C-InrmSY.js");
15
+ const { runInit } = await import("./init-BQ6zfsnw.js");
16
16
  await runInit({
17
17
  yes: values.yes,
18
18
  version
@@ -22,4 +22,4 @@ const command = defineCommand({
22
22
  //#endregion
23
23
  export { command };
24
24
 
25
- //# sourceMappingURL=init-BqkRvRTM.js.map
25
+ //# sourceMappingURL=init-iN7e1XwI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-BqkRvRTM.js","names":[],"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n options: {\n yes: { type: 'boolean', description: 'Skip prompts and use default options', short: 'y', default: false },\n },\n async run({ values }) {\n const { runInit } = await import('../runners/init.ts')\n\n await runInit({ yes: values.yes, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAU,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,KAAK;EAAE,MAAM;EAAW,aAAa;EAAwC,OAAO;EAAK,SAAS;EAAO,EAC1G;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,QAAM,QAAQ;GAAE,KAAK,OAAO;GAAK;GAAS,CAAC;;CAE9C,CAAC"}
1
+ {"version":3,"file":"init-iN7e1XwI.js","names":[],"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n options: {\n yes: { type: 'boolean', description: 'Skip prompts and use default options', short: 'y', default: false },\n },\n async run({ values }) {\n const { runInit } = await import('../runners/init.ts')\n\n await runInit({ yes: values.yes, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAU,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,KAAK;EAAE,MAAM;EAAW,aAAa;EAAwC,OAAO;EAAK,SAAS;EAAO,EAC1G;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,QAAM,QAAQ;GAAE,KAAK,OAAO;GAAK;GAAS,CAAC;;CAE9C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import "./chunk--u3MIqq1.js";
2
2
  import { t as getErrorMessage } from "./errors-6mF_WKxg.js";
3
- import { r as sendTelemetry, t as buildTelemetryEvent } from "./telemetry-DxiR7clS.js";
3
+ import { r as sendTelemetry, t as buildTelemetryEvent } from "./telemetry-BF3SMlH6.js";
4
4
  import { t as jiti } from "./jiti-e08mD2Ph.js";
5
5
  import { styleText } from "node:util";
6
6
  import process from "node:process";
@@ -38,4 +38,4 @@ async function runMcp({ version }) {
38
38
  //#endregion
39
39
  export { runMcp };
40
40
 
41
- //# sourceMappingURL=mcp-D2SHEg_d.js.map
41
+ //# sourceMappingURL=mcp-BiGUvbWP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-D2SHEg_d.js","names":[],"sources":["../src/runners/mcp.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getErrorMessage } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { jiti } from '../utils/jiti.ts'\nimport { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'\n\ntype McpOptions = {\n version: string\n}\n\nexport async function runMcp({ version }: McpOptions): Promise<void> {\n let mod: typeof McpModule\n try {\n mod = (await jiti.import('@kubb/mcp', { default: true })) as typeof McpModule\n } catch (_e) {\n console.error(`Import of '@kubb/mcp' is required to start the MCP server`)\n process.exit(1)\n }\n\n const { run } = mod\n const hrStart = process.hrtime()\n try {\n console.log('⏳ Starting MCP server...')\n console.warn(styleText('yellow', 'This feature is still under development — use with caution'))\n run()\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'success' }))\n } catch (error) {\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'failed' }))\n console.error(getErrorMessage(error))\n }\n}\n"],"mappings":";;;;;;;AAWA,eAAsB,OAAO,EAAE,WAAsC;CACnE,IAAI;AACJ,KAAI;AACF,QAAO,MAAM,KAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;UACjD,IAAI;AACX,UAAQ,MAAM,4DAA4D;AAC1E,UAAQ,KAAK,EAAE;;CAGjB,MAAM,EAAE,QAAQ;CAChB,MAAM,UAAU,QAAQ,QAAQ;AAChC,KAAI;AACF,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,KAAK,UAAU,UAAU,6DAA6D,CAAC;AAC/F,OAAK;AACL,QAAM,cAAc,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAW,CAAC,CAAC;UACvG,OAAO;AACd,QAAM,cAAc,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAU,CAAC,CAAC;AAC7G,UAAQ,MAAM,gBAAgB,MAAM,CAAC"}
1
+ {"version":3,"file":"mcp-BiGUvbWP.js","names":[],"sources":["../src/runners/mcp.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getErrorMessage } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { jiti } from '../utils/jiti.ts'\nimport { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'\n\ntype McpOptions = {\n version: string\n}\n\nexport async function runMcp({ version }: McpOptions): Promise<void> {\n let mod: typeof McpModule\n try {\n mod = (await jiti.import('@kubb/mcp', { default: true })) as typeof McpModule\n } catch (_e) {\n console.error(`Import of '@kubb/mcp' is required to start the MCP server`)\n process.exit(1)\n }\n\n const { run } = mod\n const hrStart = process.hrtime()\n try {\n console.log('⏳ Starting MCP server...')\n console.warn(styleText('yellow', 'This feature is still under development — use with caution'))\n run()\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'success' }))\n } catch (error) {\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'failed' }))\n console.error(getErrorMessage(error))\n }\n}\n"],"mappings":";;;;;;;AAWA,eAAsB,OAAO,EAAE,WAAsC;CACnE,IAAI;AACJ,KAAI;AACF,QAAO,MAAM,KAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;UACjD,IAAI;AACX,UAAQ,MAAM,4DAA4D;AAC1E,UAAQ,KAAK,EAAE;;CAGjB,MAAM,EAAE,QAAQ;CAChB,MAAM,UAAU,QAAQ,QAAQ;AAChC,KAAI;AACF,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,KAAK,UAAU,UAAU,6DAA6D,CAAC;AAC/F,OAAK;AACL,QAAM,cAAc,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAW,CAAC,CAAC;UACvG,OAAO;AACd,QAAM,cAAc,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAU,CAAC,CAAC;AAC7G,UAAQ,MAAM,gBAAgB,MAAM,CAAC"}