@kubb/cli 5.14.6 → 5.15.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 (186) hide show
  1. package/bin/kubb.js +2 -1
  2. package/dist/{Telemetry-B5V_ufmv.cjs → Telemetry-B52pKz9i.cjs} +14 -118
  3. package/dist/Telemetry-B52pKz9i.cjs.map +1 -0
  4. package/dist/{Telemetry-DrnGartf.js → Telemetry-C7Qwy2s7.js} +12 -86
  5. package/dist/Telemetry-C7Qwy2s7.js.map +1 -0
  6. package/dist/{background-DlK0by5c.js → background-BJCuXYuB.js} +5 -6
  7. package/dist/{background-DlK0by5c.js.map → background-BJCuXYuB.js.map} +1 -1
  8. package/dist/{background-CdPT1eaq.cjs → background-CK2gQtTU.cjs} +5 -6
  9. package/dist/{background-CdPT1eaq.cjs.map → background-CK2gQtTU.cjs.map} +1 -1
  10. package/dist/{background-C6XHpEo7.js → background-D4mZCg-4.js} +1 -1
  11. package/dist/banner-BdTTDFkG.js +140 -0
  12. package/dist/banner-BdTTDFkG.js.map +1 -0
  13. package/dist/banner-wJFk-L-c.cjs +163 -0
  14. package/dist/banner-wJFk-L-c.cjs.map +1 -0
  15. package/dist/config-BL3HnFhb.js +1 -0
  16. package/dist/config-BWj9jBVj.cjs +62 -0
  17. package/dist/config-BWj9jBVj.cjs.map +1 -0
  18. package/dist/{config-CNqgDSu3.js → config-CQTxXvIG.js} +6 -52
  19. package/dist/config-CQTxXvIG.js.map +1 -0
  20. package/dist/{config-BG_Nr2CZ.cjs → config-CRrmj88c.cjs} +15 -62
  21. package/dist/config-CRrmj88c.cjs.map +1 -0
  22. package/dist/config-Uk3rbZfb.js +49 -0
  23. package/dist/config-Uk3rbZfb.js.map +1 -0
  24. package/dist/configFile-C0DIXNMD.js +993 -0
  25. package/dist/configFile-C0DIXNMD.js.map +1 -0
  26. package/dist/configFile-CoEpHdXG.cjs +1028 -0
  27. package/dist/configFile-CoEpHdXG.cjs.map +1 -0
  28. package/dist/{credentials-C8tjAhTo.js → credentials-B77iJx9H.js} +1 -1
  29. package/dist/{credentials-DDaKqtJn.cjs → credentials-DEsGwcGD.cjs} +3 -4
  30. package/dist/{credentials-DDaKqtJn.cjs.map → credentials-DEsGwcGD.cjs.map} +1 -1
  31. package/dist/{credentials-CZK6zPLv.js → credentials-osgjujE_.js} +3 -4
  32. package/dist/{credentials-CZK6zPLv.js.map → credentials-osgjujE_.js.map} +1 -1
  33. package/dist/env-C3xHRMez.js +1 -0
  34. package/dist/env-eu3XyKqJ.cjs +55 -0
  35. package/dist/env-eu3XyKqJ.cjs.map +1 -0
  36. package/dist/env-rv-VgSGN.js +34 -0
  37. package/dist/env-rv-VgSGN.js.map +1 -0
  38. package/dist/{errors-Cl69p_vI.cjs → errors-BponpdjN.cjs} +3 -4
  39. package/dist/{errors-Cl69p_vI.cjs.map → errors-BponpdjN.cjs.map} +1 -1
  40. package/dist/{errors-DmC83ALX.js → errors-wzqmMpMo.js} +3 -4
  41. package/dist/{errors-DmC83ALX.js.map → errors-wzqmMpMo.js.map} +1 -1
  42. package/dist/index.cjs +37 -2719
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +0 -2
  45. package/dist/index.d.ts +0 -2
  46. package/dist/index.js +35 -2713
  47. package/dist/index.js.map +1 -1
  48. package/dist/installWithSpinner-DpnpxHq5.js +49 -0
  49. package/dist/installWithSpinner-DpnpxHq5.js.map +1 -0
  50. package/dist/installWithSpinner-ONGfIVUJ.cjs +56 -0
  51. package/dist/installWithSpinner-ONGfIVUJ.cjs.map +1 -0
  52. package/dist/{text-CL6N6yPS.js → intro-9PB8sE8z.js} +8 -52
  53. package/dist/intro-9PB8sE8z.js.map +1 -0
  54. package/dist/{text-DrsG1EDN.cjs → intro-YPaf1Imr.cjs} +12 -80
  55. package/dist/intro-YPaf1Imr.cjs.map +1 -0
  56. package/dist/isCIEnvironment-D6xtAAZ2.js +14 -0
  57. package/dist/isCIEnvironment-D6xtAAZ2.js.map +1 -0
  58. package/dist/isCIEnvironment-DiVOMI5Q.cjs +20 -0
  59. package/dist/isCIEnvironment-DiVOMI5Q.cjs.map +1 -0
  60. package/dist/mascot--q1xjKw1.js +63 -0
  61. package/dist/mascot--q1xjKw1.js.map +1 -0
  62. package/dist/mascot-JSA0j3Q_.cjs +80 -0
  63. package/dist/mascot-JSA0j3Q_.cjs.map +1 -0
  64. package/dist/mcp-CcseJJwh.cjs +20 -0
  65. package/dist/mcp-CcseJJwh.cjs.map +1 -0
  66. package/dist/mcp-DUTsS8tR.js +21 -0
  67. package/dist/mcp-DUTsS8tR.js.map +1 -0
  68. package/dist/package-B1hUUjio.cjs +10 -0
  69. package/dist/package-B1hUUjio.cjs.map +1 -0
  70. package/dist/package-MYPMnnTX.js +5 -0
  71. package/dist/package-MYPMnnTX.js.map +1 -0
  72. package/dist/{registry-DOGpflct.js → registry-B3eYk4LN.js} +7 -67
  73. package/dist/registry-B3eYk4LN.js.map +1 -0
  74. package/dist/{registry-BzBp6aZI.cjs → registry-YE1pFWL-.cjs} +4 -82
  75. package/dist/registry-YE1pFWL-.cjs.map +1 -0
  76. package/dist/{reporters-GzXlc4CK.cjs → reporters-2cgjvXwR.cjs} +32 -40
  77. package/dist/{reporters-GzXlc4CK.cjs.map → reporters-2cgjvXwR.cjs.map} +1 -1
  78. package/dist/{reporters-mYHIUZSx.js → reporters-BM430HdQ.js} +19 -27
  79. package/dist/{reporters-mYHIUZSx.js.map → reporters-BM430HdQ.js.map} +1 -1
  80. package/dist/{rolldown-runtime-CPE0t6oh.cjs → rolldown-runtime-C3-Zg-KD.cjs} +1 -2
  81. package/dist/{rolldown-runtime-CRm0XQPb.js → rolldown-runtime-xo6NMXYd.js} +1 -2
  82. package/dist/run-1H9TGT8v.js +77 -0
  83. package/dist/run-1H9TGT8v.js.map +1 -0
  84. package/dist/run-BYP_t9dR.cjs +324 -0
  85. package/dist/run-BYP_t9dR.cjs.map +1 -0
  86. package/dist/run-Bq6gcfkS.js +1 -0
  87. package/dist/run-BrM7-NSV.js +181 -0
  88. package/dist/run-BrM7-NSV.js.map +1 -0
  89. package/dist/run-BsrNfFIl.js +228 -0
  90. package/dist/run-BsrNfFIl.js.map +1 -0
  91. package/dist/{run-l8IiOR_c.js → run-CLiHI99L.js} +9 -9
  92. package/dist/{run-l8IiOR_c.js.map → run-CLiHI99L.js.map} +1 -1
  93. package/dist/{run-C8Prej7s.cjs → run-CQORv7Gq.cjs} +44 -37
  94. package/dist/run-CQORv7Gq.cjs.map +1 -0
  95. package/dist/{run-EJtgdIin.js → run-CXVhxFfC.js} +31 -23
  96. package/dist/run-CXVhxFfC.js.map +1 -0
  97. package/dist/run-CrM4jsix.cjs +80 -0
  98. package/dist/run-CrM4jsix.cjs.map +1 -0
  99. package/dist/run-CvFakE3B.cjs +185 -0
  100. package/dist/run-CvFakE3B.cjs.map +1 -0
  101. package/dist/{run-DC_xH5H3.cjs → run-CyzKy-0p.cjs} +49 -41
  102. package/dist/run-CyzKy-0p.cjs.map +1 -0
  103. package/dist/run-D-nn9-Wq.js +319 -0
  104. package/dist/run-D-nn9-Wq.js.map +1 -0
  105. package/dist/run-DBnSbwtU.cjs +389 -0
  106. package/dist/run-DBnSbwtU.cjs.map +1 -0
  107. package/dist/{run-j1g5si5R.js → run-DTqMrPS9.js} +5 -6
  108. package/dist/{run-j1g5si5R.js.map → run-DTqMrPS9.js.map} +1 -1
  109. package/dist/{run-9fs2T2Je.js → run-DUwX6Icx.js} +26 -20
  110. package/dist/run-DUwX6Icx.js.map +1 -0
  111. package/dist/run-FEiyv6_U.js +385 -0
  112. package/dist/run-FEiyv6_U.js.map +1 -0
  113. package/dist/run-LY_UAYyM.cjs +233 -0
  114. package/dist/run-LY_UAYyM.cjs.map +1 -0
  115. package/dist/{run-sjzj0ir-.cjs → run-dMTJfs4_.cjs} +10 -10
  116. package/dist/{run-sjzj0ir-.cjs.map → run-dMTJfs4_.cjs.map} +1 -1
  117. package/dist/{run-CypFtkVE.cjs → run-uPA5s3rI.cjs} +5 -6
  118. package/dist/{run-CypFtkVE.cjs.map → run-uPA5s3rI.cjs.map} +1 -1
  119. package/dist/shared-C0EtrdUm.cjs +123 -0
  120. package/dist/shared-C0EtrdUm.cjs.map +1 -0
  121. package/dist/shared-Ct9stKpp.js +94 -0
  122. package/dist/shared-Ct9stKpp.js.map +1 -0
  123. package/dist/{snapshot-laSRD0z1.cjs → snapshot-CPF9zyZj.cjs} +13 -14
  124. package/dist/{snapshot-laSRD0z1.cjs.map → snapshot-CPF9zyZj.cjs.map} +1 -1
  125. package/dist/{snapshot-BJWnL6hE.js → snapshot-CiV08NJr.js} +10 -11
  126. package/dist/{snapshot-BJWnL6hE.js.map → snapshot-CiV08NJr.js.map} +1 -1
  127. package/dist/spinner-BZaln7O8.js +160 -0
  128. package/dist/spinner-BZaln7O8.js.map +1 -0
  129. package/dist/spinner-CfB0sIPy.cjs +208 -0
  130. package/dist/spinner-CfB0sIPy.cjs.map +1 -0
  131. package/dist/{status-DFEdbBPu.cjs → status-C066YA-4.cjs} +7 -8
  132. package/dist/{status-DFEdbBPu.cjs.map → status-C066YA-4.cjs.map} +1 -1
  133. package/dist/{status-BjmXLRm2.js → status-Dj8tivag.js} +6 -7
  134. package/dist/{status-BjmXLRm2.js.map → status-Dj8tivag.js.map} +1 -1
  135. package/dist/studio-B4XsXgKj.js +215 -0
  136. package/dist/studio-B4XsXgKj.js.map +1 -0
  137. package/dist/studio-D9_-mKee.cjs +218 -0
  138. package/dist/studio-D9_-mKee.cjs.map +1 -0
  139. package/dist/studioWorker.js +4 -5
  140. package/dist/{summary-DDnI70tn.js → summary-CbmQKA8l.js} +5 -6
  141. package/dist/{summary-DDnI70tn.js.map → summary-CbmQKA8l.js.map} +1 -1
  142. package/dist/{summary-1DCwzWEU.cjs → summary-Clvl5Hxs.cjs} +7 -8
  143. package/dist/{summary-1DCwzWEU.cjs.map → summary-Clvl5Hxs.cjs.map} +1 -1
  144. package/dist/table-BlRe9YTZ.cjs +15 -0
  145. package/dist/table-BlRe9YTZ.cjs.map +1 -0
  146. package/dist/table-CR7iZJGo.js +10 -0
  147. package/dist/table-CR7iZJGo.js.map +1 -0
  148. package/dist/text-BmiI4s6N.js +13 -0
  149. package/dist/text-BmiI4s6N.js.map +1 -0
  150. package/dist/text-Ep3AulAS.cjs +24 -0
  151. package/dist/text-Ep3AulAS.cjs.map +1 -0
  152. package/dist/time-3BKoci3G.cjs +82 -0
  153. package/dist/time-3BKoci3G.cjs.map +1 -0
  154. package/dist/time-C-wU7VhC.js +65 -0
  155. package/dist/time-C-wU7VhC.js.map +1 -0
  156. package/dist/utils-BdibacYq.js +244 -0
  157. package/dist/utils-BdibacYq.js.map +1 -0
  158. package/dist/utils-CO89mxRU.cjs +290 -0
  159. package/dist/utils-CO89mxRU.cjs.map +1 -0
  160. package/dist/utils-CbJ6hS_t.js +222 -0
  161. package/dist/utils-CbJ6hS_t.js.map +1 -0
  162. package/dist/utils-CcARPB45.cjs +286 -0
  163. package/dist/utils-CcARPB45.cjs.map +1 -0
  164. package/dist/validate-B3tLWYJU.cjs +27 -0
  165. package/dist/validate-B3tLWYJU.cjs.map +1 -0
  166. package/dist/validate-C5fyNF4v.js +28 -0
  167. package/dist/validate-C5fyNF4v.js.map +1 -0
  168. package/package.json +7 -7
  169. package/dist/Telemetry-B5V_ufmv.cjs.map +0 -1
  170. package/dist/Telemetry-DrnGartf.js.map +0 -1
  171. package/dist/config-BG_Nr2CZ.cjs.map +0 -1
  172. package/dist/config-CNqgDSu3.js.map +0 -1
  173. package/dist/config-DWDpFSn1.js +0 -1
  174. package/dist/registry-BzBp6aZI.cjs.map +0 -1
  175. package/dist/registry-DOGpflct.js.map +0 -1
  176. package/dist/run-9fs2T2Je.js.map +0 -1
  177. package/dist/run-C8Prej7s.cjs.map +0 -1
  178. package/dist/run-CXVme-aS.js +0 -1
  179. package/dist/run-DC_xH5H3.cjs.map +0 -1
  180. package/dist/run-EJtgdIin.js.map +0 -1
  181. package/dist/text-CL6N6yPS.js.map +0 -1
  182. package/dist/text-DrsG1EDN.cjs.map +0 -1
  183. package/dist/utils-C3vTpUje.cjs +0 -645
  184. package/dist/utils-C3vTpUje.cjs.map +0 -1
  185. package/dist/utils-CIc8YFtr.js +0 -536
  186. package/dist/utils-CIc8YFtr.js.map +0 -1
