@kubb/cli 5.1.0 → 5.2.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 (101) hide show
  1. package/README.md +66 -0
  2. package/dist/{Telemetry-Fiymfxez.js → Telemetry-BCTY-Nzq.js} +3 -49
  3. package/dist/Telemetry-BCTY-Nzq.js.map +1 -0
  4. package/dist/{Telemetry-D-Jpt27O.cjs → Telemetry-DKfJQxnC.cjs} +8 -60
  5. package/dist/Telemetry-DKfJQxnC.cjs.map +1 -0
  6. package/dist/constants-CdxpgX3_.cjs +115 -0
  7. package/dist/constants-CdxpgX3_.cjs.map +1 -0
  8. package/dist/constants-DHRspBTo.js +92 -0
  9. package/dist/constants-DHRspBTo.js.map +1 -0
  10. package/dist/env-DHaFBZTX.cjs +82 -0
  11. package/dist/env-DHaFBZTX.cjs.map +1 -0
  12. package/dist/env-DqPKEL59.js +59 -0
  13. package/dist/env-DqPKEL59.js.map +1 -0
  14. package/dist/{errors-CZtH2dKk.cjs → errors-C-wEou02.cjs} +2 -19
  15. package/dist/errors-C-wEou02.cjs.map +1 -0
  16. package/dist/errors-C8yNfV7w.js +20 -0
  17. package/dist/errors-C8yNfV7w.js.map +1 -0
  18. package/dist/{generate-HzSh9v2l.js → generate-CEHA2OSd.js} +9 -6
  19. package/dist/generate-CEHA2OSd.js.map +1 -0
  20. package/dist/{generate-BO_Gv-vi.cjs → generate-P5PWAa7J.cjs} +9 -6
  21. package/dist/generate-P5PWAa7J.cjs.map +1 -0
  22. package/dist/index.cjs +14 -9
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +2 -3
  25. package/dist/index.js +15 -10
  26. package/dist/index.js.map +1 -1
  27. package/dist/{init-BslRoYhh.js → init-CgQnnwbc.js} +3 -3
  28. package/dist/{init-BslRoYhh.js.map → init-CgQnnwbc.js.map} +1 -1
  29. package/dist/{init-EJOY4K6y.cjs → init-_p5e5VuD.cjs} +3 -3
  30. package/dist/{init-EJOY4K6y.cjs.map → init-_p5e5VuD.cjs.map} +1 -1
  31. package/dist/{mcp-CtV0d0Dc.js → mcp-B-GxGgVr.js} +8 -10
  32. package/dist/mcp-B-GxGgVr.js.map +1 -0
  33. package/dist/{mcp-BIcX2H1u.cjs → mcp-B3B-rE7W.cjs} +8 -10
  34. package/dist/mcp-B3B-rE7W.cjs.map +1 -0
  35. package/dist/output-B2V2MN_C.cjs +137 -0
  36. package/dist/output-B2V2MN_C.cjs.map +1 -0
  37. package/dist/output-LZvrgF3z.js +89 -0
  38. package/dist/output-LZvrgF3z.js.map +1 -0
  39. package/dist/package-GR1Pi9JF.js +6 -0
  40. package/dist/package-GR1Pi9JF.js.map +1 -0
  41. package/dist/{package-CnUMuss9.cjs → package-vVVyiYqL.cjs} +2 -2
  42. package/dist/package-vVVyiYqL.cjs.map +1 -0
  43. package/dist/{run-DSgLksGj.js → run-BzvsJ0Ek.js} +80 -112
  44. package/dist/run-BzvsJ0Ek.js.map +1 -0
  45. package/dist/run-CH9jQeET.js +499 -0
  46. package/dist/run-CH9jQeET.js.map +1 -0
  47. package/dist/run-D-XYvWxQ.js +281 -0
  48. package/dist/run-D-XYvWxQ.js.map +1 -0
  49. package/dist/{run-BV2tMjuz.cjs → run-D6yr3HEE.cjs} +15 -4
  50. package/dist/run-D6yr3HEE.cjs.map +1 -0
  51. package/dist/{run-FPqeAEF4.cjs → run-DRBqVXX0.cjs} +93 -125
  52. package/dist/run-DRBqVXX0.cjs.map +1 -0
  53. package/dist/{run-DCfdTu52.js → run-DgV0unjs.js} +11 -4
  54. package/dist/run-DgV0unjs.js.map +1 -0
  55. package/dist/{run-Cs5FunVC.cjs → run-FLh61kzq.cjs} +11 -4
  56. package/dist/run-FLh61kzq.cjs.map +1 -0
  57. package/dist/run-Z_y-m4dQ.cjs +283 -0
  58. package/dist/run-Z_y-m4dQ.cjs.map +1 -0
  59. package/dist/{run-ChKPZlIB.js → run-n7yOll1q.js} +15 -4
  60. package/dist/run-n7yOll1q.js.map +1 -0
  61. package/dist/run-pPsQ2MsX.cjs +502 -0
  62. package/dist/run-pPsQ2MsX.cjs.map +1 -0
  63. package/dist/studio-DKv2YLJZ.js +77 -0
  64. package/dist/studio-DKv2YLJZ.js.map +1 -0
  65. package/dist/studio-PDMxqFN0.cjs +76 -0
  66. package/dist/studio-PDMxqFN0.cjs.map +1 -0
  67. package/dist/{run-DAGbErY0.cjs → utils-B0SrWoNh.cjs} +303 -323
  68. package/dist/utils-B0SrWoNh.cjs.map +1 -0
  69. package/dist/{run-CLGgnrjg.js → utils-CzoNURwq.js} +274 -364
  70. package/dist/utils-CzoNURwq.js.map +1 -0
  71. package/dist/{validate-BxCwQou-.cjs → validate-BcB0tFQ6.cjs} +8 -13
  72. package/dist/validate-BcB0tFQ6.cjs.map +1 -0
  73. package/dist/{validate-DD2S9ffV.js → validate-QpkCbIFJ.js} +8 -13
  74. package/dist/validate-QpkCbIFJ.js.map +1 -0
  75. package/package.json +18 -9
  76. package/dist/Telemetry-D-Jpt27O.cjs.map +0 -1
  77. package/dist/Telemetry-Fiymfxez.js.map +0 -1
  78. package/dist/errors-CMvLO2NE.js +0 -31
  79. package/dist/errors-CMvLO2NE.js.map +0 -1
  80. package/dist/errors-CZtH2dKk.cjs.map +0 -1
  81. package/dist/generate-BO_Gv-vi.cjs.map +0 -1
  82. package/dist/generate-HzSh9v2l.js.map +0 -1
  83. package/dist/mcp-BIcX2H1u.cjs.map +0 -1
  84. package/dist/mcp-CtV0d0Dc.js.map +0 -1
  85. package/dist/package-CnUMuss9.cjs.map +0 -1
  86. package/dist/package-DiBDd6nT.js +0 -6
  87. package/dist/package-DiBDd6nT.js.map +0 -1
  88. package/dist/run-BV2tMjuz.cjs.map +0 -1
  89. package/dist/run-CLGgnrjg.js.map +0 -1
  90. package/dist/run-ChKPZlIB.js.map +0 -1
  91. package/dist/run-Cs5FunVC.cjs.map +0 -1
  92. package/dist/run-DAGbErY0.cjs.map +0 -1
  93. package/dist/run-DCfdTu52.js.map +0 -1
  94. package/dist/run-DSgLksGj.js.map +0 -1
  95. package/dist/run-FPqeAEF4.cjs.map +0 -1
  96. package/dist/tools-DH1a7ZJH.js +0 -152
  97. package/dist/tools-DH1a7ZJH.js.map +0 -1
  98. package/dist/tools-bwKAf_r-.cjs +0 -175
  99. package/dist/tools-bwKAf_r-.cjs.map +0 -1
  100. package/dist/validate-BxCwQou-.cjs.map +0 -1
  101. package/dist/validate-DD2S9ffV.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-qbf5tadS.cjs");
