@kubb/cli 4.32.3 → 4.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/agent-CJ69TqoO.js +87 -0
  2. package/dist/agent-CJ69TqoO.js.map +1 -0
  3. package/dist/agent-CduUX7Ye.cjs +91 -0
  4. package/dist/agent-CduUX7Ye.cjs.map +1 -0
  5. package/dist/agent-D0A3RQho.js +57 -0
  6. package/dist/agent-D0A3RQho.js.map +1 -0
  7. package/dist/agent-DrnwQBZf.cjs +60 -0
  8. package/dist/agent-DrnwQBZf.cjs.map +1 -0
  9. package/dist/constants-CEKRremI.js +79 -0
  10. package/dist/constants-CEKRremI.js.map +1 -0
  11. package/dist/constants-CnPOlsJq.cjs +126 -0
  12. package/dist/constants-CnPOlsJq.cjs.map +1 -0
  13. package/dist/errors-BUjJsNoe.cjs +44 -0
  14. package/dist/errors-BUjJsNoe.cjs.map +1 -0
  15. package/dist/errors-bSLTEh4e.js +27 -0
  16. package/dist/errors-bSLTEh4e.js.map +1 -0
  17. package/dist/{generate-DFdkL6Kp.cjs → generate-ByMgAV76.cjs} +423 -577
  18. package/dist/generate-ByMgAV76.cjs.map +1 -0
  19. package/dist/generate-CiUPO5ds.cjs +65 -0
  20. package/dist/generate-CiUPO5ds.cjs.map +1 -0
  21. package/dist/generate-DIIxtkWT.js +66 -0
  22. package/dist/generate-DIIxtkWT.js.map +1 -0
  23. package/dist/{generate-zZuxBP8z.js → generate-HP5ySfjV.js} +422 -577
  24. package/dist/generate-HP5ySfjV.js.map +1 -0
  25. package/dist/index.cjs +226 -35
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +226 -35
  29. package/dist/index.js.map +1 -1
  30. package/dist/init-Cd1hCb7q.cjs +296 -0
  31. package/dist/init-Cd1hCb7q.cjs.map +1 -0
  32. package/dist/init-DLNrkDF4.js +25 -0
  33. package/dist/init-DLNrkDF4.js.map +1 -0
  34. package/dist/init-Df_aXezV.cjs +24 -0
  35. package/dist/init-Df_aXezV.cjs.map +1 -0
  36. package/dist/init-DyKK2fTp.js +291 -0
  37. package/dist/init-DyKK2fTp.js.map +1 -0
  38. package/dist/jiti-BdskUHhD.cjs +16 -0
  39. package/dist/jiti-BdskUHhD.cjs.map +1 -0
  40. package/dist/jiti-Cl7t20dO.js +11 -0
  41. package/dist/jiti-Cl7t20dO.js.map +1 -0
  42. package/dist/mcp-B73FC8dF.cjs +42 -0
  43. package/dist/mcp-B73FC8dF.cjs.map +1 -0
  44. package/dist/mcp-Bd9LITaI.js +16 -0
  45. package/dist/mcp-Bd9LITaI.js.map +1 -0
  46. package/dist/mcp-Cf-1dsB-.js +41 -0
  47. package/dist/mcp-Cf-1dsB-.js.map +1 -0
  48. package/dist/mcp-Clg-Qnkr.cjs +15 -0
  49. package/dist/mcp-Clg-Qnkr.cjs.map +1 -0
  50. package/dist/package-681jTtCk.js +6 -0
  51. package/dist/package-681jTtCk.js.map +1 -0
  52. package/dist/{package-C2pulzfz.cjs → package-aKgzEJtp.cjs} +2 -2
  53. package/dist/package-aKgzEJtp.cjs.map +1 -0
  54. package/dist/{telemetry-DYWvlxqs.js → telemetry-C4gOKX2x.js} +31 -10
  55. package/dist/telemetry-C4gOKX2x.js.map +1 -0
  56. package/dist/{telemetry-BDSSqUiG.cjs → telemetry-T5IA2dWA.cjs} +40 -7
  57. package/dist/telemetry-T5IA2dWA.cjs.map +1 -0
  58. package/dist/types-CLtz0jem.js +25 -0
  59. package/dist/types-CLtz0jem.js.map +1 -0
  60. package/dist/types-Ck2lzFON.cjs +36 -0
  61. package/dist/types-Ck2lzFON.cjs.map +1 -0
  62. package/dist/validate-Chjg23AE.js +41 -0
  63. package/dist/validate-Chjg23AE.js.map +1 -0
  64. package/dist/validate-Cr26q5xX.js +25 -0
  65. package/dist/validate-Cr26q5xX.js.map +1 -0
  66. package/dist/validate-DURmg-2Q.cjs +24 -0
  67. package/dist/validate-DURmg-2Q.cjs.map +1 -0
  68. package/dist/validate-Dqi9T_c4.cjs +42 -0
  69. package/dist/validate-Dqi9T_c4.cjs.map +1 -0
  70. package/package.json +5 -6
  71. package/src/cli/adapters/nodeAdapter.ts +159 -0
  72. package/src/cli/help.ts +36 -0
  73. package/src/cli/index.ts +16 -0
  74. package/src/cli/parse.ts +18 -0
  75. package/src/cli/schema.ts +38 -0
  76. package/src/cli/types.ts +95 -0
  77. package/src/commands/agent/start.ts +27 -136
  78. package/src/commands/agent.ts +6 -25
  79. package/src/commands/generate.ts +26 -158
  80. package/src/commands/init.ts +9 -360
  81. package/src/commands/mcp.ts +7 -52
  82. package/src/commands/validate.ts +9 -60
  83. package/src/constants.ts +77 -0
  84. package/src/index.ts +36 -42
  85. package/src/loggers/clackLogger.ts +42 -140
  86. package/src/loggers/fileSystemLogger.ts +1 -12
  87. package/src/loggers/githubActionsLogger.ts +36 -101
  88. package/src/loggers/plainLogger.ts +23 -70
  89. package/src/loggers/utils.ts +66 -2
  90. package/src/runners/agent.ts +100 -0
  91. package/src/runners/generate.ts +208 -100
  92. package/src/runners/init.ts +322 -0
  93. package/src/runners/mcp.ts +32 -0
  94. package/src/runners/validate.ts +35 -0
  95. package/src/utils/Writables.ts +2 -2
  96. package/src/utils/envDetection.ts +34 -0
  97. package/src/utils/errors.ts +23 -0
  98. package/src/utils/executeHooks.ts +18 -6
  99. package/src/utils/getCosmiConfig.ts +10 -11
  100. package/src/utils/getIntro.ts +17 -18
  101. package/src/utils/getSummary.ts +11 -15
  102. package/src/utils/jiti.ts +9 -0
  103. package/src/utils/packageManager.ts +3 -3
  104. package/src/utils/randomColor.ts +3 -12
  105. package/src/utils/runHook.ts +75 -0
  106. package/src/utils/spawnAsync.ts +47 -0
  107. package/src/utils/telemetry.ts +8 -25
  108. package/src/utils/watcher.ts +2 -4
  109. package/dist/agent-BuijLPSZ.cjs +0 -20
  110. package/dist/agent-BuijLPSZ.cjs.map +0 -1
  111. package/dist/agent-Dswt_kxP.js +0 -20
  112. package/dist/agent-Dswt_kxP.js.map +0 -1
  113. package/dist/generate-DFdkL6Kp.cjs.map +0 -1
  114. package/dist/generate-zZuxBP8z.js.map +0 -1
  115. package/dist/init-CNLk2fNd.js +0 -304
  116. package/dist/init-CNLk2fNd.js.map +0 -1
  117. package/dist/init-CSP6FGaW.cjs +0 -308
  118. package/dist/init-CSP6FGaW.cjs.map +0 -1
  119. package/dist/mcp-44Od-yig.cjs +0 -57
  120. package/dist/mcp-44Od-yig.cjs.map +0 -1
  121. package/dist/mcp-CgaHrkDs.js +0 -57
  122. package/dist/mcp-CgaHrkDs.js.map +0 -1
  123. package/dist/package--eaEMq2R.js +0 -6
  124. package/dist/package--eaEMq2R.js.map +0 -1
  125. package/dist/package-C2pulzfz.cjs.map +0 -1
  126. package/dist/start-CB8afXV6.cjs +0 -134
  127. package/dist/start-CB8afXV6.cjs.map +0 -1
  128. package/dist/start-DHPjtHJj.js +0 -131
  129. package/dist/start-DHPjtHJj.js.map +0 -1
  130. package/dist/telemetry-BDSSqUiG.cjs.map +0 -1
  131. package/dist/telemetry-DYWvlxqs.js.map +0 -1
  132. package/dist/validate-C7s0cFnp.cjs +0 -66
  133. package/dist/validate-C7s0cFnp.cjs.map +0 -1
  134. package/dist/validate-_7cmvjg_.js +0 -66
  135. package/dist/validate-_7cmvjg_.js.map +0 -1
  136. package/src/loggers/envDetection.ts +0 -28
  137. package/src/loggers/index.ts +0 -5
