export async function run()

in packages/apps-tools/src/cli/index.ts [18:104]


export async function run(argv = process.argv) {
  const args = parse(argv);
  const {YOUTRACK_HOST, YOUTRACK_API_TOKEN} = process.env;
  const config: Config = {
    host: args.host || YOUTRACK_HOST || null,
    token: args.token || YOUTRACK_API_TOKEN || null,
    output: args.output || null,
    overwrite: args.overwrite || null,
    manifest: args.manifest || null,
    schema: args.schema || null,
    open: args.open || null,
    cwd: process.cwd(),
  };

  if (args.version || args.v) {
    return printVersion();
  }

  const option = args._[0];
  switch (option) {
    case 'list':
    case 'download':
    case 'upload':
      await checkRequiredParams(['host', 'token'], args, async () => {
        const executable = options[option];
        await executable(config, args._.slice(1)[0]);
      });
      return;
    case 'validate':
      await options['validate'](config, args._.slice(1)[0]);
      return;
    case 'version':
      printVersion();
      return;
    default:
      printHelp();
      return;
  }

  function printHelp() {
    br();
    printLine(i18n('list     --host --token                      '), i18n('View a list of installed apps'));
    printLine(i18n('download <app> [--output, --overwrite]       '), i18n('Download an app'));
    printLine(i18n('upload   <directory>                         '), i18n('Upload app to server'));
    printLine(i18n('validate <directory> [--manifest, --schema]  '), i18n('Validate manifest'));
    br();
    console.log(
      i18n('One can also provide host and token via environment variables $YOUTRACK_HOST and $YOUTRACK_API_TOKEN.'),
    );

    function br() {
      console.log('');
    }

    function printLine(option: string, description: string) {
      console.log('    ' + option + '   ' + description);
    }
  }

  async function checkRequiredParams(
    required: RequiredParams[],
    args: Record<string, string>,
    fn: () => Promise<void>,
  ): Promise<void> {
    function allParamsProvided(params: RequiredParams[], args: Record<string, string>): boolean {
      return params.every(param => {
        if ((!args.hasOwnProperty(param) || !args[param]) && !config[param]) {
          if (param === 'token') {
            const createTokenUrl = `${resolve(config.host, 'users/me?tab=account-security').href}`;
            exit(new Error(i18n(`Token is required. Please create one at ${createTokenUrl}`)));
          } else {
            exit(new Error(i18n('Option "--' + param + '" is required')));
          }

          return false;
        }
        return true;
      });
    }

    if (allParamsProvided(required, args)) await fn();
  }

  function printVersion() {
    console.log(require('../../package.json').version);
  }
}