{"version":3,"file":"orval.mjs","names":["pkg.name","pkg.version","pkg.description"],"sources":["../../src/bin/orval.ts"],"sourcesContent":["#!/usr/bin/env node\nimport path from 'node:path';\n\nimport { Option, program } from '@commander-js/extra-typings';\nimport {\n  ErrorWithTag,\n  getWarningCount,\n  isString,\n  log,\n  logError,\n  OutputClient,\n  OutputMode,\n  resetWarnings,\n  setVerbose,\n  startMessage,\n  SupportedFormatter,\n} from '@orval/core';\n\nimport pkg from '../../package.json';\nimport { generateSpec } from '../generate-spec';\nimport { findConfigFile, loadConfigFile } from '../utils/config';\nimport { normalizeOptions } from '../utils/options';\nimport { startWatcher } from '../utils/watcher';\n\nconst orvalMessage = startMessage({\n  name: pkg.name,\n  version: pkg.version,\n  description: pkg.description,\n});\nconst cli = program\n  .name('orval')\n  .description(\n    'Instantly generate TypeScript clients from your OpenAPI specification',\n  )\n  .version(pkg.version);\n\ncli\n  .addOption(\n    new Option('-o, --output <path>', 'output file destination').conflicts([\n      'config',\n      'project',\n    ]),\n  )\n  .addOption(\n    new Option(\n      '-i, --input <path>',\n      'input file (yaml or json openapi specs)',\n    ).conflicts(['config', 'project']),\n  )\n  .addOption(\n    new Option(\n      '-c, --config <path>',\n      'override flags by a config file',\n    ).conflicts(['input', 'output']),\n  )\n  .addOption(\n    new Option(\n      '-p, --project <name...>',\n      'focus one or more projects of the config',\n    ).conflicts(['input', 'output']),\n  )\n  .addOption(\n    new Option('-m, --mode <name>', 'default mode that will be used').choices(\n      Object.values(OutputMode),\n    ),\n  )\n  .option(\n    '-w, --watch [paths...]',\n    'Watch mode, if path is not specified, it watches the input target',\n  )\n  .addOption(\n    new Option('--client <name>', 'default client that will be used').choices(\n      Object.values(OutputClient),\n    ),\n  )\n  .option('--mock', 'activate mock generation (msw handlers + faker factories)')\n  .option('--clean [paths...]', 'Clean output directory')\n  .addOption(\n    new Option(\n      '--formatter <name>',\n      'Format generated files (prettier, biome, oxfmt)',\n    ).choices(Object.values(SupportedFormatter)),\n  )\n  .option('--tsconfig <path>', 'path to your tsconfig file')\n  .option('--verbose', 'Enable verbose logging')\n  .option(\n    '--fail-on-warnings',\n    'Exit with error code 1 when warnings are emitted',\n  )\n  .action(async (options) => {\n    if (options.verbose) {\n      setVerbose(true);\n    }\n\n    resetWarnings();\n    log(orvalMessage);\n\n    if (isString(options.input) && isString(options.output)) {\n      const normalizedOptions = await normalizeOptions({\n        input: options.input,\n        output: {\n          target: options.output,\n          clean: options.clean,\n          formatter: options.formatter,\n          mock: options.mock,\n          client: options.client,\n          mode: options.mode,\n          tsconfig: options.tsconfig,\n        },\n      });\n\n      try {\n        await generateSpec(process.cwd(), normalizedOptions);\n      } catch (error) {\n        if (error instanceof ErrorWithTag) {\n          logError(error.cause, error.tag);\n        } else {\n          logError(error);\n        }\n        process.exit(1);\n      }\n\n      if (options.watch) {\n        await startWatcher(\n          options.watch,\n          async () => {\n            resetWarnings();\n            try {\n              await generateSpec(process.cwd(), normalizedOptions);\n            } catch (error) {\n              logError(error);\n              process.exit(1);\n            }\n            if (options.failOnWarnings && getWarningCount() > 0) {\n              logError(\n                `Process exited with ${getWarningCount()} warning(s) due to --fail-on-warnings flag`,\n              );\n              process.exit(1);\n            }\n          },\n          normalizedOptions.input.target as string,\n        );\n      }\n    } else {\n      const configFilePath = findConfigFile(options.config);\n      const workspace = path.dirname(configFilePath);\n      const configFile = await loadConfigFile(configFilePath);\n\n      const missingProjects = options.project?.filter(\n        (p) => !Object.hasOwn(configFile, p),\n      );\n\n      if (missingProjects?.length) {\n        logError(`Project not found in config: ${missingProjects.join(', ')}`);\n        process.exit(1);\n      }\n\n      const configs = Object.entries(configFile).filter(\n        ([projectName]) =>\n          // only filter by project if specified\n          !Array.isArray(options.project) ||\n          options.project.includes(projectName),\n      );\n\n      let hasErrors = false;\n      for (const [projectName, config] of configs) {\n        const normalizedOptions = await normalizeOptions(\n          config,\n          workspace,\n          options,\n        );\n\n        try {\n          await generateSpec(workspace, normalizedOptions, projectName);\n        } catch (error) {\n          hasErrors = true;\n          logError(error, projectName);\n        }\n\n        if (options.watch !== undefined) {\n          const fileToWatch = isString(normalizedOptions.input.target)\n            ? normalizedOptions.input.target\n            : undefined;\n\n          await startWatcher(\n            options.watch,\n            async () => {\n              resetWarnings();\n              try {\n                await generateSpec(workspace, normalizedOptions, projectName);\n              } catch (error) {\n                logError(error, projectName);\n              }\n              if (options.failOnWarnings && getWarningCount() > 0) {\n                logError(\n                  `Process exited with ${getWarningCount()} warning(s) due to --fail-on-warnings flag`,\n                );\n                process.exit(1);\n              }\n            },\n            fileToWatch,\n          );\n        }\n      }\n\n      if (hasErrors) {\n        logError('One or more project failed, see above for details');\n        process.exit(1);\n      }\n    }\n\n    if (options.failOnWarnings && getWarningCount() > 0) {\n      logError(\n        `Process exited with ${getWarningCount()} warning(s) due to --fail-on-warnings flag`,\n      );\n      process.exit(1);\n    }\n  });\n\nawait cli.parseAsync(process.argv);\n"],"mappings":"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"}