@@ -0,0 +1,389 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ const require_configFile = require("./configFile-CoEpHdXG.cjs");
3
+ const require_time = require("./time-3BKoci3G.cjs");
4
+ const require_spinner = require("./spinner-CfB0sIPy.cjs");
5
+ const require_package = require("./package-B1hUUjio.cjs");
6
+ const require_intro = require("./intro-YPaf1Imr.cjs");
7
+ const require_config = require("./config-CRrmj88c.cjs");
8
+ const require_config$1 = require("./config-BWj9jBVj.cjs");
9
+ const require_registry = require("./registry-YE1pFWL-.cjs");
10
+ const require_utils = require("./utils-CO89mxRU.cjs");
11
+ const require_installWithSpinner = require("./installWithSpinner-ONGfIVUJ.cjs");
12
+ const require_text = require("./text-Ep3AulAS.cjs");
13
+ let node_util = require("node:util");
14
+ let gunshi = require("gunshi");
15
+ let node_process = require("node:process");
16
+ node_process = require_rolldown_runtime.__toESM(node_process, 1);
17
+ let node_path = require("node:path");
18
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
19
+ let _clack_prompts = require("@clack/prompts");
20
+ _clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
21
+ let _kubb_core = require("@kubb/core");
22
+ let _gunshi_plugin_dryrun = require("@gunshi/plugin-dryrun");
23
+ // ../../internals/shared/src/init.ts
24
+ /** The `kubb.config.ts` `kubb init` writes before `kubb add` puts each plugin in. */
25
+ function generateConfigFile({ inputPath, outputPath }) {
26
+ return `import { defineConfig } from 'kubb/config'
27
+
28
+ export default defineConfig({
29
+ input: '${inputPath}',
30
+ output: {
31
+ path: '${outputPath}',
32
+ clean: true,
33
+ },
34
+ plugins: [],
35
+ })
36
+ `;
37
+ }
38
+ // src/runners/init/run.ts
39
+ function cancelAndExit(message = "Operation canceled.") {
40
+ _clack_prompts.cancel(message);
41
+ node_process.default.exit(0);
42
+ }
43
+ function unwrap(value) {
44
+ if (_clack_prompts.isCancel(value)) cancelAndExit();
45
+ return value;
46
+ }
47
+ /** The full `kubb.config.ts` for `choices`, with each plugin added the way `kubb add` adds it. */
48
+ function buildConfig({ inputPath, outputPath, plugins }) {
49
+ const { source, outcomes } = require_configFile.editConfig({
50
+ source: generateConfigFile({
51
+ inputPath,
52
+ outputPath
53
+ }),
54
+ edits: plugins.map((entry) => ({
55
+ operation: require_configFile.ConfigEditOperation.ADD_PLUGIN,
56
+ plugin: entry.artifact.package
57
+ })),
58
+ extensions: new Map(plugins.map(({ artifact, manifest }) => [artifact.package, {
59
+ package: artifact.package,
60
+ version: artifact.version,
61
+ manifest
62
+ }]))
63
+ });
64
+ const failed = outcomes.find((outcome) => !outcome.applied);
65
+ if (failed && failed.edit.operation === require_configFile.ConfigEditOperation.ADD_PLUGIN) throw new _kubb_core.Diagnostics.Error({
66
+ code: _kubb_core.Diagnostics.code.unknown,
67
+ severity: "error",
68
+ message: `Could not add ${failed.edit.plugin} to ${require_config.KUBB_CONFIG_FILENAME}: ${failed.reason}`,
69
+ help: `Run kubb init without that plugin, then add it with kubb add.`
70
+ });
71
+ return source;
72
+ }
73
+ /** Generates from the config at `configPath` without reporters, and returns how many files it wrote. */
74
+ async function firstRun(configPath) {
75
+ const { configs } = await require_config$1.getConfigs({ configPath });
76
+ let files = 0;
77
+ for (const config of configs) {
78
+ const result = await (0, _kubb_core.createKubb)(config).generate();
79
+ if (!result.success) throw new Error(result.diagnostics.flatMap((diagnostic) => diagnostic.severity === "error" ? [diagnostic.message] : []).join("\n"));
80
+ files += result.files.length;
81
+ }
82
+ return files;
83
+ }
84
+ /** The command that runs `kubb generate`: the `generate` script when it runs Kubb, otherwise `npx kubb generate`. */
85
+ function generateCommand({ packageManager, script, watch }) {
86
+ if (script !== "kubb generate") return `npx kubb generate${watch ? " --watch" : ""}`;
87
+ const run = [
88
+ packageManager.name,
89
+ ...packageManager.runCommand,
90
+ "generate"
91
+ ].join(" ");
92
+ if (!watch) return run;
93
+ return packageManager.name === "npm" ? `${run} -- --watch` : `${run} --watch`;
94
+ }
95
+ /**
96
+ * Runs the Kubb setup wizard: detects the package manager and specs, asks for the spec, plugins, and
97
+ * output folder, shows the config for review, then installs, writes `kubb.config.ts`, adds a
98
+ * `generate` script, and runs the first generation.
99
+ * Pass `yes: true` to skip all prompts and print one line per step.
100
+ */
101
+ async function run({ yes, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }) {
102
+ const cwd = node_process.default.cwd();
103
+ /** Runs `task` behind a spinner, or prints one line when it is done in `--yes` mode. */
104
+ async function step({ start, task, done, failed }) {
105
+ const spinner = require_spinner.createSpinner();
106
+ if (!yes) spinner.start(start);
107
+ try {
108
+ const result = await task();
109
+ if (yes) console.log(`${(0, node_util.styleText)("green", "✓")} ${done(result)}`);
110
+ else spinner.stop(done(result));
111
+ return result;
112
+ } catch (error) {
113
+ if (!yes) spinner.error(failed);
114
+ throw error;
115
+ }
116
+ }
117
+ if (!yes) require_intro.logIntro({ title: require_intro.isInteractiveRun({
118
+ yes,
119
+ dryRun: dryRun.enabled
120
+ }) ? void 0 : "Set up Kubb" });
121
+ try {
122
+ const registry = require_registry.fetchRegistryIndex({ registry: require_registry.registryUrl() }).then((entries) => entries.filter((entry) => entry.kind === "plugin" && !require_registry.incompatibility(entry.manifest)));
123
+ registry.catch(() => {});
124
+ if (!await require_spinner.exists(node_path.default.join(cwd, "package.json"))) {
125
+ if (!yes) {
126
+ if (!unwrap(await _clack_prompts.confirm({
127
+ message: "No package.json found. Would you like to create one?",
128
+ initialValue: true
129
+ }))) cancelAndExit();
130
+ }
131
+ const packageManager = require_utils.detectPackageManager(cwd);
132
+ await step({
133
+ start: `Initializing package.json with ${packageManager.name}`,
134
+ task: () => require_utils.initPackageJson(cwd, packageManager),
135
+ done: () => `Created package.json with ${packageManager.name}`,
136
+ failed: "Could not create package.json"
137
+ });
138
+ }
139
+ const packageManager = require_utils.detectPackageManager(cwd);
140
+ const specs = await require_utils.findSpecFiles(cwd);
141
+ if (!yes) {
142
+ require_intro.logStep(`Package manager ${packageManager.name}`);
143
+ if (specs[0]) {
144
+ const { version: specVersion, operations } = await require_utils.readSpecInfo(node_path.default.join(cwd, specs[0]));
145
+ const details = [
146
+ specs[0].slice(2),
147
+ specVersion ? `${specVersion.startsWith("2") ? "Swagger" : "OpenAPI"} ${specVersion}` : void 0,
148
+ operations === void 0 ? void 0 : require_text.pluralize(operations, "operation"),
149
+ specs.length > 1 ? `+${specs.length - 1} more` : void 0
150
+ ];
151
+ require_intro.logStep(`Found ${details.filter(Boolean).join(" · ")}`);
152
+ }
153
+ }
154
+ const plugins = pluginsFlag || yes ? await registry : void 0;
155
+ const defaultPlugins = (entries) => require_config.initDefaults.plugins.flatMap((id) => require_utils.findPlugin({
156
+ plugins: entries,
157
+ id
158
+ }) ?? []);
159
+ const flagPlugins = pluginsFlag && plugins ? require_utils.parsePluginsFlag({
160
+ plugins,
161
+ value: pluginsFlag
162
+ }) : void 0;
163
+ let choices = {
164
+ inputPath: inputFlag ?? specs[0] ?? require_config.initDefaults.inputPath,
165
+ outputPath: outputFlag ?? require_config.initDefaults.outputPath,
166
+ plugins: flagPlugins ?? (plugins ? defaultPlugins(plugins) : [])
167
+ };
168
+ if (yes && !choices.plugins.length) throw new Error("The registry has no default plugin. Pass --plugins to choose one.");
169
+ async function askInput(current) {
170
+ const choice = specs.length ? unwrap(await _clack_prompts.select({
171
+ message: "Which spec should Kubb read?",
172
+ options: [
173
+ ...specs.map((spec) => ({
174
+ value: spec,
175
+ label: spec,
176
+ hint: "found in this repo"
177
+ })),
178
+ {
179
+ value: "url",
180
+ label: "A URL"
181
+ },
182
+ {
183
+ value: "file",
184
+ label: "Another file"
185
+ }
186
+ ],
187
+ initialValue: specs.includes(current) ? current : /^https?:\/\//.test(current) ? "url" : "file"
188
+ })) : /^https?:\/\//.test(current) ? "url" : "file";
189
+ if (specs.includes(choice)) return choice;
190
+ const isUrl = choice === "url";
191
+ const initial = isUrl === /^https?:\/\//.test(current) && !specs.includes(current) ? current : void 0;
192
+ return unwrap(await _clack_prompts.text({
193
+ message: isUrl ? "Spec URL" : "Spec path",
194
+ placeholder: isUrl ? "https://example.com/openapi.yaml" : require_config.initDefaults.inputPath,
195
+ initialValue: initial,
196
+ defaultValue: isUrl ? void 0 : require_config.initDefaults.inputPath,
197
+ validate: (value) => {
198
+ if (isUrl && !/^https?:\/\//.test(value ?? "")) return "Enter an http(s) URL";
199
+ }
200
+ }));
201
+ }
202
+ async function askPlugins(previous) {
203
+ const plugins = await registry;
204
+ const current = previous.length ? previous : defaultPlugins(plugins);
205
+ const width = Math.max(...plugins.map((entry) => entry.manifest.displayName.length));
206
+ const nameWidth = Math.max(...plugins.map((entry) => entry.manifest.name.length));
207
+ const values = unwrap(await _clack_prompts.multiselect({
208
+ message: "What should Kubb generate?",
209
+ options: plugins.map(({ id, manifest }) => ({
210
+ value: id,
211
+ label: `${manifest.displayName.padEnd(width)} ${(0, node_util.styleText)("dim", manifest.name.padEnd(nameWidth))}`.trimEnd()
212
+ })),
213
+ initialValues: current.map((entry) => entry.id),
214
+ required: true
215
+ }));
216
+ return plugins.filter((entry) => values.includes(entry.id));
217
+ }
218
+ const answered = yes || Boolean(inputFlag && outputFlag && pluginsFlag);
219
+ if (!answered) {
220
+ let firstPass = true;
221
+ while (true) {
222
+ choices = {
223
+ inputPath: firstPass && inputFlag ? inputFlag : await askInput(choices.inputPath),
224
+ plugins: firstPass && flagPlugins ? flagPlugins : await askPlugins(choices.plugins),
225
+ outputPath: firstPass && outputFlag ? outputFlag : unwrap(await _clack_prompts.text({
226
+ message: "Output folder",
227
+ placeholder: choices.outputPath,
228
+ defaultValue: choices.outputPath
229
+ }))
230
+ };
231
+ firstPass = false;
232
+ const missing = require_utils.missingPluginDependencies(choices.plugins.map((entry) => entry.manifest));
233
+ if (missing.length) {
234
+ require_intro.logWarn(`${missing.join("\n")}\nAdd the missing plugins.`);
235
+ continue;
236
+ }
237
+ const config = buildConfig(choices);
238
+ const packages = [require_config.KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)];
239
+ require_intro.logStep(`Review ${require_config.KUBB_CONFIG_FILENAME}`);
240
+ require_intro.logBlock([
241
+ ...config.trimEnd().split("\n"),
242
+ "",
243
+ `${(0, node_util.styleText)("dim", "Installs")} ${packages.join(" ")} with ${packageManager.name}`
244
+ ]);
245
+ const configExists = await require_spinner.exists(node_path.default.join(cwd, require_config.KUBB_CONFIG_FILENAME));
246
+ if (unwrap(await _clack_prompts.select({
247
+ message: configExists ? `kubb.config.ts exists. Overwrite it?` : "Create it?",
248
+ options: [{
249
+ value: true,
250
+ label: "Yes"
251
+ }, {
252
+ value: false,
253
+ label: "Change a choice"
254
+ }]
255
+ }))) break;
256
+ }
257
+ }
258
+ const missing = require_utils.missingPluginDependencies(choices.plugins.map((entry) => entry.manifest));
259
+ if (missing.length) throw new _kubb_core.Diagnostics.Error({
260
+ code: _kubb_core.Diagnostics.code.missingDependency,
261
+ severity: "error",
262
+ message: `${missing.join("\n")}\nAdd the missing plugins and run kubb init again.`
263
+ });
264
+ const configPath = node_path.default.join(cwd, require_config.KUBB_CONFIG_FILENAME);
265
+ if (answered && !yes && await require_spinner.exists(configPath)) {
266
+ if (!unwrap(await _clack_prompts.confirm({
267
+ message: `kubb.config.ts exists. Overwrite it?`,
268
+ initialValue: false
269
+ }))) cancelAndExit("Keeping existing configuration.");
270
+ }
271
+ const packagesToInstall = [`${require_config.KUBB_PACKAGE_NAME}@${require_package.version}`, ...choices.plugins.map((entry) => require_registry.installSpec(entry.artifact))];
272
+ const packageNames = [require_config.KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)];
273
+ const dry = { message: `install ${packagesToInstall.length} packages with ${packageManager.name}` };
274
+ if (yes) await step({
275
+ start: "",
276
+ task: async () => void await dryRun.run(() => require_utils.installPackages(packagesToInstall, packageManager, cwd), dry),
277
+ done: () => `Installed ${packageNames.join(" ")} with ${packageManager.name}`,
278
+ failed: "Installation failed"
279
+ });
280
+ else await require_installWithSpinner.installWithSpinner({
281
+ packages: packagesToInstall,
282
+ names: `${packagesToInstall.length} packages`,
283
+ packageManager,
284
+ cwd,
285
+ install: async (packages, packageManager, cwd, onLine) => void await dryRun.run(() => require_utils.installPackages(packages, packageManager, cwd, onLine), dry)
286
+ });
287
+ await step({
288
+ start: `Writing ${require_config.KUBB_CONFIG_FILENAME}`,
289
+ task: async () => dryRun.run(async () => void await require_spinner.write(configPath, buildConfig(choices)), { message: `write ${require_config.KUBB_CONFIG_FILENAME}` }),
290
+ done: () => `Wrote ${require_config.KUBB_CONFIG_FILENAME}`,
291
+ failed: `Could not write ${require_config.KUBB_CONFIG_FILENAME}`
292
+ });
293
+ const scriptAdded = await dryRun.run(() => require_utils.addGenerateScript(cwd), {
294
+ message: "add a generate script to package.json",
295
+ resolve: async () => await require_utils.generateScript(cwd) === void 0
296
+ });
297
+ if (scriptAdded && !yes) require_intro.logStep("Added \"generate\": \"kubb generate\" to package.json");
298
+ const script = scriptAdded ? "kubb generate" : await require_utils.generateScript(cwd);
299
+ const runStart = node_process.default.hrtime();
300
+ try {
301
+ await dryRun.run(() => step({
302
+ start: "Running the first generation",
303
+ task: () => firstRun(configPath),
304
+ done: (files) => yes ? `Generated ${require_text.pluralize(files, "file")} in ${choices.outputPath}` : `First run ${require_text.pluralize(files, "file")} in ${choices.outputPath} · ${require_time.formatMs(require_time.getElapsedMs(runStart))}`,
305
+ failed: "First run failed"
306
+ }), {
307
+ message: "run the first generation",
308
+ resolve: () => 0
309
+ });
310
+ } catch (error) {
311
+ require_intro.logError(error instanceof Error ? error.message : String(error));
312
+ const message = `Kubb is set up, but the first run failed. Fix the error, then run ${generateCommand({
313
+ packageManager,
314
+ script,
315
+ watch: false
316
+ })}.`;
317
+ if (yes) console.log(message);
318
+ else require_intro.logOutro((0, node_util.styleText)("yellow", message));
319
+ node_process.default.exitCode = 1;
320
+ return;
321
+ }
322
+ if (yes) {
323
+ console.log(`Kubb is set up. Run ${generateCommand({
324
+ packageManager,
325
+ script,
326
+ watch: false
327
+ })} after changing the spec.`);
328
+ return;
329
+ }
330
+ require_intro.logOutro(`${(0, node_util.styleText)("green", "✓ Kubb is set up")}\n ${(0, node_util.styleText)("dim", "Next")} ${generateCommand({
331
+ packageManager,
332
+ script,
333
+ watch: true
334
+ })}`);
335
+ } catch (error) {
336
+ require_intro.logError((0, node_util.styleText)("red", "An error occurred during initialization"));
337
+ if (error instanceof Error) require_intro.logError(error.message);
338
+ node_process.default.exit(1);
339
+ }
340
+ }
341
+ const command = (0, gunshi.defineWithTypes)()({
342
+ name: "init",
343
+ description: "Set up a config, install plugins, and run the first generation.",
344
+ examples: [
345
+ "kubb init",
346
+ "kubb init --yes",
347
+ "kubb init --input ./openapi.yaml --output ./src/gen --plugins plugin-ts,plugin-zod",
348
+ "kubb init --yes --input ./openapi.yaml --plugins ts,zod --output src/api",
349
+ "kubb init --plugins plugin-ts,plugin-axios,plugin-react-query",
350
+ "kubb init --yes --dry-run"
351
+ ].join("\n"),
352
+ toKebab: true,
353
+ args: {
354
+ yes: {
355
+ type: "boolean",
356
+ description: "Skip prompts and use the detected spec, the default plugin, and the default output folder",
357
+ short: "y",
358
+ default: false
359
+ },
360
+ input: {
361
+ type: "string",
362
+ description: "Path to the OpenAPI specification",
363
+ short: "i",
364
+ metavar: "path"
365
+ },
366
+ output: {
367
+ type: "string",
368
+ description: "Output directory for generated files",
369
+ short: "o",
370
+ metavar: "path"
371
+ },
372
+ plugins: {
373
+ type: "string",
374
+ description: "Comma-separated Kubb registry ids of the plugins to add, the same ids `kubb add` takes (plugin-ts, plugin-zod, acme/plugin-x), or short names (ts, zod)",
375
+ metavar: "plugin-ts,plugin-zod,..."
376
+ }
377
+ },
378
+ run: ({ values, extensions }) => run({
379
+ yes: values.yes,
380
+ input: values.input,
381
+ output: values.output,
382
+ plugins: values.plugins,
383
+ dryRun: extensions[_gunshi_plugin_dryrun.pluginId]
384
+ })
385
+ });
386
+ exports.command = command;
387
+ exports.run = run;
388
+
389
+ //# sourceMappingURL=run-DBnSbwtU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-DBnSbwtU.cjs","names":["clack","editConfig","ConfigEditOperation","Diagnostics","KUBB_CONFIG_FILENAME","getConfigs","createKubb","process","createSpinner","styleText","isInteractiveRun","fetchRegistryIndex","registryUrl","incompatibility","exists","path","detectPackageManager","initPackageJson","findSpecFiles","readSpecInfo","pluralize","initDefaults","findPlugin","parsePluginsFlag","missingPluginDependencies","KUBB_PACKAGE_NAME","version","installSpec","installPackages","installWithSpinner","write","addGenerateScript","generateScript","formatMs","getElapsedMs","defineWithTypes","dryRunId"],"sources":["../../../internals/shared/src/init.ts","../src/runners/init/run.ts"],"sourcesContent":["/** The `kubb.config.ts` `kubb init` writes before `kubb add` puts each plugin in. */\nexport function generateConfigFile({ inputPath, outputPath }: { inputPath: string; outputPath: string }): string {\n return `import { defineConfig } from 'kubb/config'\n\nexport default defineConfig({\n input: '${inputPath}',\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [],\n})\n`\n}\n","import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { DryRunExtension } from '@gunshi/plugin-dryrun'\nimport { defineWithTypes } from 'gunshi'\nimport { ConfigEditOperation, editConfig, generateConfigFile, initDefaults, KUBB_CONFIG_FILENAME, KUBB_PACKAGE_NAME } from '@internals/shared'\nimport { exists, formatMs, getElapsedMs, write } from '@internals/utils'\nimport { createKubb, Diagnostics, type RegistryEntry } from '@kubb/core'\nimport { dryRunId, type DryRunExtensions } from '../../commands/shared.ts'\nimport { getConfigs } from '../../config.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport { isInteractiveRun, logIntro, logOutro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { fetchRegistryIndex, incompatibility, installSpec, registryUrl } from '../../utils/registry.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport {\n addGenerateScript,\n detectPackageManager,\n findPlugin,\n findSpecFiles,\n generateScript,\n initPackageJson,\n installPackages,\n missingPluginDependencies,\n type PackageManagerInfo,\n parsePluginsFlag,\n readSpecInfo,\n} from './utils.ts'\nimport { version } from '../../../package.json'\n\nfunction cancelAndExit(message = 'Operation canceled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\nfunction unwrap<T>(value: T): Exclude<T, symbol> {\n if (clack.isCancel(value)) cancelAndExit()\n return value as Exclude<T, symbol>\n}\n\ntype InitOptions = {\n /**\n * When `true`, skips all interactive prompts and uses the detected or default values.\n */\n yes: boolean\n /**\n * Input path flag value from `--input`. When provided, skips the input prompt.\n */\n input?: string\n /**\n * Output directory flag value from `--output`. When provided, skips the output prompt.\n */\n output?: string\n /**\n * Comma-separated plugin list from `--plugins`, e.g. `'plugin-ts,zod'`. When provided, skips the plugin selection prompt.\n */\n plugins?: string\n /**\n * Dry-run extension from `@gunshi/plugin-dryrun`. When enabled, package installation, file\n * writes, and the first run are skipped.\n */\n dryRun: DryRunExtension\n}\n\ntype Choices = {\n inputPath: string\n outputPath: string\n plugins: Array<RegistryEntry>\n}\n\n/** The full `kubb.config.ts` for `choices`, with each plugin added the way `kubb add` adds it. */\nfunction buildConfig({ inputPath, outputPath, plugins }: Choices): string {\n const { source, outcomes } = editConfig({\n source: generateConfigFile({ inputPath, outputPath }),\n edits: plugins.map((entry) => ({ operation: ConfigEditOperation.ADD_PLUGIN, plugin: entry.artifact.package })),\n extensions: new Map(plugins.map(({ artifact, manifest }) => [artifact.package, { package: artifact.package, version: artifact.version, manifest }])),\n })\n const failed = outcomes.find((outcome) => !outcome.applied)\n if (failed && failed.edit.operation === ConfigEditOperation.ADD_PLUGIN)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `Could not add ${failed.edit.plugin} to ${KUBB_CONFIG_FILENAME}: ${failed.reason}`,\n help: `Run kubb init without that plugin, then add it with kubb add.`,\n })\n return source\n}\n\n/** Generates from the config at `configPath` without reporters, and returns how many files it wrote. */\nasync function firstRun(configPath: string): Promise<number> {\n const { configs } = await getConfigs({ configPath })\n let files = 0\n for (const config of configs) {\n const result = await createKubb(config).generate()\n if (!result.success) throw new Error(result.diagnostics.flatMap((diagnostic) => (diagnostic.severity === 'error' ? [diagnostic.message] : [])).join('\\n'))\n files += result.files.length\n }\n return files\n}\n\n/** The command that runs `kubb generate`: the `generate` script when it runs Kubb, otherwise `npx kubb generate`. */\nfunction generateCommand({ packageManager, script, watch }: { packageManager: PackageManagerInfo; script: string | undefined; watch: boolean }): string {\n if (script !== 'kubb generate') return `npx kubb generate${watch ? ' --watch' : ''}`\n const run = [packageManager.name, ...packageManager.runCommand, 'generate'].join(' ')\n if (!watch) return run\n return packageManager.name === 'npm' ? `${run} -- --watch` : `${run} --watch`\n}\n\n/**\n * Runs the Kubb setup wizard: detects the package manager and specs, asks for the spec, plugins, and\n * output folder, shows the config for review, then installs, writes `kubb.config.ts`, adds a\n * `generate` script, and runs the first generation.\n * Pass `yes: true` to skip all prompts and print one line per step.\n */\nexport async function run({ yes, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n /** Runs `task` behind a spinner, or prints one line when it is done in `--yes` mode. */\n async function step<T>({ start, task, done, failed }: { start: string; task: () => Promise<T>; done: (result: T) => string; failed: string }): Promise<T> {\n const spinner = createSpinner()\n if (!yes) spinner.start(start)\n try {\n const result = await task()\n if (yes) console.log(`${styleText('green', '✓')} ${done(result)}`)\n else spinner.stop(done(result))\n return result\n } catch (error) {\n if (!yes) spinner.error(failed)\n throw error\n }\n }\n\n if (!yes) logIntro({ title: isInteractiveRun({ yes, dryRun: dryRun.enabled }) ? undefined : 'Set up Kubb' })\n\n try {\n // Start the registry fetch now but await it only at the plugin step, so the first prompt never waits on the network\n const registry = fetchRegistryIndex({ registry: registryUrl() }).then((entries) =>\n entries.filter((entry) => entry.kind === 'plugin' && !incompatibility(entry.manifest)),\n )\n registry.catch(() => {})\n\n if (!(await exists(path.join(cwd, 'package.json')))) {\n if (!yes) {\n const shouldInit = unwrap(await clack.confirm({ message: 'No package.json found. Would you like to create one?', initialValue: true }))\n if (!shouldInit) cancelAndExit()\n }\n\n const packageManager = detectPackageManager(cwd)\n await step({\n start: `Initializing package.json with ${packageManager.name}`,\n task: () => initPackageJson(cwd, packageManager),\n done: () => `Created package.json with ${packageManager.name}`,\n failed: 'Could not create package.json',\n })\n }\n\n const packageManager = detectPackageManager(cwd)\n const specs = await findSpecFiles(cwd)\n\n if (!yes) {\n logStep(`Package manager ${packageManager.name}`)\n if (specs[0]) {\n const { version: specVersion, operations } = await readSpecInfo(path.join(cwd, specs[0]))\n const details = [\n specs[0].slice(2),\n specVersion ? `${specVersion.startsWith('2') ? 'Swagger' : 'OpenAPI'} ${specVersion}` : undefined,\n operations === undefined ? undefined : pluralize(operations, 'operation'),\n specs.length > 1 ? `+${specs.length - 1} more` : undefined,\n ]\n logStep(`Found ${details.filter(Boolean).join(' · ')}`)\n }\n }\n\n // `--plugins` and `--yes` need the registry before any prompt; the interactive path reads it at the plugin step\n const plugins = pluginsFlag || yes ? await registry : undefined\n const defaultPlugins = (entries: Array<RegistryEntry>) => initDefaults.plugins.flatMap((id) => findPlugin({ plugins: entries, id }) ?? [])\n\n const flagPlugins = pluginsFlag && plugins ? parsePluginsFlag({ plugins, value: pluginsFlag }) : undefined\n\n let choices: Choices = {\n inputPath: inputFlag ?? specs[0] ?? initDefaults.inputPath,\n outputPath: outputFlag ?? initDefaults.outputPath,\n plugins: flagPlugins ?? (plugins ? defaultPlugins(plugins) : []),\n }\n if (yes && !choices.plugins.length) {\n throw new Error('The registry has no default plugin. Pass --plugins to choose one.')\n }\n\n async function askInput(current: string): Promise<string> {\n const choice = specs.length\n ? unwrap(\n await clack.select({\n message: 'Which spec should Kubb read?',\n options: [\n ...specs.map((spec) => ({ value: spec, label: spec, hint: 'found in this repo' })),\n { value: 'url', label: 'A URL' },\n { value: 'file', label: 'Another file' },\n ],\n initialValue: specs.includes(current) ? current : /^https?:\\/\\//.test(current) ? 'url' : 'file',\n }),\n )\n : /^https?:\\/\\//.test(current)\n ? 'url'\n : 'file'\n if (specs.includes(choice)) return choice\n const isUrl = choice === 'url'\n const initial = isUrl === /^https?:\\/\\//.test(current) && !specs.includes(current) ? current : undefined\n return unwrap(\n await clack.text({\n message: isUrl ? 'Spec URL' : 'Spec path',\n placeholder: isUrl ? 'https://example.com/openapi.yaml' : initDefaults.inputPath,\n initialValue: initial,\n defaultValue: isUrl ? undefined : initDefaults.inputPath,\n validate: (value) => {\n if (isUrl && !/^https?:\\/\\//.test(value ?? '')) return 'Enter an http(s) URL'\n },\n }),\n )\n }\n\n async function askPlugins(previous: Array<RegistryEntry>): Promise<Array<RegistryEntry>> {\n const plugins = await registry\n const current = previous.length ? previous : defaultPlugins(plugins)\n const width = Math.max(...plugins.map((entry) => entry.manifest.displayName.length))\n const nameWidth = Math.max(...plugins.map((entry) => entry.manifest.name.length))\n const values = unwrap(\n await clack.multiselect({\n message: 'What should Kubb generate?',\n options: plugins.map(({ id, manifest }) => ({\n value: id,\n label: `${manifest.displayName.padEnd(width)} ${styleText('dim', manifest.name.padEnd(nameWidth))}`.trimEnd(),\n })),\n initialValues: current.map((entry) => entry.id),\n required: true,\n }),\n )\n return plugins.filter((entry) => values.includes(entry.id))\n }\n\n // Flags for all three choices leave nothing to ask or review, as before the review step existed\n const answered = yes || Boolean(inputFlag && outputFlag && pluginsFlag)\n if (!answered) {\n let firstPass = true\n while (true) {\n // The first pass skips the questions a flag answered; \"Change a choice\" asks them all again.\n choices = {\n inputPath: firstPass && inputFlag ? inputFlag : await askInput(choices.inputPath),\n plugins: firstPass && flagPlugins ? flagPlugins : await askPlugins(choices.plugins),\n outputPath:\n firstPass && outputFlag\n ? outputFlag\n : unwrap(await clack.text({ message: 'Output folder', placeholder: choices.outputPath, defaultValue: choices.outputPath })),\n }\n firstPass = false\n const missing = missingPluginDependencies(choices.plugins.map((entry) => entry.manifest))\n if (missing.length) {\n logWarn(`${missing.join('\\n')}\\nAdd the missing plugins.`)\n continue\n }\n const config = buildConfig(choices)\n const packages = [KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)]\n logStep(`Review ${KUBB_CONFIG_FILENAME}`)\n logBlock([...config.trimEnd().split('\\n'), '', `${styleText('dim', 'Installs')} ${packages.join(' ')} with ${packageManager.name}`])\n const configExists = await exists(path.join(cwd, KUBB_CONFIG_FILENAME))\n const confirmed = unwrap(\n await clack.select({\n message: configExists ? `${KUBB_CONFIG_FILENAME} exists. Overwrite it?` : 'Create it?',\n options: [\n { value: true, label: 'Yes' },\n { value: false, label: 'Change a choice' },\n ],\n }),\n )\n if (confirmed) break\n }\n }\n\n // Check the selection against the plugins' manifests before installing anything\n const missing = missingPluginDependencies(choices.plugins.map((entry) => entry.manifest))\n if (missing.length) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.missingDependency,\n severity: 'error',\n message: `${missing.join('\\n')}\\nAdd the missing plugins and run kubb init again.`,\n })\n }\n\n const configPath = path.join(cwd, KUBB_CONFIG_FILENAME)\n if (answered && !yes && (await exists(configPath))) {\n const overwrite = unwrap(await clack.confirm({ message: `${KUBB_CONFIG_FILENAME} exists. Overwrite it?`, initialValue: false }))\n if (!overwrite) cancelAndExit('Keeping existing configuration.')\n }\n\n // Install `kubb` at the running CLI's version and each plugin at the version the registry pins\n const packagesToInstall = [`${KUBB_PACKAGE_NAME}@${version}`, ...choices.plugins.map((entry) => installSpec(entry.artifact))]\n const packageNames = [KUBB_PACKAGE_NAME, ...choices.plugins.map((entry) => entry.artifact.package)]\n const dry = { message: `install ${packagesToInstall.length} packages with ${packageManager.name}` }\n if (yes) {\n await step({\n start: '',\n task: async () => void (await dryRun.run(() => installPackages(packagesToInstall, packageManager, cwd), dry)),\n done: () => `Installed ${packageNames.join(' ')} with ${packageManager.name}`,\n failed: 'Installation failed',\n })\n } else {\n await installWithSpinner({\n packages: packagesToInstall,\n names: `${packagesToInstall.length} packages`,\n packageManager,\n cwd,\n install: async (packages, packageManager, cwd, onLine) => void (await dryRun.run(() => installPackages(packages, packageManager, cwd, onLine), dry)),\n })\n }\n\n await step({\n start: `Writing ${KUBB_CONFIG_FILENAME}`,\n task: async () => dryRun.run(async () => void (await write(configPath, buildConfig(choices))), { message: `write ${KUBB_CONFIG_FILENAME}` }),\n done: () => `Wrote ${KUBB_CONFIG_FILENAME}`,\n failed: `Could not write ${KUBB_CONFIG_FILENAME}`,\n })\n\n const scriptAdded = await dryRun.run(() => addGenerateScript(cwd), {\n message: 'add a generate script to package.json',\n resolve: async () => (await generateScript(cwd)) === undefined,\n })\n if (scriptAdded && !yes) logStep('Added \"generate\": \"kubb generate\" to package.json')\n\n const script = scriptAdded ? 'kubb generate' : await generateScript(cwd)\n const runStart = process.hrtime()\n try {\n await dryRun.run(\n () =>\n step({\n start: 'Running the first generation',\n task: () => firstRun(configPath),\n done: (files) =>\n yes\n ? `Generated ${pluralize(files, 'file')} in ${choices.outputPath}`\n : `First run ${pluralize(files, 'file')} in ${choices.outputPath} · ${formatMs(getElapsedMs(runStart))}`,\n failed: 'First run failed',\n }),\n { message: 'run the first generation', resolve: () => 0 },\n )\n } catch (error) {\n logError(error instanceof Error ? error.message : String(error))\n const message = `Kubb is set up, but the first run failed. Fix the error, then run ${generateCommand({ packageManager, script, watch: false })}.`\n if (yes) console.log(message)\n else logOutro(styleText('yellow', message))\n process.exitCode = 1\n return\n }\n\n if (yes) {\n console.log(`Kubb is set up. Run ${generateCommand({ packageManager, script, watch: false })} after changing the spec.`)\n return\n }\n logOutro(`${styleText('green', '✓ Kubb is set up')}\\n ${styleText('dim', 'Next')} ${generateCommand({ packageManager, script, watch: true })}`)\n } catch (error) {\n logError(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n logError(error.message)\n }\n process.exit(1)\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'init',\n description: 'Set up a config, install plugins, and run the first generation.',\n examples: [\n 'kubb init',\n 'kubb init --yes',\n 'kubb init --input ./openapi.yaml --output ./src/gen --plugins plugin-ts,plugin-zod',\n 'kubb init --yes --input ./openapi.yaml --plugins ts,zod --output src/api',\n 'kubb init --plugins plugin-ts,plugin-axios,plugin-react-query',\n 'kubb init --yes --dry-run',\n ].join('\\n'),\n toKebab: true,\n args: {\n yes: {\n type: 'boolean',\n description: 'Skip prompts and use the detected spec, the default plugin, and the default output folder',\n short: 'y',\n default: false,\n },\n input: {\n type: 'string',\n description: 'Path to the OpenAPI specification',\n short: 'i',\n metavar: 'path',\n },\n output: {\n type: 'string',\n description: 'Output directory for generated files',\n short: 'o',\n metavar: 'path',\n },\n plugins: {\n type: 'string',\n description:\n 'Comma-separated Kubb registry ids of the plugins to add, the same ids `kubb add` takes (plugin-ts, plugin-zod, acme/plugin-x), or short names (ts, zod)',\n metavar: 'plugin-ts,plugin-zod,...',\n },\n },\n run: ({ values, extensions }) => run({ yes: values.yes, input: values.input, output: values.output, plugins: values.plugins, dryRun: extensions[dryRunId] }),\n})\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import "./rolldown-runtime-CRm0XQPb.js";
2
- import { n as toError } from "./errors-DmC83ALX.js";
3
- import { n as trackRun } from "./Telemetry-DrnGartf.js";
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { n as toError } from "./errors-wzqmMpMo.js";
3
+ import { n as trackRun } from "./Telemetry-C7Qwy2s7.js";
4
4
  import { styleText } from "node:util";
