86 lines
1.9 KiB
JavaScript
86 lines
1.9 KiB
JavaScript
var booleanCondition = require('esmangle-evaluator').booleanCondition;
|
|
|
|
var recast = require('recast');
|
|
var types = recast.types;
|
|
var b = types.builders;
|
|
|
|
var VISITOR_METHODS = {
|
|
visitLogicalExpression: visitLogicalExp,
|
|
visitIfStatement: visitCondition,
|
|
visitConditionalExpression: visitCondition
|
|
};
|
|
|
|
module.exports = function(branch) {
|
|
recast.visit(branch, VISITOR_METHODS);
|
|
return branch;
|
|
};
|
|
|
|
|
|
/**
|
|
* "||" and "&&"
|
|
*/
|
|
function visitLogicalExp(path) {
|
|
var leftEval = booleanCondition(path.node.left);
|
|
|
|
if (typeof leftEval !== 'boolean') {
|
|
// console.log('___ %s ___', path.node.operator);
|
|
this.traverse(path);
|
|
return;
|
|
}
|
|
|
|
if (leftEval === true && path.node.operator === '||') {
|
|
// console.log('true || ___');
|
|
path.replace(b.literal(true));
|
|
recast.visit(path, VISITOR_METHODS);
|
|
return false;
|
|
}
|
|
|
|
if (leftEval === true && path.node.operator === '&&') {
|
|
// console.log('true && ___');
|
|
path.replace(path.node.right);
|
|
recast.visit(path, VISITOR_METHODS);
|
|
return false;
|
|
}
|
|
|
|
if (leftEval === false && path.node.operator === '&&') {
|
|
// console.log('false && ___');
|
|
path.replace(b.literal(false));
|
|
recast.visit(path, VISITOR_METHODS);
|
|
return false;
|
|
}
|
|
|
|
if (leftEval === false && path.node.operator === '||') {
|
|
// console.log('false || ___');
|
|
path.replace(path.node.right);
|
|
recast.visit(path, VISITOR_METHODS);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* "if" and ternary "?"
|
|
*/
|
|
function visitCondition(path) {
|
|
var testEval = booleanCondition(path.node.test);
|
|
|
|
if (typeof testEval !== 'boolean') {
|
|
// console.log('if/? ___');
|
|
this.traverse(path);
|
|
return;
|
|
}
|
|
|
|
if (testEval === true) {
|
|
// console.log('if/? (true)');
|
|
path.replace(path.value.consequent);
|
|
recast.visit(path, VISITOR_METHODS);
|
|
return false;
|
|
}
|
|
|
|
if (testEval === false) {
|
|
// console.log('if/? (false)');
|
|
path.replace(path.value.alternate);
|
|
recast.visit(path, VISITOR_METHODS);
|
|
return false;
|
|
}
|
|
}
|