"use strict";

module.exports = removeUseStrict;
const newIssueUrl = "https://github.com/babel/minify/issues/new";
const useStrict = "use strict";
/**
 * Remove redundant use strict
 * If the parent has a "use strict" directive, it is not required in
 * the children
 *
 * @param {NodePath} block BlockStatement
 */

function removeUseStrict(block) {
  if (!block.isBlockStatement()) {
    throw new Error(`Received ${block.type}. Expected BlockStatement. ` + `Please report at ${newIssueUrl}`);
  }

  const useStricts = getUseStrictDirectives(block); // early exit

  if (useStricts.length < 1) return; // only keep the first use strict

  if (useStricts.length > 1) {
    for (let i = 1; i < useStricts.length; i++) {
      useStricts[i].remove();
    }
  } // check if parent has an use strict


  if (hasStrictParent(block)) {
    useStricts[0].remove();
  }
}

function hasStrictParent(path) {
  return path.findParent(parent => parent.isBlockStatement() && isStrict(parent));
}

function isStrict(block) {
  return getUseStrictDirectives(block).length > 0;
}

function getUseStrictDirectives(block) {
  var dir = block.get("directives");
  return Array.isArray(dir) ? dir.filter(function (directive) {
    return directive.node.value.value === useStrict;
  }) : [];
}