@kubb/cli 4.27.0 → 4.27.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 (33) hide show
  1. package/README.md +14 -3
  2. package/dist/{agent-_H9DOOPd.js → agent-CEvWvnIe.js} +2 -2
  3. package/dist/{agent-_H9DOOPd.js.map → agent-CEvWvnIe.js.map} +1 -1
  4. package/dist/{agent-BFRqrVF_.cjs → agent-i7gxtADx.cjs} +2 -2
  5. package/dist/{agent-BFRqrVF_.cjs.map → agent-i7gxtADx.cjs.map} +1 -1
  6. package/dist/{generate-10eNJXJo.cjs → generate-Ckr6ePrM.cjs} +2 -2
  7. package/dist/{generate-10eNJXJo.cjs.map → generate-Ckr6ePrM.cjs.map} +1 -1
  8. package/dist/{generate-sTQnT8vH.js → generate-DkkJxjne.js} +2 -2
  9. package/dist/{generate-sTQnT8vH.js.map → generate-DkkJxjne.js.map} +1 -1
  10. package/dist/index.cjs +5 -5
  11. package/dist/index.js +5 -5
  12. package/dist/{init-BwzStiaK.js → init-D195PGpQ.js} +85 -51
  13. package/dist/init-D195PGpQ.js.map +1 -0
  14. package/dist/{init-DOhq5sjS.cjs → init-aD7e9Tuu.cjs} +85 -51
  15. package/dist/init-aD7e9Tuu.cjs.map +1 -0
  16. package/dist/package-C6rC-7CN.js +6 -0
  17. package/dist/package-C6rC-7CN.js.map +1 -0
  18. package/dist/{package-DcbrXbFT.cjs → package-G9nHaBbo.cjs} +2 -2
  19. package/dist/package-G9nHaBbo.cjs.map +1 -0
  20. package/dist/{start-Dp1iN5KU.cjs → start-BPR_UFp2.cjs} +11 -11
  21. package/dist/start-BPR_UFp2.cjs.map +1 -0
  22. package/dist/{start-D9LsCoNJ.js → start-DNbpCv53.js} +11 -11
  23. package/dist/start-DNbpCv53.js.map +1 -0
  24. package/package.json +6 -6
  25. package/src/commands/agent/start.ts +11 -27
  26. package/src/commands/init.ts +94 -57
  27. package/dist/init-BwzStiaK.js.map +0 -1
  28. package/dist/init-DOhq5sjS.cjs.map +0 -1
  29. package/dist/package-C3VLYHj-.js +0 -6
  30. package/dist/package-C3VLYHj-.js.map +0 -1
  31. package/dist/package-DcbrXbFT.cjs.map +0 -1
  32. package/dist/start-D9LsCoNJ.js.map +0 -1
  33. package/dist/start-Dp1iN5KU.cjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/cli",
3
- "version": "4.27.0",
3
+ "version": "4.27.2",
4
4
  "description": "Command-line interface for Kubb, enabling easy generation of TypeScript, React-Query, Zod, and other code from OpenAPI specifications.",
5
5
  "keywords": [
6
6
  "cli",
@@ -61,21 +61,21 @@
61
61
  "dotenv": "^17.3.1",
62
62
  "execa": "^9.6.1",
63
63
  "gradient-string": "^3.0.0",
64
- "jiti": "^2.6.1",
64
+ "jiti": "2.5.1",
65
65
  "latest-version": "^9.0.0",
66
66
  "picocolors": "^1.1.1",
67
67
  "seedrandom": "^3.0.5",
68
68
  "semver": "^7.7.4",
69
69
  "string-argv": "^0.3.2",
70
- "@kubb/core": "4.27.0"
70
+ "@kubb/core": "4.27.2"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@types/seedrandom": "^3.0.8",
74
74
  "@types/semver": "^7.7.1",
75
75
  "source-map-support": "^0.5.21",
76
- "@kubb/agent": "4.27.0",
77
- "@kubb/mcp": "4.27.0",
78
- "@kubb/oas": "4.27.0"
76
+ "@kubb/agent": "4.27.2",
77
+ "@kubb/mcp": "4.27.2",
78
+ "@kubb/oas": "4.27.2"
79
79
  },
80
80
  "engines": {
81
81
  "node": ">=20"
@@ -9,22 +9,6 @@ import { config as loadEnv } from 'dotenv'
9
9
  import { execa } from 'execa'
10
10
  import pc from 'picocolors'
11
11
 
12
- declare global {
13
- namespace NodeJS {
14
- interface ProcessEnv {
15
- PORT: string
16
- KUBB_ROOT: string
17
- KUBB_STUDIO_URL: string
18
- KUBB_AGENT_TOKEN: string
19
- KUBB_CONFIG: string
20
- KUBB_AGENT_NO_CACHE: string
21
- KUBB_RETRY_TIMEOUT: string
22
- KUBB_ALLOW_WRITE: string
23
- KUBB_ALLOW_ALL: string
24
- }
25
- }
26
- }
27
-
28
12
  const args = {
29
13
  config: {
30
14
  type: 'string',
@@ -83,31 +67,31 @@ async function startServer({ port, host, configPath, noCache, allowWrite, allowA
83
67
  const HOST = process.env.HOST || host || '0.0.0.0'
84
68
 
85
69
  // kubb env
86
- const KUBB_ROOT = process.env.KUBB_ROOT || process.cwd()
87
- const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'
70
+ const KUBB_AGENT_ROOT = process.env.KUBB_AGENT_ROOT || process.cwd()
71
+ const KUBB_AGENT_CONFIG = process.env.KUBB_AGENT_CONFIG || configPath || 'kubb.config.ts'
88
72
  const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'
89
- const KUBB_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_ALLOW_WRITE ?? 'false')
90
- const KUBB_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_ALLOW_ALL ?? 'false')
73
+ const KUBB_AGENT_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_AGENT_ALLOW_WRITE ?? 'false')
74
+ const KUBB_AGENT_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_AGENT_ALLOW_ALL ?? 'false')
91
75
  const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'
92
76
  const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN
93
- const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'
77
+ const KUBB_AGENT_RETRY_TIMEOUT = process.env.KUBB_AGENT_RETRY_TIMEOUT || '30000'
94
78
 
95
79
  // Set environment variables
96
80
  const env = {
97
- KUBB_ROOT,
98
- KUBB_CONFIG,
81
+ KUBB_AGENT_ROOT,
82
+ KUBB_AGENT_CONFIG,
99
83
  PORT,
100
84
  HOST,
101
85
  KUBB_STUDIO_URL,
102
- KUBB_RETRY_TIMEOUT,
86
+ KUBB_AGENT_RETRY_TIMEOUT,
103
87
  KUBB_AGENT_NO_CACHE,
104
88
  KUBB_AGENT_TOKEN,
105
- KUBB_ALLOW_WRITE,
106
- KUBB_ALLOW_ALL,
89
+ KUBB_AGENT_ALLOW_WRITE,
90
+ KUBB_AGENT_ALLOW_ALL,
107
91
  }
108
92
 
109
93
  clack.log.step(pc.cyan('Starting agent server...'))
110
- clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))
94
+ clack.log.info(pc.dim(`Config: ${KUBB_AGENT_CONFIG}`))
111
95
  clack.log.info(pc.dim(`Host: ${HOST}`))