5
5
  import process from "node:process";
6
- //#region src/runners/mcp/run.ts
6
+ // src/runners/mcp/run.ts
7
7
  /**
8
8
  * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.
9
9
  */
@@ -26,7 +26,6 @@ async function run() {
26
26
  process.exitCode = 1;
27
27
  }
28
28
  }
29
- //#endregion
30
29
  export { run };
31
30
 
32
- //# sourceMappingURL=run-j1g5si5R.js.map
31
+ //# sourceMappingURL=run-DTqMrPS9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-j1g5si5R.js","names":[],"sources":["../src/runners/mcp/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { toError } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { trackRun } from '../../Telemetry.ts'\n\n/**\n * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.\n */\nexport async function run(): Promise<void> {\n const { run: startMcpServer } = (await import('@kubb/mcp')) as typeof McpModule\n\n const report = trackRun({ command: 'mcp', hrStart: process.hrtime() })\n\n try {\n // The MCP stdio transport owns stdout: anything else written there corrupts the JSON-RPC stream.\n console.error(styleText('cyan', '⏳ Starting MCP server...'))\n console.warn(styleText('yellow', 'This feature is still under development, use with caution'))\n const server = startMcpServer()\n // Report once the client introduces itself, so the event names the client (e.g. `claude-code`, `cursor-vscode`).\n server.on('initialize', ({ clientInfo }) => void report({ status: 'success', mcpClient: clientInfo.name }), { once: true })\n } catch (error) {\n await report({ status: 'failed' })\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n"],"mappings":";;;;;;;;;AASA,eAAsB,MAAqB;CACzC,MAAM,EAAE,KAAK,mBAAoB,MAAM,OAAO;CAE9C,MAAM,SAAS,SAAS;EAAE,SAAS;EAAO,SAAS,QAAQ,OAAO;CAAE,CAAC;CAErE,IAAI;EAEF,QAAQ,MAAM,UAAU,QAAQ,0BAA0B,CAAC;EAC3D,QAAQ,KAAK,UAAU,UAAU,2DAA2D,CAAC;EAG7F,eAAK,CAAC,CAAC,GAAG,eAAe,EAAE,iBAAiB,KAAK,OAAO;GAAE,QAAQ;GAAW,WAAW,WAAW;EAAK,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;CAC5H,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,QAAQ,WAAW;CACrB;AACF"}
1
+ {"version":3,"file":"run-DTqMrPS9.js","names":[],"sources":["../src/runners/mcp/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { toError } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { trackRun } from '../../Telemetry.ts'\n\n/**\n * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.\n */\nexport async function run(): Promise<void> {\n const { run: startMcpServer } = (await import('@kubb/mcp')) as typeof McpModule\n\n const report = trackRun({ command: 'mcp', hrStart: process.hrtime() })\n\n try {\n // The MCP stdio transport owns stdout: anything else written there corrupts the JSON-RPC stream.\n console.error(styleText('cyan', '⏳ Starting MCP server...'))\n console.warn(styleText('yellow', 'This feature is still under development, use with caution'))\n const server = startMcpServer()\n // Report once the client introduces itself, so the event names the client (e.g. `claude-code`, `cursor-vscode`).\n server.on('initialize', ({ clientInfo }) => void report({ status: 'success', mcpClient: clientInfo.name }), { once: true })\n } catch (error) {\n await report({ status: 'failed' })\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n"],"mappings":";;;;;;;;;AASA,eAAsB,MAAqB;CACzC,MAAM,EAAE,KAAK,mBAAoB,MAAM,OAAO;CAE9C,MAAM,SAAS,SAAS;EAAE,SAAS;EAAO,SAAS,QAAQ,OAAO;CAAE,CAAC;CAErE,IAAI;EAEF,QAAQ,MAAM,UAAU,QAAQ,0BAA0B,CAAC;EAC3D,QAAQ,KAAK,UAAU,UAAU,2DAA2D,CAAC;EAG7F,eAAK,CAAC,CAAC,GAAG,eAAe,EAAE,iBAAiB,KAAK,OAAO;GAAE,QAAQ;GAAW,WAAW,WAAW;EAAK,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;CAC5H,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,QAAQ,WAAW;CACrB;AACF"}
@@ -1,11 +1,16 @@
1
- import "./rolldown-runtime-CRm0XQPb.js";
2
- import { n as toError } from "./errors-DmC83ALX.js";
3
- import { n as trackRun, r as version, s as isCIEnvironment } from "./Telemetry-DrnGartf.js";
4
- import { c as createSpinner } from "./utils-CIc8YFtr.js";
5
- import { _ as isRichOutput, a as logOutro, c as logBlock, d as logStep, g as canUseTTY, h as plainWriter, i as logIntro, n as toPermissionFlag, s as logTip } from "./text-CL6N6yPS.js";
6
- import { i as KUBB_CONFIG_FILENAME, t as getConfigs } from "./config-CNqgDSu3.js";
7
- import { a as readCredentials, n as getCredentialsPath, o as writeCredentials, r as getMachineId, t as clearCredentials } from "./credentials-CZK6zPLv.js";
8
- import { n as setupReporters } from "./reporters-mYHIUZSx.js";
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { n as toError } from "./errors-wzqmMpMo.js";
3
+ import { t as isCIEnvironment } from "./isCIEnvironment-D6xtAAZ2.js";
4
+ import { t as createSpinner } from "./spinner-BZaln7O8.js";
5
+ import { t as version } from "./package-MYPMnnTX.js";
6
+ import { n as trackRun } from "./Telemetry-C7Qwy2s7.js";
7
+ import { n as isRichOutput, t as canUseTTY } from "./env-rv-VgSGN.js";
8
+ import { a as logTip, l as logStep, n as logIntro, o as logBlock, p as plainWriter, r as logOutro } from "./intro-9PB8sE8z.js";
9
+ import { a as readCredentials, n as getCredentialsPath, o as writeCredentials, r as getMachineId, t as clearCredentials } from "./credentials-osgjujE_.js";
10
+ import { n as toPermissionFlag } from "./text-BmiI4s6N.js";
11
+ import { a as KUBB_CONFIG_FILENAME } from "./config-CQTxXvIG.js";
12
+ import { n as setupReporters } from "./reporters-BM430HdQ.js";
13
+ import { t as getConfigs } from "./config-Uk3rbZfb.js";
9
14
  import { styleText } from "node:util";
