1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- 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;
- }
- }
|