@kubb/cli 4.22.0 → 4.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{generate-Bjj-OR20.js → generate-Bgpw_dcv.js} +6 -649
- package/dist/generate-Bgpw_dcv.js.map +1 -0
- package/dist/{generate-BJyvkuLI.cjs → generate-BxSL_NKj.cjs} +10 -653
- package/dist/generate-BxSL_NKj.cjs.map +1 -0
- package/dist/getCosmiConfig-Co29x0Wv.cjs +458 -0
- package/dist/getCosmiConfig-Co29x0Wv.cjs.map +1 -0
- package/dist/getCosmiConfig-y2n_oW_y.js +438 -0
- package/dist/getCosmiConfig-y2n_oW_y.js.map +1 -0
- package/dist/index.cjs +9 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/{init-D37jPiGV.js → init-CfRtJpHs.js} +3 -3
- package/dist/{init-D37jPiGV.js.map → init-CfRtJpHs.js.map} +1 -1
- package/dist/{init-CxLDdq2k.cjs → init-DZzYaf0D.cjs} +3 -3
- package/dist/{init-CxLDdq2k.cjs.map → init-DZzYaf0D.cjs.map} +1 -1
- package/dist/{mcp-By2JUPa8.js → mcp-BdwwUv36.js} +1 -1
- package/dist/{mcp-By2JUPa8.js.map → mcp-BdwwUv36.js.map} +1 -1
- package/dist/{mcp-l-_Z-WU6.cjs → mcp-Hy_PYnFp.cjs} +1 -1
- package/dist/{mcp-l-_Z-WU6.cjs.map → mcp-Hy_PYnFp.cjs.map} +1 -1
- package/dist/package-BQu01PU2.js +6 -0
- package/dist/package-BQu01PU2.js.map +1 -0
- package/dist/{package-Cnl_fuIC.cjs → package-Cmbk_MZB.cjs} +2 -2
- package/dist/package-Cmbk_MZB.cjs.map +1 -0
- package/dist/start-Dtqs_9NV.js +125 -0
- package/dist/start-Dtqs_9NV.js.map +1 -0
- package/dist/start-iXbqdw8g.cjs +128 -0
- package/dist/start-iXbqdw8g.cjs.map +1 -0
- package/dist/{validate-DkHCd-Tl.cjs → validate-Cvb5aOEb.cjs} +1 -1
- package/dist/{validate-DkHCd-Tl.cjs.map → validate-Cvb5aOEb.cjs.map} +1 -1
- package/dist/{validate-0Qu8SxVA.js → validate-YI4YkVTl.js} +1 -1
- package/dist/{validate-0Qu8SxVA.js.map → validate-YI4YkVTl.js.map} +1 -1
- package/package.json +4 -4
- package/src/commands/generate.ts +0 -38
- package/src/commands/init.ts +3 -1
- package/src/commands/start.ts +149 -0
- package/src/index.ts +2 -1
- package/dist/generate-BJyvkuLI.cjs.map +0 -1
- package/dist/generate-Bjj-OR20.js.map +0 -1
- package/dist/package-Cnl_fuIC.cjs.map +0 -1
- package/dist/package-Qh9BQXK6.js +0 -6
- package/dist/package-Qh9BQXK6.js.map +0 -1
- package/src/loggers/streamLogger.ts +0 -93
- package/src/utils/streamServer.ts +0 -163
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __name } from "./chunk-jHaXqnEa.js";
|
|
2
|
-
import { t as version } from "./package-
|
|
2
|
+
import { t as version } from "./package-BQu01PU2.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import process$1 from "node:process";
|
|
@@ -286,7 +286,7 @@ const command = defineCommand({
|
|
|
286
286
|
}
|
|
287
287
|
fs.writeFileSync(configPath, configContent, "utf-8");
|
|
288
288
|
configSpinner.stop("Created kubb.config.ts");
|
|
289
|
-
clack.outro(pc.green("✓ All set!") + "\n\n" + pc.dim("Next steps:") + "\n" + pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + pc.cyan(" 2.
|
|
289
|
+
clack.outro(pc.green("✓ All set!") + "\n\n" + pc.dim("Next steps:") + "\n" + pc.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + pc.cyan(" 2. Generate code with: npx kubb generate") + "\n" + pc.cyan(" Or start a stream server with: npx kubb start") + "\n" + pc.cyan(` 3. Find generated files in: ${outputPath}`) + "\n\n" + pc.dim(`Using ${packageManager.name} • Kubb v${version}`));
|
|
290
290
|
} catch (error) {
|
|
291
291
|
clack.log.error(pc.red("An error occurred during initialization"));
|
|
292
292
|
if (error instanceof Error) clack.log.error(error.message);
|
|
@@ -298,4 +298,4 @@ var init_default = command;
|
|
|
298
298
|
|
|
299
299
|
//#endregion
|
|
300
300
|
export { init_default as default };
|
|
301
|
-
//# sourceMappingURL=init-
|
|
301
|
+
//# sourceMappingURL=init-CfRtJpHs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-D37jPiGV.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', ...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. Run: npx kubb generate') +\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
|
+
{"version":3,"file":"init-CfRtJpHs.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', ...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,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-C1_xRkKa.cjs');
|
|
2
|
-
const require_package = require('./package-
|
|
2
|
+
const require_package = require('./package-Cmbk_MZB.cjs');
|
|
3
3
|
let citty = require("citty");
|
|
4
4
|
let node_path = require("node:path");
|
|
5
5
|
node_path = require_chunk.__toESM(node_path);
|
|
@@ -291,7 +291,7 @@ const command = (0, citty.defineCommand)({
|
|
|
291
291
|
}
|
|
292
292
|
node_fs.default.writeFileSync(configPath, configContent, "utf-8");
|
|
293
293
|
configSpinner.stop("Created kubb.config.ts");
|
|
294
|
-
_clack_prompts.outro(picocolors.default.green("✓ All set!") + "\n\n" + picocolors.default.dim("Next steps:") + "\n" + picocolors.default.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + picocolors.default.cyan(" 2.
|
|
294
|
+
_clack_prompts.outro(picocolors.default.green("✓ All set!") + "\n\n" + picocolors.default.dim("Next steps:") + "\n" + picocolors.default.cyan(` 1. Make sure your OpenAPI spec is at: ${inputPath}`) + "\n" + picocolors.default.cyan(" 2. Generate code with: npx kubb generate") + "\n" + picocolors.default.cyan(" Or start a stream server with: npx kubb start") + "\n" + picocolors.default.cyan(` 3. Find generated files in: ${outputPath}`) + "\n\n" + picocolors.default.dim(`Using ${packageManager.name} • Kubb v${require_package.version}`));
|
|
295
295
|
} catch (error) {
|
|
296
296
|
_clack_prompts.log.error(picocolors.default.red("An error occurred during initialization"));
|
|
297
297
|
if (error instanceof Error) _clack_prompts.log.error(error.message);
|
|
@@ -303,4 +303,4 @@ var init_default = command;
|
|
|
303
303
|
|
|
304
304
|
//#endregion
|
|
305
305
|
exports.default = init_default;
|
|
306
|
-
//# sourceMappingURL=init-
|
|
306
|
+
//# sourceMappingURL=init-DZzYaf0D.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-CxLDdq2k.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', ...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. Run: npx kubb generate') +\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
|
+
{"version":3,"file":"init-DZzYaf0D.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', ...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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-
|
|
1
|
+
{"version":3,"file":"mcp-BdwwUv36.js","names":[],"sources":["../src/commands/mcp.ts"],"sourcesContent":["import type { ArgsDef } from 'citty'\nimport { defineCommand, showUsage } from 'citty'\nimport { createJiti } from 'jiti'\nimport pc from 'picocolors'\n\nconst jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n\nconst args = {\n help: {\n type: 'boolean',\n description: 'Show help',\n alias: 'h',\n default: false,\n },\n} as const satisfies ArgsDef\n\nconst command = defineCommand({\n meta: {\n name: 'mcp',\n description: 'Start the server to enable the MCP client to interact with the LLM.',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n if (args.help) {\n return showUsage(command)\n }\n\n let mod: any\n try {\n mod = await jiti.import('@kubb/mcp', { default: true })\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 try {\n console.log('⏳ Starting MCP server...')\n console.warn(pc.yellow('This feature is still under development — use with caution'))\n await run()\n } catch (error) {\n console.error((error as Error)?.message)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;AAKA,MAAM,OAAO,WAAW,OAAO,KAAK,KAAK,EACvC,YAAY,MACb,CAAC;AAWF,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAdW,EACX,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,SAAS;EACV,EACF;CAQC,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,SAAS;AAEjB,MAAI,KAAK,KACP,QAAO,UAAU,QAAQ;EAG3B,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,KAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;WAChD,IAAI;AACX,WAAQ,MAAM,4DAA4D;AAC1E,WAAQ,KAAK,EAAE;;EAGjB,MAAM,EAAE,QAAQ;AAChB,MAAI;AACF,WAAQ,IAAI,2BAA2B;AACvC,WAAQ,KAAK,GAAG,OAAO,6DAA6D,CAAC;AACrF,SAAM,KAAK;WACJ,OAAO;AACd,WAAQ,MAAO,OAAiB,QAAQ;;;CAG7C,CAAC;AAEF,kBAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-
|
|
1
|
+
{"version":3,"file":"mcp-Hy_PYnFp.cjs","names":["jiti","pc"],"sources":["../src/commands/mcp.ts"],"sourcesContent":["import type { ArgsDef } from 'citty'\nimport { defineCommand, showUsage } from 'citty'\nimport { createJiti } from 'jiti'\nimport pc from 'picocolors'\n\nconst jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n\nconst args = {\n help: {\n type: 'boolean',\n description: 'Show help',\n alias: 'h',\n default: false,\n },\n} as const satisfies ArgsDef\n\nconst command = defineCommand({\n meta: {\n name: 'mcp',\n description: 'Start the server to enable the MCP client to interact with the LLM.',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n if (args.help) {\n return showUsage(command)\n }\n\n let mod: any\n try {\n mod = await jiti.import('@kubb/mcp', { default: true })\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 try {\n console.log('⏳ Starting MCP server...')\n console.warn(pc.yellow('This feature is still under development — use with caution'))\n await run()\n } catch (error) {\n console.error((error as Error)?.message)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;AAKA,MAAMA,6EAAmC,EACvC,YAAY,MACb,CAAC;AAWF,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAdW,EACX,MAAM;EACJ,MAAM;EACN,aAAa;EACb,OAAO;EACP,SAAS;EACV,EACF;CAQC,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,SAAS;AAEjB,MAAI,KAAK,KACP,6BAAiB,QAAQ;EAG3B,IAAI;AACJ,MAAI;AACF,SAAM,MAAMA,OAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;WAChD,IAAI;AACX,WAAQ,MAAM,4DAA4D;AAC1E,WAAQ,KAAK,EAAE;;EAGjB,MAAM,EAAE,QAAQ;AAChB,MAAI;AACF,WAAQ,IAAI,2BAA2B;AACvC,WAAQ,KAAKC,mBAAG,OAAO,6DAA6D,CAAC;AACrF,SAAM,KAAK;WACJ,OAAO;AACd,WAAQ,MAAO,OAAiB,QAAQ;;;CAG7C,CAAC;AAEF,kBAAe"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-BQu01PU2.js","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
//#region package.json
|
|
3
|
-
var version = "4.22.
|
|
3
|
+
var version = "4.22.1";
|
|
4
4
|
|
|
5
5
|
//#endregion
|
|
6
6
|
Object.defineProperty(exports, 'version', {
|
|
@@ -9,4 +9,4 @@ Object.defineProperty(exports, 'version', {
|
|
|
9
9
|
return version;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
-
//# sourceMappingURL=package-
|
|
12
|
+
//# sourceMappingURL=package-Cmbk_MZB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-Cmbk_MZB.cjs","names":[],"sources":["../package.json"],"sourcesContent":[""],"mappings":""}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { t as __name } from "./chunk-jHaXqnEa.js";
|
|
2
|
+
import { t as version } from "./package-BQu01PU2.js";
|
|
3
|
+
import { n as getConfigs, r as generate, t as getCosmiConfig } from "./getCosmiConfig-y2n_oW_y.js";
|
|
4
|
+
import { defineCommand, showUsage } from "citty";
|
|
5
|
+
import * as process$1 from "node:process";
|
|
6
|
+
import * as clack from "@clack/prompts";
|
|
7
|
+
import { LogLevel, startServer } from "@kubb/core";
|
|
8
|
+
import { AsyncEventEmitter } from "@kubb/core/utils";
|
|
9
|
+
import pc from "picocolors";
|
|
10
|
+
|
|
11
|
+
//#region src/commands/start.ts
|
|
12
|
+
const command = defineCommand({
|
|
13
|
+
meta: {
|
|
14
|
+
name: "start",
|
|
15
|
+
description: "[input] Start HTTP server with SSE streaming based on a 'kubb.config.ts' file"
|
|
16
|
+
},
|
|
17
|
+
args: {
|
|
18
|
+
config: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Path to the Kubb config",
|
|
21
|
+
alias: "c"
|
|
22
|
+
},
|
|
23
|
+
logLevel: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Info, silent, verbose or debug",
|
|
26
|
+
alias: "l",
|
|
27
|
+
default: "info",
|
|
28
|
+
valueHint: "silent|info|verbose|debug"
|
|
29
|
+
},
|
|
30
|
+
debug: {
|
|
31
|
+
type: "boolean",
|
|
32
|
+
description: "Override logLevel to debug",
|
|
33
|
+
alias: "d",
|
|
34
|
+
default: false
|
|
35
|
+
},
|
|
36
|
+
verbose: {
|
|
37
|
+
type: "boolean",
|
|
38
|
+
description: "Override logLevel to verbose",
|
|
39
|
+
alias: "v",
|
|
40
|
+
default: false
|
|
41
|
+
},
|
|
42
|
+
silent: {
|
|
43
|
+
type: "boolean",
|
|
44
|
+
description: "Override logLevel to silent",
|
|
45
|
+
alias: "s",
|
|
46
|
+
default: false
|
|
47
|
+
},
|
|
48
|
+
port: {
|
|
49
|
+
type: "string",
|
|
50
|
+
description: "Port for the server. If not specified, an available port is automatically selected.",
|
|
51
|
+
alias: "p"
|
|
52
|
+
},
|
|
53
|
+
host: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Host for the server",
|
|
56
|
+
default: "localhost"
|
|
57
|
+
},
|
|
58
|
+
help: {
|
|
59
|
+
type: "boolean",
|
|
60
|
+
description: "Show help",
|
|
61
|
+
alias: "h",
|
|
62
|
+
default: false
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
async run(commandContext) {
|
|
66
|
+
const { args } = commandContext;
|
|
67
|
+
const input = args._[0];
|
|
68
|
+
if (args.help) return showUsage(command);
|
|
69
|
+
if (args.debug) args.logLevel = "debug";
|
|
70
|
+
if (args.verbose) args.logLevel = "verbose";
|
|
71
|
+
if (args.silent) args.logLevel = "silent";
|
|
72
|
+
try {
|
|
73
|
+
const result = await getCosmiConfig("kubb", args.config);
|
|
74
|
+
const configs = await getConfigs(result, {
|
|
75
|
+
...args,
|
|
76
|
+
watch: false
|
|
77
|
+
});
|
|
78
|
+
if (configs.length > 1) clack.log.warn(pc.yellow("Stream mode only supports a single configuration. Only the first config will be used."));
|
|
79
|
+
const port = args.port ? Number.parseInt(args.port, 10) : 0;
|
|
80
|
+
const host = args.host;
|
|
81
|
+
const config = configs[0];
|
|
82
|
+
const logLevel = LogLevel[args.logLevel] || 3;
|
|
83
|
+
const events = new AsyncEventEmitter();
|
|
84
|
+
events.on("server:start", (serverUrl, configPath) => {
|
|
85
|
+
clack.log.success(pc.green(`Stream server started on ${pc.bold(serverUrl)}`));
|
|
86
|
+
clack.log.info(pc.dim(`Config: ${configPath}`));
|
|
87
|
+
clack.log.info(pc.dim(`Connect: ${serverUrl}/api/info`));
|
|
88
|
+
clack.log.info(pc.dim(`Generate: ${serverUrl}/api/generate`));
|
|
89
|
+
clack.log.info(pc.dim(`Health: ${serverUrl}/api/health`));
|
|
90
|
+
clack.log.step(pc.yellow("Waiting for requests... (Press Ctrl+C to stop)"));
|
|
91
|
+
});
|
|
92
|
+
events.on("server:shutdown", () => {
|
|
93
|
+
clack.log.info("Shutting down stream server...");
|
|
94
|
+
});
|
|
95
|
+
events.on("server:stopped", () => {
|
|
96
|
+
clack.log.success("Server stopped");
|
|
97
|
+
});
|
|
98
|
+
await startServer({
|
|
99
|
+
port,
|
|
100
|
+
host,
|
|
101
|
+
configPath: result.filepath,
|
|
102
|
+
config,
|
|
103
|
+
version,
|
|
104
|
+
events,
|
|
105
|
+
onGenerate: async () => {
|
|
106
|
+
await generate({
|
|
107
|
+
input,
|
|
108
|
+
config,
|
|
109
|
+
logLevel,
|
|
110
|
+
events
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
} catch (error) {
|
|
115
|
+
clack.log.error(pc.red("Failed to start stream server"));
|
|
116
|
+
console.error(error);
|
|
117
|
+
process$1.exit(1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
var start_default = command;
|
|
122
|
+
|
|
123
|
+
//#endregion
|
|
124
|
+
export { start_default as default };
|
|
125
|
+
//# sourceMappingURL=start-Dtqs_9NV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-Dtqs_9NV.js","names":[],"sources":["../src/commands/start.ts"],"sourcesContent":["import * as process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { LogLevel, type ServerEvents, startServer } from '@kubb/core'\nimport { AsyncEventEmitter } from '@kubb/core/utils'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand, showUsage } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { generate } from '../runners/generate.ts'\nimport { getConfigs } from '../utils/getConfigs.ts'\nimport { getCosmiConfig } from '../utils/getCosmiConfig.ts'\nimport type { Args as GenerateArgs } from './generate.ts'\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n logLevel: {\n type: 'string',\n description: 'Info, silent, verbose or debug',\n alias: 'l',\n default: 'info',\n valueHint: 'silent|info|verbose|debug',\n },\n debug: {\n type: 'boolean',\n description: 'Override logLevel to debug',\n alias: 'd',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Override logLevel to verbose',\n alias: 'v',\n default: false,\n },\n silent: {\n type: 'boolean',\n description: 'Override logLevel to silent',\n alias: 's',\n default: false,\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 help: {\n type: 'boolean',\n description: 'Show help',\n alias: 'h',\n default: false,\n },\n} as const satisfies ArgsDef\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: \"[input] Start HTTP server with SSE streaming based on a 'kubb.config.ts' file\",\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n const input = args._[0]\n\n if (args.help) {\n return showUsage(command)\n }\n\n if (args.debug) {\n args.logLevel = 'debug'\n }\n\n if (args.verbose) {\n args.logLevel = 'verbose'\n }\n\n if (args.silent) {\n args.logLevel = 'silent'\n }\n\n try {\n const result = await getCosmiConfig('kubb', args.config)\n // Create args compatible with getConfigs/startStreamServer (needs watch property)\n const generateArgs = { ...args, watch: false } as unknown as GenerateArgs\n const configs = await getConfigs(result, generateArgs)\n\n if (configs.length > 1) {\n clack.log.warn(pc.yellow('Stream mode only supports a single configuration. Only the first config will be used.'))\n }\n\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const config = configs[0]!\n const logLevel = LogLevel[args.logLevel as keyof typeof LogLevel] || 3\n\n const events = new AsyncEventEmitter<ServerEvents>()\n\n events.on('server:start', (serverUrl: string, configPath: string) => {\n clack.log.success(pc.green(`Stream server started on ${pc.bold(serverUrl)}`))\n clack.log.info(pc.dim(`Config: ${configPath}`))\n clack.log.info(pc.dim(`Connect: ${serverUrl}/api/info`))\n clack.log.info(pc.dim(`Generate: ${serverUrl}/api/generate`))\n clack.log.info(pc.dim(`Health: ${serverUrl}/api/health`))\n clack.log.step(pc.yellow('Waiting for requests... (Press Ctrl+C to stop)'))\n })\n\n events.on('server:shutdown', () => {\n clack.log.info('Shutting down stream server...')\n })\n\n events.on('server:stopped', () => {\n clack.log.success('Server stopped')\n })\n\n await startServer({\n port,\n host,\n configPath: result.filepath,\n config,\n version,\n events,\n onGenerate: async () => {\n await generate({\n input,\n config,\n logLevel,\n events,\n })\n },\n })\n\n // Server is running, don't exit\n } catch (error) {\n clack.log.error(pc.red('Failed to start stream server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;AA8DA,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAtDW;EACX,QAAQ;GACN,MAAM;GACN,aAAa;GACb,OAAO;GACR;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,WAAW;GACZ;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,SAAS;GACP,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,QAAQ;GACN,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,OAAO;GACR;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,SAAS;GACV;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACF;CAQC,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK,EAAE;AAErB,MAAI,KAAK,KACP,QAAO,UAAU,QAAQ;AAG3B,MAAI,KAAK,MACP,MAAK,WAAW;AAGlB,MAAI,KAAK,QACP,MAAK,WAAW;AAGlB,MAAI,KAAK,OACP,MAAK,WAAW;AAGlB,MAAI;GACF,MAAM,SAAS,MAAM,eAAe,QAAQ,KAAK,OAAO;GAGxD,MAAM,UAAU,MAAM,WAAW,QADZ;IAAE,GAAG;IAAM,OAAO;IAAO,CACQ;AAEtD,OAAI,QAAQ,SAAS,EACnB,OAAM,IAAI,KAAK,GAAG,OAAO,wFAAwF,CAAC;GAGpH,MAAM,OAAO,KAAK,OAAO,OAAO,SAAS,KAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAO,KAAK;GAClB,MAAM,SAAS,QAAQ;GACvB,MAAM,WAAW,SAAS,KAAK,aAAsC;GAErE,MAAM,SAAS,IAAI,mBAAiC;AAEpD,UAAO,GAAG,iBAAiB,WAAmB,eAAuB;AACnE,UAAM,IAAI,QAAQ,GAAG,MAAM,4BAA4B,GAAG,KAAK,UAAU,GAAG,CAAC;AAC7E,UAAM,IAAI,KAAK,GAAG,IAAI,WAAW,aAAa,CAAC;AAC/C,UAAM,IAAI,KAAK,GAAG,IAAI,YAAY,UAAU,WAAW,CAAC;AACxD,UAAM,IAAI,KAAK,GAAG,IAAI,aAAa,UAAU,eAAe,CAAC;AAC7D,UAAM,IAAI,KAAK,GAAG,IAAI,WAAW,UAAU,aAAa,CAAC;AACzD,UAAM,IAAI,KAAK,GAAG,OAAO,iDAAiD,CAAC;KAC3E;AAEF,UAAO,GAAG,yBAAyB;AACjC,UAAM,IAAI,KAAK,iCAAiC;KAChD;AAEF,UAAO,GAAG,wBAAwB;AAChC,UAAM,IAAI,QAAQ,iBAAiB;KACnC;AAEF,SAAM,YAAY;IAChB;IACA;IACA,YAAY,OAAO;IACnB;IACA;IACA;IACA,YAAY,YAAY;AACtB,WAAM,SAAS;MACb;MACA;MACA;MACA;MACD,CAAC;;IAEL,CAAC;WAGK,OAAO;AACd,SAAM,IAAI,MAAM,GAAG,IAAI,gCAAgC,CAAC;AACxD,WAAQ,MAAM,MAAM;AACpB,aAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const require_chunk = require('./chunk-C1_xRkKa.cjs');
|
|
2
|
+
const require_package = require('./package-Cmbk_MZB.cjs');
|
|
3
|
+
const require_getCosmiConfig = require('./getCosmiConfig-Co29x0Wv.cjs');
|
|
4
|
+
let citty = require("citty");
|
|
5
|
+
let node_process = require("node:process");
|
|
6
|
+
node_process = require_chunk.__toESM(node_process);
|
|
7
|
+
let _clack_prompts = require("@clack/prompts");
|
|
8
|
+
_clack_prompts = require_chunk.__toESM(_clack_prompts);
|
|
9
|
+
let _kubb_core = require("@kubb/core");
|
|
10
|
+
let _kubb_core_utils = require("@kubb/core/utils");
|
|
11
|
+
let picocolors = require("picocolors");
|
|
12
|
+
picocolors = require_chunk.__toESM(picocolors);
|
|
13
|
+
|
|
14
|
+
//#region src/commands/start.ts
|
|
15
|
+
const command = (0, citty.defineCommand)({
|
|
16
|
+
meta: {
|
|
17
|
+
name: "start",
|
|
18
|
+
description: "[input] Start HTTP server with SSE streaming based on a 'kubb.config.ts' file"
|
|
19
|
+
},
|
|
20
|
+
args: {
|
|
21
|
+
config: {
|
|
22
|
+
type: "string",
|
|
23
|
+
description: "Path to the Kubb config",
|
|
24
|
+
alias: "c"
|
|
25
|
+
},
|
|
26
|
+
logLevel: {
|
|
27
|
+
type: "string",
|
|
28
|
+
description: "Info, silent, verbose or debug",
|
|
29
|
+
alias: "l",
|
|
30
|
+
default: "info",
|
|
31
|
+
valueHint: "silent|info|verbose|debug"
|
|
32
|
+
},
|
|
33
|
+
debug: {
|
|
34
|
+
type: "boolean",
|
|
35
|
+
description: "Override logLevel to debug",
|
|
36
|
+
alias: "d",
|
|
37
|
+
default: false
|
|
38
|
+
},
|
|
39
|
+
verbose: {
|
|
40
|
+
type: "boolean",
|
|
41
|
+
description: "Override logLevel to verbose",
|
|
42
|
+
alias: "v",
|
|
43
|
+
default: false
|
|
44
|
+
},
|
|
45
|
+
silent: {
|
|
46
|
+
type: "boolean",
|
|
47
|
+
description: "Override logLevel to silent",
|
|
48
|
+
alias: "s",
|
|
49
|
+
default: false
|
|
50
|
+
},
|
|
51
|
+
port: {
|
|
52
|
+
type: "string",
|
|
53
|
+
description: "Port for the server. If not specified, an available port is automatically selected.",
|
|
54
|
+
alias: "p"
|
|
55
|
+
},
|
|
56
|
+
host: {
|
|
57
|
+
type: "string",
|
|
58
|
+
description: "Host for the server",
|
|
59
|
+
default: "localhost"
|
|
60
|
+
},
|
|
61
|
+
help: {
|
|
62
|
+
type: "boolean",
|
|
63
|
+
description: "Show help",
|
|
64
|
+
alias: "h",
|
|
65
|
+
default: false
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
async run(commandContext) {
|
|
69
|
+
const { args } = commandContext;
|
|
70
|
+
const input = args._[0];
|
|
71
|
+
if (args.help) return (0, citty.showUsage)(command);
|
|
72
|
+
if (args.debug) args.logLevel = "debug";
|
|
73
|
+
if (args.verbose) args.logLevel = "verbose";
|
|
74
|
+
if (args.silent) args.logLevel = "silent";
|
|
75
|
+
try {
|
|
76
|
+
const result = await require_getCosmiConfig.getCosmiConfig("kubb", args.config);
|
|
77
|
+
const configs = await require_getCosmiConfig.getConfigs(result, {
|
|
78
|
+
...args,
|
|
79
|
+
watch: false
|
|
80
|
+
});
|
|
81
|
+
if (configs.length > 1) _clack_prompts.log.warn(picocolors.default.yellow("Stream mode only supports a single configuration. Only the first config will be used."));
|
|
82
|
+
const port = args.port ? Number.parseInt(args.port, 10) : 0;
|
|
83
|
+
const host = args.host;
|
|
84
|
+
const config = configs[0];
|
|
85
|
+
const logLevel = _kubb_core.LogLevel[args.logLevel] || 3;
|
|
86
|
+
const events = new _kubb_core_utils.AsyncEventEmitter();
|
|
87
|
+
events.on("server:start", (serverUrl, configPath) => {
|
|
88
|
+
_clack_prompts.log.success(picocolors.default.green(`Stream server started on ${picocolors.default.bold(serverUrl)}`));
|
|
89
|
+
_clack_prompts.log.info(picocolors.default.dim(`Config: ${configPath}`));
|
|
90
|
+
_clack_prompts.log.info(picocolors.default.dim(`Connect: ${serverUrl}/api/info`));
|
|
91
|
+
_clack_prompts.log.info(picocolors.default.dim(`Generate: ${serverUrl}/api/generate`));
|
|
92
|
+
_clack_prompts.log.info(picocolors.default.dim(`Health: ${serverUrl}/api/health`));
|
|
93
|
+
_clack_prompts.log.step(picocolors.default.yellow("Waiting for requests... (Press Ctrl+C to stop)"));
|
|
94
|
+
});
|
|
95
|
+
events.on("server:shutdown", () => {
|
|
96
|
+
_clack_prompts.log.info("Shutting down stream server...");
|
|
97
|
+
});
|
|
98
|
+
events.on("server:stopped", () => {
|
|
99
|
+
_clack_prompts.log.success("Server stopped");
|
|
100
|
+
});
|
|
101
|
+
await (0, _kubb_core.startServer)({
|
|
102
|
+
port,
|
|
103
|
+
host,
|
|
104
|
+
configPath: result.filepath,
|
|
105
|
+
config,
|
|
106
|
+
version: require_package.version,
|
|
107
|
+
events,
|
|
108
|
+
onGenerate: async () => {
|
|
109
|
+
await require_getCosmiConfig.generate({
|
|
110
|
+
input,
|
|
111
|
+
config,
|
|
112
|
+
logLevel,
|
|
113
|
+
events
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
} catch (error) {
|
|
118
|
+
_clack_prompts.log.error(picocolors.default.red("Failed to start stream server"));
|
|
119
|
+
console.error(error);
|
|
120
|
+
node_process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
var start_default = command;
|
|
125
|
+
|
|
126
|
+
//#endregion
|
|
127
|
+
exports.default = start_default;
|
|
128
|
+
//# sourceMappingURL=start-iXbqdw8g.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-iXbqdw8g.cjs","names":["getCosmiConfig","getConfigs","pc","LogLevel","AsyncEventEmitter","generate"],"sources":["../src/commands/start.ts"],"sourcesContent":["import * as process from 'node:process'\nimport * as clack from '@clack/prompts'\nimport { LogLevel, type ServerEvents, startServer } from '@kubb/core'\nimport { AsyncEventEmitter } from '@kubb/core/utils'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand, showUsage } from 'citty'\nimport pc from 'picocolors'\nimport { version } from '../../package.json'\nimport { generate } from '../runners/generate.ts'\nimport { getConfigs } from '../utils/getConfigs.ts'\nimport { getCosmiConfig } from '../utils/getCosmiConfig.ts'\nimport type { Args as GenerateArgs } from './generate.ts'\n\nconst args = {\n config: {\n type: 'string',\n description: 'Path to the Kubb config',\n alias: 'c',\n },\n logLevel: {\n type: 'string',\n description: 'Info, silent, verbose or debug',\n alias: 'l',\n default: 'info',\n valueHint: 'silent|info|verbose|debug',\n },\n debug: {\n type: 'boolean',\n description: 'Override logLevel to debug',\n alias: 'd',\n default: false,\n },\n verbose: {\n type: 'boolean',\n description: 'Override logLevel to verbose',\n alias: 'v',\n default: false,\n },\n silent: {\n type: 'boolean',\n description: 'Override logLevel to silent',\n alias: 's',\n default: false,\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 help: {\n type: 'boolean',\n description: 'Show help',\n alias: 'h',\n default: false,\n },\n} as const satisfies ArgsDef\n\nconst command = defineCommand({\n meta: {\n name: 'start',\n description: \"[input] Start HTTP server with SSE streaming based on a 'kubb.config.ts' file\",\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n const input = args._[0]\n\n if (args.help) {\n return showUsage(command)\n }\n\n if (args.debug) {\n args.logLevel = 'debug'\n }\n\n if (args.verbose) {\n args.logLevel = 'verbose'\n }\n\n if (args.silent) {\n args.logLevel = 'silent'\n }\n\n try {\n const result = await getCosmiConfig('kubb', args.config)\n // Create args compatible with getConfigs/startStreamServer (needs watch property)\n const generateArgs = { ...args, watch: false } as unknown as GenerateArgs\n const configs = await getConfigs(result, generateArgs)\n\n if (configs.length > 1) {\n clack.log.warn(pc.yellow('Stream mode only supports a single configuration. Only the first config will be used.'))\n }\n\n const port = args.port ? Number.parseInt(args.port, 10) : 0\n const host = args.host\n const config = configs[0]!\n const logLevel = LogLevel[args.logLevel as keyof typeof LogLevel] || 3\n\n const events = new AsyncEventEmitter<ServerEvents>()\n\n events.on('server:start', (serverUrl: string, configPath: string) => {\n clack.log.success(pc.green(`Stream server started on ${pc.bold(serverUrl)}`))\n clack.log.info(pc.dim(`Config: ${configPath}`))\n clack.log.info(pc.dim(`Connect: ${serverUrl}/api/info`))\n clack.log.info(pc.dim(`Generate: ${serverUrl}/api/generate`))\n clack.log.info(pc.dim(`Health: ${serverUrl}/api/health`))\n clack.log.step(pc.yellow('Waiting for requests... (Press Ctrl+C to stop)'))\n })\n\n events.on('server:shutdown', () => {\n clack.log.info('Shutting down stream server...')\n })\n\n events.on('server:stopped', () => {\n clack.log.success('Server stopped')\n })\n\n await startServer({\n port,\n host,\n configPath: result.filepath,\n config,\n version,\n events,\n onGenerate: async () => {\n await generate({\n input,\n config,\n logLevel,\n events,\n })\n },\n })\n\n // Server is running, don't exit\n } catch (error) {\n clack.log.error(pc.red('Failed to start stream server'))\n console.error(error)\n process.exit(1)\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;;;;;;;;AA8DA,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAtDW;EACX,QAAQ;GACN,MAAM;GACN,aAAa;GACb,OAAO;GACR;EACD,UAAU;GACR,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACT,WAAW;GACZ;EACD,OAAO;GACL,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,SAAS;GACP,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,QAAQ;GACN,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,OAAO;GACR;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,SAAS;GACV;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACF;CAQC,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,SAAS;EACjB,MAAM,QAAQ,KAAK,EAAE;AAErB,MAAI,KAAK,KACP,6BAAiB,QAAQ;AAG3B,MAAI,KAAK,MACP,MAAK,WAAW;AAGlB,MAAI,KAAK,QACP,MAAK,WAAW;AAGlB,MAAI,KAAK,OACP,MAAK,WAAW;AAGlB,MAAI;GACF,MAAM,SAAS,MAAMA,sCAAe,QAAQ,KAAK,OAAO;GAGxD,MAAM,UAAU,MAAMC,kCAAW,QADZ;IAAE,GAAG;IAAM,OAAO;IAAO,CACQ;AAEtD,OAAI,QAAQ,SAAS,EACnB,gBAAM,IAAI,KAAKC,mBAAG,OAAO,wFAAwF,CAAC;GAGpH,MAAM,OAAO,KAAK,OAAO,OAAO,SAAS,KAAK,MAAM,GAAG,GAAG;GAC1D,MAAM,OAAO,KAAK;GAClB,MAAM,SAAS,QAAQ;GACvB,MAAM,WAAWC,oBAAS,KAAK,aAAsC;GAErE,MAAM,SAAS,IAAIC,oCAAiC;AAEpD,UAAO,GAAG,iBAAiB,WAAmB,eAAuB;AACnE,mBAAM,IAAI,QAAQF,mBAAG,MAAM,4BAA4BA,mBAAG,KAAK,UAAU,GAAG,CAAC;AAC7E,mBAAM,IAAI,KAAKA,mBAAG,IAAI,WAAW,aAAa,CAAC;AAC/C,mBAAM,IAAI,KAAKA,mBAAG,IAAI,YAAY,UAAU,WAAW,CAAC;AACxD,mBAAM,IAAI,KAAKA,mBAAG,IAAI,aAAa,UAAU,eAAe,CAAC;AAC7D,mBAAM,IAAI,KAAKA,mBAAG,IAAI,WAAW,UAAU,aAAa,CAAC;AACzD,mBAAM,IAAI,KAAKA,mBAAG,OAAO,iDAAiD,CAAC;KAC3E;AAEF,UAAO,GAAG,yBAAyB;AACjC,mBAAM,IAAI,KAAK,iCAAiC;KAChD;AAEF,UAAO,GAAG,wBAAwB;AAChC,mBAAM,IAAI,QAAQ,iBAAiB;KACnC;AAEF,qCAAkB;IAChB;IACA;IACA,YAAY,OAAO;IACnB;IACA;IACA;IACA,YAAY,YAAY;AACtB,WAAMG,gCAAS;MACb;MACA;MACA;MACA;MACD,CAAC;;IAEL,CAAC;WAGK,OAAO;AACd,kBAAM,IAAI,MAAMH,mBAAG,IAAI,gCAAgC,CAAC;AACxD,WAAQ,MAAM,MAAM;AACpB,gBAAQ,KAAK,EAAE;;;CAGpB,CAAC;AAEF,oBAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-
|
|
1
|
+
{"version":3,"file":"validate-Cvb5aOEb.cjs","names":["jiti"],"sources":["../src/commands/validate.ts"],"sourcesContent":["import process from 'node:process'\nimport type { ArgsDef } from 'citty'\nimport { defineCommand, showUsage } from 'citty'\nimport { createJiti } from 'jiti'\n\nconst jiti = createJiti(import.meta.url, {\n sourceMaps: true,\n})\n\nconst args = {\n input: {\n type: 'string',\n description: 'Path to Swagger/OpenAPI file',\n alias: 'i',\n },\n help: {\n type: 'boolean',\n description: 'Show help',\n alias: 'h',\n default: false,\n },\n} as const satisfies ArgsDef\n\nconst command = defineCommand({\n meta: {\n name: 'validate',\n description: 'Validate a Swagger/OpenAPI file',\n },\n args,\n async run(commandContext) {\n const { args } = commandContext\n\n if (args.help) {\n return showUsage(command)\n }\n\n if (args.input) {\n let mod: any\n try {\n mod = await jiti.import('@kubb/oas', { default: true })\n } catch (_e) {\n console.error(`Import of '@kubb/oas' is required to do validation`)\n process.exit(1)\n }\n\n const { parse } = mod\n try {\n const oas = await parse(args.input)\n await oas.validate()\n\n console.log('✅ Validation success')\n } catch (error) {\n console.error('❌ Validation failed')\n console.log((error as Error)?.message)\n process.exit(1)\n }\n }\n },\n})\n\nexport default command\n"],"mappings":";;;;;;;AAKA,MAAMA,6EAAmC,EACvC,YAAY,MACb,CAAC;AAgBF,MAAM,mCAAwB;CAC5B,MAAM;EACJ,MAAM;EACN,aAAa;EACd;CACD,MAnBW;EACX,OAAO;GACL,MAAM;GACN,aAAa;GACb,OAAO;GACR;EACD,MAAM;GACJ,MAAM;GACN,aAAa;GACb,OAAO;GACP,SAAS;GACV;EACF;CAQC,MAAM,IAAI,gBAAgB;EACxB,MAAM,EAAE,SAAS;AAEjB,MAAI,KAAK,KACP,6BAAiB,QAAQ;AAG3B,MAAI,KAAK,OAAO;GACd,IAAI;AACJ,OAAI;AACF,UAAM,MAAMA,OAAK,OAAO,aAAa,EAAE,SAAS,MAAM,CAAC;YAChD,IAAI;AACX,YAAQ,MAAM,qDAAqD;AACnE,yBAAQ,KAAK,EAAE;;GAGjB,MAAM,EAAE,UAAU;AAClB,OAAI;AAEF,WADY,MAAM,MAAM,KAAK,MAAM,EACzB,UAAU;AAEpB,YAAQ,IAAI,uBAAuB;YAC5B,OAAO;AACd,YAAQ,MAAM,sBAAsB;AACpC,YAAQ,IAAK,OAAiB,QAAQ;AACtC,yBAAQ,KAAK,EAAE;;;;CAItB,CAAC;AAEF,uBAAe"}
|