{"version":3,"file":"commander.mjs","sources":["../../../../src/cli/utils/commander.ts"],"sourcesContent":["/**\n * This file includes hooks to use for commander.hook and argParsers for commander.argParser\n */\n\nimport inquirer from 'inquirer';\nimport { Command, InvalidOptionArgumentError, Option } from 'commander';\nimport chalk from 'chalk';\nimport { isNaN } from 'lodash/fp';\nimport { exitWith } from './helpers';\n\n/**\n * argParser: Parse a comma-delimited string as an array\n */\nconst parseList = (value: string) => {\n  try {\n    return value.split(',').map((item) => item.trim()); // trim shouldn't be necessary but might help catch unexpected whitespace characters\n  } catch (e) {\n    exitWith(1, `Unrecognized input: ${value}`);\n  }\n\n  return [];\n};\n\n/**\n * Returns an argParser that returns a list\n */\nconst getParseListWithChoices = (choices: string[], errorMessage = 'Invalid options:') => {\n  return (value: string) => {\n    const list = parseList(value);\n    const invalid = list.filter((item) => {\n      return !choices.includes(item);\n    });\n\n    if (invalid.length > 0) {\n      exitWith(1, `${errorMessage}: ${invalid.join(',')}`);\n    }\n\n    return list;\n  };\n};\n\n/**\n * argParser: Parse a string as an integer\n */\nconst parseInteger = (value: string) => {\n  // parseInt takes a string and a radix\n  const parsedValue = parseInt(value, 10);\n  if (isNaN(parsedValue)) {\n    throw new InvalidOptionArgumentError(`Not an integer: ${value}`);\n  }\n  return parsedValue;\n};\n\n/**\n * argParser: Parse a string as a URL object\n */\nconst parseURL = (value: string) => {\n  try {\n    const url = new URL(value);\n    if (!url.host) {\n      throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n    }\n\n    return url;\n  } catch (e) {\n    throw new InvalidOptionArgumentError(`Could not parse url ${value}`);\n  }\n};\n\n/**\n * hook: if encrypt==true and key not provided, prompt for it\n */\nconst promptEncryptionKey = async (thisCommand: Command) => {\n  const opts = thisCommand.opts();\n\n  if (!opts.encrypt && opts.key) {\n    return exitWith(1, 'Key may not be present unless encryption is used');\n  }\n\n  // if encrypt==true but we have no key, prompt for it\n  if (opts.encrypt && !(opts.key && opts.key.length > 0)) {\n    try {\n      const answers = await inquirer.prompt([\n        {\n          type: 'password',\n          message: 'Please enter an encryption key',\n          name: 'key',\n          validate(key) {\n            if (key.length > 0) return true;\n\n            return 'Key must be present when using the encrypt option';\n          },\n        },\n      ]);\n      opts.key = answers.key;\n    } catch (e) {\n      return exitWith(1, 'Failed to get encryption key');\n    }\n    if (!opts.key) {\n      return exitWith(1, 'Failed to get encryption key');\n    }\n  }\n};\n\n/**\n * hook: require a confirmation message to be accepted unless forceOption (-f,--force) is used\n */\nconst getCommanderConfirmMessage = (\n  message: string,\n  { failMessage }: { failMessage?: string } = {}\n) => {\n  return async (command: Command) => {\n    const confirmed = await confirmMessage(message, { force: command.opts().force });\n    if (!confirmed) {\n      exitWith(1, failMessage);\n    }\n  };\n};\n\nconst confirmMessage = async (message: string, { force }: { force?: boolean } = {}) => {\n  // if we have a force option, respond yes\n  if (force === true) {\n    // attempt to mimic the inquirer prompt exactly\n    console.log(`${chalk.green('?')} ${chalk.bold(message)} ${chalk.cyan('Yes')}`);\n    return true;\n  }\n\n  const answers = await inquirer.prompt([\n    {\n      type: 'confirm',\n      message,\n      name: `confirm`,\n      default: false,\n    },\n  ]);\n\n  return answers.confirm;\n};\n\nconst forceOption = new Option(\n  '--force',\n  `Automatically answer \"yes\" to all prompts, including potentially destructive requests, and run non-interactively.`\n);\n\nexport {\n  getParseListWithChoices,\n  parseList,\n  parseURL,\n  parseInteger,\n  promptEncryptionKey,\n  getCommanderConfirmMessage,\n  confirmMessage,\n  forceOption,\n};\n"],"names":["parseList","value","split","map","item","trim","e","exitWith","getParseListWithChoices","choices","errorMessage","list","invalid","filter","includes","length","join","parseInteger","parsedValue","parseInt","isNaN","InvalidOptionArgumentError","parseURL","url","URL","host","promptEncryptionKey","thisCommand","opts","encrypt","key","answers","inquirer","prompt","type","message","name","validate","getCommanderConfirmMessage","failMessage","command","confirmed","confirmMessage","force","console","log","chalk","green","bold","cyan","default","confirm","forceOption","Option"],"mappings":"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"}