
const chalk = require('chalk');
const dedent = require('dedent');
const has = require('lodash/has');

const warn = msg => {
  console.warn(chalk.yellowBright.bold(msg));
};

/**
 * Checks if the given command or binary name is present in the package.json scripts. This would be
 * called if and when resolving a binary fails in `findBin`.
 *
 * @param {Object} pkg package.json
 * @param {string} cmd .
 * @param {string} binName .
 * @param {Array<string>} args .
 * @throws {Error} If a script is found in the pkg for the given `cmd` or `binName`.
 */
module.exports = function checkPkgScripts(pkg, cmd, binName, args) {
  if (pkg && pkg.scripts) {
    const { scripts } = pkg;
    let scriptName;
    let script;
    if (has(scripts, cmd)) {
      scriptName = cmd;
      script = scripts[cmd];
    } else if (has(scripts, binName)) {
      scriptName = binName;
      script = scripts[binName];
    } else {
      return;
    }

    const argsStr = args && args.length ? args.join(' ') : '';
    warn(dedent`
      \`lint-staged\` no longer supports running scripts defined in package.json.

      The same behavior can be achieved by changing the command to any of the following:
        - \`npm run ${scriptName} -- ${argsStr}\`
        - \`${script} ${argsStr}\`
    `);
    throw new Error(`Could not resolve binary for \`${cmd}\``);
  }
};
