@kubb/cli 4.33.0 → 4.33.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/{agent-D0A3RQho.js → agent-BGWY8Iow.js} +5 -5
  2. package/dist/agent-BGWY8Iow.js.map +1 -0
  3. package/dist/{agent-CduUX7Ye.cjs → agent-Bd1QdPVV.cjs} +7 -7
  4. package/dist/agent-Bd1QdPVV.cjs.map +1 -0
  5. package/dist/{agent-DrnwQBZf.cjs → agent-CmQJU9h7.cjs} +7 -7
  6. package/dist/agent-CmQJU9h7.cjs.map +1 -0
  7. package/dist/{agent-CJ69TqoO.js → agent-u_Ehwz6r.js} +5 -5
  8. package/dist/agent-u_Ehwz6r.js.map +1 -0
  9. package/dist/{constants-CnPOlsJq.cjs → constants-BTUap0zs.cjs} +1 -19
  10. package/dist/{constants-CnPOlsJq.cjs.map → constants-BTUap0zs.cjs.map} +1 -1
  11. package/dist/{constants-CEKRremI.js → constants-CM3dJzjK.js} +2 -14
  12. package/dist/{constants-CEKRremI.js.map → constants-CM3dJzjK.js.map} +1 -1
  13. package/dist/{types-CLtz0jem.js → define--M_JMcDC.js} +6 -6
  14. package/dist/define--M_JMcDC.js.map +1 -0
  15. package/dist/{types-Ck2lzFON.cjs → define-D6Kfm7-Z.cjs} +6 -6
  16. package/dist/define-D6Kfm7-Z.cjs.map +1 -0
  17. package/dist/{errors-bSLTEh4e.js → errors-6mF_WKxg.js} +5 -5
  18. package/dist/errors-6mF_WKxg.js.map +1 -0
  19. package/dist/{errors-BUjJsNoe.cjs → errors-DBW0N9w4.cjs} +5 -5
  20. package/dist/errors-DBW0N9w4.cjs.map +1 -0
  21. package/dist/{generate-ByMgAV76.cjs → generate-6Cm1AK2n.cjs} +275 -153
  22. package/dist/generate-6Cm1AK2n.cjs.map +1 -0
  23. package/dist/{generate-HP5ySfjV.js → generate-DcNp9Owd.js} +271 -149
  24. package/dist/generate-DcNp9Owd.js.map +1 -0
  25. package/dist/{generate-CiUPO5ds.cjs → generate-DqmjK5Lc.cjs} +3 -3
  26. package/dist/generate-DqmjK5Lc.cjs.map +1 -0
  27. package/dist/{generate-DIIxtkWT.js → generate-rtsmgWhO.js} +3 -3
  28. package/dist/generate-rtsmgWhO.js.map +1 -0
  29. package/dist/index.cjs +13 -13
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.js +12 -12
  32. package/dist/index.js.map +1 -1
  33. package/dist/{init-DLNrkDF4.js → init--9nMhvx6.js} +4 -4
  34. package/dist/init--9nMhvx6.js.map +1 -0
  35. package/dist/{init-Df_aXezV.cjs → init-BvjtU-sC.cjs} +5 -4
  36. package/dist/init-BvjtU-sC.cjs.map +1 -0
  37. package/dist/{init-DyKK2fTp.js → init-C-InrmSY.js} +42 -31
  38. package/dist/init-C-InrmSY.js.map +1 -0
  39. package/dist/{init-Cd1hCb7q.cjs → init-hmolV6B4.cjs} +47 -37
  40. package/dist/init-hmolV6B4.cjs.map +1 -0
  41. package/dist/{jiti-BdskUHhD.cjs → jiti-Cd3S0xwr.cjs} +1 -1
  42. package/dist/{jiti-BdskUHhD.cjs.map → jiti-Cd3S0xwr.cjs.map} +1 -1
  43. package/dist/{jiti-Cl7t20dO.js → jiti-e08mD2Ph.js} +1 -1
  44. package/dist/{jiti-Cl7t20dO.js.map → jiti-e08mD2Ph.js.map} +1 -1
  45. package/dist/{mcp-Clg-Qnkr.cjs → mcp-Bd-DXHWV.cjs} +5 -4
  46. package/dist/mcp-Bd-DXHWV.cjs.map +1 -0
  47. package/dist/{mcp-Bd9LITaI.js → mcp-CZzxfbHW.js} +4 -4
  48. package/dist/mcp-CZzxfbHW.js.map +1 -0
  49. package/dist/{mcp-B73FC8dF.cjs → mcp-ChHFPRzD.cjs} +4 -4
  50. package/dist/mcp-ChHFPRzD.cjs.map +1 -0
  51. package/dist/{mcp-Cf-1dsB-.js → mcp-D2SHEg_d.js} +4 -4
  52. package/dist/mcp-D2SHEg_d.js.map +1 -0
  53. package/dist/{package-aKgzEJtp.cjs → package-BXijqaX5.cjs} +2 -2
  54. package/dist/package-BXijqaX5.cjs.map +1 -0
  55. package/dist/package-DeOlqJ31.js +6 -0
  56. package/dist/package-DeOlqJ31.js.map +1 -0
  57. package/dist/shell-7HPrTCJ5.cjs +57 -0
  58. package/dist/shell-7HPrTCJ5.cjs.map +1 -0
  59. package/dist/shell-DqqWsHCD.js +46 -0
  60. package/dist/shell-DqqWsHCD.js.map +1 -0
  61. package/dist/{telemetry-T5IA2dWA.cjs → telemetry-Cn9X1I5B.cjs} +46 -9
  62. package/dist/telemetry-Cn9X1I5B.cjs.map +1 -0
  63. package/dist/{telemetry-C4gOKX2x.js → telemetry-DxiR7clS.js} +40 -9
  64. package/dist/telemetry-DxiR7clS.js.map +1 -0
  65. package/dist/{validate-Cr26q5xX.js → validate-BH2Ysgxr.js} +4 -4
  66. package/dist/validate-BH2Ysgxr.js.map +1 -0
  67. package/dist/{validate-DURmg-2Q.cjs → validate-BQvsoQz-.cjs} +5 -4
  68. package/dist/validate-BQvsoQz-.cjs.map +1 -0
  69. package/dist/{validate-Dqi9T_c4.cjs → validate-Bbrn3Q-A.cjs} +4 -4
  70. package/dist/validate-Bbrn3Q-A.cjs.map +1 -0
  71. package/dist/{validate-Chjg23AE.js → validate-l8vLmwKA.js} +4 -4
  72. package/dist/validate-l8vLmwKA.js.map +1 -0
  73. package/package.json +6 -5
  74. package/src/commands/agent/start.ts +1 -1
  75. package/src/commands/agent.ts +1 -1
  76. package/src/commands/generate.ts +1 -1
  77. package/src/commands/init.ts +1 -1
  78. package/src/commands/mcp.ts +1 -1
  79. package/src/commands/validate.ts +1 -1
  80. package/src/constants.ts +0 -1
  81. package/src/index.ts +1 -1
  82. package/src/loggers/clackLogger.ts +26 -28
  83. package/src/loggers/fileSystemLogger.ts +1 -2
  84. package/src/loggers/githubActionsLogger.ts +26 -28
  85. package/src/loggers/plainLogger.ts +25 -26
  86. package/src/loggers/utils.ts +4 -5
  87. package/src/runners/agent.ts +1 -1
  88. package/src/runners/generate.ts +20 -7
  89. package/src/runners/init.ts +2 -1
  90. package/src/runners/mcp.ts +1 -1
  91. package/src/runners/validate.ts +1 -1
  92. package/src/utils/executeHooks.ts +2 -2
  93. package/src/utils/getIntro.ts +1 -80
  94. package/src/utils/getSummary.ts +1 -2
  95. package/src/utils/packageManager.ts +2 -2
  96. package/src/utils/runHook.ts +2 -2
  97. package/src/utils/telemetry.ts +1 -2
  98. package/dist/agent-CJ69TqoO.js.map +0 -1
  99. package/dist/agent-CduUX7Ye.cjs.map +0 -1
  100. package/dist/agent-D0A3RQho.js.map +0 -1
  101. package/dist/agent-DrnwQBZf.cjs.map +0 -1
  102. package/dist/errors-BUjJsNoe.cjs.map +0 -1
  103. package/dist/errors-bSLTEh4e.js.map +0 -1
  104. package/dist/generate-ByMgAV76.cjs.map +0 -1
  105. package/dist/generate-CiUPO5ds.cjs.map +0 -1
  106. package/dist/generate-DIIxtkWT.js.map +0 -1
  107. package/dist/generate-HP5ySfjV.js.map +0 -1
  108. package/dist/init-Cd1hCb7q.cjs.map +0 -1
  109. package/dist/init-DLNrkDF4.js.map +0 -1
  110. package/dist/init-Df_aXezV.cjs.map +0 -1
  111. package/dist/init-DyKK2fTp.js.map +0 -1
  112. package/dist/mcp-B73FC8dF.cjs.map +0 -1
  113. package/dist/mcp-Bd9LITaI.js.map +0 -1
  114. package/dist/mcp-Cf-1dsB-.js.map +0 -1
  115. package/dist/mcp-Clg-Qnkr.cjs.map +0 -1
  116. package/dist/package-681jTtCk.js +0 -6
  117. package/dist/package-681jTtCk.js.map +0 -1
  118. package/dist/package-aKgzEJtp.cjs.map +0 -1
  119. package/dist/telemetry-C4gOKX2x.js.map +0 -1
  120. package/dist/telemetry-T5IA2dWA.cjs.map +0 -1
  121. package/dist/types-CLtz0jem.js.map +0 -1
  122. package/dist/types-Ck2lzFON.cjs.map +0 -1
  123. package/dist/validate-Chjg23AE.js.map +0 -1
  124. package/dist/validate-Cr26q5xX.js.map +0 -1
  125. package/dist/validate-DURmg-2Q.cjs.map +0 -1
  126. package/dist/validate-Dqi9T_c4.cjs.map +0 -1
  127. package/src/cli/adapters/nodeAdapter.ts +0 -159
  128. package/src/cli/help.ts +0 -36
  129. package/src/cli/index.ts +0 -16
  130. package/src/cli/parse.ts +0 -18
  131. package/src/cli/schema.ts +0 -38
  132. package/src/cli/types.ts +0 -95
  133. package/src/utils/envDetection.ts +0 -34
  134. package/src/utils/errors.ts +0 -23
  135. package/src/utils/formatMsWithColor.ts +0 -22
  136. package/src/utils/randomColor.ts +0 -14
  137. package/src/utils/spawnAsync.ts +0 -47