2
- const require_tools = require("./tools-bwKAf_r-.cjs");
2
+ const require_output = require("./output-B2V2MN_C.cjs");
3
+ const require_constants = require("./constants-CdxpgX3_.cjs");
3
4
  let node_util = require("node:util");
4
5
  let node_process = require("node:process");
5
6
  node_process = require_rolldown_runtime.__toESM(node_process, 1);
@@ -10,95 +11,6 @@ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
10
11
  let _clack_prompts = require("@clack/prompts");
11
12
  _clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
12
13
  let tinyexec = require("tinyexec");
13
- //#region ../../internals/shared/src/constants.ts
14
- const KUBB_CONFIG_FILENAME = "kubb.config.ts";
15
- const KUBB_PACKAGE_NAME = "kubb";
16
- const initDefaults = {
17
- inputPath: "./openapi.yaml",
18
- outputPath: "./src/gen",
19
- plugins: ["plugin-ts"]
20
- };
21
- const availablePlugins = [
22
- {
23
- value: "plugin-ts",
24
- label: "TypeScript",
25
- hint: "Recommended",
26
- packageName: "@kubb/plugin-ts",
27
- importName: "pluginTs",
28
- category: "types"
29
- },
30
- {
31
- value: "plugin-axios",
32
- label: "Axios Client",
33
- packageName: "@kubb/plugin-axios",
34
- importName: "pluginAxios",
35
- category: "client"
36
- },
37
- {
38
- value: "plugin-fetch",
39
- label: "Fetch Client",
40
- packageName: "@kubb/plugin-fetch",
41
- importName: "pluginFetch",
42
- category: "client"
43
- },
44
- {
45
- value: "plugin-react-query",
46
- label: "React Query / TanStack Query",
47
- packageName: "@kubb/plugin-react-query",
48
- importName: "pluginReactQuery",
49
- category: "framework"
50
- },
51
- {
52
- value: "plugin-vue-query",
53
- label: "Vue Query",
54
- packageName: "@kubb/plugin-vue-query",
55
- importName: "pluginVueQuery",
56
- category: "framework"
57
- },
58
- {
59
- value: "plugin-zod",
60
- label: "Zod Schemas",
61
- packageName: "@kubb/plugin-zod",
62
- importName: "pluginZod",
63
- category: "validation"
64
- },
65
- {
66
- value: "plugin-faker",
67
- label: "Faker.js Mocks",
68
- packageName: "@kubb/plugin-faker",
69
- importName: "pluginFaker",
70
- category: "mocks"
71
- },
72
- {
73
- value: "plugin-msw",
74
- label: "MSW Handlers",
75
- packageName: "@kubb/plugin-msw",
76
- importName: "pluginMsw",
77
- category: "mocks"
78
- },
79
- {
80
- value: "plugin-cypress",
81
- label: "Cypress Tests",
82
- packageName: "@kubb/plugin-cypress",
83
- importName: "pluginCypress",
84
- category: "testing"
85
- },
86
- {
87
- value: "plugin-mcp",
88
- label: "MCP Server (AI / Model Context Protocol)",
89
- packageName: "@kubb/plugin-mcp",
90
- importName: "pluginMcp",
91
- category: "ai"
92
- },
93
- {
94
- value: "plugin-redoc",
95
- label: "ReDoc Documentation",
96
- packageName: "@kubb/plugin-redoc",
97
- importName: "pluginRedoc",
98
- category: "documentation"
99
- }
100
- ];
101
- //#endregion
102
14
  //#region ../../internals/shared/src/init.ts