112
96
  clack.log.info(pc.dim(`Port: ${PORT}`))
113
97
  if (noCache) {
@@ -165,13 +165,26 @@ ${pluginConfigs}
165
165
  `
166
166
  }
167
167
 
168
+ const DEFAULT_INPUT_PATH = './openapi.yaml'
169
+ const DEFAULT_OUTPUT_PATH = './src/gen'
170
+ const DEFAULT_PLUGINS = ['plugin-oas', 'plugin-ts']
171
+
168
172
  const command = defineCommand({
169
173
  meta: {
170
174
  name: 'init',
171
175
  description: 'Initialize a new Kubb project with interactive setup',
172
176
  },
173
- async run() {
177
+ args: {
178
+ yes: {
179
+ type: 'boolean',
180
+ alias: 'y',
181
+ description: 'Skip prompts and use default options',
182
+ default: false,
183
+ },
184
+ },
185
+ async run({ args }) {
174
186
  const cwd = process.cwd()
187
+ const yes = args.yes
175
188
 
176
189
  clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))
177
190
 
@@ -179,14 +192,16 @@ const command = defineCommand({
179
192
  // Check/create package.json
180
193
  let packageManager: PackageManagerInfo
181
194
  if (!hasPackageJson(cwd)) {
182
- const shouldInit = await clack.confirm({
183
- message: 'No package.json found. Would you like to create one?',
184
- initialValue: true,
185
- })
186
-
187
- if (clack.isCancel(shouldInit) || !shouldInit) {
188
- clack.cancel('Operation cancelled.')
189
- process.exit(0)
195
+ if (!yes) {
196
+ const shouldInit = await clack.confirm({
197
+ message: 'No package.json found. Would you like to create one?',
198
+ initialValue: true,
199
+ })
200
+
201
+ if (clack.isCancel(shouldInit) || !shouldInit) {
202
+ clack.cancel('Operation cancelled.')
203
+ process.exit(0)
204
+ }
190
205
  }
191
206
 
192
207
  // Detect package manager before initializing
@@ -204,53 +219,73 @@ const command = defineCommand({
204
219
  }
205
220
 
206
221
  // Prompt for OpenAPI spec path
207
- const inputPath = await clack.text({
208
- message: 'Where is your OpenAPI specification located?',
209
- placeholder: './openapi.yaml',
210
- defaultValue: './openapi.yaml',
211
- validate: (value) => {
212
- if (!value) return 'Input path is required'
213
- },
214
- })
215
-
216
- if (clack.isCancel(inputPath)) {
217
- clack.cancel('Operation cancelled.')
218
- process.exit(0)
222
+ let inputPath: string
223
+ if (yes) {
224
+ inputPath = DEFAULT_INPUT_PATH
225
+ clack.log.info(`Using input path: ${pc.cyan(inputPath)}`)
226
+ } else {
227
+ const inputPathResult = await clack.text({
228
+ message: 'Where is your OpenAPI specification located?',
229
+ placeholder: DEFAULT_INPUT_PATH,
230
+ defaultValue: DEFAULT_INPUT_PATH,
231
+ validate: (value) => {
232
+ if (!value) return 'Input path is required'
233
+ },
234
+ })
235
+
236
+ if (clack.isCancel(inputPathResult)) {
237
+ clack.cancel('Operation cancelled.')
238
+ process.exit(0)
239
+ }
240
+ inputPath = inputPathResult as string
219
241
  }
220
242
 
221
243
  // Prompt for output directory
222
- const outputPath = await clack.text({
223
- message: 'Where should the generated files be output?',
224
- placeholder: './src/gen',
225
- defaultValue: './src/gen',
226
- validate: (value) => {
227
- if (!value) return 'Output path is required'
228
- },
229
- })
230
-
231
- if (clack.isCancel(outputPath)) {
232
- clack.cancel('Operation cancelled.')
233
- process.exit(0)
244
+ let outputPath: string
245
+ if (yes) {
246
+ outputPath = DEFAULT_OUTPUT_PATH
247
+ clack.log.info(`Using output path: ${pc.cyan(outputPath)}`)
248
+ } else {
249
+ const outputPathResult = await clack.text({
250
+ message: 'Where should the generated files be output?',
251
+ placeholder: DEFAULT_OUTPUT_PATH,
252
+ defaultValue: DEFAULT_OUTPUT_PATH,
253
+ validate: (value) => {
254
+ if (!value) return 'Output path is required'
255
+ },
256
+ })
257
+
258
+ if (clack.isCancel(outputPathResult)) {
259
+ clack.cancel('Operation cancelled.')
260
+ process.exit(0)
261
+ }
262
+ outputPath = outputPathResult as string
234
263
  }
235
264
 
236
265
  // Plugin selection
237
- const selectedPluginValues = await clack.multiselect({
238
- message: 'Select plugins to use:',
239
- options: plugins.map((plugin) => ({
240
- value: plugin.value,
241
- label: plugin.label,
242
- hint: plugin.hint,
243
- })),
244
- initialValues: ['plugin-oas', 'plugin-ts'],
245
- required: true,
246
- })
247
-
248
- if (clack.isCancel(selectedPluginValues)) {
249
- clack.cancel('Operation cancelled.')
250
- process.exit(0)
251
- }
266
+ let selectedPlugins: PluginOption[]
267
+ if (yes) {
268
+ selectedPlugins = plugins.filter((plugin) => DEFAULT_PLUGINS.includes(plugin.value))
269
+ clack.log.info(`Using plugins: ${pc.cyan(selectedPlugins.map((p) => p.label).join(', '))}`)
270
+ } else {
271
+ const selectedPluginValues = await clack.multiselect({
272
+ message: 'Select plugins to use:',
273
+ options: plugins.map((plugin) => ({
274
+ value: plugin.value,
275
+ label: plugin.label,
276
+ hint: plugin.hint,
277
+ })),
278
+ initialValues: DEFAULT_PLUGINS,
279
+ required: true,
280
+ })
252
281
 
253
- const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))
282
+ if (clack.isCancel(selectedPluginValues)) {
283
+ clack.cancel('Operation cancelled.')
284
+ process.exit(0)
285
+ }
286
+
287
+ selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))
288
+ }
254
289
 
255
290
  // Ensure plugin-oas is always included
256
291
  if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {
@@ -275,21 +310,23 @@ const command = defineCommand({
275
310
  const configSpinner = clack.spinner()
276
311
  configSpinner.start('Creating kubb.config.ts')
277
312
 
278
- const configContent = generateConfigFile(selectedPlugins, inputPath as string, outputPath as string)
313
+ const configContent = generateConfigFile(selectedPlugins, inputPath, outputPath)
279
314
  const configPath = path.join(cwd, 'kubb.config.ts')
280
315
 
281
316
  // Check if config already exists
282
317
  if (fs.existsSync(configPath)) {
283
318
  configSpinner.stop('kubb.config.ts already exists')
284
319
 
285
- const shouldOverwrite = await clack.confirm({
286
- message: 'kubb.config.ts already exists. Overwrite?',
287
- initialValue: false,
288
- })
320
+ if (!yes) {
321
+ const shouldOverwrite = await clack.confirm({
322
+ message: 'kubb.config.ts already exists. Overwrite?',
323
+ initialValue: false,
324
+ })
289
325
 
290
- if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {
291
- clack.cancel('Keeping existing configuration. Packages have been installed.')
292
- process.exit(0)
326
+ if (clack.isCancel(shouldOverwrite) || !shouldOverwrite) {
327
+ clack.cancel('Keeping existing configuration. Packages have been installed.')
328
+ process.exit(0)
329
+ }
293
330
  }
294
331
 
295
332
  configSpinner.start('Overwriting kubb.config.ts')
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-BwzStiaK.js","names":["process","spinner"],"sources":["../src/utils/packageManager.ts","../src/commands/init.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { execa } from 'execa'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n name: PackageManager\n lockFile: string\n installCommand: string[]\n}\n\nconst packageManagers: Record<PackageManager, 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\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n // Check for packageManager field in package.json\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const [name] = packageJson.packageManager.split('@')\n if (name in packageManagers) {\n return packageManagers[name as PackageManager]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n // Check for lock files\n for (const pm of Object.values(packageManagers)) {\n if (fs.existsSync(path.join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n // Default to npm\n return packageManagers.npm\n}\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<PackageManager, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await execa(packageManager.name, commands[packageManager.name], {\n cwd,\n stdio: 'inherit',\n })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await execa(packageManager.name, [...packageManager.installCommand, ...packages], {\n cwd,\n stdio: 'inherit',\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages, type PackageManagerInfo } 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 plugins: 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 if (plugin.value === 'plugin-oas') {\n return ' pluginOas(),'\n }\n if (plugin.value === 'plugin-ts') {\n return ` pluginTs({\\n output: {\\n path: 'models',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-client') {\n return ` pluginClient({\\n output: {\\n path: 'clients',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-react-query') {\n return ` pluginReactQuery({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-zod') {\n return ` pluginZod({\\n output: {\\n path: 'zod',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-faker') {\n return ` pluginFaker({\\n output: {\\n path: 'mocks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-msw') {\n return ` pluginMsw({\\n output: {\\n path: 'msw',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-swr') {\n return ` pluginSwr({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n // Default config for other plugins\n return ` ${plugin.importName}(),`\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\nconst command = defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n },\n async run() {\n const cwd = process.cwd()\n\n clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\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 clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Detect package manager before initializing\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: ${pc.cyan(packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: './openapi.yaml',\n defaultValue: './openapi.yaml',\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Prompt for output directory\n const outputPath = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: './src/gen',\n defaultValue: './src/gen',\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Plugin selection\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: plugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: ['plugin-oas', 'plugin-ts'],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(plugins.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 as string, outputPath as string)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n // Check if config already exists\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\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 clack.cancel('Keeping existing configuration. Packages have been installed.')\n process.exit(0)\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 // Success message\n clack.outro(\n pc.green('✓ All set!') +\n '\\n\\n' +\n pc.dim('Next steps:') +\n '\\n' +\n pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n pc.cyan(' 2. Generate code with: npx kubb generate') +\n '\\n' +\n pc.cyan(' Or start a stream server with: npx kubb start') +\n '\\n' +\n pc.cyan(` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n pc.dim(`Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(pc.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})\n\nexport default command\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-DOhq5sjS.cjs","names":["path","fs","process","pc","clack","spinner","path","fs","version"],"sources":["../src/utils/packageManager.ts","../src/commands/init.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { execa } from 'execa'\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun'\n\nexport interface PackageManagerInfo {\n name: PackageManager\n lockFile: string\n installCommand: string[]\n}\n\nconst packageManagers: Record<PackageManager, 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\nexport function detectPackageManager(cwd: string = process.cwd()): PackageManagerInfo {\n // Check for packageManager field in package.json\n const packageJsonPath = path.join(cwd, 'package.json')\n if (fs.existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n if (packageJson.packageManager) {\n const [name] = packageJson.packageManager.split('@')\n if (name in packageManagers) {\n return packageManagers[name as PackageManager]\n }\n }\n } catch {\n // Continue to lock file detection\n }\n }\n\n // Check for lock files\n for (const pm of Object.values(packageManagers)) {\n if (fs.existsSync(path.join(cwd, pm.lockFile))) {\n return pm\n }\n }\n\n // Default to npm\n return packageManagers.npm\n}\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<PackageManager, string[]> = {\n npm: ['init', '-y'],\n pnpm: ['init'],\n yarn: ['init', '-y'],\n bun: ['init', '-y'],\n }\n\n await execa(packageManager.name, commands[packageManager.name], {\n cwd,\n stdio: 'inherit',\n })\n}\n\nexport async function installPackages(packages: string[], packageManager: PackageManagerInfo, cwd: string = process.cwd()): Promise<void> {\n await execa(packageManager.name, [...packageManager.installCommand, ...packages], {\n cwd,\n stdio: 'inherit',\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { detectPackageManager, hasPackageJson, initPackageJson, installPackages, type PackageManagerInfo } 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 plugins: 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 if (plugin.value === 'plugin-oas') {\n return ' pluginOas(),'\n }\n if (plugin.value === 'plugin-ts') {\n return ` pluginTs({\\n output: {\\n path: 'models',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-client') {\n return ` pluginClient({\\n output: {\\n path: 'clients',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-react-query') {\n return ` pluginReactQuery({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-zod') {\n return ` pluginZod({\\n output: {\\n path: 'zod',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-faker') {\n return ` pluginFaker({\\n output: {\\n path: 'mocks',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-msw') {\n return ` pluginMsw({\\n output: {\\n path: 'msw',\\n },\\n }),`\n }\n if (plugin.value === 'plugin-swr') {\n return ` pluginSwr({\\n output: {\\n path: 'hooks',\\n },\\n }),`\n }\n // Default config for other plugins\n return ` ${plugin.importName}(),`\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\nconst command = defineCommand({\n meta: {\n name: 'init',\n description: 'Initialize a new Kubb project with interactive setup',\n },\n async run() {\n const cwd = process.cwd()\n\n clack.intro(pc.bgCyan(pc.black(' Kubb Init ')))\n\n try {\n // Check/create package.json\n let packageManager: PackageManagerInfo\n if (!hasPackageJson(cwd)) {\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 clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Detect package manager before initializing\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: ${pc.cyan(packageManager.name)}`)\n }\n\n // Prompt for OpenAPI spec path\n const inputPath = await clack.text({\n message: 'Where is your OpenAPI specification located?',\n placeholder: './openapi.yaml',\n defaultValue: './openapi.yaml',\n validate: (value) => {\n if (!value) return 'Input path is required'\n },\n })\n\n if (clack.isCancel(inputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Prompt for output directory\n const outputPath = await clack.text({\n message: 'Where should the generated files be output?',\n placeholder: './src/gen',\n defaultValue: './src/gen',\n validate: (value) => {\n if (!value) return 'Output path is required'\n },\n })\n\n if (clack.isCancel(outputPath)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n // Plugin selection\n const selectedPluginValues = await clack.multiselect({\n message: 'Select plugins to use:',\n options: plugins.map((plugin) => ({\n value: plugin.value,\n label: plugin.label,\n hint: plugin.hint,\n })),\n initialValues: ['plugin-oas', 'plugin-ts'],\n required: true,\n })\n\n if (clack.isCancel(selectedPluginValues)) {\n clack.cancel('Operation cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = plugins.filter((plugin) => (selectedPluginValues as string[]).includes(plugin.value))\n\n // Ensure plugin-oas is always included\n if (!selectedPlugins.find((p) => p.value === 'plugin-oas')) {\n selectedPlugins.unshift(plugins.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 as string, outputPath as string)\n const configPath = path.join(cwd, 'kubb.config.ts')\n\n // Check if config already exists\n if (fs.existsSync(configPath)) {\n configSpinner.stop('kubb.config.ts already exists')\n\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 clack.cancel('Keeping existing configuration. Packages have been installed.')\n process.exit(0)\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 // Success message\n clack.outro(\n pc.green('✓ All set!') +\n '\\n\\n' +\n pc.dim('Next steps:') +\n '\\n' +\n pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) +\n '\\n' +\n pc.cyan(' 2. Generate code with: npx kubb generate') +\n '\\n' +\n pc.cyan(' Or start a stream server with: npx kubb start') +\n '\\n' +\n pc.cyan(` 3. Find generated files in: ${outputPath}`) +\n '\\n\\n' +\n pc.dim(`Using ${packageManager.name} • Kubb v${version}`),\n )\n } catch (error) {\n clack.log.error(pc.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})\n\nexport default command\n"],"mappings":";;;;;;;;;;;;;;;;AAYA,MAAM,kBAA8D;CAClE,MAAM;EACJ,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,MAAM;EACJ,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,KAAK;EACH,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,OAAO,KAAK;EAC9B;CACD,KAAK;EACH,MAAM;EACN,UAAU;EACV,gBAAgB,CAAC,WAAW,aAAa;EAC1C;CACF;AAED,SAAgB,qBAAqB,MAAc,QAAQ,KAAK,EAAsB;CAEpF,MAAM,kBAAkBA,kBAAK,KAAK,KAAK,eAAe;AACtD,KAAIC,gBAAG,WAAW,gBAAgB,CAChC,KAAI;EACF,MAAM,cAAc,KAAK,MAAMA,gBAAG,aAAa,iBAAiB,QAAQ,CAAC;AACzE,MAAI,YAAY,gBAAgB;GAC9B,MAAM,CAAC,QAAQ,YAAY,eAAe,MAAM,IAAI;AACpD,OAAI,QAAQ,gBACV,QAAO,gBAAgB;;SAGrB;AAMV,MAAK,MAAM,MAAM,OAAO,OAAO,gBAAgB,CAC7C,KAAIA,gBAAG,WAAWD,kBAAK,KAAK,KAAK,GAAG,SAAS,CAAC,CAC5C,QAAO;AAKX,QAAO,gBAAgB;;AAGzB,SAAgB,eAAe,MAAc,QAAQ,KAAK,EAAW;AACnE,QAAOC,gBAAG,WAAWD,kBAAK,KAAK,KAAK,eAAe,CAAC;;AAGtD,eAAsB,gBAAgB,KAAa,gBAAmD;AAQpG,wBAAY,eAAe,MAPwB;EACjD,KAAK,CAAC,QAAQ,KAAK;EACnB,MAAM,CAAC,OAAO;EACd,MAAM,CAAC,QAAQ,KAAK;EACpB,KAAK,CAAC,QAAQ,KAAK;EACpB,CAEyC,eAAe,OAAO;EAC9D;EACA,OAAO;EACR,CAAC;;AAGJ,eAAsB,gBAAgB,UAAoB,gBAAoC,MAAc,QAAQ,KAAK,EAAiB;AACxI,wBAAY,eAAe,MAAM,CAAC,GAAG,eAAe,gBAAgB,GAAG,SAAS,EAAE;EAChF;EACA,OAAO;EACR,CAAC;;;;;ACnEJ,MAAM,UAA0B;CAC9B;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;EACb,YAAY;EACZ,UAAU;EACX;CACF;AAED,SAAS,mBAAmB,iBAAiC,WAAmB,YAA4B;AAkC1G,QAAO;EAjCS,gBAAgB,KAAK,WAAW,YAAY,OAAO,WAAW,WAAW,OAAO,YAAY,GAAG,CAAC,KAAK,KAAK,CAkClH;;;;;aAKG,UAAU;;;aAGV,WAAW;;;;EAxCA,gBACnB,KAAK,WAAW;AACf,MAAI,OAAO,UAAU,aACnB,QAAO;AAET,MAAI,OAAO,UAAU,YACnB,QAAO;AAET,MAAI,OAAO,UAAU,gBACnB,QAAO;AAET,MAAI,OAAO,UAAU,qBACnB,QAAO;AAET,MAAI,OAAO,UAAU,aACnB,QAAO;AAET,MAAI,OAAO,UAAU,eACnB,QAAO;AAET,MAAI,OAAO,UAAU,aACnB,QAAO;AAET,MAAI,OAAO,UAAU,aACnB,QAAO;AAGT,SAAO,OAAO,OAAO,WAAW;GAChC,CACD,KAAK,KAAK,CAeC;;;;;AAMhB,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAAM,MAAM;EACV,MAAM,MAAME,qBAAQ,KAAK;AAEzB,iBAAM,MAAMC,mBAAG,OAAOA,mBAAG,MAAM,cAAc,CAAC,CAAC;AAE/C,MAAI;GAEF,IAAI;AACJ,OAAI,CAAC,eAAe,IAAI,EAAE;IACxB,MAAM,aAAa,MAAMC,eAAM,QAAQ;KACrC,SAAS;KACT,cAAc;KACf,CAAC;AAEF,QAAIA,eAAM,SAAS,WAAW,IAAI,CAAC,YAAY;AAC7C,oBAAM,OAAO,uBAAuB;AACpC,0BAAQ,KAAK,EAAE;;AAIjB,qBAAiB,qBAAqB,IAAI;IAE1C,MAAMC,YAAUD,eAAM,SAAS;AAC/B,cAAQ,MAAM,kCAAkC,eAAe,OAAO;AAEtE,UAAM,gBAAgB,KAAK,eAAe;AAE1C,cAAQ,KAAK,6BAA6B,eAAe,OAAO;UAC3D;AACL,qBAAiB,qBAAqB,IAAI;AAC1C,mBAAM,IAAI,KAAK,6BAA6BD,mBAAG,KAAK,eAAe,KAAK,GAAG;;GAI7E,MAAM,YAAY,MAAMC,eAAM,KAAK;IACjC,SAAS;IACT,aAAa;IACb,cAAc;IACd,WAAW,UAAU;AACnB,SAAI,CAAC,MAAO,QAAO;;IAEtB,CAAC;AAEF,OAAIA,eAAM,SAAS,UAAU,EAAE;AAC7B,mBAAM,OAAO,uBAAuB;AACpC,yBAAQ,KAAK,EAAE;;GAIjB,MAAM,aAAa,MAAMA,eAAM,KAAK;IAClC,SAAS;IACT,aAAa;IACb,cAAc;IACd,WAAW,UAAU;AACnB,SAAI,CAAC,MAAO,QAAO;;IAEtB,CAAC;AAEF,OAAIA,eAAM,SAAS,WAAW,EAAE;AAC9B,mBAAM,OAAO,uBAAuB;AACpC,yBAAQ,KAAK,EAAE;;GAIjB,MAAM,uBAAuB,MAAMA,eAAM,YAAY;IACnD,SAAS;IACT,SAAS,QAAQ,KAAK,YAAY;KAChC,OAAO,OAAO;KACd,OAAO,OAAO;KACd,MAAM,OAAO;KACd,EAAE;IACH,eAAe,CAAC,cAAc,YAAY;IAC1C,UAAU;IACX,CAAC;AAEF,OAAIA,eAAM,SAAS,qBAAqB,EAAE;AACxC,mBAAM,OAAO,uBAAuB;AACpC,yBAAQ,KAAK,EAAE;;GAGjB,MAAM,kBAAkB,QAAQ,QAAQ,WAAY,qBAAkC,SAAS,OAAO,MAAM,CAAC;AAG7G,OAAI,CAAC,gBAAgB,MAAM,MAAM,EAAE,UAAU,aAAa,CACxD,iBAAgB,QAAQ,QAAQ,MAAM,MAAM,EAAE,UAAU,aAAa,CAAE;GAIzE,MAAM,oBAAoB;IAAC;IAAc;IAAa;IAAe,GAAG,gBAAgB,KAAK,MAAM,EAAE,YAAY;IAAC;GAElH,MAAM,UAAUA,eAAM,SAAS;AAC/B,WAAQ,MAAM,cAAc,kBAAkB,OAAO,iBAAiB,eAAe,OAAO;AAE5F,OAAI;AACF,UAAM,gBAAgB,mBAAmB,gBAAgB,IAAI;AAC7D,YAAQ,KAAK,aAAa,kBAAkB,OAAO,WAAW;YACvD,OAAO;AACd,YAAQ,KAAK,sBAAsB;AACnC,UAAM;;GAIR,MAAM,gBAAgBA,eAAM,SAAS;AACrC,iBAAc,MAAM,0BAA0B;GAE9C,MAAM,gBAAgB,mBAAmB,iBAAiB,WAAqB,WAAqB;GACpG,MAAM,aAAaE,kBAAK,KAAK,KAAK,iBAAiB;AAGnD,OAAIC,gBAAG,WAAW,WAAW,EAAE;AAC7B,kBAAc,KAAK,gCAAgC;IAEnD,MAAM,kBAAkB,MAAMH,eAAM,QAAQ;KAC1C,SAAS;KACT,cAAc;KACf,CAAC;AAEF,QAAIA,eAAM,SAAS,gBAAgB,IAAI,CAAC,iBAAiB;AACvD,oBAAM,OAAO,gEAAgE;AAC7E,0BAAQ,KAAK,EAAE;;AAGjB,kBAAc,MAAM,6BAA6B;;AAGnD,mBAAG,cAAc,YAAY,eAAe,QAAQ;AAEpD,iBAAc,KAAK,yBAAyB;AAG5C,kBAAM,MACJD,mBAAG,MAAM,aAAa,GACpB,SACAA,mBAAG,IAAI,cAAc,GACrB,OACAA,mBAAG,KAAK,2CAA2C,YAAY,GAC/D,OACAA,mBAAG,KAAK,6CAA6C,GACrD,OACAA,mBAAG,KAAK,qDAAqD,GAC7D,OACAA,mBAAG,KAAK,iCAAiC,aAAa,GACtD,SACAA,mBAAG,IAAI,SAAS,eAAe,KAAK,WAAWK,0BAAU,CAC5D;WACM,OAAO;AACd,kBAAM,IAAI,MAAML,mBAAG,IAAI,0CAA0C,CAAC;AAClE,OAAI,iBAAiB,MACnB,gBAAM,IAAI,MAAM,MAAM,QAAQ;AAEhC,wBAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,mBAAe"}
@@ -1,6 +0,0 @@
1
- //#region package.json
2
- var version = "4.27.0";
3
-
4
- //#endregion
5
- export { version as t };
6
- //# sourceMappingURL=package-C3VLYHj-.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-C3VLYHj-.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-DcbrXbFT.cjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"start-D9LsCoNJ.js","names":["process","args"],"sources":["../src/commands/agent/start.ts"],"sourcesContent":["import path from 'node:path'\nimport * as process from 'node:process'\nimport { fileURLToPath } from 'node:url'\n\nimport * as clack from '@clack/prompts'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand } from 'citty'\nimport { config as loadEnv } from 'dotenv'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\n\ndeclare global {\n namespace NodeJS {\n interface ProcessEnv {\n PORT: string\n KUBB_ROOT: string\n KUBB_STUDIO_URL: string\n KUBB_AGENT_TOKEN: string\n KUBB_CONFIG: string\n KUBB_AGENT_NO_CACHE: string\n KUBB_RETRY_TIMEOUT: string\n KUBB_ALLOW_WRITE: string\n KUBB_ALLOW_ALL: string\n }\n }\n}\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n port: {\n type: 'string',\n description: 'Port for the server. If not specified, an available port is automatically selected.',\n alias: 'p',\n },\n host: {\n type: 'string',\n description: 'Host for the server',\n default: 'localhost',\n },\n 'no-cache': {\n type: 'boolean',\n description: 'Disable session caching',\n default: false,\n },\n 'allow-write': {\n type: 'boolean',\n description: 'Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.',\n default: false,\n },\n 'allow-all': {\n type: 'boolean',\n description: 'Grant all permissions (implies --allow-write).',\n default: false,\n },\n} as const satisfies ArgsDef\n\ntype StartServerProps = {\n port: number\n host: string\n configPath: string\n noCache: boolean\n allowWrite: boolean\n allowAll: boolean\n}\n\nasync function startServer({ port, host, configPath, noCache, allowWrite, allowAll }: StartServerProps): Promise<void> {\n try {\n // Load .env files into process.env (supports .env, .env.local, .env.*.local)\n loadEnv() // .env\n\n // Resolve the @kubb/agent package path\n const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')\n const agentPkgPath = fileURLToPath(agentPkgUrl)\n const agentDir = path.dirname(agentPkgPath)\n const serverPath = path.join(agentDir, '.output', 'server', 'index.mjs')\n\n // nitro env\n const PORT = process.env.PORT || (port === 0 ? '3000' : String(port))\n const HOST = process.env.HOST || host || '0.0.0.0'\n\n // kubb env\n const KUBB_ROOT = process.env.KUBB_ROOT || process.cwd()\n const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'\n const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'\n const KUBB_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_ALLOW_WRITE ?? 'false')\n const KUBB_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_ALLOW_ALL ?? 'false')\n const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'\n const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN\n const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'\n\n // Set environment variables\n const env = {\n KUBB_ROOT,\n KUBB_CONFIG,\n PORT,\n HOST,\n KUBB_STUDIO_URL,\n KUBB_RETRY_TIMEOUT,\n KUBB_AGENT_NO_CACHE,\n KUBB_AGENT_TOKEN,\n KUBB_ALLOW_WRITE,\n KUBB_ALLOW_ALL,\n }\n\n clack.log.step(pc.cyan('Starting agent server...'))\n clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))\n clack.log.info(pc.dim(`Host: ${HOST}`))\n clack.log.info(pc.dim(`Port: ${PORT}`))\n if (noCache) {\n clack.log.info(pc.dim('Session caching: disabled'))\n }\n if (!allowWrite && !allowAll) {\n clack.log.warn(pc.yellow('Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))\n }\n\n // Use execa to spawn the server process\n await execa('node', [serverPath], {\n env,\n stdio: 'inherit',\n cwd: process.cwd(),\n })\n } catch (error) {\n console.error('Failed to start agent server:', error)\n process.exit(1)\n }\n}\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Agent server',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n try {\n const configPath = path.resolve(process.cwd(), args.config || 'kubb.config.ts')\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const noCache = args['no-cache']\n const allowWrite = args['allow-write']\n const allowAll = args['allow-all']\n\n await startServer({ port, host, configPath, noCache, allowWrite, allowAll })\n } catch (error) {\n clack.log.error(pc.red('Failed to start agent server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;AA2BA,MAAM,OAAO;CACX,QAAQ;EACN,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,eAAe;EACb,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,aAAa;EACX,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACF;AAWD,eAAe,YAAY,EAAE,MAAM,MAAM,YAAY,SAAS,YAAY,YAA6C;AACrH,KAAI;AAEF,UAAS;EAIT,MAAM,eAAe,cADD,OAAO,KAAK,QAAQ,2BAA2B,CACpB;EAC/C,MAAM,WAAW,KAAK,QAAQ,aAAa;EAC3C,MAAM,aAAa,KAAK,KAAK,UAAU,WAAW,UAAU,YAAY;EAGxE,MAAM,OAAOA,UAAQ,IAAI,SAAS,SAAS,IAAI,SAAS,OAAO,KAAK;EACpE,MAAM,OAAOA,UAAQ,IAAI,QAAQ,QAAQ;EAGzC,MAAM,YAAYA,UAAQ,IAAI,aAAaA,UAAQ,KAAK;EACxD,MAAM,cAAcA,UAAQ,IAAI,eAAe,cAAc;EAC7D,MAAM,sBAAsB,UAAU,SAAS;EAC/C,MAAM,mBAAmB,YAAY,aAAa,SAAUA,UAAQ,IAAI,oBAAoB;EAC5F,MAAM,iBAAiB,WAAW,SAAUA,UAAQ,IAAI,kBAAkB;EAC1E,MAAM,kBAAkBA,UAAQ,IAAI,mBAAmB;EACvD,MAAM,mBAAmBA,UAAQ,IAAI;EAIrC,MAAM,MAAM;GACV;GACA;GACA;GACA;GACA;GACA,oBATyBA,UAAQ,IAAI,sBAAsB;GAU3D;GACA;GACA;GACA;GACD;AAED,QAAM,IAAI,KAAK,GAAG,KAAK,2BAA2B,CAAC;AACnD,QAAM,IAAI,KAAK,GAAG,IAAI,WAAW,cAAc,CAAC;AAChD,QAAM,IAAI,KAAK,GAAG,IAAI,SAAS,OAAO,CAAC;AACvC,QAAM,IAAI,KAAK,GAAG,IAAI,SAAS,OAAO,CAAC;AACvC,MAAI,QACF,OAAM,IAAI,KAAK,GAAG,IAAI,4BAA4B,CAAC;AAErD,MAAI,CAAC,cAAc,CAAC,SAClB,OAAM,IAAI,KAAK,GAAG,OAAO,0EAA0E,CAAC;AAItG,QAAM,MAAM,QAAQ,CAAC,WAAW,EAAE;GAChC;GACA,OAAO;GACP,KAAKA,UAAQ,KAAK;GACnB,CAAC;UACK,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,YAAQ,KAAK,EAAE;;;AAInB,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD;CACA,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,iBAAS;AAEjB,MAAI;GACF,MAAM,aAAa,KAAK,QAAQA,UAAQ,KAAK,EAAEC,OAAK,UAAU,iBAAiB;GAC/E,MAAM,OAAOA,OAAK,OAAO,OAAO,SAASA,OAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAOA,OAAK;GAClB,MAAM,UAAUA,OAAK;GACrB,MAAM,aAAaA,OAAK;GACxB,MAAM,WAAWA,OAAK;AAEtB,SAAM,YAAY;IAAE;IAAM;IAAM;IAAY;IAAS;IAAY;IAAU,CAAC;WACrE,OAAO;AACd,SAAM,IAAI,MAAM,GAAG,IAAI,+BAA+B,CAAC;AACvD,WAAQ,MAAM,MAAM;AACpB,aAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"start-Dp1iN5KU.cjs","names":["path","process","pc","args"],"sources":["../src/commands/agent/start.ts"],"sourcesContent":["import path from 'node:path'\nimport * as process from 'node:process'\nimport { fileURLToPath } from 'node:url'\n\nimport * as clack from '@clack/prompts'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand } from 'citty'\nimport { config as loadEnv } from 'dotenv'\nimport { execa } from 'execa'\nimport pc from 'picocolors'\n\ndeclare global {\n namespace NodeJS {\n interface ProcessEnv {\n PORT: string\n KUBB_ROOT: string\n KUBB_STUDIO_URL: string\n KUBB_AGENT_TOKEN: string\n KUBB_CONFIG: string\n KUBB_AGENT_NO_CACHE: string\n KUBB_RETRY_TIMEOUT: string\n KUBB_ALLOW_WRITE: string\n KUBB_ALLOW_ALL: string\n }\n }\n}\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n port: {\n type: 'string',\n description: 'Port for the server. If not specified, an available port is automatically selected.',\n alias: 'p',\n },\n host: {\n type: 'string',\n description: 'Host for the server',\n default: 'localhost',\n },\n 'no-cache': {\n type: 'boolean',\n description: 'Disable session caching',\n default: false,\n },\n 'allow-write': {\n type: 'boolean',\n description: 'Allow writing generated files to the filesystem. When not set, no files are written and the config patch is not persisted.',\n default: false,\n },\n 'allow-all': {\n type: 'boolean',\n description: 'Grant all permissions (implies --allow-write).',\n default: false,\n },\n} as const satisfies ArgsDef\n\ntype StartServerProps = {\n port: number\n host: string\n configPath: string\n noCache: boolean\n allowWrite: boolean\n allowAll: boolean\n}\n\nasync function startServer({ port, host, configPath, noCache, allowWrite, allowAll }: StartServerProps): Promise<void> {\n try {\n // Load .env files into process.env (supports .env, .env.local, .env.*.local)\n loadEnv() // .env\n\n // Resolve the @kubb/agent package path\n const agentPkgUrl = import.meta.resolve('@kubb/agent/package.json')\n const agentPkgPath = fileURLToPath(agentPkgUrl)\n const agentDir = path.dirname(agentPkgPath)\n const serverPath = path.join(agentDir, '.output', 'server', 'index.mjs')\n\n // nitro env\n const PORT = process.env.PORT || (port === 0 ? '3000' : String(port))\n const HOST = process.env.HOST || host || '0.0.0.0'\n\n // kubb env\n const KUBB_ROOT = process.env.KUBB_ROOT || process.cwd()\n const KUBB_CONFIG = process.env.KUBB_CONFIG || configPath || 'kubb.config.ts'\n const KUBB_AGENT_NO_CACHE = noCache ? 'true' : 'false'\n const KUBB_ALLOW_WRITE = allowAll || allowWrite ? 'true' : (process.env.KUBB_ALLOW_WRITE ?? 'false')\n const KUBB_ALLOW_ALL = allowAll ? 'true' : (process.env.KUBB_ALLOW_ALL ?? 'false')\n const KUBB_STUDIO_URL = process.env.KUBB_STUDIO_URL || 'https://studio.kubb.dev'\n const KUBB_AGENT_TOKEN = process.env.KUBB_AGENT_TOKEN\n const KUBB_RETRY_TIMEOUT = process.env.KUBB_RETRY_TIMEOUT || '30000'\n\n // Set environment variables\n const env = {\n KUBB_ROOT,\n KUBB_CONFIG,\n PORT,\n HOST,\n KUBB_STUDIO_URL,\n KUBB_RETRY_TIMEOUT,\n KUBB_AGENT_NO_CACHE,\n KUBB_AGENT_TOKEN,\n KUBB_ALLOW_WRITE,\n KUBB_ALLOW_ALL,\n }\n\n clack.log.step(pc.cyan('Starting agent server...'))\n clack.log.info(pc.dim(`Config: ${KUBB_CONFIG}`))\n clack.log.info(pc.dim(`Host: ${HOST}`))\n clack.log.info(pc.dim(`Port: ${PORT}`))\n if (noCache) {\n clack.log.info(pc.dim('Session caching: disabled'))\n }\n if (!allowWrite && !allowAll) {\n clack.log.warn(pc.yellow('Filesystem writes disabled. Use --allow-write or --allow-all to enable.'))\n }\n\n // Use execa to spawn the server process\n await execa('node', [serverPath], {\n env,\n stdio: 'inherit',\n cwd: process.cwd(),\n })\n } catch (error) {\n console.error('Failed to start agent server:', error)\n process.exit(1)\n }\n}\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: 'Start the Agent server',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n try {\n const configPath = path.resolve(process.cwd(), args.config || 'kubb.config.ts')\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const noCache = args['no-cache']\n const allowWrite = args['allow-write']\n const allowAll = args['allow-all']\n\n await startServer({ port, host, configPath, noCache, allowWrite, allowAll })\n } catch (error) {\n clack.log.error(pc.red('Failed to start agent server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;;;;;AA2BA,MAAM,OAAO;CACX,QAAQ;EACN,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACR;CACD,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,YAAY;EACV,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,eAAe;EACb,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACD,aAAa;EACX,MAAM;EACN,aAAa;EACb,SAAS;EACV;CACF;AAWD,eAAe,YAAY,EAAE,MAAM,MAAM,YAAY,SAAS,YAAY,YAA6C;AACrH,KAAI;AAEF,sBAAS;EAIT,MAAM,8CAD0B,QAAQ,2BAA2B,CACpB;EAC/C,MAAM,WAAWA,kBAAK,QAAQ,aAAa;EAC3C,MAAM,aAAaA,kBAAK,KAAK,UAAU,WAAW,UAAU,YAAY;EAGxE,MAAM,OAAOC,aAAQ,IAAI,SAAS,SAAS,IAAI,SAAS,OAAO,KAAK;EACpE,MAAM,OAAOA,aAAQ,IAAI,QAAQ,QAAQ;EAGzC,MAAM,YAAYA,aAAQ,IAAI,aAAaA,aAAQ,KAAK;EACxD,MAAM,cAAcA,aAAQ,IAAI,eAAe,cAAc;EAC7D,MAAM,sBAAsB,UAAU,SAAS;EAC/C,MAAM,mBAAmB,YAAY,aAAa,SAAUA,aAAQ,IAAI,oBAAoB;EAC5F,MAAM,iBAAiB,WAAW,SAAUA,aAAQ,IAAI,kBAAkB;EAC1E,MAAM,kBAAkBA,aAAQ,IAAI,mBAAmB;EACvD,MAAM,mBAAmBA,aAAQ,IAAI;EAIrC,MAAM,MAAM;GACV;GACA;GACA;GACA;GACA;GACA,oBATyBA,aAAQ,IAAI,sBAAsB;GAU3D;GACA;GACA;GACA;GACD;AAED,iBAAM,IAAI,KAAKC,mBAAG,KAAK,2BAA2B,CAAC;AACnD,iBAAM,IAAI,KAAKA,mBAAG,IAAI,WAAW,cAAc,CAAC;AAChD,iBAAM,IAAI,KAAKA,mBAAG,IAAI,SAAS,OAAO,CAAC;AACvC,iBAAM,IAAI,KAAKA,mBAAG,IAAI,SAAS,OAAO,CAAC;AACvC,MAAI,QACF,gBAAM,IAAI,KAAKA,mBAAG,IAAI,4BAA4B,CAAC;AAErD,MAAI,CAAC,cAAc,CAAC,SAClB,gBAAM,IAAI,KAAKA,mBAAG,OAAO,0EAA0E,CAAC;AAItG,yBAAY,QAAQ,CAAC,WAAW,EAAE;GAChC;GACA,OAAO;GACP,KAAKD,aAAQ,KAAK;GACnB,CAAC;UACK,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,eAAQ,KAAK,EAAE;;;AAInB,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD;CACA,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,iBAAS;AAEjB,MAAI;GACF,MAAM,aAAaD,kBAAK,QAAQC,aAAQ,KAAK,EAAEE,OAAK,UAAU,iBAAiB;GAC/E,MAAM,OAAOA,OAAK,OAAO,OAAO,SAASA,OAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAOA,OAAK;GAClB,MAAM,UAAUA,OAAK;GACrB,MAAM,aAAaA,OAAK;GACxB,MAAM,WAAWA,OAAK;AAEtB,SAAM,YAAY;IAAE;IAAM;IAAM;IAAY;IAAS;IAAY;IAAU,CAAC;WACrE,OAAO;AACd,kBAAM,IAAI,MAAMD,mBAAG,IAAI,+BAA+B,CAAC;AACvD,WAAQ,MAAM,MAAM;AACpB,gBAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}