@@ -1,6 +1,6 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { t as version } from "./package-681jTtCk.js";
3
- import { n as defineCommand } from "./types-CLtz0jem.js";
2
+ import { n as defineCommand } from "./define--M_JMcDC.js";
3
+ import { t as version } from "./package-DeOlqJ31.js";
4
4
  //#region src/commands/init.ts
5
5
  const command = defineCommand({
6
6
  name: "init",
@@ -12,7 +12,7 @@ const command = defineCommand({
12
12
  default: false
13
13
  } },
14
14
  async run({ values }) {
15
- const { runInit } = await import("./init-DyKK2fTp.js");
15
+ const { runInit } = await import("./init-C-InrmSY.js");
16
16
  await runInit({
17
17
  yes: values.yes,
18
18
  version
@@ -22,4 +22,4 @@ const command = defineCommand({
22
22
  //#endregion
23
23
  export { command };
24
24
 
25
- //# sourceMappingURL=init-DLNrkDF4.js.map
25
+ //# sourceMappingURL=init--9nMhvx6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init--9nMhvx6.js","names":[],"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n options: {\n yes: { type: 'boolean', description: 'Skip prompts and use default options', short: 'y', default: false },\n },\n async run({ values }) {\n const { runInit } = await import('../runners/init.ts')\n\n await runInit({ yes: values.yes, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAU,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,KAAK;EAAE,MAAM;EAAW,aAAa;EAAwC,OAAO;EAAK,SAAS;EAAO,EAC1G;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,QAAM,QAAQ;GAAE,KAAK,OAAO;GAAK;GAAS,CAAC;;CAE9C,CAAC"}
@@ -1,7 +1,8 @@
1
1
  require("./chunk-ByKO4r7w.cjs");
2
- const require_package = require("./package-aKgzEJtp.cjs");
2
+ const require_define = require("./define-D6Kfm7-Z.cjs");
3
+ const require_package = require("./package-BXijqaX5.cjs");
3
4
  //#region src/commands/init.ts
4
- const command = require("./types-Ck2lzFON.cjs").defineCommand({
5
+ const command = require_define.defineCommand({
5
6
  name: "init",
6
7
  description: "Initialize a new Kubb project with interactive setup",
7
8
  options: { yes: {
@@ -11,7 +12,7 @@ const command = require("./types-Ck2lzFON.cjs").defineCommand({
11
12
  default: false
12
13
  } },
13
14
  async run({ values }) {
14
- const { runInit } = await Promise.resolve().then(() => require("./init-Cd1hCb7q.cjs"));
15
+ const { runInit } = await Promise.resolve().then(() => require("./init-hmolV6B4.cjs"));
15
16
  await runInit({
16
17
  yes: values.yes,
17
18
  version: require_package.version
@@ -21,4 +22,4 @@ const command = require("./types-Ck2lzFON.cjs").defineCommand({
21
22
  //#endregion
22
23
  exports.command = command;
23
24
 
24
- //# sourceMappingURL=init-Df_aXezV.cjs.map
25
+ //# sourceMappingURL=init-BvjtU-sC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-BvjtU-sC.cjs","names":["defineCommand"],"sources":["../src/commands/init.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n options: {\n yes: { type: 'boolean', description: 'Skip prompts and use default options', short: 'y', default: false },\n },\n async run({ values }) {\n const { runInit } = await import('../runners/init.ts')\n\n await runInit({ yes: values.yes, version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAUA,eAAAA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,SAAS,EACP,KAAK;EAAE,MAAM;EAAW,aAAa;EAAwC,OAAO;EAAK,SAAS;EAAO,EAC1G;CACD,MAAM,IAAI,EAAE,UAAU;EACpB,MAAM,EAAE,YAAY,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,sBAAA,CAAA;AAE1B,QAAM,QAAQ;GAAE,KAAK,OAAO;GAAK,SAAA,gBAAA;GAAS,CAAC;;CAE9C,CAAC"}
@@ -1,39 +1,50 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { o as initDefaults, s as pluginDefaultConfigs } from "./constants-CEKRremI.js";
2
+ import { t as spawnAsync } from "./shell-DqqWsHCD.js";
3
+ import { o as initDefaults, s as pluginDefaultConfigs } from "./constants-CM3dJzjK.js";
3
4
  import { styleText } from "node:util";
5
+ import fs, { existsSync, readFileSync } from "node:fs";
6
+ import path, { join } from "node:path";
4
7
  import process$1 from "node:process";
5
- import path from "node:path";
6
8
  import * as clack from "@clack/prompts";
7
- import { spawn } from "node:child_process";
8
- import { detectPackageManager } from "@kubb/core";
9
- import fs from "node:fs";
10
- //#region src/utils/spawnAsync.ts
9
+ //#region ../../internals/utils/src/packageManager.ts
10
+ const packageManagers = {
11
+ pnpm: {
12
+ name: "pnpm",
13
+ lockFile: "pnpm-lock.yaml",
14
+ installCommand: ["add", "-D"]
15
+ },
16
+ yarn: {
17
+ name: "yarn",
18
+ lockFile: "yarn.lock",
19
+ installCommand: ["add", "-D"]
20
+ },
21
+ bun: {
22
+ name: "bun",
23
+ lockFile: "bun.lockb",
24
+ installCommand: ["add", "-d"]
25
+ },
26
+ npm: {
27
+ name: "npm",
28
+ lockFile: "package-lock.json",
29
+ installCommand: ["install", "--save-dev"]
30
+ }
31
+ };
11
32
  /**
12
- * Spawns `cmd args` and returns a promise.
13
- * - Foreground (default): inherits stdio and resolves when the process exits successfully.
14
- * - Detached: spawns in its own process group, un-refs the child, and resolves immediately.
33
+ * Detects the active package manager for the given directory.
34
+ * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.
35
+ * Falls back to npm when no signal is found.
15
36
  */
16
- function spawnAsync(cmd, args, options = {}) {
17
- const { cwd = process.cwd(), env, detached = false } = options;
18
- return new Promise((resolve, reject) => {
19
- const child = spawn(cmd, args, {
20
- stdio: detached ? "ignore" : "inherit",
21
- cwd,
22
- env,
23
- detached
24
- });
25
- if (detached) {
26
- child.unref();
27
- resolve();
28
- return;
37
+ function detectPackageManager(cwd = process.cwd()) {
38
+ const packageJsonPath = join(cwd, "package.json");
39
+ if (existsSync(packageJsonPath)) try {
40
+ const pmField = JSON.parse(readFileSync(packageJsonPath, "utf-8")).packageManager;
41
+ if (typeof pmField === "string") {
42
+ const name = pmField.split("@")[0];
43
+ if (name && name in packageManagers) return packageManagers[name];
29
44
  }
30
- child.on("close", (code, signal) => {
31
- if (code === 0) resolve();
32
- else if (signal !== null) reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" was terminated by signal ${signal}`));
33
- else reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" exited with code ${code}`));
34
- });
35
- child.on("error", reject);
36
- });
45
+ } catch {}
46
+ for (const pm of Object.values(packageManagers)) if (existsSync(join(cwd, pm.lockFile))) return pm;
47
+ return packageManagers.npm;
37
48
  }
38
49
  //#endregion
39
50
  //#region src/utils/packageManager.ts
@@ -286,6 +297,6 @@ async function runInit({ yes, version }) {
286
297
  }
287
298
  }
288
299
  //#endregion
289
- export { runInit, spawnAsync as t };
300
+ export { runInit };
290
301
 
291
- //# sourceMappingURL=init-DyKK2fTp.js.map
302
+ //# sourceMappingURL=init-C-InrmSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-C-InrmSY.js","names":["process"],"sources":["../../../internals/utils/src/packageManager.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file name that uniquely identifies this package manager in a project root. */\n lockFile: string\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/**\n * Detects the active package manager for the given directory.\n * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.\n * Falls back to npm when no signal is found.\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = join(cwd, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as PackageJson\n const pmField = packageJson.packageManager\n if (typeof pmField === 'string') {\n const name = pmField.split('@')[0]\n if (name && name in packageManagers) {\n return packageManagers[name as PackageManagerName]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n for (const pm of Object.values(packageManagers)) {\n if (existsSync(join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@internals/utils'\nimport { spawnAsync } from '@internals/utils'\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await spawnAsync(packageManager.name, commands[packageManager.name], { cwd })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { PackageManagerInfo } from '@internals/utils'\nimport { detectPackageManager } from '@internals/utils'\nimport { initDefaults, pluginDefaultConfigs } from '../constants.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst availablePlugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n const config = (pluginDefaultConfigs as Record<string, string>)[plugin.value] ?? `${plugin.importName}()`\n return ` ${config},`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nfunction cancelAndExit(message = 'Operation cancelled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n yes: boolean\n version: string\n}\n\nexport async function runInit({ yes, version }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n clack.intro(styleText('bgCyan', styleText('black', ' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n let inputPath: string\n if (yes) {\n inputPath = initDefaults.inputPath\n clack.log.info(`Using input path: ${styleText('cyan', inputPath)}`)\n } else {\n const inputPathResult = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPathResult)) {\n cancelAndExit()\n }\n inputPath = inputPathResult as string\n }\n\n // Prompt for output directory\n let outputPath: string\n if (yes) {\n outputPath = initDefaults.outputPath\n clack.log.info(`Using output path: ${styleText('cyan', outputPath)}`)\n } else {\n const outputPathResult = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPathResult)) {\n cancelAndExit()\n }\n outputPath = outputPathResult as string\n }\n\n // Plugin selection\n let selectedPlugins: PluginOption[]\n if (yes) {\n selectedPlugins = availablePlugins.filter((plugin) => (initDefaults.plugins as readonly string[]).includes(plugin.value))\n clack.log.info(`Using plugins: ${styleText('cyan', selectedPlugins.map((p) => p.label).join(', '))}`)\n } else {\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n cancelAndExit()\n }\n\n selectedPlugins = availablePlugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n }\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(availablePlugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n clack.outro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ' Or start a stream server with: npx kubb start') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":"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"}
@@ -1,43 +1,54 @@
1
1
  const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
- const require_constants = require("./constants-CnPOlsJq.cjs");
2
+ const require_shell = require("./shell-7HPrTCJ5.cjs");
3
+ const require_constants = require("./constants-BTUap0zs.cjs");
3
4
  let node_util = require("node:util");
4
- let node_process = require("node:process");
5
- node_process = require_chunk.__toESM(node_process);
5
+ let node_fs = require("node:fs");
6
+ node_fs = require_chunk.__toESM(node_fs);
6
7
  let node_path = require("node:path");
7
8
  node_path = require_chunk.__toESM(node_path);
9
+ let node_process = require("node:process");
10
+ node_process = require_chunk.__toESM(node_process);
8
11
  let _clack_prompts = require("@clack/prompts");
9
12
  _clack_prompts = require_chunk.__toESM(_clack_prompts);
10
- let node_child_process = require("node:child_process");
11
- let _kubb_core = require("@kubb/core");
12
- let node_fs = require("node:fs");
13
- node_fs = require_chunk.__toESM(node_fs);
14
- //#region src/utils/spawnAsync.ts
13
+ //#region ../../internals/utils/src/packageManager.ts
14
+ const packageManagers = {
15
+ pnpm: {
16
+ name: "pnpm",
17
+ lockFile: "pnpm-lock.yaml",
18
+ installCommand: ["add", "-D"]
19
+ },
20
+ yarn: {
21
+ name: "yarn",
22
+ lockFile: "yarn.lock",
23
+ installCommand: ["add", "-D"]
24
+ },
25
+ bun: {
26
+ name: "bun",
27
+ lockFile: "bun.lockb",
28
+ installCommand: ["add", "-d"]
29
+ },
30
+ npm: {
31
+ name: "npm",
32
+ lockFile: "package-lock.json",
33
+ installCommand: ["install", "--save-dev"]
34
+ }
35
+ };
15
36
  /**
16
- * Spawns `cmd args` and returns a promise.
17
- * - Foreground (default): inherits stdio and resolves when the process exits successfully.
18
- * - Detached: spawns in its own process group, un-refs the child, and resolves immediately.
37
+ * Detects the active package manager for the given directory.
38
+ * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.
39
+ * Falls back to npm when no signal is found.
19
40
  */
20
- function spawnAsync(cmd, args, options = {}) {
21
- const { cwd = process.cwd(), env, detached = false } = options;
22
- return new Promise((resolve, reject) => {
23
- const child = (0, node_child_process.spawn)(cmd, args, {
24
- stdio: detached ? "ignore" : "inherit",
25
- cwd,
26
- env,
27
- detached
28
- });
29
- if (detached) {
30
- child.unref();
31
- resolve();
32
- return;
41
+ function detectPackageManager(cwd = process.cwd()) {
42
+ const packageJsonPath = (0, node_path.join)(cwd, "package.json");
43
+ if ((0, node_fs.existsSync)(packageJsonPath)) try {
44
+ const pmField = JSON.parse((0, node_fs.readFileSync)(packageJsonPath, "utf-8")).packageManager;
45
+ if (typeof pmField === "string") {
46
+ const name = pmField.split("@")[0];
47
+ if (name && name in packageManagers) return packageManagers[name];
33
48
  }
34
- child.on("close", (code, signal) => {
35
- if (code === 0) resolve();
36
- else if (signal !== null) reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" was terminated by signal ${signal}`));
37
- else reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" exited with code ${code}`));
38
- });
39
- child.on("error", reject);
40
- });
49
+ } catch {}
50
+ for (const pm of Object.values(packageManagers)) if ((0, node_fs.existsSync)((0, node_path.join)(cwd, pm.lockFile))) return pm;
51
+ return packageManagers.npm;
41
52
  }
42
53
  //#endregion
43
54
  //#region src/utils/packageManager.ts
@@ -45,7 +56,7 @@ function hasPackageJson(cwd = process.cwd()) {
45
56
  return node_fs.default.existsSync(node_path.default.join(cwd, "package.json"));
46
57
  }
47
58
  async function initPackageJson(cwd, packageManager) {
48
- await spawnAsync(packageManager.name, {
59
+ await require_shell.spawnAsync(packageManager.name, {
49
60
  npm: ["init", "-y"],
50
61
  pnpm: ["init"],
51
62
  yarn: ["init", "-y"],
@@ -53,7 +64,7 @@ async function initPackageJson(cwd, packageManager) {
53
64
  }[packageManager.name], { cwd });
54
65
  }
55
66
  async function installPackages(packages, packageManager, cwd = process.cwd()) {
56
- await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd });
67
+ await require_shell.spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd });
57
68
  }
58
69
  //#endregion
59
70
  //#region src/runners/init.ts
@@ -190,13 +201,13 @@ async function runInit({ yes, version }) {
190
201
  });
191
202
  if (_clack_prompts.isCancel(shouldInit) || !shouldInit) cancelAndExit();
192
203
  }
193
- packageManager = (0, _kubb_core.detectPackageManager)(cwd);
204
+ packageManager = detectPackageManager(cwd);
194
205
  const spinner = _clack_prompts.spinner();
195
206
  spinner.start(`Initializing package.json with ${packageManager.name}`);
196
207
  await initPackageJson(cwd, packageManager);
197
208
  spinner.stop(`Created package.json with ${packageManager.name}`);
198
209
  } else {
199
- packageManager = (0, _kubb_core.detectPackageManager)(cwd);
210
+ packageManager = detectPackageManager(cwd);
200
211
  _clack_prompts.log.info(`Detected package manager: ${(0, node_util.styleText)("cyan", packageManager.name)}`);
201
212
  }
202
213
  let inputPath;
@@ -291,6 +302,5 @@ async function runInit({ yes, version }) {
291
302
  }
292
303
  //#endregion
293
304
  exports.runInit = runInit;
294
- exports.spawnAsync = spawnAsync;
295
305
 
296
- //# sourceMappingURL=init-Cd1hCb7q.cjs.map
306
+ //# sourceMappingURL=init-hmolV6B4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-hmolV6B4.cjs","names":["fs","path","spawnAsync","pluginDefaultConfigs","process","clack","initDefaults","path","fs"],"sources":["../../../internals/utils/src/packageManager.ts","../src/utils/packageManager.ts","../src/runners/init.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n /** Identifier used in CLI commands, e.g. `pnpm`, `yarn`. */\n name: PackageManagerName\n /** Lock file name that uniquely identifies this package manager in a project root. */\n lockFile: string\n /** Subcommands passed to the package manager binary to install a dev dependency. */\n installCommand: ReadonlyArray<string>\n}\n\nexport const packageManagers: Record<PackageManagerName, PackageManagerInfo> = {\n pnpm: {\n name: 'pnpm',\n lockFile: 'pnpm-lock.yaml',\n installCommand: ['add', '-D'],\n },\n yarn: {\n name: 'yarn',\n lockFile: 'yarn.lock',\n installCommand: ['add', '-D'],\n },\n bun: {\n name: 'bun',\n lockFile: 'bun.lockb',\n installCommand: ['add', '-d'],\n },\n npm: {\n name: 'npm',\n lockFile: 'package-lock.json',\n installCommand: ['install', '--save-dev'],\n },\n}\n\n/** Minimal shape of `package.json` fields read during detection. */\ntype PackageJson = {\n /** The `packageManager` field from `package.json` (e.g. `\"pnpm@9.0.0\"`). */\n packageManager?: string\n}\n\n/**\n * Detects the active package manager for the given directory.\n * Resolution order: `packageManager` field in `package.json`, then presence of a lock file.\n * Falls back to npm when no signal is found.\n */\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n const packageJsonPath = join(cwd, 'package.json')\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as PackageJson\n const pmField = packageJson.packageManager\n if (typeof pmField === 'string') {\n const name = pmField.split('@')[0]\n if (name && name in packageManagers) {\n return packageManagers[name as PackageManagerName]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n for (const pm of Object.values(packageManagers)) {\n if (existsSync(join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n return packageManagers.npm\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageManagerInfo, PackageManagerName } from '@internals/utils'\nimport { spawnAsync } from '@internals/utils'\n\nexport function hasPackageJson(cwd: string = process.cwd()): boolean {\n return fs.existsSync(path.join(cwd, 'package.json'))\n}\n\nexport async function initPackageJson(cwd: string, packageManager: PackageManagerInfo): Promise<void> {\n const commands: Record<PackageManagerName, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await spawnAsync(packageManager.name, commands[packageManager.name], { cwd })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await spawnAsync(packageManager.name, [...packageManager.installCommand, ...packages], { cwd })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport type { PackageManagerInfo } from '@internals/utils'\nimport { detectPackageManager } from '@internals/utils'\nimport { initDefaults, pluginDefaultConfigs } from '../constants.ts'\nimport { hasPackageJson, initPackageJson, installPackages } from '../utils/packageManager.ts'\n\ntype PluginOption = {\n value: string\n label: string\n hint?: string\n packageName: string\n importName: string\n category: 'core' | 'typescript' | 'query' | 'validation' | 'testing' | 'mocking' | 'docs'\n}\n\nconst availablePlugins: PluginOption[] = [\n {\n value: 'plugin-oas',\n label: 'OpenAPI Parser',\n hint: 'Required',\n packageName: '@kubb/plugin-oas',\n importName: 'pluginOas',\n category: 'core',\n },\n {\n value: 'plugin-ts',\n label: 'TypeScript',\n hint: 'Recommended',\n packageName: '@kubb/plugin-ts',\n importName: 'pluginTs',\n category: 'typescript',\n },\n {\n value: 'plugin-client',\n label: 'Client (Fetch/Axios)',\n packageName: '@kubb/plugin-client',\n importName: 'pluginClient',\n category: 'typescript',\n },\n {\n value: 'plugin-react-query',\n label: 'React Query / TanStack Query',\n packageName: '@kubb/plugin-react-query',\n importName: 'pluginReactQuery',\n category: 'query',\n },\n {\n value: 'plugin-solid-query',\n label: 'Solid Query',\n packageName: '@kubb/plugin-solid-query',\n importName: 'pluginSolidQuery',\n category: 'query',\n },\n {\n value: 'plugin-svelte-query',\n label: 'Svelte Query',\n packageName: '@kubb/plugin-svelte-query',\n importName: 'pluginSvelteQuery',\n category: 'query',\n },\n {\n value: 'plugin-vue-query',\n label: 'Vue Query',\n packageName: '@kubb/plugin-vue-query',\n importName: 'pluginVueQuery',\n category: 'query',\n },\n {\n value: 'plugin-swr',\n label: 'SWR',\n packageName: '@kubb/plugin-swr',\n importName: 'pluginSwr',\n category: 'query',\n },\n {\n value: 'plugin-zod',\n label: 'Zod Schemas',\n packageName: '@kubb/plugin-zod',\n importName: 'pluginZod',\n category: 'validation',\n },\n {\n value: 'plugin-faker',\n label: 'Faker.js Mocks',\n packageName: '@kubb/plugin-faker',\n importName: 'pluginFaker',\n category: 'mocking',\n },\n {\n value: 'plugin-msw',\n label: 'MSW Handlers',\n packageName: '@kubb/plugin-msw',\n importName: 'pluginMsw',\n category: 'mocking',\n },\n {\n value: 'plugin-cypress',\n label: 'Cypress Tests',\n packageName: '@kubb/plugin-cypress',\n importName: 'pluginCypress',\n category: 'testing',\n },\n {\n value: 'plugin-redoc',\n label: 'ReDoc Documentation',\n packageName: '@kubb/plugin-redoc',\n importName: 'pluginRedoc',\n category: 'docs',\n },\n]\n\nfunction generateConfigFile(selectedPlugins: PluginOption[], inputPath: string, outputPath: string): string {\n const imports = selectedPlugins.map((plugin) => `import { ${plugin.importName} } from '${plugin.packageName}'`).join('\\n')\n\n const pluginConfigs = selectedPlugins\n .map((plugin) => {\n const config = (pluginDefaultConfigs as Record<string, string>)[plugin.value] ?? `${plugin.importName}()`\n return ` ${config},`\n })\n .join('\\n')\n\n return `import { defineConfig } from '@kubb/core'\n${imports}\n\nexport default defineConfig({\n root: '.',\n input: {\n path: '${inputPath}',\n },\n output: {\n path: '${outputPath}',\n clean: true,\n },\n plugins: [\n${pluginConfigs}\n ],\n})\n`\n}\n\nfunction cancelAndExit(message = 'Operation cancelled.'): never {\n clack.cancel(message)\n process.exit(0)\n}\n\ntype InitOptions = {\n yes: boolean\n version: string\n}\n\nexport async function runInit({ yes, version }: InitOptions): Promise<void> {\n const cwd = process.cwd()\n\n clack.intro(styleText('bgCyan', styleText('black', ' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\n if (!yes) {\n const shouldInit = await clack.confirm({\n message: 'No package.json found. Would you like to create one?',\n initialValue: true,\n })\n\n if (clack.isCancel(shouldInit) || !shouldInit) {\n cancelAndExit()\n }\n }\n\n packageManager = detectPackageManager(cwd)\n\n const spinner = clack.spinner()\n spinner.start(`Initializing package.json with ${packageManager.name}`)\n\n await initPackageJson(cwd, packageManager)\n\n spinner.stop(`Created package.json with ${packageManager.name}`)\n } else {\n packageManager = detectPackageManager(cwd)\n clack.log.info(`Detected package manager: ${styleText('cyan', packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n let inputPath: string\n if (yes) {\n inputPath = initDefaults.inputPath\n clack.log.info(`Using input path: ${styleText('cyan', inputPath)}`)\n } else {\n const inputPathResult = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: initDefaults.inputPath,\n defaultValue: initDefaults.inputPath,\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPathResult)) {\n cancelAndExit()\n }\n inputPath = inputPathResult as string\n }\n\n // Prompt for output directory\n let outputPath: string\n if (yes) {\n outputPath = initDefaults.outputPath\n clack.log.info(`Using output path: ${styleText('cyan', outputPath)}`)\n } else {\n const outputPathResult = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: initDefaults.outputPath,\n defaultValue: initDefaults.outputPath,\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPathResult)) {\n cancelAndExit()\n }\n outputPath = outputPathResult as string\n }\n\n // Plugin selection\n let selectedPlugins: PluginOption[]\n if (yes) {\n selectedPlugins = availablePlugins.filter((plugin) => (initDefaults.plugins as readonly string[]).includes(plugin.value))\n clack.log.info(`Using plugins: ${styleText('cyan', selectedPlugins.map((p) => p.label).join(', '))}`)\n } else {\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: availablePlugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: [...initDefaults.plugins],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n cancelAndExit()\n }\n\n selectedPlugins = availablePlugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n }\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(availablePlugins.find((p) => p.value === 'plugin-oas')!)\n }\n\n // Install packages\n const packagesToInstall = ['@kubb/core', '@kubb/cli', '@kubb/agent', ...selectedPlugins.map((p) => p.packageName)]\n\n const spinner = clack.spinner()\n spinner.start(`Installing ${packagesToInstall.length} packages with ${packageManager.name}`)\n\n try {\n await installPackages(packagesToInstall, packageManager, cwd)\n spinner.stop(`Installed ${packagesToInstall.length} packages`)\n } catch (error) {\n spinner.stop('Installation failed')\n throw error\n }\n\n // Generate config file\n const configSpinner = clack.spinner()\n configSpinner.start('Creating kubb.config.ts')\n\n const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\n if (!yes) {\n const shouldOverwrite = await clack.confirm({\n message: 'kubb.config.ts already exists. Overwrite?',\n initialValue: false,\n })\n\n if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {\n cancelAndExit('Keeping existing configuration. Packages have been installed.')\n }\n }\n\n configSpinner.start('Overwriting kubb.config.ts')\n }\n\n fs.writeFileSync(configPath, configContent, 'utf-8')\n\n configSpinner.stop('Created kubb.config.ts')\n\n clack.outro(\n styleText('green', '✓ All set!') +\n '\\n\\n' +\n styleText('dim', 'Next steps:') +\n '\\n' +\n styleText('cyan', ` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n styleText('cyan', ' 2. Generate code with: npx kubb generate') +\n '\\n' +\n styleText('cyan', ' Or start a stream server with: npx kubb start') +\n '\\n' +\n styleText('cyan', ` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n styleText('dim', `Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(styleText('red', 'An error occurred during initialization'))\n if (error instanceof Error) {\n clack.log.error(error.message)\n }\n process.exit(1)\n }\n}\n"],"mappings":"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"}
@@ -13,4 +13,4 @@ Object.defineProperty(exports, "jiti", {
13
13
  }
14
14
  });
15
15
 
16
- //# sourceMappingURL=jiti-BdskUHhD.cjs.map
16
+ //# sourceMappingURL=jiti-Cd3S0xwr.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"jiti-BdskUHhD.cjs","names":["jiti"],"sources":["../src/utils/jiti.ts"],"sourcesContent":["import { createJiti } from 'jiti'\n\n/**\n * Shared jiti instance for dynamic ESM/TS imports across CLI commands.\n * Created once at module scope to avoid the overhead of repeated instantiation.\n */\nexport const jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n"],"mappings":";;;;;;AAMA,MAAaA,UAAAA,mBAAAA,YAAAA,QAAAA,MAAAA,CAAAA,cAAAA,WAAAA,CAAAA,MAAmC,EAC9C,YAAY,MACb,CAAC"}
1
+ {"version":3,"file":"jiti-Cd3S0xwr.cjs","names":["jiti"],"sources":["../src/utils/jiti.ts"],"sourcesContent":["import { createJiti } from 'jiti'\n\n/**\n * Shared jiti instance for dynamic ESM/TS imports across CLI commands.\n * Created once at module scope to avoid the overhead of repeated instantiation.\n */\nexport const jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n"],"mappings":";;;;;;AAMA,MAAaA,UAAAA,mBAAAA,YAAAA,QAAAA,MAAAA,CAAAA,cAAAA,WAAAA,CAAAA,MAAmC,EAC9C,YAAY,MACb,CAAC"}
@@ -8,4 +8,4 @@ const jiti = createJiti(import.meta.url, { sourceMaps: true });
8
8
  //#endregion
9
9
  export { jiti as t };
10
10
 
11
- //# sourceMappingURL=jiti-Cl7t20dO.js.map
11
+ //# sourceMappingURL=jiti-e08mD2Ph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jiti-Cl7t20dO.js","names":[],"sources":["../src/utils/jiti.ts"],"sourcesContent":["import { createJiti } from 'jiti'\n\n/**\n * Shared jiti instance for dynamic ESM/TS imports across CLI commands.\n * Created once at module scope to avoid the overhead of repeated instantiation.\n */\nexport const jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n"],"mappings":";;;;;;AAMA,MAAa,OAAO,WAAW,OAAO,KAAK,KAAK,EAC9C,YAAY,MACb,CAAC"}
1
+ {"version":3,"file":"jiti-e08mD2Ph.js","names":[],"sources":["../src/utils/jiti.ts"],"sourcesContent":["import { createJiti } from 'jiti'\n\n/**\n * Shared jiti instance for dynamic ESM/TS imports across CLI commands.\n * Created once at module scope to avoid the overhead of repeated instantiation.\n */\nexport const jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n"],"mappings":";;;;;;AAMA,MAAa,OAAO,WAAW,OAAO,KAAK,KAAK,EAC9C,YAAY,MACb,CAAC"}
@@ -1,15 +1,16 @@
1
1
  require("./chunk-ByKO4r7w.cjs");
2
- const require_package = require("./package-aKgzEJtp.cjs");
2
+ const require_define = require("./define-D6Kfm7-Z.cjs");
3
+ const require_package = require("./package-BXijqaX5.cjs");
3
4
  //#region src/commands/mcp.ts
4
- const command = require("./types-Ck2lzFON.cjs").defineCommand({
5
+ const command = require_define.defineCommand({
5
6
  name: "mcp",
6
7
  description: "Start the server to enable the MCP client to interact with the LLM.",
7
8
  async run() {
8
- const { runMcp } = await Promise.resolve().then(() => require("./mcp-B73FC8dF.cjs"));
9
+ const { runMcp } = await Promise.resolve().then(() => require("./mcp-ChHFPRzD.cjs"));
9
10
  await runMcp({ version: require_package.version });
10
11
  }
11
12
  });
12
13
  //#endregion
13
14
  exports.command = command;
14
15
 
15
- //# sourceMappingURL=mcp-Clg-Qnkr.cjs.map
16
+ //# sourceMappingURL=mcp-Bd-DXHWV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-Bd-DXHWV.cjs","names":["defineCommand"],"sources":["../src/commands/mcp.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'mcp',\n description: 'Start the server to enable the MCP client to interact with the LLM.',\n async run() {\n const { runMcp } = await import('../runners/mcp.ts')\n\n await runMcp({ version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAUA,eAAAA,cAAc;CACnC,MAAM;CACN,aAAa;CACb,MAAM,MAAM;EACV,MAAM,EAAE,WAAW,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,qBAAA,CAAA;AAEzB,QAAM,OAAO,EAAE,SAAA,gBAAA,SAAS,CAAC;;CAE5B,CAAC"}
@@ -1,16 +1,16 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { t as version } from "./package-681jTtCk.js";
3
- import { n as defineCommand } from "./types-CLtz0jem.js";
2
+ import { n as defineCommand } from "./define--M_JMcDC.js";
3
+ import { t as version } from "./package-DeOlqJ31.js";
4
4
  //#region src/commands/mcp.ts
5
5
  const command = defineCommand({
6
6
  name: "mcp",
7
7
  description: "Start the server to enable the MCP client to interact with the LLM.",
8
8
  async run() {
9
- const { runMcp } = await import("./mcp-Cf-1dsB-.js");
9
+ const { runMcp } = await import("./mcp-D2SHEg_d.js");
10
10
  await runMcp({ version });
11
11
  }
12
12
  });
13
13
  //#endregion
14
14
  export { command };
15
15
 
16
- //# sourceMappingURL=mcp-Bd9LITaI.js.map
16
+ //# sourceMappingURL=mcp-CZzxfbHW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-CZzxfbHW.js","names":[],"sources":["../src/commands/mcp.ts"],"sourcesContent":["import { defineCommand } from '@internals/utils'\nimport { version } from '../../package.json'\n\nexport const command = defineCommand({\n name: 'mcp',\n description: 'Start the server to enable the MCP client to interact with the LLM.',\n async run() {\n const { runMcp } = await import('../runners/mcp.ts')\n\n await runMcp({ version })\n },\n})\n"],"mappings":";;;;AAGA,MAAa,UAAU,cAAc;CACnC,MAAM;CACN,aAAa;CACb,MAAM,MAAM;EACV,MAAM,EAAE,WAAW,MAAM,OAAO;AAEhC,QAAM,OAAO,EAAE,SAAS,CAAC;;CAE5B,CAAC"}
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require("./chunk-ByKO4r7w.cjs");
2
- const require_telemetry = require("./telemetry-T5IA2dWA.cjs");
3
- const require_errors = require("./errors-BUjJsNoe.cjs");
4
- const require_jiti = require("./jiti-BdskUHhD.cjs");
2
+ const require_errors = require("./errors-DBW0N9w4.cjs");
3
+ const require_telemetry = require("./telemetry-Cn9X1I5B.cjs");
4
+ const require_jiti = require("./jiti-Cd3S0xwr.cjs");
5
5
  let node_util = require("node:util");
6
6
  let node_process = require("node:process");
7
7
  node_process = require_chunk.__toESM(node_process);
@@ -39,4 +39,4 @@ async function runMcp({ version }) {
39
39
  //#endregion
40
40
  exports.runMcp = runMcp;
41
41
 
42
- //# sourceMappingURL=mcp-B73FC8dF.cjs.map
42
+ //# sourceMappingURL=mcp-ChHFPRzD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-ChHFPRzD.cjs","names":["jiti","process","sendTelemetry","buildTelemetryEvent","getErrorMessage"],"sources":["../src/runners/mcp.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getErrorMessage } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { jiti } from '../utils/jiti.ts'\nimport { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'\n\ntype McpOptions = {\n version: string\n}\n\nexport async function runMcp({ version }: McpOptions): Promise<void> {\n let mod: typeof McpModule\n try {\n mod = (await jiti.import('@kubb/mcp', { default: true })) as typeof McpModule\n } catch (_e) {\n console.error(`Import of '@kubb/mcp' is required to start the MCP server`)\n process.exit(1)\n }\n\n const { run } = mod\n const hrStart = process.hrtime()\n try {\n console.log('⏳ Starting MCP server...')\n console.warn(styleText('yellow', 'This feature is still under development — use with caution'))\n run()\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'success' }))\n } catch (error) {\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'failed' }))\n console.error(getErrorMessage(error))\n }\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,OAAO,EAAE,WAAsC;CACnE,IAAI;AACJ,KAAI;AACF,QAAO,MAAMA,aAAAA,KAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;UACjD,IAAI;AACX,UAAQ,MAAM,4DAA4D;AAC1E,eAAA,QAAQ,KAAK,EAAE;;CAGjB,MAAM,EAAE,QAAQ;CAChB,MAAM,UAAUC,aAAAA,QAAQ,QAAQ;AAChC,KAAI;AACF,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,MAAA,GAAA,UAAA,WAAe,UAAU,6DAA6D,CAAC;AAC/F,OAAK;AACL,QAAMC,kBAAAA,cAAcC,kBAAAA,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAW,CAAC,CAAC;UACvG,OAAO;AACd,QAAMD,kBAAAA,cAAcC,kBAAAA,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAU,CAAC,CAAC;AAC7G,UAAQ,MAAMC,eAAAA,gBAAgB,MAAM,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { r as sendTelemetry, t as buildTelemetryEvent } from "./telemetry-C4gOKX2x.js";
3
- import { t as getErrorMessage } from "./errors-bSLTEh4e.js";
4
- import { t as jiti } from "./jiti-Cl7t20dO.js";
2
+ import { t as getErrorMessage } from "./errors-6mF_WKxg.js";
3
+ import { r as sendTelemetry, t as buildTelemetryEvent } from "./telemetry-DxiR7clS.js";
4
+ import { t as jiti } from "./jiti-e08mD2Ph.js";
5
5
  import { styleText } from "node:util";
6
6
  import process from "node:process";
7
7
  //#region src/runners/mcp.ts
@@ -38,4 +38,4 @@ async function runMcp({ version }) {
38
38
  //#endregion
39
39
  export { runMcp };
40
40
 
41
- //# sourceMappingURL=mcp-Cf-1dsB-.js.map
41
+ //# sourceMappingURL=mcp-D2SHEg_d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-D2SHEg_d.js","names":[],"sources":["../src/runners/mcp.ts"],"sourcesContent":["import process from 'node:process'\nimport { styleText } from 'node:util'\nimport { getErrorMessage } from '@internals/utils'\nimport type * as McpModule from '@kubb/mcp'\nimport { jiti } from '../utils/jiti.ts'\nimport { buildTelemetryEvent, sendTelemetry } from '../utils/telemetry.ts'\n\ntype McpOptions = {\n version: string\n}\n\nexport async function runMcp({ version }: McpOptions): Promise<void> {\n let mod: typeof McpModule\n try {\n mod = (await jiti.import('@kubb/mcp', { default: true })) as typeof McpModule\n } catch (_e) {\n console.error(`Import of '@kubb/mcp' is required to start the MCP server`)\n process.exit(1)\n }\n\n const { run } = mod\n const hrStart = process.hrtime()\n try {\n console.log('⏳ Starting MCP server...')\n console.warn(styleText('yellow', 'This feature is still under development — use with caution'))\n run()\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'success' }))\n } catch (error) {\n await sendTelemetry(buildTelemetryEvent({ command: 'mcp', kubbVersion: version, hrStart, status: 'failed' }))\n console.error(getErrorMessage(error))\n }\n}\n"],"mappings":";;;;;;;AAWA,eAAsB,OAAO,EAAE,WAAsC;CACnE,IAAI;AACJ,KAAI;AACF,QAAO,MAAM,KAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;UACjD,IAAI;AACX,UAAQ,MAAM,4DAA4D;AAC1E,UAAQ,KAAK,EAAE;;CAGjB,MAAM,EAAE,QAAQ;CAChB,MAAM,UAAU,QAAQ,QAAQ;AAChC,KAAI;AACF,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,KAAK,UAAU,UAAU,6DAA6D,CAAC;AAC/F,OAAK;AACL,QAAM,cAAc,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAW,CAAC,CAAC;UACvG,OAAO;AACd,QAAM,cAAc,oBAAoB;GAAE,SAAS;GAAO,aAAa;GAAS;GAAS,QAAQ;GAAU,CAAC,CAAC;AAC7G,UAAQ,MAAM,gBAAgB,MAAM,CAAC"}
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "4.33.0";
2
+ var version = "4.33.2";
3
3
  //#endregion
4
4
  Object.defineProperty(exports, "version", {
5
5
  enumerable: true,
@@ -8,4 +8,4 @@ Object.defineProperty(exports, "version", {
8
8
  }
9
9
  });
10
10
 
11
- //# sourceMappingURL=package-aKgzEJtp.cjs.map
11
+ //# sourceMappingURL=package-BXijqaX5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-BXijqaX5.cjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,6 @@
1
+ //#region package.json
2
+ var version = "4.33.2";
3
+ //#endregion
4
+ export { version as t };
5
+
6
+ //# sourceMappingURL=package-DeOlqJ31.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-DeOlqJ31.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,57 @@
1
+ require("./chunk-ByKO4r7w.cjs");
2
+ let node_child_process = require("node:child_process");
3
+ //#region ../../internals/utils/src/shell.ts
4
+ /**
5
+ * Tokenizes a shell command string, respecting single and double quotes.
6
+ *
7
+ * @example
8
+ * tokenize('git commit -m "initial commit"')
9
+ * // → ['git', 'commit', '-m', 'initial commit']
10
+ */
11
+ function tokenize(command) {
12
+ return (command.match(/[^\s"']+|"([^"]*)"|'([^']*)'/g) ?? []).map((token) => token.replace(/^["']|["']$/g, ""));
13
+ }
14
+ /**
15
+ * Spawns `cmd` with `args` and returns a promise that settles when the child process finishes.
16
+ *
17
+ * Foreground mode (default) inherits the parent's stdio and rejects on non-zero exit or signal.
18
+ * Detached mode spawns the child in its own process group, unref's it, and resolves immediately —
19
+ * the parent can exit without waiting for the child.
20
+ */
21
+ function spawnAsync(cmd, args, options = {}) {
22
+ const { cwd = process.cwd(), env, detached = false } = options;
23
+ return new Promise((resolve, reject) => {
24
+ const child = (0, node_child_process.spawn)(cmd, args, {
25
+ stdio: detached ? "ignore" : "inherit",
26
+ cwd,
27
+ env,
28
+ detached
29
+ });
30
+ if (detached) {
31
+ child.unref();
32
+ resolve();
33
+ return;
34
+ }
35
+ child.on("close", (code, signal) => {
36
+ if (code === 0) resolve();
37
+ else if (signal !== null) reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" was terminated by signal ${signal}`));
38
+ else reject(/* @__PURE__ */ new Error(`"${cmd} ${args.join(" ")}" exited with code ${code}`));
39
+ });
40
+ child.on("error", reject);
41
+ });
42
+ }
43
+ //#endregion
44
+ Object.defineProperty(exports, "spawnAsync", {
45
+ enumerable: true,
46
+ get: function() {
47
+ return spawnAsync;
48
+ }
49
+ });
50
+ Object.defineProperty(exports, "tokenize", {
51
+ enumerable: true,
52
+ get: function() {
53
+ return tokenize;
54
+ }
55
+ });
56
+
57
+ //# sourceMappingURL=shell-7HPrTCJ5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-7HPrTCJ5.cjs","names":[],"sources":["../../../internals/utils/src/shell.ts"],"sourcesContent":["import { spawn } from 'node:child_process'\n\n/**\n * Tokenizes a shell command string, respecting single and double quotes.\n *\n * @example\n * tokenize('git commit -m \"initial commit\"')\n * // → ['git', 'commit', '-m', 'initial commit']\n */\nexport function tokenize(command: string): string[] {\n return (command.match(/[^\\s\"']+|\"([^\"]*)\"|'([^']*)'/g) ?? []).map((token) => token.replace(/^[\"']|[\"']$/g, ''))\n}\n\ntype SpawnOptions = {\n /** Working directory for the child process. Defaults to `process.cwd()`. */\n cwd?: string\n /** Environment variables passed to the child process. Defaults to the parent's `process.env`. */\n env?: NodeJS.ProcessEnv\n /**\n * When `true`, spawns a detached background process and resolves immediately.\n * The child is unref'd so the parent process can exit independently.\n * Defaults to `false` (foreground — inherits stdio and waits for exit).\n */\n detached?: boolean\n}\n\n/**\n * Spawns `cmd` with `args` and returns a promise that settles when the child process finishes.\n *\n * Foreground mode (default) inherits the parent's stdio and rejects on non-zero exit or signal.\n * Detached mode spawns the child in its own process group, unref's it, and resolves immediately —\n * the parent can exit without waiting for the child.\n */\nexport function spawnAsync(cmd: string, args: string[], options: SpawnOptions = {}): Promise<void> {\n const { cwd = process.cwd(), env, detached = false } = options\n\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {\n stdio: detached ? 'ignore' : 'inherit',\n cwd,\n env,\n detached,\n })\n\n if (detached) {\n child.unref()\n resolve()\n return\n }\n\n child.on('close', (code, signal) => {\n if (code === 0) {\n resolve()\n } else if (signal !== null) {\n reject(new Error(`\"${cmd} ${args.join(' ')}\" was terminated by signal ${signal}`))\n } else {\n reject(new Error(`\"${cmd} ${args.join(' ')}\" exited with code ${code}`))\n }\n })\n child.on('error', reject)\n })\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,SAAS,SAA2B;AAClD,SAAQ,QAAQ,MAAM,gCAAgC,IAAI,EAAE,EAAE,KAAK,UAAU,MAAM,QAAQ,gBAAgB,GAAG,CAAC;;;;;;;;;AAuBjH,SAAgB,WAAW,KAAa,MAAgB,UAAwB,EAAE,EAAiB;CACjG,MAAM,EAAE,MAAM,QAAQ,KAAK,EAAE,KAAK,WAAW,UAAU;AAEvD,QAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,SAAA,GAAA,mBAAA,OAAc,KAAK,MAAM;GAC7B,OAAO,WAAW,WAAW;GAC7B;GACA;GACA;GACD,CAAC;AAEF,MAAI,UAAU;AACZ,SAAM,OAAO;AACb,YAAS;AACT;;AAGF,QAAM,GAAG,UAAU,MAAM,WAAW;AAClC,OAAI,SAAS,EACX,UAAS;YACA,WAAW,KACpB,wBAAO,IAAI,MAAM,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,6BAA6B,SAAS,CAAC;OAElF,wBAAO,IAAI,MAAM,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,qBAAqB,OAAO,CAAC;IAE1E;AACF,QAAM,GAAG,SAAS,OAAO;GACzB"}