103
15
  /**
104
16
  * Resolves a comma-separated plugin flag (e.g. `--plugins plugin-ts,plugin-zod`) into the
@@ -108,7 +20,7 @@ const availablePlugins = [
108
20
  function resolvePlugins(pluginsFlag) {
109
21
  if (!pluginsFlag) return [];
110
22
  const requested = pluginsFlag.split(",").map((value) => value.trim()).filter(Boolean);
111
- return availablePlugins.filter((plugin) => requested.includes(plugin.value));
23
+ return require_constants.availablePlugins.filter((plugin) => requested.includes(plugin.value));
112
24
  }
113
25
  function generateConfigFile({ selectedPlugins, inputPath, outputPath }) {
114
26
  return `import { defineConfig } from 'kubb/config'
@@ -139,6 +51,62 @@ function resolveInstallVersions({ packages, version }) {
139
51
  return packages.map((name) => name === "kubb" ? `${name}@${version}` : `${name}@${tag}`);
140
52
  }
141
53
  //#endregion
54
+ //#region src/tools.ts
55
+ /**
56
+ * Metadata for each supported package manager, keyed by its short name.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * packageManagers.pnpm.installCommand // ['add', '-D']
61
+ * packageManagers.npm.lockFile // 'package-lock.json'
62
+ * ```
63
+ */
64
+ const packageManagers = {
65
+ pnpm: {
66
+ name: "pnpm",
67
+ lockFile: "pnpm-lock.yaml",
68
+ installCommand: ["add", "-D"]
69
+ },
70
+ yarn: {
71
+ name: "yarn",
72
+ lockFile: "yarn.lock",
73
+ installCommand: ["add", "-D"]
74
+ },
75
+ bun: {
76
+ name: "bun",
77
+ lockFile: "bun.lockb",
78
+ installCommand: ["add", "-d"]
79
+ },
80
+ npm: {
81
+ name: "npm",
82
+ lockFile: "package-lock.json",
83
+ installCommand: ["install", "--save-dev"]
84
+ }
85
+ };
86
+ /**
87
+ * Detects the active package manager for the given directory.
88
+ * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.
89
+ * Falls back to `npm` when no signal is found.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * detectPackageManager('/my/project') // { name: 'pnpm', lockFile: 'pnpm-lock.yaml', ... }
94
+ * detectPackageManager() // falls back to npm when no lock file is found
95
+ * ```
96
+ */
97
+ function detectPackageManager(cwd = process.cwd()) {
98
+ const packageJsonPath = (0, node_path.join)(cwd, "package.json");
99
+ if ((0, node_fs.existsSync)(packageJsonPath)) try {
100
+ const pmField = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8")).packageManager;
101
+ if (typeof pmField === "string") {
102
+ const name = pmField.split("@")[0];
103
+ if (name && name in packageManagers) return packageManagers[name];
104
+ }
105
+ } catch {}
106
+ for (const pm of Object.values(packageManagers)) if ((0, node_fs.existsSync)((0, node_path.join)(cwd, pm.lockFile))) return pm;
107
+ return packageManagers.npm;
108
+ }
109
+ //#endregion
142
110
  //#region src/runners/init/utils.ts
143
111
  /**
144
112
  * Returns `true` when a `package.json` exists at `cwd`.
@@ -188,18 +156,18 @@ function cancelAndExit(message = "Operation canceled.") {
188
156
  */
189
157
  async function run({ yes, version, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }) {
190
158
  const cwd = node_process.default.cwd();
191
- _clack_prompts.intro((0, node_util.styleText)("bgCyan", (0, node_util.styleText)("black", " Kubb Init ")));
159
+ require_output.logIntro({ title: (0, node_util.styleText)("bgCyan", (0, node_util.styleText)("black", " Kubb Init ")) });
192
160
  /**
193
161
  * Returns `flag` when provided, the `defaultValue` when `yes` is set,
194
162
  * or calls `prompt()` for interactive input. Exits on cancellation.
195
163
  */
196
164
  async function resolveOrPrompt(flag, defaultValue, logLabel, prompt) {
197
165
  if (flag !== void 0) {
198
- _clack_prompts.log.info(`${logLabel}: ${(0, node_util.styleText)("cyan", String(flag))}`);
166
+ require_output.logInfo(`${logLabel}: ${(0, node_util.styleText)("cyan", String(flag))}`);
199
167
  return flag;
200
168
  }
201
169
  if (yes) {
202
- _clack_prompts.log.info(`${logLabel}: ${(0, node_util.styleText)("cyan", String(defaultValue))}`);
170
+ require_output.logInfo(`${logLabel}: ${(0, node_util.styleText)("cyan", String(defaultValue))}`);
203
171
  return defaultValue;
204
172
  }
205
173
  const result = await prompt();
@@ -215,64 +183,64 @@ async function run({ yes, version, input: inputFlag, output: outputFlag, plugins
215
183
  });
216
184
  if (_clack_prompts.isCancel(shouldInit) || !shouldInit) cancelAndExit();
217
185
  }
218
- const packageManager = require_tools.detectPackageManager(cwd);
219
- const spinner = _clack_prompts.spinner();
186
+ const packageManager = detectPackageManager(cwd);
187
+ const spinner = require_output.createSpinner();
220
188
  spinner.start(`Initializing package.json with ${packageManager.name}`);
221
189
  await initPackageJson(cwd, packageManager);
222
190
  spinner.stop(`Created package.json with ${packageManager.name}`);
223
191
  }
