@kubb/cli
Version: 
Command-line interface for Kubb, enabling easy generation of TypeScript, React-Query, Zod, and other code from OpenAPI specifications.
1 lines • 12 kB
Source Map (JSON)
{"version":3,"file":"generate-C-LME3FT.cjs","names":["results: Array<Config>","path","pc","LogMapper","pc","path","process","PromiseManager"],"sources":["../src/utils/getPlugins.ts","../src/utils/getConfig.ts","../src/utils/getCosmiConfig.ts","../src/utils/watcher.ts","../src/commands/generate.ts"],"sourcesContent":["import type { UserConfig } from '@kubb/core'\n\nfunction isJSONPlugins(plugins: UserConfig['plugins']) {\n  return !!(plugins as any)?.some((plugin: any) => {\n    return Array.isArray(plugin) && typeof plugin?.at(0) === 'string'\n  })\n}\n\nfunction isObjectPlugins(plugins: UserConfig['plugins']): plugins is any {\n  return plugins instanceof Object && !Array.isArray(plugins)\n}\n\nexport function getPlugins(plugins: UserConfig['plugins']): Promise<UserConfig['plugins']> {\n  if (isObjectPlugins(plugins)) {\n    throw new Error('Object plugins are not supported anymore, best to use http://kubb.dev/getting-started/configure#json')\n  }\n\n  if (isJSONPlugins(plugins)) {\n    throw new Error('JSON plugins are not supported anymore, best to use http://kubb.dev/getting-started/configure#json')\n  }\n\n  return Promise.resolve(plugins)\n}\n","import { isPromise } from '@kubb/core/utils'\n\nimport { getPlugins } from './getPlugins.ts'\n\nimport type { Config, UserConfig } from '@kubb/core'\nimport type { Args } from '../commands/generate.ts'\nimport type { CosmiconfigResult } from './getCosmiConfig.ts'\n\n/**\n * Converting UserConfig to Config without a change in the object beside the JSON convert.\n */\nexport async function getConfig(result: CosmiconfigResult, args: Args): Promise<Array<Config> | Config> {\n  const config = result?.config\n  let kubbUserConfig = Promise.resolve(config) as Promise<UserConfig | Array<UserConfig>>\n\n  // for ts or js files\n  if (typeof config === 'function') {\n    const possiblePromise = config(args)\n    if (isPromise(possiblePromise)) {\n      kubbUserConfig = possiblePromise\n    }\n    kubbUserConfig = Promise.resolve(possiblePromise)\n  }\n\n  let JSONConfig = await kubbUserConfig\n\n  if (Array.isArray(JSONConfig)) {\n    const results: Array<Config> = []\n\n    for (const item of JSONConfig) {\n      const plugins = item.plugins ? await getPlugins(item.plugins) : undefined\n\n      results.push({\n        ...item,\n        plugins,\n      } as Config)\n    }\n\n    return results\n  }\n\n  JSONConfig = {\n    ...JSONConfig,\n    plugins: JSONConfig.plugins ? await getPlugins(JSONConfig.plugins) : undefined,\n  }\n\n  return JSONConfig as Config\n}\n","import type { defineConfig, UserConfig } from '@kubb/core'\nimport { cosmiconfig } from 'cosmiconfig'\nimport { createJiti } from 'jiti'\n\nexport type CosmiconfigResult = {\n  filepath: string\n  isEmpty?: boolean\n  config: ReturnType<typeof defineConfig> | UserConfig\n}\n\nconst tsLoader = async (configFile: string) => {\n  const jiti = createJiti(import.meta.url, {\n    jsx: {\n      runtime: 'automatic',\n      importSource: '@kubb/react-fabric',\n    },\n    sourceMaps: true,\n  })\n\n  const mod = await jiti.import(configFile, { default: true })\n\n  return mod\n}\n\nexport async function getCosmiConfig(moduleName: string, config?: string): Promise<CosmiconfigResult> {\n  const searchPlaces = [\n    'package.json',\n    `.${moduleName}rc`,\n    `.${moduleName}rc.json`,\n    `.${moduleName}rc.yaml`,\n    `.${moduleName}rc.yml`,\n\n    `.${moduleName}rc.ts`,\n    `.${moduleName}rc.js`,\n    `.${moduleName}rc.mjs`,\n    `.${moduleName}rc.cjs`,\n\n    `${moduleName}.config.ts`,\n    `${moduleName}.config.js`,\n    `${moduleName}.config.mjs`,\n    `${moduleName}.config.cjs`,\n  ]\n  const explorer = cosmiconfig(moduleName, {\n    cache: false,\n    searchPlaces: [\n      ...searchPlaces.map((searchPlace) => {\n        return `.config/${searchPlace}`\n      }),\n      ...searchPlaces.map((searchPlace) => {\n        return `configs/${searchPlace}`\n      }),\n      ...searchPlaces,\n    ],\n    loaders: {\n      '.ts': tsLoader,\n    },\n  })\n\n  const result = config ? await explorer.load(config) : await explorer.search()\n\n  if (result?.isEmpty || !result || !result.config) {\n    throw new Error('Config not defined, create a kubb.config.js or pass through your config with the option --config')\n  }\n\n  return result as CosmiconfigResult\n}\n","import { createLogger } from '@kubb/core/logger'\nimport pc from 'picocolors'\n\nexport async function startWatcher(path: string[], cb: (path: string[]) => Promise<void>): Promise<void> {\n  const { watch } = await import('chokidar')\n  const logger = createLogger()\n\n  const ignored = '**/{.git,node_modules}/**'\n\n  const watcher = watch(path, {\n    ignorePermissionErrors: true,\n    ignored,\n  })\n  watcher.on('all', (type, file) => {\n    logger?.emit('info', pc.yellow(pc.bold(`Change detected: ${type} ${file}`)))\n\n    try {\n      cb(path)\n    } catch (_e) {\n      logger?.emit('warning', pc.red('Watcher failed'))\n    }\n  })\n}\n","import path from 'node:path'\nimport * as process from 'node:process'\nimport { isInputPath, PromiseManager } from '@kubb/core'\nimport { createLogger, LogMapper } from '@kubb/core/logger'\nimport type { ArgsDef, ParsedArgs } from 'citty'\nimport { defineCommand, showUsage } from 'citty'\nimport type { SingleBar } from 'cli-progress'\nimport pc from 'picocolors'\nimport { getConfig } from '../utils/getConfig.ts'\nimport { getCosmiConfig } from '../utils/getCosmiConfig.ts'\nimport { startWatcher } from '../utils/watcher.ts'\n\ndeclare global {\n  var isDevtoolsEnabled: any\n}\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 or debug',\n    alias: 'l',\n    default: 'info',\n    valueHint: 'silent|info|debug',\n  },\n  watch: {\n    type: 'boolean',\n    description: 'Watch mode based on the input file',\n    alias: 'w',\n    default: false,\n  },\n  debug: {\n    type: 'boolean',\n    description: 'Override logLevel to debug',\n    alias: 'd',\n    default: false,\n  },\n  help: {\n    type: 'boolean',\n    description: 'Show help',\n    alias: 'h',\n    default: false,\n  },\n} as const satisfies ArgsDef\n\nexport type Args = ParsedArgs<typeof args>\n\nconst command = defineCommand({\n  meta: {\n    name: 'generate',\n    description: \"[input] Generate files based on a 'kubb.config.ts' file\",\n  },\n  args,\n  async run(commandContext) {\n    const progressCache = new Map<string, SingleBar>()\n\n    const { args } = commandContext\n\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    const logLevel = LogMapper[args.logLevel as keyof typeof LogMapper] || 3\n    const logger = createLogger({\n      logLevel,\n    })\n    const { generate } = await import('../runners/generate.ts')\n\n    logger.emit('start', 'Loading config')\n\n    const result = await getCosmiConfig('kubb', args.config)\n    logger.emit('success', `Config loaded(${pc.dim(path.relative(process.cwd(), result.filepath))})`)\n\n    const config = await getConfig(result, args)\n\n    const start = async () => {\n      if (Array.isArray(config)) {\n        const promiseManager = new PromiseManager()\n        const promises = config.map((c) => () => {\n          progressCache.clear()\n\n          return generate({\n            input,\n            config: c,\n            args,\n            progressCache,\n          })\n        })\n\n        await promiseManager.run('seq', promises)\n        return\n      }\n\n      progressCache.clear()\n\n      await generate({\n        input,\n        config,\n        progressCache,\n        args,\n      })\n\n      return\n    }\n\n    if (args.watch) {\n      if (Array.isArray(config)) {\n        throw new Error('Cannot use watcher with multiple Configs(array)')\n      }\n\n      if (isInputPath(config)) {\n        return startWatcher([input || config.input.path], async (paths) => {\n          await start()\n          logger.emit('start', pc.yellow(pc.bold(`Watching for changes in ${paths.join(' and ')}`)))\n        })\n      }\n    }\n\n    await start()\n\n    if (globalThis.isDevtoolsEnabled) {\n      const canRestart = await logger.consola?.prompt('Restart(could be used to validate the profiler)?', {\n        type: 'confirm',\n        initial: false,\n      })\n\n      if (canRestart) {\n        await start()\n      } else {\n        process.exit(1)\n      }\n    }\n  },\n})\n\nexport default command\n"],"mappings":"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"}