UNPKG

babel-core

Version:

Turn ES6 code into readable vanilla ES5 with source maps

97 lines (77 loc) 2.52 kB
"use strict"; var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; }; exports.ConditionalExpression = ConditionalExpression; exports.__esModule = true; var t = _interopRequireWildcard(require("../../../types")); function toStatements(node) { if (t.isBlockStatement(node)) { var hasBlockScoped = false; for (var i = 0; i < node.body.length; i++) { var bodyNode = node.body[i]; if (t.isBlockScoped(bodyNode)) hasBlockScoped = true; } if (!hasBlockScoped) { return node.body; } } return node; } var metadata = { optional: true }; exports.metadata = metadata; function ConditionalExpression(node, parent, scope) { var evaluateTest = this.get("test").evaluateTruthy(); if (evaluateTest === true) { return node.consequent; } else if (evaluateTest === false) { return node.alternate; } } var IfStatement = { exit: function exit(node, parent, scope) { var consequent = node.consequent; var alternate = node.alternate; var evaluateTest = this.get("test").evaluateTruthy(); // we can check if a test will be truthy 100% and if so then we can inline // the consequent and completely ignore the alternate // // if (true) { foo; } -> { foo; } // if ("foo") { foo; } -> { foo; } // if (evaluateTest === true) { return toStatements(consequent); } // we can check if a test will be falsy 100% and if so we can inline the // alternate if there is one and completely remove the consequent // // if ("") { bar; } else { foo; } -> { foo; } // if ("") { bar; } -> // if (evaluateTest === false) { if (alternate) { return toStatements(alternate); } else { return this.remove(); } } // remove alternate blocks that are empty // // if (foo) { foo; } else {} -> if (foo) { foo; } // if (t.isBlockStatement(alternate) && !alternate.body.length) { alternate = node.alternate = null; } // if the consequent block is empty turn alternate blocks into a consequent // and flip the test // // if (foo) {} else { bar; } -> if (!foo) { bar; } // if (t.isBlockStatement(consequent) && !consequent.body.length && t.isBlockStatement(alternate) && alternate.body.length) { node.consequent = node.alternate; node.alternate = null; node.test = t.unaryExpression("!", test, true); } } }; exports.IfStatement = IfStatement;