10
15
  import { hostname } from "node:os";
11
16
  import process from "node:process";
@@ -15,7 +20,7 @@ import * as prompts from "@clack/prompts";
15
20
  import { Diagnostics, Hookable, cliReporter, logLevel } from "@kubb/core";
16
21
  import { InvalidAgentTokenError, PairingCanceledError, connectAgent, defaultStudioUrl, pairAgent } from "@kubb/studio";
17
22
  import { AgentPermission } from "@kubb/studio/protocol";
18
- //#region ../../internals/utils/src/copyToClipboard.ts
23
+ // ../../internals/utils/src/copyToClipboard.ts
19
24
  const COMMANDS = {
20
25
  darwin: ["pbcopy"],
21
26
  win32: ["clip.exe"],
@@ -45,8 +50,7 @@ async function copyToClipboard(text) {
45
50
  run.process?.stdin?.end(text);
46
51
  return run.then(({ exitCode }) => exitCode === 0, () => false);
47
52
  }
48
- //#endregion
49
- //#region ../../internals/utils/src/openInBrowser.ts
53
+ // ../../internals/utils/src/openInBrowser.ts
50
54
  const ignore = () => {};
51
55
  /**
52
56
  * Opens a URL or local file in the default browser, unless running in CI.
@@ -64,8 +68,7 @@ function openInBrowser(target) {
64
68
  }
65
69
  x(process.platform === "darwin" ? "open" : "xdg-open", [target]).then(ignore, ignore);
66
70
  }
67
- //#endregion
68
- //#region src/runners/studio/run.ts
71
+ // src/runners/studio/run.ts
69
72
  /**
70
73
  * Pairs this machine with Studio and stores the resulting token.
71
74
  *
@@ -209,11 +212,11 @@ function formatPermissionRows(granted) {
209
212
  * Flags win, saved answers are reused, and the rest are asked in one list whose answers are stored
210
213
  * in `~/.kubb/credentials.json`.
211
214
  */
212
- async function resolvePermissions(options, credentials, configPath = KUBB_CONFIG_FILENAME) {
215
+ async function resolvePermissions(options, credentials, configPath = KUBB_CONFIG_FILENAME, { edit = false } = {}) {
213
216
  const project = process.cwd();
214
217
  const remembered = credentials.projects?.[project];
215
218
  const granted = Object.fromEntries(PERMISSIONS.map(({ key }) => [key, options.permission[key] || remembered?.[key] === true]));
216
- const pending = PERMISSIONS.filter(({ key }) => !options.permission[key] && typeof remembered?.[key] !== "boolean");
219
+ const pending = PERMISSIONS.filter(({ key }) => !options.permission[key] && (edit || typeof remembered?.[key] !== "boolean"));
217
220
  if (!pending.length || isCIEnvironment() || !canUseTTY()) return granted;
218
221
  prompts.updateSettings({ withGuide: true });
219
222
  const selected = await prompts.multiselect({
@@ -223,9 +226,13 @@ async function resolvePermissions(options, credentials, configPath = KUBB_CONFIG
223
226
  label: title(configPath),
224
227
  hint
225
228
  })),
229
+ ...edit ? { initialValues: pending.filter(({ key }) => remembered?.[key] === true).map(({ key }) => key) } : {},
226
230
  required: false
227
231
  });
228
- if (prompts.isCancel(selected)) return granted;
232
+ if (prompts.isCancel(selected)) {
233
+ if (edit) throw new Error("Canceled. Permissions are unchanged.");
234
+ return granted;
235
+ }
229
236
  const answers = Object.fromEntries(pending.map(({ key }) => [key, selected.includes(key)]));
230
237
  await writeCredentials({
231
238
  ...credentials,
@@ -292,7 +299,7 @@ async function connect(options, context = {}) {
292
299
  let unwatch;
293
300
  try {
294
301
  if (!context.prepared) {
295
- const { getWorkerStatus } = await import("./background-C6XHpEo7.js");
302
+ const { getWorkerStatus } = await import("./background-D4mZCg-4.js");
296
303
  if ((await getWorkerStatus()).running) throw new Diagnostics.Error({
297
304
  code: Diagnostics.code.unknown,
298
305
  severity: "error",
@@ -360,7 +367,7 @@ async function connect(options, context = {}) {
360
367
  await hooks.callHook("kubb:lifecycle:end");
361
368
  unwatch?.();
362
369
  if (background) {
363
- const { startWorker } = await import("./background-C6XHpEo7.js");
370
+ const { startWorker } = await import("./background-D4mZCg-4.js");
364
371
  await startWorker(options);
365
372
  if (options.logLevel !== "silent") logOutro("Running in the background · kubb studio stop");
366
373
  return;
@@ -430,7 +437,6 @@ async function runStudio(values, action, { block = false, json = false } = {}) {
430
437
  process.exitCode = 1;
431
438
  }
432
439
  }
433
- //#endregion
434
440
  export { login as a, runStudio as c, loadConfigs as i, watchKeys as l, formatCountdown as n, prepareConnection as o, formatPermissionRows as r, resolvePermissions as s, connect as t };
435
441
 
436
- //# sourceMappingURL=run-9fs2T2Je.js.map
442
+ //# sourceMappingURL=run-DUwX6Icx.js.map