@kubb/cli 4.32.4 → 4.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/agent-Bd1QdPVV.cjs +91 -0
  2. package/dist/agent-Bd1QdPVV.cjs.map +1 -0
  3. package/dist/agent-D83d9Pud.cjs +60 -0
  4. package/dist/agent-D83d9Pud.cjs.map +1 -0
  5. package/dist/agent-DgKQXSmR.js +57 -0
  6. package/dist/agent-DgKQXSmR.js.map +1 -0
  7. package/dist/agent-u_Ehwz6r.js +87 -0
  8. package/dist/agent-u_Ehwz6r.js.map +1 -0
  9. package/dist/constants-BTUap0zs.cjs +108 -0
  10. package/dist/constants-BTUap0zs.cjs.map +1 -0
  11. package/dist/constants-CM3dJzjK.js +67 -0
  12. package/dist/constants-CM3dJzjK.js.map +1 -0
  13. package/dist/define--M_JMcDC.js +25 -0
  14. package/dist/define--M_JMcDC.js.map +1 -0
  15. package/dist/define-D6Kfm7-Z.cjs +36 -0
  16. package/dist/define-D6Kfm7-Z.cjs.map +1 -0
  17. package/dist/errors-6mF_WKxg.js +27 -0
  18. package/dist/errors-6mF_WKxg.js.map +1 -0
  19. package/dist/errors-DBW0N9w4.cjs +44 -0
  20. package/dist/errors-DBW0N9w4.cjs.map +1 -0
  21. package/dist/generate-Bn8n4w1O.cjs +65 -0
  22. package/dist/generate-Bn8n4w1O.cjs.map +1 -0
  23. package/dist/{generate-CpWtSc45.js → generate-CAsV9wSx.js} +656 -689
  24. package/dist/generate-CAsV9wSx.js.map +1 -0
  25. package/dist/generate-D-59YK0L.js +66 -0
  26. package/dist/generate-D-59YK0L.js.map +1 -0
  27. package/dist/{generate-COj0aMS6.cjs → generate-JC65igQh.cjs} +662 -694
  28. package/dist/generate-JC65igQh.cjs.map +1 -0
  29. package/dist/index.cjs +226 -35
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +226 -35
  33. package/dist/index.js.map +1 -1
  34. package/dist/init-C-InrmSY.js +302 -0
  35. package/dist/init-C-InrmSY.js.map +1 -0
  36. package/dist/init-CXP8OfMe.js +25 -0
  37. package/dist/init-CXP8OfMe.js.map +1 -0
  38. package/dist/init-CbeE-L-0.cjs +25 -0
  39. package/dist/init-CbeE-L-0.cjs.map +1 -0
  40. package/dist/init-hmolV6B4.cjs +306 -0
  41. package/dist/init-hmolV6B4.cjs.map +1 -0
  42. package/dist/jiti-Cd3S0xwr.cjs +16 -0
  43. package/dist/jiti-Cd3S0xwr.cjs.map +1 -0
  44. package/dist/jiti-e08mD2Ph.js +11 -0
  45. package/dist/jiti-e08mD2Ph.js.map +1 -0
  46. package/dist/mcp-BDxg2oJm.cjs +16 -0
  47. package/dist/mcp-BDxg2oJm.cjs.map +1 -0
  48. package/dist/mcp-ChHFPRzD.cjs +42 -0
  49. package/dist/mcp-ChHFPRzD.cjs.map +1 -0
  50. package/dist/mcp-D2SHEg_d.js +41 -0
  51. package/dist/mcp-D2SHEg_d.js.map +1 -0
  52. package/dist/mcp-MSoE4vNA.js +16 -0
  53. package/dist/mcp-MSoE4vNA.js.map +1 -0
  54. package/dist/{package-aNQWvWbS.cjs → package-CUVyeIbt.cjs} +2 -2
  55. package/dist/package-CUVyeIbt.cjs.map +1 -0
  56. package/dist/package-Cbd8OC6q.js +6 -0
  57. package/dist/package-Cbd8OC6q.js.map +1 -0
  58. package/dist/shell-7HPrTCJ5.cjs +57 -0
  59. package/dist/shell-7HPrTCJ5.cjs.map +1 -0
  60. package/dist/shell-DqqWsHCD.js +46 -0
  61. package/dist/shell-DqqWsHCD.js.map +1 -0
  62. package/dist/{telemetry-BDSSqUiG.cjs → telemetry-Cn9X1I5B.cjs} +79 -9
  63. package/dist/telemetry-Cn9X1I5B.cjs.map +1 -0
  64. package/dist/{telemetry-DYWvlxqs.js → telemetry-DxiR7clS.js} +63 -11
  65. package/dist/telemetry-DxiR7clS.js.map +1 -0
  66. package/dist/validate-BG8A3aQS.cjs +25 -0
  67. package/dist/validate-BG8A3aQS.cjs.map +1 -0
  68. package/dist/validate-BZ1UFkwA.js +25 -0
  69. package/dist/validate-BZ1UFkwA.js.map +1 -0
  70. package/dist/validate-Bbrn3Q-A.cjs +42 -0
  71. package/dist/validate-Bbrn3Q-A.cjs.map +1 -0
  72. package/dist/validate-l8vLmwKA.js +41 -0
  73. package/dist/validate-l8vLmwKA.js.map +1 -0
  74. package/package.json +6 -6
  75. package/src/commands/agent/start.ts +27 -136
  76. package/src/commands/agent.ts +6 -25
  77. package/src/commands/generate.ts +26 -158
  78. package/src/commands/init.ts +9 -360
  79. package/src/commands/mcp.ts +7 -52
  80. package/src/commands/validate.ts +9 -60
  81. package/src/constants.ts +76 -0
  82. package/src/index.ts +36 -42
  83. package/src/loggers/clackLogger.ts +65 -165
  84. package/src/loggers/fileSystemLogger.ts +2 -14
  85. package/src/loggers/githubActionsLogger.ts +58 -125
  86. package/src/loggers/plainLogger.ts +44 -92
  87. package/src/loggers/utils.ts +67 -4
  88. package/src/runners/agent.ts +100 -0
  89. package/src/runners/generate.ts +223 -102
  90. package/src/runners/init.ts +323 -0
  91. package/src/runners/mcp.ts +32 -0
  92. package/src/runners/validate.ts +35 -0
  93. package/src/utils/Writables.ts +2 -2
  94. package/src/utils/executeHooks.ts +20 -8
  95. package/src/utils/getCosmiConfig.ts +10 -11
  96. package/src/utils/getIntro.ts +1 -81
  97. package/src/utils/getSummary.ts +12 -17
  98. package/src/utils/jiti.ts +9 -0
  99. package/src/utils/packageManager.ts +4 -4
  100. package/src/utils/runHook.ts +75 -0
  101. package/src/utils/telemetry.ts +8 -26
  102. package/src/utils/watcher.ts +2 -4
  103. package/dist/agent-6COck3B9.cjs +0 -20
  104. package/dist/agent-6COck3B9.cjs.map +0 -1
  105. package/dist/agent-DMm6c5Vg.js +0 -20
  106. package/dist/agent-DMm6c5Vg.js.map +0 -1
  107. package/dist/generate-COj0aMS6.cjs.map +0 -1
  108. package/dist/generate-CpWtSc45.js.map +0 -1
  109. package/dist/init-Bdn3_qir.js +0 -304
  110. package/dist/init-Bdn3_qir.js.map +0 -1
  111. package/dist/init-CFW2kWY8.cjs +0 -308
  112. package/dist/init-CFW2kWY8.cjs.map +0 -1
  113. package/dist/mcp-DkwtARfo.cjs +0 -57
  114. package/dist/mcp-DkwtARfo.cjs.map +0 -1
  115. package/dist/mcp-DrH93Vq4.js +0 -57
  116. package/dist/mcp-DrH93Vq4.js.map +0 -1
  117. package/dist/package-BnJbGmLm.js +0 -6
  118. package/dist/package-BnJbGmLm.js.map +0 -1
  119. package/dist/package-aNQWvWbS.cjs.map +0 -1
  120. package/dist/start-CqTUu14n.js +0 -131
  121. package/dist/start-CqTUu14n.js.map +0 -1
  122. package/dist/start-D-rsIJGo.cjs +0 -134
  123. package/dist/start-D-rsIJGo.cjs.map +0 -1
  124. package/dist/telemetry-BDSSqUiG.cjs.map +0 -1
  125. package/dist/telemetry-DYWvlxqs.js.map +0 -1
  126. package/dist/validate-BlV8L8gC.js +0 -66
  127. package/dist/validate-BlV8L8gC.js.map +0 -1
  128. package/dist/validate-COhZUXF8.cjs +0 -66
  129. package/dist/validate-COhZUXF8.cjs.map +0 -1
  130. package/src/loggers/envDetection.ts +0 -28
  131. package/src/loggers/index.ts +0 -5
  132. package/src/utils/formatMsWithColor.ts +0 -22
  133. package/src/utils/randomColor.ts +0 -23