package/dist/index.js CHANGED
@@ -1,47 +1,238 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { t as version } from "./package--eaEMq2R.js";
3
- import { n as isTelemetryDisabled } from "./telemetry-DYWvlxqs.js";
4
- import { styleText } from "node:util";
5
- import { defineCommand, runCommand, runMain } from "citty";
6
- //#region src/index.ts
7
- const main = defineCommand({
8
- meta: {
9
- name: "kubb",
10
- version,
11
- description: "Kubb generation"
12
- },
13
- args: { version: {
2
+ import { t as version } from "./package-681jTtCk.js";
3
+ import { t as defineCLIAdapter } from "./types-CLtz0jem.js";
4
+ import { n as isTelemetryDisabled } from "./telemetry-C4gOKX2x.js";
5
+ import { parseArgs, styleText } from "node:util";
6
+ //#region src/cli/schema.ts
7
+ /**
8
+ * Serializes `CommandDefinition[]` to a plain, JSON-serializable structure.
9
+ * Use to expose CLI capabilities to AI agents or MCP tools.
10
+ */
11
+ function getCommandSchema(defs) {
12
+ return defs.map(serializeCommand);
13
+ }
14
+ function serializeCommand(def) {
15
+ return {
16
+ name: def.name,
17
+ description: def.description,
18
+ arguments: def.arguments,
19
+ options: serializeOptions(def.options ?? {}),
20
+ subCommands: def.subCommands ? def.subCommands.map(serializeCommand) : []
21
+ };
22
+ }
23
+ function serializeOptions(options) {
24
+ return Object.entries(options).map(([name, opt]) => {
25
+ return {
26
+ name,
27
+ flags: `${opt.short ? `-${opt.short}, ` : ""}--${name}${opt.type === "string" ? ` <${opt.hint ?? name}>` : ""}`,
28
+ type: opt.type,
29
+ description: opt.description,
30
+ ...opt.default !== void 0 ? { default: opt.default } : {},
31
+ ...opt.hint ? { hint: opt.hint } : {},
32
+ ...opt.enum ? { enum: opt.enum } : {},
33
+ ...opt.required ? { required: opt.required } : {}
34
+ };
35
+ });
36
+ }
37
+ //#endregion
38
+ //#region src/cli/help.ts
39
+ /** Prints formatted help output for a command using its `CommandDefinition`. */
40
+ function renderHelp(def, parentName) {
41
+ const schema = getCommandSchema([def])[0];
42
+ const programName = parentName ? `${parentName} ${schema.name}` : schema.name;
43
+ const argsPart = schema.arguments?.length ? ` ${schema.arguments.join(" ")}` : "";
44
+ const subCmdPart = schema.subCommands.length ? " <command>" : "";
45
+ console.log(`\n${styleText("bold", "Usage:")} ${programName}${argsPart}${subCmdPart} [options]\n`);
46
+ if (schema.description) console.log(` ${schema.description}\n`);
47
+ if (schema.subCommands.length) {
48
+ console.log(styleText("bold", "Commands:"));
49
+ for (const sub of schema.subCommands) console.log(` ${styleText("cyan", sub.name.padEnd(16))}${sub.description}`);
50
+ console.log();
51
+ }
52
+ const options = [...schema.options, {
53
+ name: "help",
54
+ flags: "-h, --help",
14
55
  type: "boolean",
15
- alias: "v",
16
- description: "Show version number"
17
- } },
18
- async setup({ rawArgs, args }) {
19
- if (args.version) {
56
+ description: "Show help"
57
+ }];
58
+ console.log(styleText("bold", "Options:"));
59
+ for (const opt of options) {
60
+ const flags = styleText("cyan", opt.flags.padEnd(30));
61
+ const defaultPart = opt.default !== void 0 ? styleText("dim", ` (default: ${opt.default})`) : "";
62
+ console.log(` ${flags}${opt.description}${defaultPart}`);
63
+ }
64
+ console.log();
65
+ }
66
+ //#endregion
67
+ //#region src/cli/adapters/nodeAdapter.ts
68
+ function buildParseOptions(def) {
69
+ const result = { help: {
70
+ type: "boolean",
71
+ short: "h"
72
+ } };
73
+ for (const [name, opt] of Object.entries(def.options ?? {})) result[name] = {
74
+ type: opt.type,
75
+ ...opt.short ? { short: opt.short } : {},
76
+ ...opt.default !== void 0 ? { default: opt.default } : {}
77
+ };
78
+ return result;
79
+ }
80
+ async function runCommand(def, argv, parentName) {
81
+ const parseOptions = buildParseOptions(def);
82
+ let parsed;
83
+ try {
84
+ const result = parseArgs({
85
+ args: argv,
86
+ options: parseOptions,
87
+ allowPositionals: true,
88
+ strict: false
89
+ });
90
+ parsed = {
91
+ values: result.values,
92
+ positionals: result.positionals
93
+ };
94
+ } catch {
95
+ renderHelp(def, parentName);
96
+ process.exit(1);
97
+ }
98
+ if (parsed.values["help"]) {
99
+ renderHelp(def, parentName);
100
+ process.exit(0);
101
+ }
102
+ for (const [name, opt] of Object.entries(def.options ?? {})) if (opt.required && parsed.values[name] === void 0) {
103
+ console.error(styleText("red", `Error: --${name} is required`));
104
+ renderHelp(def, parentName);
105
+ process.exit(1);
106
+ }
107
+ if (!def.run) {
108
+ renderHelp(def, parentName);
109
+ process.exit(0);
110
+ }
111
+ try {
112
+ await def.run(parsed);
113
+ } catch (err) {
114
+ console.error(styleText("red", `Error: ${err instanceof Error ? err.message : String(err)}`));
115
+ renderHelp(def, parentName);
116
+ process.exit(1);
117
+ }
118
+ }
119
+ function printRootHelp(programName, version, defs) {
120
+ console.log(`\n${styleText("bold", "Usage:")} ${programName} <command> [options]\n`);
121
+ console.log(` Kubb generation — v${version}\n`);
122
+ console.log(styleText("bold", "Commands:"));
123
+ for (const def of defs) console.log(` ${styleText("cyan", def.name.padEnd(16))}${def.description}`);
124
+ console.log();
125
+ console.log(styleText("bold", "Options:"));
126
+ console.log(` ${styleText("cyan", "-v, --version".padEnd(30))}Show version number`);
127
+ console.log(` ${styleText("cyan", "-h, --help".padEnd(30))}Show help`);
128
+ console.log();
129
+ console.log(`Run ${styleText("cyan", `${programName} <command> --help`)} for command-specific help.\n`);
130
+ }
131
+ /** CLI adapter using `node:util parseArgs`. No external dependencies. */
132
+ const nodeAdapter = defineCLIAdapter({
133
+ renderHelp(def, parentName) {
134
+ renderHelp(def, parentName);
135
+ },
136
+ async run(defs, argv, opts) {
137
+ const { programName, defaultCommandName, version } = opts;
138
+ const args = argv.length >= 2 && argv[0]?.includes("node") ? argv.slice(2) : argv;
139
+ if (args[0] === "--version" || args[0] === "-v") {
20
140
  console.log(version);
21
141
  process.exit(0);
22
142
  }
23
- if (!isTelemetryDisabled()) 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`);
24
- if (![
25
- "generate",
26
- "validate",
27
- "mcp",
28
- "agent",
29
- "init"
30
- ].includes(rawArgs[0])) {
31
- await runCommand(await import("./generate-zZuxBP8z.js").then((r) => r.default), { rawArgs });
143
+ if (args[0] === "--help" || args[0] === "-h") {
144
+ printRootHelp(programName, version, defs);
32
145
  process.exit(0);
33
146
  }
34
- },
35
- subCommands: {
36
- generate: () => import("./generate-zZuxBP8z.js").then((r) => r.default),
37
- validate: () => import("./validate-_7cmvjg_.js").then((r) => r.default),
38
- mcp: () => import("./mcp-CgaHrkDs.js").then((r) => r.default),
39
- agent: () => import("./agent-Dswt_kxP.js").then((r) => r.default),
40
- init: () => import("./init-CNLk2fNd.js").then((r) => r.default)
147
+ if (args.length === 0) {
148
+ const defaultDef = defs.find((d) => d.name === defaultCommandName);
149
+ if (defaultDef?.run) await runCommand(defaultDef, [], programName);
150
+ else printRootHelp(programName, version, defs);
151
+ return;
152
+ }
153
+ const [first, ...rest] = args;
154
+ const isKnownSubcommand = defs.some((d) => d.name === first);
155
+ let def;
156
+ let commandArgv;
157
+ let parentName;
158
+ if (isKnownSubcommand) {
159
+ def = defs.find((d) => d.name === first);
160
+ commandArgv = rest;
161
+ parentName = programName;
162
+ } else {
163
+ def = defs.find((d) => d.name === defaultCommandName);
164
+ commandArgv = args;
165
+ parentName = programName;
166
+ }
167
+ if (!def) {
168
+ console.error(`Unknown command: ${first}`);
169
+ printRootHelp(programName, version, defs);
170
+ process.exit(1);
171
+ }
172
+ if (def.subCommands?.length) {
173
+ const [subName, ...subRest] = commandArgv;
174
+ const subDef = def.subCommands.find((s) => s.name === subName);
175
+ if (subName === "--help" || subName === "-h") {
176
+ renderHelp(def, parentName);
177
+ process.exit(0);
178
+ }
179
+ if (!subDef) {
180
+ renderHelp(def, parentName);
181
+ process.exit(subName ? 1 : 0);
182
+ }
183
+ await runCommand(subDef, subRest, `${parentName} ${def.name}`);
184
+ return;
185
+ }
186
+ await runCommand(def, commandArgv, parentName);
41
187
  }
42
188
  });
43
- async function run(_argv) {
44
- await runMain(main);
189
+ //#endregion
190
+ //#region src/cli/parse.ts
191
+ /**
192
+ * Create a CLI runner bound to a specific adapter.
193
+ * Defaults to the built-in `nodeAdapter` (Node.js `node:util parseArgs`).
194
+ */
195
+ function createCLI(options) {
196
+ const adapter = options?.adapter ?? nodeAdapter;
197
+ return { run(commands, argv, opts) {
198
+ return adapter.run(commands, argv, opts);
199
+ } };
200
+ }
201
+ //#endregion
202
+ //#region src/index.ts
203
+ const cli = createCLI();
204
+ function shouldShowTelemetryNotice(argv) {
205
+ 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;
213
+ if (!process.stdout.isTTY) return false;
214
+ return true;
215
+ }
216
+ async function run(argv = process.argv) {
217
+ 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
+ const [{ command: generateCommand }, { command: validateCommand }, { command: mcpCommand }, { command: agentCommand }, { command: initCommand }] = await Promise.all([
219
+ import("./generate-DIIxtkWT.js"),
220
+ import("./validate-Cr26q5xX.js"),
221
+ import("./mcp-Bd9LITaI.js"),
222
+ import("./agent-D0A3RQho.js"),
223
+ import("./init-DLNrkDF4.js")
224
+ ]);
225
+ await cli.run([
226
+ generateCommand,
227
+ validateCommand,
228
+ mcpCommand,
229
+ agentCommand,
230
+ initCommand
231
+ ], argv, {
232
+ programName: "kubb",
233
+ defaultCommandName: "generate",
234
+ version
235
+ });
45
236
  }
46
237
  //#endregion
47
238
  export { run };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { defineCommand, runCommand, runMain } from 'citty'\nimport { version } from '../package.json'\nimport { isTelemetryDisabled } from './utils/telemetry.ts'\n\nconst main = defineCommand({\n meta: {\n name: 'kubb',\n version,\n description: 'Kubb generation',\n },\n args: {\n version: {\n type: 'boolean',\n alias: 'v',\n description: 'Show version number',\n },\n },\n async setup({ rawArgs, args }) {\n if (args.version) {\n console.log(version)\n process.exit(0)\n }\n\n if (!isTelemetryDisabled()) {\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 if (!['generate', 'validate', 'mcp', 'agent', 'init'].includes(rawArgs[0] as string)) {\n // generate is not being used\n const generateCommand = await import('./commands/generate.ts').then((r) => r.default)\n\n await runCommand(generateCommand, { rawArgs })\n\n process.exit(0)\n }\n },\n subCommands: {\n generate: () => import('./commands/generate.ts').then((r) => r.default),\n validate: () => import('./commands/validate.ts').then((r) => r.default),\n mcp: () => import('./commands/mcp.ts').then((r) => r.default),\n agent: () => import('./commands/agent.ts').then((r) => r.default),\n init: () => import('./commands/init.ts').then((r) => r.default),\n },\n})\n\nexport async function run(_argv?: string[]): Promise<void> {\n await runMain(main)\n}\n"],"mappings":";;;;;;AAKA,MAAM,OAAO,cAAc;CACzB,MAAM;EACJ,MAAM;EACN;EACA,aAAa;EACd;CACD,MAAM,EACJ,SAAS;EACP,MAAM;EACN,OAAO;EACP,aAAa;EACd,EACF;CACD,MAAM,MAAM,EAAE,SAAS,QAAQ;AAC7B,MAAI,KAAK,SAAS;AAChB,WAAQ,IAAI,QAAQ;AACpB,WAAQ,KAAK,EAAE;;AAGjB,MAAI,CAAC,qBAAqB,CACxB,SAAQ,IACN,GAAG,UAAU,UAAU,UAAU,CAAC,uIAAuI,UAAU,QAAQ,2BAA2B,CAAC,KACxN;AAGH,MAAI,CAAC;GAAC;GAAY;GAAY;GAAO;GAAS;GAAO,CAAC,SAAS,QAAQ,GAAa,EAAE;AAIpF,SAAM,WAFkB,MAAM,OAAO,0BAA0B,MAAM,MAAM,EAAE,QAAQ,EAEnD,EAAE,SAAS,CAAC;AAE9C,WAAQ,KAAK,EAAE;;;CAGnB,aAAa;EACX,gBAAgB,OAAO,0BAA0B,MAAM,MAAM,EAAE,QAAQ;EACvE,gBAAgB,OAAO,0BAA0B,MAAM,MAAM,EAAE,QAAQ;EACvE,WAAW,OAAO,qBAAqB,MAAM,MAAM,EAAE,QAAQ;EAC7D,aAAa,OAAO,uBAAuB,MAAM,MAAM,EAAE,QAAQ;EACjE,YAAY,OAAO,sBAAsB,MAAM,MAAM,EAAE,QAAQ;EAChE;CACF,CAAC;AAEF,eAAsB,IAAI,OAAiC;AACzD,OAAM,QAAQ,KAAK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/cli/schema.ts","../src/cli/help.ts","../src/cli/adapters/nodeAdapter.ts","../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 { renderHelp } from '../help.ts'\nimport type { CommandDefinition, OptionType, ParsedArgs, RunOptions } from '../types.ts'\nimport { defineCLIAdapter } 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 { version } from '../package.json'\nimport { createCLI } from './cli/index.ts'\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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"}
@@ -0,0 +1,296 @@
1
+ const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
+ const require_constants = require("./constants-CnPOlsJq.cjs");
3
+ let node_util = require("node:util");
4
+ let node_process = require("node:process");
5
+ node_process = require_chunk.__toESM(node_process);
6
+ let node_path = require("node:path");
7
+ node_path = require_chunk.__toESM(node_path);
8
+ let _clack_prompts = require("@clack/prompts");
9
+ _clack_prompts = require_chunk.__toESM(_clack_prompts);
10
+ let node_child_process = require("node:child_process");
11
+ let _kubb_core = require("@kubb/core");
12
+ let node_fs = require("node:fs");
13
+ node_fs = require_chunk.__toESM(node_fs);
14
+ //#region src/utils/spawnAsync.ts
15
+ /**
16
+ * Spawns `cmd args` and returns a promise.
17
+ * - Foreground (default): inherits stdio and resolves when the process exits successfully.
18
+ * - Detached: spawns in its own process group, un-refs the child, and resolves immediately.
19
+ */
20
+ function spawnAsync(cmd, args, options = {}) {
21
+ const { cwd = process.cwd(), env, detached = false } = options;
22
+ return new Promise((resolve, reject) => {
23
+ const child = (0, node_child_process.spawn)(cmd, args, {
24
+ stdio: detached ? "ignore" : "inherit",
25
+ cwd,
26
+ env,
27
+ detached
28
+ });
29
+ if (detached) {
30
+ child.unref();
31
+ resolve();
32
+ return;
33
+ }
34
+ child.on("close", (code, signal) => {
35
+ if (code === 0) resolve();
36
+ else if (signal !== null) reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" was terminated by signal ${signal}`));
37
+ else reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" exited with code ${code}`));
38
+ });
39
+ child.on("error", reject);
40
+ });
41
+ }
42
+ //#endregion
43
+ //#region src/utils/packageManager.ts
44
+ function hasPackageJson(cwd = process.cwd()) {
45
+ return node_fs.default.existsSync(node_path.default.join(cwd, "package.json"));
46
+ }
47
+ async function initPackageJson(cwd, packageManager) {
48
+ await spawnAsync(packageManager.name, {
49
+ npm: ["init", "-y"],
50
+ pnpm: ["init"],
51
+ yarn: ["init", "-y"],
52
+ bun: ["init", "-y"]
53
+ }[packageManager.name], { cwd });
54
+ }
55
+ async function installPackages(packages, packageManager, cwd = process.cwd()) {
56
+ await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd });
57
+ }
58
+ //#endregion
59
+ //#region src/runners/init.ts
60
+ const availablePlugins = [
61
+ {
62
+ value: "plugin-oas",
63
+ label: "OpenAPI Parser",
64
+ hint: "Required",
65
+ packageName: "@kubb/plugin-oas",
66
+ importName: "pluginOas",
67
+ category: "core"
68
+ },
69
+ {
70
+ value: "plugin-ts",
71
+ label: "TypeScript",
72
+ hint: "Recommended",
73
+ packageName: "@kubb/plugin-ts",
74
+ importName: "pluginTs",
75
+ category: "typescript"
76
+ },
77
+ {
78
+ value: "plugin-client",
79
+ label: "Client (Fetch/Axios)",
80
+ packageName: "@kubb/plugin-client",
81
+ importName: "pluginClient",
82
+ category: "typescript"
83
+ },
84
+ {
85
+ value: "plugin-react-query",
86
+ label: "React Query / TanStack Query",
87
+ packageName: "@kubb/plugin-react-query",
88
+ importName: "pluginReactQuery",
89
+ category: "query"
90
+ },
91
+ {
92
+ value: "plugin-solid-query",
93
+ label: "Solid Query",
94
+ packageName: "@kubb/plugin-solid-query",
95
+ importName: "pluginSolidQuery",
96
+ category: "query"
97
+ },
98
+ {
99
+ value: "plugin-svelte-query",
100
+ label: "Svelte Query",
101
+ packageName: "@kubb/plugin-svelte-query",
102
+ importName: "pluginSvelteQuery",
103
+ category: "query"
104
+ },
105
+ {
106
+ value: "plugin-vue-query",
107
+ label: "Vue Query",
108
+ packageName: "@kubb/plugin-vue-query",
109
+ importName: "pluginVueQuery",
110
+ category: "query"
111
+ },
112
+ {
113
+ value: "plugin-swr",
114
+ label: "SWR",
115
+ packageName: "@kubb/plugin-swr",
116
+ importName: "pluginSwr",
117
+ category: "query"
118
+ },
119
+ {
120
+ value: "plugin-zod",
121
+ label: "Zod Schemas",
122
+ packageName: "@kubb/plugin-zod",
123
+ importName: "pluginZod",
124
+ category: "validation"
125
+ },
126
+ {
127
+ value: "plugin-faker",
128
+ label: "Faker.js Mocks",
129
+ packageName: "@kubb/plugin-faker",
130
+ importName: "pluginFaker",
131
+ category: "mocking"
132
+ },
133
+ {
134
+ value: "plugin-msw",
135
+ label: "MSW Handlers",
136
+ packageName: "@kubb/plugin-msw",
137
+ importName: "pluginMsw",
138
+ category: "mocking"
139
+ },
140
+ {
141
+ value: "plugin-cypress",
142
+ label: "Cypress Tests",
143
+ packageName: "@kubb/plugin-cypress",
144
+ importName: "pluginCypress",
145
+ category: "testing"
146
+ },
147
+ {
148
+ value: "plugin-redoc",
149
+ label: "ReDoc Documentation",
150
+ packageName: "@kubb/plugin-redoc",
151
+ importName: "pluginRedoc",
152
+ category: "docs"
153
+ }
154
+ ];
155
+ function generateConfigFile(selectedPlugins, inputPath, outputPath) {
156
+ return `import { defineConfig } from '@kubb/core'
157
+ ${selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join("\n")}
158
+
159
+ export default defineConfig({
160
+ root: '.',
161
+ input: {
162
+ path: '${inputPath}',
163
+ },
164
+ output: {
165
+ path: '${outputPath}',
166
+ clean: true,
167
+ },
168
+ plugins: [
169
+ ${selectedPlugins.map((plugin) => {
170
+ return ` ${require_constants.pluginDefaultConfigs[plugin.value] ?? `${plugin.importName}()`},`;
171
+ }).join("\n")}
172
+ ],
173
+ })
174
+ `;
175
+ }
176
+ function cancelAndExit(message = "Operation cancelled.") {
177
+ _clack_prompts.cancel(message);
178
+ node_process.default.exit(0);
179
+ }
180
+ async function runInit({ yes, version }) {
181
+ const cwd = node_process.default.cwd();
182
+ _clack_prompts.intro((0, node_util.styleText)("bgCyan", (0, node_util.styleText)("black", " Kubb Init ")));
183
+ try {
184
+ let packageManager;
185
+ if (!hasPackageJson(cwd)) {
186
+ if (!yes) {
187
+ const shouldInit = await _clack_prompts.confirm({
188
+ message: "No package.json found. Would you like to create one?",
189
+ initialValue: true
190
+ });
191
+ if (_clack_prompts.isCancel(shouldInit) || !shouldInit) cancelAndExit();
192
+ }
193
+ packageManager = (0, _kubb_core.detectPackageManager)(cwd);
194
+ const spinner = _clack_prompts.spinner();
195
+ spinner.start(`Initializing package.json with ${packageManager.name}`);
196
+ await initPackageJson(cwd, packageManager);
197
+ spinner.stop(`Created package.json with ${packageManager.name}`);
198
+ } else {
199
+ packageManager = (0, _kubb_core.detectPackageManager)(cwd);
200
+ _clack_prompts.log.info(`Detected package manager: ${(0, node_util.styleText)("cyan", packageManager.name)}`);
201
+ }
202
+ let inputPath;
203
+ if (yes) {
204
+ inputPath = require_constants.initDefaults.inputPath;
205
+ _clack_prompts.log.info(`Using input path: ${(0, node_util.styleText)("cyan", inputPath)}`);
206
+ } else {
207
+ const inputPathResult = await _clack_prompts.text({
208
+ message: "Where is your OpenAPI specification located?",
209
+ placeholder: require_constants.initDefaults.inputPath,
210
+ defaultValue: require_constants.initDefaults.inputPath,
211
+ validate: (value) => {
212
+ if (!value) return "Input path is required";
213
+ }
214
+ });
215
+ if (_clack_prompts.isCancel(inputPathResult)) cancelAndExit();
216
+ inputPath = inputPathResult;
217
+ }
218
+ let outputPath;
219
+ if (yes) {
220
+ outputPath = require_constants.initDefaults.outputPath;
221
+ _clack_prompts.log.info(`Using output path: ${(0, node_util.styleText)("cyan", outputPath)}`);
222
+ } else {
223
+ const outputPathResult = await _clack_prompts.text({
224
+ message: "Where should the generated files be output?",
225
+ placeholder: require_constants.initDefaults.outputPath,
226
+ defaultValue: require_constants.initDefaults.outputPath,
227
+ validate: (value) => {
228
+ if (!value) return "Output path is required";
229
+ }
230
+ });
231
+ if (_clack_prompts.isCancel(outputPathResult)) cancelAndExit();
232
+ outputPath = outputPathResult;
233
+ }
234
+ let selectedPlugins;
235
+ if (yes) {
236
+ selectedPlugins = availablePlugins.filter((plugin) => require_constants.initDefaults.plugins.includes(plugin.value));
237
+ _clack_prompts.log.info(`Using plugins: ${(0, node_util.styleText)("cyan", selectedPlugins.map((p) => p.label).join(", "))}`);
238
+ } else {
239
+ const selectedPluginValues = await _clack_prompts.multiselect({
240
+ message: "Select plugins to use:",
241
+ options: availablePlugins.map((plugin) => ({
242
+ value: plugin.value,
243
+ label: plugin.label,
244
+ hint: plugin.hint
245
+ })),
246
+ initialValues: [...require_constants.initDefaults.plugins],
247
+ required: true
248
+ });
249
+ if (_clack_prompts.isCancel(selectedPluginValues)) cancelAndExit();
250
+ selectedPlugins = availablePlugins.filter((plugin) => selectedPluginValues.includes(plugin.value));
251
+ }
252
+ if (!selectedPlugins.find((p) => p.value === "plugin-oas")) selectedPlugins.unshift(availablePlugins.find((p) => p.value === "plugin-oas"));
253
+ const packagesToInstall = [
254
+ "@kubb/core",
255
+ "@kubb/cli",
256
+ "@kubb/agent",
257
+ ...selectedPlugins.map((p) => p.packageName)
258
+ ];
259
+ const spinner = _clack_prompts.spinner();
260
+ spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`);
261
+ try {
262
+ await installPackages(packagesToInstall, packageManager, cwd);
263
+ spinner.stop(`Installed ${packagesToInstall.length} packages`);
264
+ } catch (error) {
265
+ spinner.stop("Installation failed");
266
+ throw error;
267
+ }
268
+ const configSpinner = _clack_prompts.spinner();
269
+ configSpinner.start("Creating kubb.config.ts");
270
+ const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath);
271
+ const configPath = node_path.default.join(cwd, "kubb.config.ts");
272
+ if (node_fs.default.existsSync(configPath)) {
273
+ configSpinner.stop("kubb.config.ts already exists");
274
+ if (!yes) {
275
+ const shouldOverwrite = await _clack_prompts.confirm({
276
+ message: "kubb.config.ts already exists. Overwrite?",
277
+ initialValue: false
278
+ });
279
+ if (_clack_prompts.isCancel(shouldOverwrite) || !shouldOverwrite) cancelAndExit("Keeping existing configuration. Packages have been installed.");
280
+ }
281
+ configSpinner.start("Overwriting kubb.config.ts");
282
+ }
283
+ node_fs.default.writeFileSync(configPath, configContent, "utf-8");
284
+ configSpinner.stop("Created kubb.config.ts");
285
+ _clack_prompts.outro((0, node_util.styleText)("green", "✓ All set!") + "\n\n" + (0, node_util.styleText)("dim", "Next steps:") + "\n" + (0, node_util.styleText)("cyan", ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + (0, node_util.styleText)("cyan", " 2. Generate code with: npx kubb generate") + "\n" + (0, node_util.styleText)("cyan", " Or start a stream server with: npx kubb start") + "\n" + (0, node_util.styleText)("cyan", ` 3. Find generated files in: ${outputPath}`) + "\n\n" + (0, node_util.styleText)("dim", `Using ${packageManager.name} • Kubb v${version}`));
286
+ } catch (error) {
287
+ _clack_prompts.log.error((0, node_util.styleText)("red", "An error occurred during initialization"));
288
+ if (error instanceof Error) _clack_prompts.log.error(error.message);
289
+ node_process.default.exit(1);
290
+ }
291
+ }
292
+ //#endregion
293
+ exports.runInit = runInit;
294
+ exports.spawnAsync = spawnAsync;
295
+
296
+ //# sourceMappingURL=init-Cd1hCb7q.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-Cd1hCb7q.cjs","names":["fs","path","pluginDefaultConfigs","process","clack","initDefaults","path","fs"],"sources":["../src/utils/spawnAsync.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { spawn } from 'node:child_process'\n\ntype SpawnOptions = {\n cwd?: string\n env?: NodeJS.ProcessEnv\n /**\n * When `true`, spawns a detached background process and resolves immediately.\n * The child is unref'd so the parent process can exit independently.\n * Defaults to `false` (foreground — inherits stdio and waits for exit).\n */\n detached?: boolean\n}\n\n/**\n * Spawns `cmd args` and returns a promise.\n * - Foreground (default): inherits stdio and resolves when the process exits successfully.\n * - Detached: spawns in its own process group, un-refs the child, and resolves immediately.\n */\nexport function spawnAsync(cmd: string, args: string[], options: SpawnOptions = {}): Promise<void> {\n const { cwd = process.cwd(), env, detached = false } = options\n\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {\n stdio: detached ? 'ignore' : 'inherit',\n cwd,\n env,\n detached,\n })\n\n if (detached) {\n child.unref()\n resolve()\n return\n }\n\n child.on('close', (code, signal) => {\n if (code === 0) {\n resolve()\n } else if (signal !== null) {\n reject(new Error(`\"${cmd} ${args.join(' ')}\" was terminated by signal ${signal}`))\n } else {\n reject(new Error(`\"${cmd} ${args.join(' ')}\" exited with code ${code}`))\n }\n })\n child.on('error', reject)\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@kubb/core'\nimport { spawnAsync } from './spawnAsync.ts'\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 { detectPackageManager, type PackageManagerInfo } from '@kubb/core'\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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"}