224
- const packageManager = require_tools.detectPackageManager(cwd);
225
- if (hasPackageJson(cwd)) _clack_prompts.log.info(`Detected package manager: ${(0, node_util.styleText)("cyan", packageManager.name)}`);
226
- const inputPath = await resolveOrPrompt(inputFlag, initDefaults.inputPath, "Using input path", () => _clack_prompts.text({
192
+ const packageManager = detectPackageManager(cwd);
193
+ if (hasPackageJson(cwd)) require_output.logInfo(`Detected package manager: ${(0, node_util.styleText)("cyan", packageManager.name)}`);
194
+ const inputPath = await resolveOrPrompt(inputFlag, require_constants.initDefaults.inputPath, "Using input path", () => _clack_prompts.text({
227
195
  message: "Where is your OpenAPI specification located?",
228
- placeholder: initDefaults.inputPath,
229
- defaultValue: initDefaults.inputPath,
196
+ placeholder: require_constants.initDefaults.inputPath,
197
+ defaultValue: require_constants.initDefaults.inputPath,
230
198
  validate: (value) => {
231
199
  if (!value) return "Input path is required";
232
200
  }
233
201
  }));
234
- const outputPath = await resolveOrPrompt(outputFlag, initDefaults.outputPath, "Using output path", () => _clack_prompts.text({
202
+ const outputPath = await resolveOrPrompt(outputFlag, require_constants.initDefaults.outputPath, "Using output path", () => _clack_prompts.text({
235
203
  message: "Where should the generated files be output?",
236
- placeholder: initDefaults.outputPath,
237
- defaultValue: initDefaults.outputPath,
204
+ placeholder: require_constants.initDefaults.outputPath,
205
+ defaultValue: require_constants.initDefaults.outputPath,
238
206
  validate: (value) => {
239
207
  if (!value) return "Output path is required";
240
208
  }
241
209
  }));
242
- const defaultPlugins = availablePlugins.filter((p) => initDefaults.plugins.includes(p.value));
210
+ const defaultPlugins = require_constants.availablePlugins.filter((p) => require_constants.initDefaults.plugins.includes(p.value));
243
211
  const pluginLabel = (plugins) => (0, node_util.styleText)("cyan", plugins.map((p) => p.label).join(", "));
244
212
  const selectedPlugins = await (async () => {
245
213
  if (pluginsFlag) {
246
214
  const plugins = resolvePlugins(pluginsFlag);
247
215
  if (plugins.length === 0) {
248
- _clack_prompts.log.warn(`No valid plugins found in --plugins value; falling back to default: ${pluginLabel(defaultPlugins)}`);
216
+ require_output.logWarn(`No valid plugins found in --plugins value; falling back to default: ${pluginLabel(defaultPlugins)}`);
249
217
  return defaultPlugins;
250
218
  }
251
- _clack_prompts.log.info(`Using plugins: ${pluginLabel(plugins)}`);
219
+ require_output.logInfo(`Using plugins: ${pluginLabel(plugins)}`);
252
220
  return plugins;
253
221
  }
254
222
  if (yes) {
255
- _clack_prompts.log.info(`Using plugins: ${pluginLabel(defaultPlugins)}`);
223
+ require_output.logInfo(`Using plugins: ${pluginLabel(defaultPlugins)}`);
256
224
  return defaultPlugins;
257
225
  }
258
226
  const values = await _clack_prompts.multiselect({
259
227
  message: "Select plugins to use:",
260
- options: availablePlugins.map(({ value, label, hint }) => ({
228
+ options: require_constants.availablePlugins.map(({ value, label, hint }) => ({
261
229
  value,
262
230
  label,
263
231
  hint
264
232
  })),
265
- initialValues: [...initDefaults.plugins],
233
+ initialValues: [...require_constants.initDefaults.plugins],
266
234
  required: true
267
235
  });
268
236
  if (_clack_prompts.isCancel(values)) cancelAndExit();
269
- return availablePlugins.filter((p) => values.includes(p.value));
237
+ return require_constants.availablePlugins.filter((p) => values.includes(p.value));
270
238
  })();
271
239
  const packagesToInstall = resolveInstallVersions({
272
- packages: [KUBB_PACKAGE_NAME, ...selectedPlugins.map((p) => p.packageName)],
240
+ packages: [require_constants.KUBB_PACKAGE_NAME, ...selectedPlugins.map((p) => p.packageName)],
273
241
  version
274
242
  });
275
- const spinner = _clack_prompts.spinner();
243
+ const spinner = require_output.createSpinner();
276
244
  spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`);
277
245
  try {
278
246
  await dryRun.run(() => installPackages(packagesToInstall, packageManager, cwd), { message: `install ${packagesToInstall.length} packages with ${packageManager.name}` });
@@ -281,35 +249,35 @@ async function run({ yes, version, input: inputFlag, output: outputFlag, plugins
281
249
  spinner.stop("Installation failed");
282
250
  throw error;
283
251
  }
284
- const configSpinner = _clack_prompts.spinner();
285
- configSpinner.start(`Creating ${KUBB_CONFIG_FILENAME}`);
252
+ const configSpinner = require_output.createSpinner();
253
+ configSpinner.start(`Creating ${require_constants.KUBB_CONFIG_FILENAME}`);
286
254
  const configContent = generateConfigFile({
287
255
  selectedPlugins,
288
256
  inputPath,
289
257
  outputPath
290
258
  });
291
- const configPath = node_path.default.join(cwd, KUBB_CONFIG_FILENAME);
259
+ const configPath = node_path.default.join(cwd, require_constants.KUBB_CONFIG_FILENAME);
292
260
  if (node_fs.default.existsSync(configPath)) {
293
- configSpinner.stop(`${KUBB_CONFIG_FILENAME} already exists`);
261
+ configSpinner.stop(`${require_constants.KUBB_CONFIG_FILENAME} already exists`);
294
262
  if (!yes) {
295
263
  const shouldOverwrite = await _clack_prompts.confirm({
296
- message: `${KUBB_CONFIG_FILENAME} already exists. Overwrite?`,
264
+ message: `${require_constants.KUBB_CONFIG_FILENAME} already exists. Overwrite?`,
297
265
  initialValue: false
298
266
  });
299
267
  if (_clack_prompts.isCancel(shouldOverwrite) || !shouldOverwrite) cancelAndExit("Keeping existing configuration. Packages have been installed.");
300
268
  }
301
- configSpinner.start(`Overwriting ${KUBB_CONFIG_FILENAME}`);
269
+ configSpinner.start(`Overwriting ${require_constants.KUBB_CONFIG_FILENAME}`);
302
270
  }
303
- await dryRun.run(() => node_fs.default.promises.writeFile(configPath, configContent, "utf-8"), { message: `write ${KUBB_CONFIG_FILENAME}` });
304
- configSpinner.stop(`Created ${KUBB_CONFIG_FILENAME}`);
305
- _clack_prompts.outro((0, node_util.styleText)("green", "✓ All set!") + "\n\n" + (0, node_util.styleText)("dim", "Next steps:") + "\n" + (0, node_util.styleText)("cyan", ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + (0, node_util.styleText)("cyan", " 2. Generate code with: npx kubb generate") + "\n" + (0, node_util.styleText)("cyan", ` 3. Find generated files in: ${outputPath}`) + "\n\n" + (0, node_util.styleText)("dim", `Using ${packageManager.name} • Kubb v${version}`));
271
+ await dryRun.run(() => node_fs.default.promises.writeFile(configPath, configContent, "utf-8"), { message: `write ${require_constants.KUBB_CONFIG_FILENAME}` });
272
+ configSpinner.stop(`Created ${require_constants.KUBB_CONFIG_FILENAME}`);
273
+ require_output.logOutro((0, node_util.styleText)("green", "✓ All set!") + "\n\n" + (0, node_util.styleText)("dim", "Next steps:") + "\n" + (0, node_util.styleText)("cyan", ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + (0, node_util.styleText)("cyan", " 2. Generate code with: npx kubb generate") + "\n" + (0, node_util.styleText)("cyan", ` 3. Find generated files in: ${outputPath}`) + "\n\n" + (0, node_util.styleText)("dim", `Using ${packageManager.name} • Kubb v${version}`));
306
274
  } catch (error) {
307
- _clack_prompts.log.error((0, node_util.styleText)("red", "An error occurred during initialization"));
308
- if (error instanceof Error) _clack_prompts.log.error(error.message);
275
+ require_output.logError((0, node_util.styleText)("red", "An error occurred during initialization"));
276
+ if (error instanceof Error) require_output.logError(error.message);
309
277
  node_process.default.exit(1);
310
278
  }
311
279
  }
312
280
  //#endregion
313
281
  exports.run = run;
314
282
 
315
- //# sourceMappingURL=run-FPqeAEF4.cjs.map
283
+ //# sourceMappingURL=run-DRBqVXX0.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-DRBqVXX0.cjs","names":["availablePlugins","join","existsSync","readFileSync","process","fs","path","x","process","styleText","clack","createSpinner","initDefaults","availablePlugins","KUBB_PACKAGE_NAME","KUBB_CONFIG_FILENAME","path","fs"],"sources":["../../../internals/shared/src/init.ts","../src/tools.ts","../src/runners/init/utils.ts","../src/runners/init/run.ts"],"sourcesContent":["import { availablePlugins, KUBB_PACKAGE_NAME } from './constants.ts'\nimport type { PluginOption } from './types.ts'\n\n/**\n * Resolves a comma-separated plugin flag (e.g. `--plugins plugin-ts,plugin-zod`) into the\n * matching known plugin options. Unrecognized names are dropped, and a missing flag yields\n * an empty list.\n */\nexport function resolvePlugins(pluginsFlag: string | undefined): Array<PluginOption> {\n if (!pluginsFlag) {\n return []\n }\n const requested = pluginsFlag\n .split(',')\n .map((value) => value.trim())\n .filter(Boolean)\n return availablePlugins.filter((plugin) => requested.includes(plugin.value))\n}\n\nexport function generateConfigFile({\n selectedPlugins,\n inputPath,\n outputPath,\n}: {\n selectedPlugins: Array<PluginOption>\n inputPath: string\n outputPath: string\n}): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins.map((plugin) => ` ${plugin.importName}(),`).join('\\n')\n\n return `import { defineConfig } from 'kubb/config'\n${imports}\n\nexport default defineConfig({\n input: '${inputPath}',\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\n/**\n * Turns package names into install specifiers for the wizard.\n *\n * `kubb` is pinned to the exact version of the running CLI, since both ship from the same release\n * and resolving `kubb@beta` separately can land on a different version than the CLI doing the\n * scaffolding. Plugins release from their own repo on their own cadence, so they follow the\n * release channel of the CLI through its dist-tag.\n */\nexport function resolveInstallVersions({ packages, version }: { packages: Array<string>; version: string }): Array<string> {\n const prerelease = version.match(/-([a-z]+)/)?.[1]\n const tag = prerelease ?? 'latest'\n\n return packages.map((name) => (name === KUBB_PACKAGE_NAME ? `${name}@${version}` : `${name}@${tag}`))\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { formatters, linters } from '@internals/utils'\nimport type { Config } from '@kubb/core'\n\n/**\n * The configurable formatter names, mirrored from `Config['output'].format`. Excludes `'auto'`\n * (detection, not a tool) and `false` (skip). The `formatters`/`linters` tables below are pinned to\n * these so adding a tool to the config union without a descriptor fails to compile.\n */\ntype FormatterName = Exclude<NonNullable<Config['output']['format']>, 'auto' | false>\ntype LinterName = Exclude<NonNullable<Config['output']['lint']>, 'auto' | false>\n\n// Pinned to core's union here rather than in `@internals/utils`, which must not import `@kubb/core`:\n// adding a tool to the config union without a descriptor stays a compile error.\nformatters satisfies Record<FormatterName, unknown>\nlinters satisfies Record<LinterName, unknown>\n\nexport { detectTool, formatters, linters } from '@internals/utils'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\n/**\n * Metadata describing a package manager's lock file and install command.\n */\nexport interface PackageManagerInfo {\n /**\n * Identifier used in CLI commands, e.g. `pnpm`, `yarn`.\n */\n name: PackageManagerName\n /**\n * Lock file name that uniquely identifies this package manager in a project root.\n */\n lockFile: string\n /**\n * Subcommands passed to the package manager binary to install a dev dependency.\n */\n installCommand: ReadonlyArray<string>\n}\n\n/**\n * Metadata for each supported package manager, keyed by its short name.\n *\n * @example\n * ```ts\n * packageManagers.pnpm.installCommand // ['add', '-D']\n * packageManagers.npm.lockFile // 'package-lock.json'\n * ```\n */\nconst 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/**\n * Minimal shape of `package.json` fields read during detection.\n */\ntype PackageJson = {\n /**\n * The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`).\n */\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 *\n * @example\n * ```ts\n * detectPackageManager('/my/project') // { name: 'pnpm', lockFile: 'pnpm-lock.yaml', ... }\n * detectPackageManager() // falls back to npm when no lock file is found\n * ```\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 process from 'node:process'\nimport { x } from 'tinyexec'\nimport type { PackageManagerInfo, PackageManagerName } from '../../tools.ts'\n\n/**\n * Returns `true` when a `package.json` exists at `cwd`.\n */\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\n/**\n * Initializes a new `package.json` at `cwd` using the detected package manager.\n */\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, Array<string>> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await x(packageManager.name, commands[packageManager.name], {\n nodeOptions: { cwd, stdio: 'inherit' },\n throwOnError: true,\n })\n}\n\n/**\n * Installs the given packages at `cwd` using the detected package manager.\n */\nexport async function installPackages(packages: Array<string>, packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await x(packageManager.name, [...packageManager.installCommand, ...packages], {\n nodeOptions: { cwd, stdio: 'inherit' },\n throwOnError: true,\n })\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 { DryRunExtension } from '@gunshi/plugin-dryrun'\nimport {\n availablePlugins,\n generateConfigFile,\n initDefaults,\n KUBB_CONFIG_FILENAME,\n KUBB_PACKAGE_NAME,\n type PluginOption,\n resolveInstallVersions,\n resolvePlugins,\n} from '@internals/shared'\nimport { createSpinner, logError, logInfo, logIntro, logOutro, logWarn } from '../../loggers/output.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from './utils.ts'\nimport { detectPackageManager } from '../../tools.ts'\n\nfunction cancelAndExit(message = 'Operation canceled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n /**\n * When `true`, skips all interactive prompts and uses default values.\n */\n yes: boolean\n /**\n * Current `@kubb/cli` version string, shown in the closing outro.\n */\n version: string\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,plugin-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 and the\n * config file write are skipped.\n */\n dryRun: DryRunExtension\n}\n\n/**\n * Runs the interactive Kubb scaffolding wizard.\n * Detects the package manager, prompts for input/output paths and plugins, installs packages, and writes `kubb.config.ts`.\n * Pass `yes: true` to skip all prompts and use defaults.\n */\nexport async function run({ yes, version, input: inputFlag, output: outputFlag, plugins: pluginsFlag, dryRun }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n logIntro({ title: styleText('bgCyan', styleText('black', ' Kubb Init ')) })\n\n /**\n * Returns `flag` when provided, the `defaultValue` when `yes` is set,\n * or calls `prompt()` for interactive input. Exits on cancellation.\n */\n async function resolveOrPrompt<T>(flag: T | undefined, defaultValue: T, logLabel: string, prompt: () => Promise<T | symbol>): Promise<T> {\n if (flag !== undefined) {\n logInfo(`${logLabel}: ${styleText('cyan', String(flag))}`)\n return flag\n }\n if (yes) {\n logInfo(`${logLabel}: ${styleText('cyan', String(defaultValue))}`)\n return defaultValue\n }\n const result = await prompt()\n if (clack.isCancel(result)) cancelAndExit()\n return result as T\n }\n\n try {\n // Check/create package.json, detect package manager once after the block\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 const packageManager = detectPackageManager(cwd)\n const spinner = createSpinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n await initPackageJson(cwd, packageManager)\n spinner.stop(`Created package.json with ${packageManager.name}`)\n }\n\n const packageManager = detectPackageManager(cwd)\n if (hasPackageJson(cwd)) {\n logInfo(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await resolveOrPrompt(inputFlag, initDefaults.inputPath, 'Using input path', () =>\n 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\n // Prompt for output directory\n const outputPath = await resolveOrPrompt(outputFlag, initDefaults.outputPath, 'Using output path', () =>\n 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\n // Plugin selection\n const defaultPlugins = availablePlugins.filter((p) => (initDefaults.plugins as ReadonlyArray<string>).includes(p.value))\n const pluginLabel = (plugins: Array<PluginOption>) => styleText('cyan', plugins.map((p) => p.label).join(', '))\n\n const selectedPlugins: Array<PluginOption> = await (async () => {\n if (pluginsFlag) {\n const plugins = resolvePlugins(pluginsFlag)\n if (plugins.length === 0) {\n logWarn(`No valid plugins found in --plugins value; falling back to default: ${pluginLabel(defaultPlugins)}`)\n return defaultPlugins\n }\n logInfo(`Using plugins: ${pluginLabel(plugins)}`)\n return plugins\n }\n if (yes) {\n logInfo(`Using plugins: ${pluginLabel(defaultPlugins)}`)\n return defaultPlugins\n }\n const values = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map(({ value, label, hint }) => ({ value, label, hint })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n if (clack.isCancel(values)) cancelAndExit()\n return availablePlugins.filter((p) => (values as Array<string>).includes(p.value))\n })()\n\n // Install packages, matching the release of the running CLI\n const packagesToInstall = resolveInstallVersions({ packages: [KUBB_PACKAGE_NAME, ...selectedPlugins.map((p) => p.packageName)], version })\n\n const spinner = createSpinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await dryRun.run(() => installPackages(packagesToInstall, packageManager, cwd), {\n message: `install ${packagesToInstall.length} packages with ${packageManager.name}`,\n })\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 = createSpinner()\n configSpinner.start(`Creating ${KUBB_CONFIG_FILENAME}`)\n\n const configContent = generateConfigFile({ selectedPlugins, inputPath, outputPath })\n const configPath = path.join(cwd, KUBB_CONFIG_FILENAME)\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop(`${KUBB_CONFIG_FILENAME} already exists`)\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: `${KUBB_CONFIG_FILENAME} 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_FILENAME}`)\n }\n\n await dryRun.run(() => fs.promises.writeFile(configPath, configContent, 'utf-8'), { message: `write ${KUBB_CONFIG_FILENAME}` })\n\n configSpinner.stop(`Created ${KUBB_CONFIG_FILENAME}`)\n\n logOutro(\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', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\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"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import "./rolldown-runtime-C0LytTxp.js";
2
- import { r as sendTelemetry, t as buildTelemetryEvent } from "./Telemetry-Fiymfxez.js";
3
- import { n as toError } from "./errors-CMvLO2NE.js";
2
+ import { t as toError } from "./errors-C8yNfV7w.js";
3
+ import { r as sendTelemetry, t as buildTelemetryEvent } from "./Telemetry-BCTY-Nzq.js";
4
+ import { t as version } from "./package-GR1Pi9JF.js";
4
5
  import { styleText } from "node:util";
5
6
  import process from "node:process";
6
7
  //#region src/runners/mcp/run.ts
@@ -27,7 +28,13 @@ async function run({ version }) {
27
28
  process.exitCode = 1;
28
29
  }
29
30
  }
31
+ /**
32
+ * Loaded on demand by `index.ts`, so `@kubb/mcp` stays out of the process for every other command.
33
+ */
34
+ const runner = async () => {
35
+ await run({ version });
36
+ };
30
37
  //#endregion
31
- export { run };
38
+ export { runner };
32
39
 
33
- //# sourceMappingURL=run-DCfdTu52.js.map
40
+ //# sourceMappingURL=run-DgV0unjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-DgV0unjs.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 type { CommandRunner } from 'gunshi'\nimport { buildTelemetryEvent, sendTelemetry } from '../../Telemetry.ts'\nimport { version } from '../../../package.json'\nimport type { definition } from '../../commands/mcp.ts'\n\ntype McpOptions = {\n /**\n * Current `@kubb/cli` version string, used for the telemetry payload.\n */\n version: string\n}\n\n/**\n * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.\n */\nexport async function run({ version }: McpOptions): Promise<void> {\n const { run: startMcpServer } = (await import('@kubb/mcp')) as typeof McpModule\n\n const hrStart = process.hrtime()\n const report = (status: 'success' | 'failed') => sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status }))\n\n try {\n console.log(styleText('cyan', '⏳ Starting MCP server...'))\n console.warn(styleText('yellow', 'This feature is still under development, use with caution'))\n\n await startMcpServer()\n await report('success')\n } catch (error) {\n await report('failed')\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n\n/**\n * Loaded on demand by `index.ts`, so `@kubb/mcp` stays out of the process for every other command.\n */\nexport const runner: CommandRunner<{ args: typeof definition.args; extensions: {} }> = async () => {\n await run({ version })\n}\n"],"mappings":";;;;;;;;;;AAmBA,eAAsB,IAAI,EAAE,WAAsC;CAChE,MAAM,EAAE,KAAK,mBAAoB,MAAM,OAAO;CAE9C,MAAM,UAAU,QAAQ,OAAO;CAC/B,MAAM,UAAU,WAAiC,cAAc,oBAAoB;EAAE,SAAS;EAAO,aAAa;EAAS;EAAS;CAAO,CAAC,CAAC;CAE7I,IAAI;EACF,QAAQ,IAAI,UAAU,QAAQ,0BAA0B,CAAC;EACzD,QAAQ,KAAK,UAAU,UAAU,2DAA2D,CAAC;EAE7F,MAAM,eAAe;EACrB,MAAM,OAAO,SAAS;CACxB,SAAS,OAAO;EACd,MAAM,OAAO,QAAQ;EACrB,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,QAAQ,WAAW;CACrB;AACF;;;;AAKA,MAAa,SAA0E,YAAY;CACjG,MAAM,IAAI,EAAE,QAAQ,CAAC;AACvB"}
@@ -1,6 +1,7 @@
1
1
  const require_rolldown_runtime = require("./rolldown-runtime-qbf5tadS.cjs");
2
- const require_Telemetry = require("./Telemetry-D-Jpt27O.cjs");
3
- const require_errors = require("./errors-CZtH2dKk.cjs");
2
+ const require_errors = require("./errors-C-wEou02.cjs");
3
+ const require_Telemetry = require("./Telemetry-DKfJQxnC.cjs");
4
+ const require_package = require("./package-vVVyiYqL.cjs");
4
5
  let node_util = require("node:util");
5
6
  let node_process = require("node:process");
6
7
  node_process = require_rolldown_runtime.__toESM(node_process, 1);
@@ -28,7 +29,13 @@ async function run({ version }) {
28
29
  node_process.default.exitCode = 1;
29
30
  }
30
31
  }
32
+ /**
33
+ * Loaded on demand by `index.ts`, so `@kubb/mcp` stays out of the process for every other command.
34
+ */
35
+ const runner = async () => {
36
+ await run({ version: require_package.version });
37
+ };
31
38
  //#endregion
32
- exports.run = run;
39
+ exports.runner = runner;
33
40
 
34
- //# sourceMappingURL=run-Cs5FunVC.cjs.map
41
+ //# sourceMappingURL=run-FLh61kzq.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-FLh61kzq.cjs","names":["process","sendTelemetry","buildTelemetryEvent","styleText","toError"],"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 type { CommandRunner } from 'gunshi'\nimport { buildTelemetryEvent, sendTelemetry } from '../../Telemetry.ts'\nimport { version } from '../../../package.json'\nimport type { definition } from '../../commands/mcp.ts'\n\ntype McpOptions = {\n /**\n * Current `@kubb/cli` version string, used for the telemetry payload.\n */\n version: string\n}\n\n/**\n * Starts the `@kubb/mcp` server over stdio and reports the outcome to telemetry.\n */\nexport async function run({ version }: McpOptions): Promise<void> {\n const { run: startMcpServer } = (await import('@kubb/mcp')) as typeof McpModule\n\n const hrStart = process.hrtime()\n const report = (status: 'success' | 'failed') => sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status }))\n\n try {\n console.log(styleText('cyan', '⏳ Starting MCP server...'))\n console.warn(styleText('yellow', 'This feature is still under development, use with caution'))\n\n await startMcpServer()\n await report('success')\n } catch (error) {\n await report('failed')\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n\n/**\n * Loaded on demand by `index.ts`, so `@kubb/mcp` stays out of the process for every other command.\n */\nexport const runner: CommandRunner<{ args: typeof definition.args; extensions: {} }> = async () => {\n await run({ version })\n}\n"],"mappings":";;;;;;;;;;;AAmBA,eAAsB,IAAI,EAAE,WAAsC;CAChE,MAAM,EAAE,KAAK,mBAAoB,MAAM,OAAO;CAE9C,MAAM,UAAUA,aAAAA,QAAQ,OAAO;CAC/B,MAAM,UAAU,WAAiCC,kBAAAA,cAAcC,kBAAAA,oBAAoB;EAAE,SAAS;EAAO,aAAa;EAAS;EAAS;CAAO,CAAC,CAAC;CAE7I,IAAI;EACF,QAAQ,KAAA,GAAIC,UAAAA,UAAAA,CAAU,QAAQ,0BAA0B,CAAC;EACzD,QAAQ,MAAA,GAAKA,UAAAA,UAAAA,CAAU,UAAU,2DAA2D,CAAC;EAE7F,MAAM,eAAe;EACrB,MAAM,OAAO,SAAS;CACxB,SAAS,OAAO;EACd,MAAM,OAAO,QAAQ;EACrB,QAAQ,MAAMC,eAAAA,QAAQ,KAAK,CAAC,CAAC,OAAO;EACpC,aAAA,QAAA,WAAmB;CACrB;AACF;;;;AAKA,MAAa,SAA0E,YAAY;CACjG,MAAM,IAAI,EAAE,SAAA,gBAAA,QAAQ,CAAC;AACvB"}