"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; }) : []; }