package/dist/index.js CHANGED
@@ -1,47 +1,238 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { t as version } from "./package-BnJbGmLm.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 defineCLIAdapter } from "./define--M_JMcDC.js";
3
+ import { n as isTelemetryDisabled } from "./telemetry-DxiR7clS.js";
4
+ import { t as version } from "./package-Cbd8OC6q.js";
5
+ import { parseArgs, styleText } from "node:util";
6
+ //#region ../../internals/utils/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 ../../internals/utils/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 ../../internals/utils/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-CpWtSc45.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-CpWtSc45.js").then((r) => r.default),
37
- validate: () => import("./validate-BlV8L8gC.js").then((r) => r.default),
38
- mcp: () => import("./mcp-DrH93Vq4.js").then((r) => r.default),
39
- agent: () => import("./agent-DMm6c5Vg.js").then((r) => r.default),
40
- init: () => import("./init-Bdn3_qir.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 ../../internals/utils/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-D-59YK0L.js"),
220
+ import("./validate-BZ1UFkwA.js"),
221
+ import("./mcp-MSoE4vNA.js"),
222
+ import("./agent-DgKQXSmR.js"),
223
+ import("./init-CXP8OfMe.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":["../../../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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"}
@@ -0,0 +1,302 @@
1
+ import "./chunk--u3MIqq1.js";
2
+ import { t as spawnAsync } from "./shell-DqqWsHCD.js";
3
+ import { o as initDefaults, s as pluginDefaultConfigs } from "./constants-CM3dJzjK.js";
4
+ import { styleText } from "node:util";
5
+ import fs, { existsSync, readFileSync } from "node:fs";
6
+ import path, { join } from "node:path";
7
+ import process$1 from "node:process";
8
+ import * as clack from "@clack/prompts";
9
+ //#region ../../internals/utils/src/packageManager.ts
10
+ const packageManagers = {
11
+ pnpm: {
12
+ name: "pnpm",
13
+ lockFile: "pnpm-lock.yaml",
14
+ installCommand: ["add", "-D"]
15
+ },
16
+ yarn: {
17
+ name: "yarn",
18
+ lockFile: "yarn.lock",
19
+ installCommand: ["add", "-D"]
20
+ },
21
+ bun: {
22
+ name: "bun",
23
+ lockFile: "bun.lockb",
24
+ installCommand: ["add", "-d"]
25
+ },
26
+ npm: {
27
+ name: "npm",
28
+ lockFile: "package-lock.json",
29
+ installCommand: ["install", "--save-dev"]
30
+ }
31
+ };
32
+ /**
33
+ * Detects the active package manager for the given directory.
34
+ * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.
35
+ * Falls back to npm when no signal is found.
36
+ */
37
+ function detectPackageManager(cwd = process.cwd()) {
38
+ const packageJsonPath = join(cwd, "package.json");
39
+ if (existsSync(packageJsonPath)) try {
40
+ const pmField = JSON.parse(readFileSync(packageJsonPath, "utf-8")).packageManager;
41
+ if (typeof pmField === "string") {
42
+ const name = pmField.split("@")[0];
43
+ if (name && name in packageManagers) return packageManagers[name];
44
+ }
45
+ } catch {}
46
+ for (const pm of Object.values(packageManagers)) if (existsSync(join(cwd, pm.lockFile))) return pm;
47
+ return packageManagers.npm;
48
+ }
49
+ //#endregion
50
+ //#region src/utils/packageManager.ts
51
+ function hasPackageJson(cwd = process.cwd()) {
52
+ return fs.existsSync(path.join(cwd, "package.json"));
53
+ }
54
+ async function initPackageJson(cwd, packageManager) {
55
+ await spawnAsync(packageManager.name, {
56
+ npm: ["init", "-y"],
57
+ pnpm: ["init"],
58
+ yarn: ["init", "-y"],
59
+ bun: ["init", "-y"]
60
+ }[packageManager.name], { cwd });
61
+ }
62
+ async function installPackages(packages, packageManager, cwd = process.cwd()) {
63
+ await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd });
64
+ }
65
+ //#endregion
66
+ //#region src/runners/init.ts
67
+ const availablePlugins = [
68
+ {
69
+ value: "plugin-oas",
70
+ label: "OpenAPI Parser",
71
+ hint: "Required",
72
+ packageName: "@kubb/plugin-oas",
73
+ importName: "pluginOas",
74
+ category: "core"
75
+ },
76
+ {
77
+ value: "plugin-ts",
78
+ label: "TypeScript",
79
+ hint: "Recommended",
80
+ packageName: "@kubb/plugin-ts",
81
+ importName: "pluginTs",
82
+ category: "typescript"
83
+ },
84
+ {
85
+ value: "plugin-client",
86
+ label: "Client (Fetch/Axios)",
87
+ packageName: "@kubb/plugin-client",
88
+ importName: "pluginClient",
89
+ category: "typescript"
90
+ },
91
+ {
92
+ value: "plugin-react-query",
93
+ label: "React Query / TanStack Query",
94
+ packageName: "@kubb/plugin-react-query",
95
+ importName: "pluginReactQuery",
96
+ category: "query"
97
+ },
98
+ {
99
+ value: "plugin-solid-query",
100
+ label: "Solid Query",
101
+ packageName: "@kubb/plugin-solid-query",
102
+ importName: "pluginSolidQuery",
103
+ category: "query"
104
+ },
105
+ {
106
+ value: "plugin-svelte-query",
107
+ label: "Svelte Query",
108
+ packageName: "@kubb/plugin-svelte-query",
109
+ importName: "pluginSvelteQuery",
110
+ category: "query"
111
+ },
112
+ {
113
+ value: "plugin-vue-query",
114
+ label: "Vue Query",
115
+ packageName: "@kubb/plugin-vue-query",
116
+ importName: "pluginVueQuery",
117
+ category: "query"
118
+ },
119
+ {
120
+ value: "plugin-swr",
121
+ label: "SWR",
122
+ packageName: "@kubb/plugin-swr",
123
+ importName: "pluginSwr",
124
+ category: "query"
125
+ },
126
+ {
127
+ value: "plugin-zod",
128
+ label: "Zod Schemas",
129
+ packageName: "@kubb/plugin-zod",
130
+ importName: "pluginZod",
131
+ category: "validation"
132
+ },
133
+ {
134
+ value: "plugin-faker",
135
+ label: "Faker.js Mocks",
136
+ packageName: "@kubb/plugin-faker",
137
+ importName: "pluginFaker",
138
+ category: "mocking"
139
+ },
140
+ {
141
+ value: "plugin-msw",
142
+ label: "MSW Handlers",
143
+ packageName: "@kubb/plugin-msw",
144
+ importName: "pluginMsw",
145
+ category: "mocking"
146
+ },
147
+ {
148
+ value: "plugin-cypress",
149
+ label: "Cypress Tests",
150
+ packageName: "@kubb/plugin-cypress",
151
+ importName: "pluginCypress",
152
+ category: "testing"
153
+ },
154
+ {
155
+ value: "plugin-redoc",
156
+ label: "ReDoc Documentation",
157
+ packageName: "@kubb/plugin-redoc",
158
+ importName: "pluginRedoc",
159
+ category: "docs"
160
+ }
161
+ ];
162
+ function generateConfigFile(selectedPlugins, inputPath, outputPath) {
163
+ return `import { defineConfig } from '@kubb/core'
164
+ ${selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join("\n")}
165
+
166
+ export default defineConfig({
167
+ root: '.',
168
+ input: {
169
+ path: '${inputPath}',
170
+ },
171
+ output: {
172
+ path: '${outputPath}',
173
+ clean: true,
174
+ },
175
+ plugins: [
176
+ ${selectedPlugins.map((plugin) => {
177
+ return ` ${pluginDefaultConfigs[plugin.value] ?? `${plugin.importName}()`},`;
178
+ }).join("\n")}
179
+ ],
180
+ })
181
+ `;
182
+ }
183
+ function cancelAndExit(message = "Operation cancelled.") {
184
+ clack.cancel(message);
185
+ process$1.exit(0);
186
+ }
187
+ async function runInit({ yes, version }) {
188
+ const cwd = process$1.cwd();
189
+ clack.intro(styleText("bgCyan", styleText("black", " Kubb Init ")));
190
+ try {
191
+ let packageManager;
192
+ if (!hasPackageJson(cwd)) {
193
+ if (!yes) {
194
+ const shouldInit = await clack.confirm({
195
+ message: "No package.json found. Would you like to create one?",
196
+ initialValue: true
197
+ });
198
+ if (clack.isCancel(shouldInit) || !shouldInit) cancelAndExit();
199
+ }
200
+ packageManager = detectPackageManager(cwd);
201
+ const spinner = clack.spinner();
202
+ spinner.start(`Initializing package.json with ${packageManager.name}`);
203
+ await initPackageJson(cwd, packageManager);
204
+ spinner.stop(`Created package.json with ${packageManager.name}`);
205
+ } else {
206
+ packageManager = detectPackageManager(cwd);
207
+ clack.log.info(`Detected package manager: ${styleText("cyan", packageManager.name)}`);
208
+ }
209
+ let inputPath;
210
+ if (yes) {
211
+ inputPath = initDefaults.inputPath;
212
+ clack.log.info(`Using input path: ${styleText("cyan", inputPath)}`);
213
+ } else {
214
+ const inputPathResult = await clack.text({
215
+ message: "Where is your OpenAPI specification located?",
216
+ placeholder: initDefaults.inputPath,
217
+ defaultValue: initDefaults.inputPath,
218
+ validate: (value) => {
219
+ if (!value) return "Input path is required";
220
+ }
221
+ });
222
+ if (clack.isCancel(inputPathResult)) cancelAndExit();
223
+ inputPath = inputPathResult;
224
+ }
225
+ let outputPath;
226
+ if (yes) {
227
+ outputPath = initDefaults.outputPath;
228
+ clack.log.info(`Using output path: ${styleText("cyan", outputPath)}`);
229
+ } else {
230
+ const outputPathResult = await clack.text({
231
+ message: "Where should the generated files be output?",
232
+ placeholder: initDefaults.outputPath,
233
+ defaultValue: initDefaults.outputPath,
234
+ validate: (value) => {
235
+ if (!value) return "Output path is required";
236
+ }
237
+ });
238
+ if (clack.isCancel(outputPathResult)) cancelAndExit();
239
+ outputPath = outputPathResult;
240
+ }
241
+ let selectedPlugins;
242
+ if (yes) {
243
+ selectedPlugins = availablePlugins.filter((plugin) => initDefaults.plugins.includes(plugin.value));
244
+ clack.log.info(`Using plugins: ${styleText("cyan", selectedPlugins.map((p) => p.label).join(", "))}`);
245
+ } else {
246
+ const selectedPluginValues = await clack.multiselect({
247
+ message: "Select plugins to use:",
248
+ options: availablePlugins.map((plugin) => ({
249
+ value: plugin.value,
250
+ label: plugin.label,
251
+ hint: plugin.hint
252
+ })),
253
+ initialValues: [...initDefaults.plugins],
254
+ required: true
255
+ });
256
+ if (clack.isCancel(selectedPluginValues)) cancelAndExit();
257
+ selectedPlugins = availablePlugins.filter((plugin) => selectedPluginValues.includes(plugin.value));
258
+ }
259
+ if (!selectedPlugins.find((p) => p.value === "plugin-oas")) selectedPlugins.unshift(availablePlugins.find((p) => p.value === "plugin-oas"));
260
+ const packagesToInstall = [
261
+ "@kubb/core",
262
+ "@kubb/cli",
263
+ "@kubb/agent",
264
+ ...selectedPlugins.map((p) => p.packageName)
265
+ ];
266
+ const spinner = clack.spinner();
267
+ spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`);
268
+ try {
269
+ await installPackages(packagesToInstall, packageManager, cwd);
270
+ spinner.stop(`Installed ${packagesToInstall.length} packages`);
271
+ } catch (error) {
272
+ spinner.stop("Installation failed");
273
+ throw error;
274
+ }
275
+ const configSpinner = clack.spinner();
276
+ configSpinner.start("Creating kubb.config.ts");
277
+ const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath);
278
+ const configPath = path.join(cwd, "kubb.config.ts");
279
+ if (fs.existsSync(configPath)) {
280
+ configSpinner.stop("kubb.config.ts already exists");
281
+ if (!yes) {
282
+ const shouldOverwrite = await clack.confirm({
283
+ message: "kubb.config.ts already exists. Overwrite?",
284
+ initialValue: false
285
+ });
286
+ if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) cancelAndExit("Keeping existing configuration. Packages have been installed.");
287
+ }
288
+ configSpinner.start("Overwriting kubb.config.ts");
289
+ }
290
+ fs.writeFileSync(configPath, configContent, "utf-8");
291
+ configSpinner.stop("Created kubb.config.ts");
292
+ clack.outro(styleText("green", "✓ All set!") + "\n\n" + styleText("dim", "Next steps:") + "\n" + styleText("cyan", ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + styleText("cyan", " 2. Generate code with: npx kubb generate") + "\n" + styleText("cyan", " Or start a stream server with: npx kubb start") + "\n" + styleText("cyan", ` 3. Find generated files in: ${outputPath}`) + "\n\n" + styleText("dim", `Using ${packageManager.name} • Kubb v${version}`));
293
+ } catch (error) {
294
+ clack.log.error(styleText("red", "An error occurred during initialization"));
295
+ if (error instanceof Error) clack.log.error(error.message);
296
+ process$1.exit(1);
297
+ }
298
+ }
299
+ //#endregion
300
+ export { runInit };
301
+
302
+ //# sourceMappingURL=init-C-InrmSY.js.map
@@ -0,0 +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":"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"}