mirror of
https://github.com/S2-/minifyfromhtml.git
synced 2025-08-03 04:10:04 +02:00
48 lines
1.2 KiB
JavaScript
48 lines
1.2 KiB
JavaScript
"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;
|
|
}) : [];
|
|
} |