babel-plugin-minify-simplify
Advanced tools
| "use strict"; | ||
| var operators = new Set(["+", "-", "*", "%", "<<", ">>", ">>>", "&", "|", "^", "/", "**"]); | ||
| var updateOperators = new Set(["+", "-"]); | ||
| const operators = new Set(["+", "-", "*", "%", "<<", ">>", ">>>", "&", "|", "^", "/", "**"]); | ||
| const updateOperators = new Set(["+", "-"]); | ||
| module.exports = function (t) { | ||
| module.exports = t => { | ||
| function simplify(path) { | ||
| var rightExpr = path.get("right"); | ||
| var leftExpr = path.get("left"); | ||
| const rightExpr = path.get("right"); | ||
| const leftExpr = path.get("left"); | ||
@@ -15,7 +15,7 @@ if (path.node.operator !== "=") { | ||
| var canBeUpdateExpression = rightExpr.get("right").isNumericLiteral() && rightExpr.get("right").node.value === 1 && updateOperators.has(rightExpr.node.operator); | ||
| const canBeUpdateExpression = rightExpr.get("right").isNumericLiteral() && rightExpr.get("right").node.value === 1 && updateOperators.has(rightExpr.node.operator); | ||
| if (leftExpr.isMemberExpression()) { | ||
| var leftPropNames = getPropNames(leftExpr); | ||
| var rightPropNames = getPropNames(rightExpr.get("left")); | ||
| const leftPropNames = getPropNames(leftExpr); | ||
| const rightPropNames = getPropNames(rightExpr.get("left")); | ||
@@ -31,3 +31,3 @@ if (!leftPropNames || leftPropNames.indexOf(undefined) > -1 || !rightPropNames || rightPropNames.indexOf(undefined) > -1 || !operators.has(rightExpr.node.operator) || !areArraysEqual(leftPropNames, rightPropNames)) { | ||
| var newExpression; // special case x=x+1 --> ++x | ||
| let newExpression; // special case x=x+1 --> ++x | ||
@@ -51,3 +51,3 @@ if (canBeUpdateExpression) { | ||
| function areArraysEqual(arr1, arr2) { | ||
| return arr1.every(function (value, index) { | ||
| return arr1.every((value, index) => { | ||
| return String(value) === String(arr2[index]); | ||
@@ -62,8 +62,8 @@ }); | ||
| var obj = path.get("object"); | ||
| var prop = path.get("property"); | ||
| var propNames = [getName(prop.node)]; | ||
| let obj = path.get("object"); | ||
| const prop = path.get("property"); | ||
| const propNames = [getName(prop.node)]; | ||
| while (obj.type === "MemberExpression") { | ||
| var node = obj.get("property").node; | ||
| const node = obj.get("property").node; | ||
@@ -70,0 +70,0 @@ if (node) { |
@@ -1,30 +0,24 @@ | ||
| var h = require("./helpers"); | ||
| "use strict"; | ||
| var PatternMatch = require("./pattern-match"); | ||
| const h = require("./helpers"); | ||
| module.exports = function (t) { | ||
| const PatternMatch = require("./pattern-match"); | ||
| module.exports = t => { | ||
| // small abstractions | ||
| var not = function not(node) { | ||
| return t.unaryExpression("!", node); | ||
| }; | ||
| const not = node => t.unaryExpression("!", node); | ||
| var notnot = function notnot(node) { | ||
| return not(not(node)); | ||
| }; | ||
| const notnot = node => not(not(node)); | ||
| var or = function or(a, b) { | ||
| return t.logicalExpression("||", a, b); | ||
| }; | ||
| const or = (a, b) => t.logicalExpression("||", a, b); | ||
| var and = function and(a, b) { | ||
| return t.logicalExpression("&&", a, b); | ||
| }; | ||
| const and = (a, b) => t.logicalExpression("&&", a, b); | ||
| function simplifyPatterns(path) { | ||
| var test = path.get("test"); | ||
| var consequent = path.get("consequent"); | ||
| var alternate = path.get("alternate"); | ||
| const test = path.get("test"); | ||
| const consequent = path.get("consequent"); | ||
| const alternate = path.get("alternate"); | ||
| var _h$typeSymbols = h.typeSymbols(t), | ||
| EX = _h$typeSymbols.Expression; // Convention: | ||
| const _h$typeSymbols = h.typeSymbols(t), | ||
| EX = _h$typeSymbols.Expression; // Convention: | ||
| // =============== | ||
@@ -34,16 +28,4 @@ // for each pattern [test, consequent, alternate, handler(expr, cons, alt)] | ||
| var matcher = new PatternMatch([[EX, true, false, function (e) { | ||
| return notnot(e); | ||
| }], [EX, false, true, function (e) { | ||
| return not(e); | ||
| }], [EX, true, EX, function (e, c, a) { | ||
| return or(notnot(e), a); | ||
| }], [EX, false, EX, function (e, c, a) { | ||
| return and(not(e), a); | ||
| }], [EX, EX, true, function (e, c) { | ||
| return or(not(e), c); | ||
| }], [EX, EX, false, function (e, c) { | ||
| return and(notnot(e), c); | ||
| }]]); | ||
| var result = matcher.match([test, consequent, alternate], h.isPatternMatchesPath(t)); | ||
| const matcher = new PatternMatch([[EX, true, false, e => notnot(e)], [EX, false, true, e => not(e)], [EX, true, EX, (e, c, a) => or(notnot(e), a)], [EX, false, EX, (e, c, a) => and(not(e), a)], [EX, EX, true, (e, c) => or(not(e), c)], [EX, EX, false, (e, c) => and(notnot(e), c)]]); | ||
| const result = matcher.match([test, consequent, alternate], h.isPatternMatchesPath(t)); | ||
@@ -50,0 +32,0 @@ if (result.match) { |
+21
-27
| "use strict"; | ||
| var VOID_0 = function VOID_0(t) { | ||
| return t.unaryExpression("void", t.numericLiteral(0), true); | ||
| }; // Types as Symbols - for comparing types | ||
| const VOID_0 = t => t.unaryExpression("void", t.numericLiteral(0), true); // Types as Symbols - for comparing types | ||
| var types = {}; // This is a test key which is used to avoid Object.keys check | ||
| const types = {}; // This is a test key which is used to avoid Object.keys check | ||
| // Object.keys() check is really expensive | ||
| // https://gist.github.com/vigneshshanmugam/c766550ecd02292dcdfbf0bf013b9d3d | ||
| var testKey = "Expression"; | ||
| const testKey = "Expression"; | ||
| var typeSymbols = function typeSymbols(t) { | ||
| const typeSymbols = t => { | ||
| // don't recompute | ||
@@ -20,3 +18,3 @@ if (types[testKey] !== undefined) { | ||
| t.TYPES.forEach(function (type) { | ||
| t.TYPES.forEach(type => { | ||
| types[type] = Symbol.for(type); | ||
@@ -27,27 +25,23 @@ }); | ||
| var isNodeOfType = function isNodeOfType(t, node, typeSymbol) { | ||
| return typeof typeSymbol !== "symbol" ? false : t["is" + Symbol.keyFor(typeSymbol)](node); | ||
| }; | ||
| const isNodeOfType = (t, node, typeSymbol) => typeof typeSymbol !== "symbol" ? false : t["is" + Symbol.keyFor(typeSymbol)](node); | ||
| var isPatternMatchesPath = function isPatternMatchesPath(t) { | ||
| return function _isPatternMatchesPath(patternValue, inputPath) { | ||
| if (Array.isArray(patternValue)) { | ||
| for (var i = 0; i < patternValue.length; i++) { | ||
| if (_isPatternMatchesPath(patternValue[i], inputPath)) { | ||
| return true; | ||
| } | ||
| const isPatternMatchesPath = t => function _isPatternMatchesPath(patternValue, inputPath) { | ||
| if (Array.isArray(patternValue)) { | ||
| for (let i = 0; i < patternValue.length; i++) { | ||
| if (_isPatternMatchesPath(patternValue[i], inputPath)) { | ||
| return true; | ||
| } | ||
| return false; | ||
| } | ||
| if (typeof patternValue === "function") { | ||
| return patternValue(inputPath); | ||
| } | ||
| return false; | ||
| } | ||
| if (isNodeOfType(t, inputPath.node, patternValue)) return true; | ||
| var evalResult = inputPath.evaluate(); | ||
| if (!evalResult.confident || !inputPath.isPure()) return false; | ||
| return evalResult.value === patternValue; | ||
| }; | ||
| if (typeof patternValue === "function") { | ||
| return patternValue(inputPath); | ||
| } | ||
| if (isNodeOfType(t, inputPath.node, patternValue)) return true; | ||
| const evalResult = inputPath.evaluate(); | ||
| if (!evalResult.confident || !inputPath.isPure()) return false; | ||
| return evalResult.value === patternValue; | ||
| }; | ||
@@ -54,0 +48,0 @@ |
+36
-38
@@ -1,9 +0,11 @@ | ||
| var REPLACED = Symbol("replaced"); | ||
| "use strict"; | ||
| var h = require("./helpers"); | ||
| const REPLACED = Symbol("replaced"); | ||
| module.exports = function (t) { | ||
| const h = require("./helpers"); | ||
| module.exports = t => { | ||
| function mergeNestedIfs(path) { | ||
| var consequent = path.get("consequent"); | ||
| var alternate = path.get("alternate"); // not nested if | ||
| const consequent = path.get("consequent"); | ||
| const alternate = path.get("alternate"); // not nested if | ||
@@ -13,3 +15,3 @@ if (!consequent.isIfStatement()) return; // there are no alternate nodes in both the if statements (nested) | ||
| if (alternate.node || consequent.get("alternate").node) return; | ||
| var test = path.get("test"); | ||
| const test = path.get("test"); | ||
| test.replaceWith(t.logicalExpression("&&", test.node, consequent.get("test").node)); | ||
@@ -21,6 +23,6 @@ consequent.replaceWith(t.clone(consequent.get("consequent").node)); | ||
| function toGuardedExpression(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
| if (node.consequent && !node.alternate && node.consequent.type === "ExpressionStatement") { | ||
| var op = "&&"; | ||
| let op = "&&"; | ||
@@ -41,3 +43,3 @@ if (t.isUnaryExpression(node.test, { | ||
| function toTernary(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -52,3 +54,3 @@ if (t.isExpressionStatement(node.consequent) && t.isExpressionStatement(node.alternate)) { | ||
| function toConditional(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -70,3 +72,3 @@ if (t.isReturnStatement(node.consequent) && t.isReturnStatement(node.alternate)) { | ||
| function toReturn(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -124,3 +126,3 @@ if (!path.getSibling(path.key + 1).node && path.parentPath && path.parentPath.parentPath && path.parentPath.parentPath.isFunction()) { | ||
| var next = path.getSibling(path.key + 1); // If the next satatement(s) is an if statement and we can simplify that | ||
| let next = path.getSibling(path.key + 1); // If the next satatement(s) is an if statement and we can simplify that | ||
| // to potentailly be an expression (or a return) then this will make it | ||
@@ -144,3 +146,3 @@ // easier merge. | ||
| if (t.isReturnStatement(node.consequent) && !node.alternate && next.isReturnStatement()) { | ||
| var nextArg = next.node.argument || h.VOID_0(t); | ||
| const nextArg = next.node.argument || h.VOID_0(t); | ||
| next.remove(); | ||
@@ -153,3 +155,3 @@ path.replaceWith(t.returnStatement(t.conditionalExpression(node.test, node.consequent.argument || h.VOID_0(t), nextArg))); | ||
| if (path.parentPath && path.parentPath.parentPath && path.parentPath.parentPath.isFunction() && !path.getSibling(path.key + 2).node && t.isReturnStatement(node.consequent) && !node.alternate && next.isExpressionStatement()) { | ||
| var nextExpr = next.node.expression; | ||
| const nextExpr = next.node.expression; | ||
| next.remove(); | ||
@@ -169,18 +171,14 @@ | ||
| function removeUnnecessaryElse(path) { | ||
| var node = path.node; | ||
| var consequent = path.get("consequent"); | ||
| var alternate = path.get("alternate"); | ||
| const node = path.node; | ||
| const consequent = path.get("consequent"); | ||
| const alternate = path.get("alternate"); | ||
| if (consequent.node && alternate.node && (consequent.isReturnStatement() || consequent.isBlockStatement() && t.isReturnStatement(consequent.node.body[consequent.node.body.length - 1])) && ( // don't hoist declarations | ||
| // TODO: validate declarations after fixing scope issues | ||
| alternate.isBlockStatement() ? !alternate.get("body").some(function (stmt) { | ||
| return stmt.isVariableDeclaration({ | ||
| kind: "let" | ||
| }) || stmt.isVariableDeclaration({ | ||
| kind: "const" | ||
| }); | ||
| }) : true)) { | ||
| path.insertAfter(alternate.isBlockStatement() ? alternate.node.body.map(function (el) { | ||
| return t.clone(el); | ||
| }) : t.clone(alternate.node)); | ||
| alternate.isBlockStatement() ? !alternate.get("body").some(stmt => stmt.isVariableDeclaration({ | ||
| kind: "let" | ||
| }) || stmt.isVariableDeclaration({ | ||
| kind: "const" | ||
| })) : true)) { | ||
| path.insertAfter(alternate.isBlockStatement() ? alternate.node.body.map(el => t.clone(el)) : t.clone(alternate.node)); | ||
| node.alternate = null; | ||
@@ -193,3 +191,3 @@ return REPLACED; | ||
| // ordered | ||
| var transforms = [toGuardedExpression, toTernary, toConditional, toReturn, removeUnnecessaryElse]; // run each of the replacement till we replace something | ||
| const transforms = [toGuardedExpression, toTernary, toConditional, toReturn, removeUnnecessaryElse]; // run each of the replacement till we replace something | ||
| // which is identified by the Symbol(REPLACED) that each of the | ||
@@ -199,3 +197,3 @@ // functions return when they replace something | ||
| for (var _i = 0; _i < transforms.length; _i++) { | ||
| var transform = transforms[_i]; | ||
| const transform = transforms[_i]; | ||
@@ -212,3 +210,3 @@ if (transform(path) === REPLACED) { | ||
| function switchConsequent(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -236,3 +234,3 @@ if (!node.alternate) { | ||
| function conditionalReturnToGuards(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -243,8 +241,8 @@ if (!path.inList || !path.get("consequent").isBlockStatement() || node.alternate) { | ||
| var ret; | ||
| var test; | ||
| var exprs = []; | ||
| var statements = node.consequent.body; | ||
| let ret; | ||
| let test; | ||
| const exprs = []; | ||
| const statements = node.consequent.body; | ||
| for (var i = 0, statement; statement = statements[i]; i++) { | ||
| for (let i = 0, statement; statement = statements[i]; i++) { | ||
| if (t.isExpressionStatement(statement)) { | ||
@@ -278,4 +276,4 @@ exprs.push(statement.expression); | ||
| exprs.push(test); | ||
| var expr = exprs.length === 1 ? exprs[0] : t.sequenceExpression(exprs); | ||
| var replacement = t.logicalExpression("&&", node.test, expr); | ||
| const expr = exprs.length === 1 ? exprs[0] : t.sequenceExpression(exprs); | ||
| const replacement = t.logicalExpression("&&", node.test, expr); | ||
| path.replaceWith(t.ifStatement(replacement, ret, null)); | ||
@@ -282,0 +280,0 @@ } |
+176
-231
| "use strict"; | ||
| function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } | ||
| function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } | ||
| function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } | ||
| function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } | ||
| function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } | ||
| function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } | ||
| module.exports = function (_ref) { | ||
| var t = _ref.types; | ||
| function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } | ||
| var flipExpressions = require("babel-helper-flip-expressions")(t); | ||
| module.exports = ({ | ||
| types: t | ||
| }) => { | ||
| const flipExpressions = require("babel-helper-flip-expressions")(t); | ||
| var toMultipleSequenceExpressions = require("babel-helper-to-multiple-sequence-expressions")(t); | ||
| const toMultipleSequenceExpressions = require("babel-helper-to-multiple-sequence-expressions")(t); | ||
| var ifStatement = require("./if-statement")(t); | ||
| const ifStatement = require("./if-statement")(t); | ||
| var conditionalExpression = require("./conditional-expression")(t); | ||
| const conditionalExpression = require("./conditional-expression")(t); | ||
| var logicalExpression = require("./logical-expression")(t); | ||
| const logicalExpression = require("./logical-expression")(t); | ||
| var assignmentExpression = require("./assignment-expression")(t); | ||
| const assignmentExpression = require("./assignment-expression")(t); | ||
| var VOID_0 = t.unaryExpression("void", t.numericLiteral(0), true); | ||
| var condExprSeen = Symbol("condExprSeen"); | ||
| var seqExprSeen = Symbol("seqExprSeen"); | ||
| var shouldRevisit = Symbol("shouldRevisit"); | ||
| const VOID_0 = t.unaryExpression("void", t.numericLiteral(0), true); | ||
| const condExprSeen = Symbol("condExprSeen"); | ||
| const seqExprSeen = Symbol("seqExprSeen"); | ||
| const shouldRevisit = Symbol("shouldRevisit"); | ||
| return { | ||
@@ -61,3 +63,3 @@ name: "minify-simplify", | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -68,3 +70,3 @@ if (node.operator !== "!" || flipExpressions.hasSeen(node)) { | ||
| var expr = node.argument; // We need to make sure that the return type will always be boolean. | ||
| const expr = node.argument; // We need to make sure that the return type will always be boolean. | ||
@@ -80,3 +82,3 @@ if (!(t.isLogicalExpression(expr) || t.isConditionalExpression(expr) || t.isBinaryExpression(expr))) { | ||
| if (flipExpressions.shouldFlip(expr, 1)) { | ||
| var newNode = flipExpressions.flip(expr); | ||
| const newNode = flipExpressions.flip(expr); | ||
| path.replaceWith(newNode); | ||
@@ -86,3 +88,3 @@ } | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -97,4 +99,4 @@ if (node.operator !== "!") { | ||
| var seq = node.argument.expressions; | ||
| var expr = seq[seq.length - 1]; | ||
| const seq = node.argument.expressions; | ||
| const expr = seq[seq.length - 1]; | ||
| seq[seq.length - 1] = t.unaryExpression("!", expr, true); | ||
@@ -104,3 +106,3 @@ path.replaceWith(node.argument); | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -115,3 +117,3 @@ if (node.operator !== "!") { | ||
| var cond = node.argument; | ||
| const cond = node.argument; | ||
| cond.alternate = t.unaryExpression("!", cond.alternate, true); | ||
@@ -130,3 +132,3 @@ cond.consequent = t.unaryExpression("!", cond.consequent, true); | ||
| function flipIfOrConditional(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -140,5 +142,5 @@ if (!path.get("test").isLogicalExpression()) { | ||
| node.test = flipExpressions.flip(node.test); | ||
| var _ref2 = [node.consequent, node.alternate]; | ||
| node.alternate = _ref2[0]; | ||
| node.consequent = _ref2[1]; | ||
| var _ref = [node.consequent, node.alternate]; | ||
| node.alternate = _ref[0]; | ||
| node.consequent = _ref[1]; | ||
| } | ||
@@ -153,16 +155,16 @@ }, conditionalExpression.simplifyPatterns], | ||
| var mutations = []; | ||
| var firstLeft = null; | ||
| var operator = null; | ||
| const mutations = []; | ||
| let firstLeft = null; | ||
| let operator = null; | ||
| function visit(path) { | ||
| if (path.isConditionalExpression()) { | ||
| var _bail = visit(path.get("consequent")); | ||
| let bail = visit(path.get("consequent")); | ||
| if (_bail) { | ||
| if (bail) { | ||
| return true; | ||
| } | ||
| _bail = visit(path.get("alternate")); | ||
| return _bail; | ||
| bail = visit(path.get("alternate")); | ||
| return bail; | ||
| } | ||
@@ -180,3 +182,3 @@ | ||
| var left = path.get("left").node; | ||
| const left = path.get("left").node; | ||
@@ -189,8 +191,6 @@ if (firstLeft == null) { | ||
| mutations.push(function () { | ||
| return path.replaceWith(path.get("right").node); | ||
| }); | ||
| mutations.push(() => path.replaceWith(path.get("right").node)); | ||
| } | ||
| var bail = visit(topPath); | ||
| const bail = visit(topPath); | ||
@@ -201,5 +201,3 @@ if (bail) { | ||
| mutations.forEach(function (f) { | ||
| return f(); | ||
| }); | ||
| mutations.forEach(f => f()); | ||
| topPath.replaceWith(t.assignmentExpression(operator, firstLeft, topPath.node)); | ||
@@ -210,3 +208,3 @@ }, // bar ? void 0 : void 0 | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -220,3 +218,3 @@ if (isVoid0(node.consequent) && isVoid0(node.alternate)) { | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -228,7 +226,7 @@ if (node[condExprSeen] || !isVoid0(node.consequent)) { | ||
| node[condExprSeen] = true; | ||
| var tests = [node.test]; | ||
| var mutations = []; | ||
| var alt; | ||
| const tests = [node.test]; | ||
| const mutations = []; | ||
| let alt; | ||
| var _loop = function _loop(next) { | ||
| for (let next = path.get("alternate"); next.isConditionalExpression(); next = next.get("alternate")) { | ||
| next.node[condExprSeen] = true; | ||
@@ -239,15 +237,7 @@ alt = next.node.alternate; | ||
| tests.push(next.node.test); | ||
| mutations.push(function () { | ||
| return next.remove(); | ||
| }); | ||
| mutations.push(() => next.remove()); | ||
| } else { | ||
| alt = next.node; | ||
| return "break"; | ||
| break; | ||
| } | ||
| }; | ||
| for (var next = path.get("alternate"); next.isConditionalExpression(); next = next.get("alternate")) { | ||
| var _ret = _loop(next); | ||
| if (_ret === "break") break; | ||
| } | ||
@@ -259,5 +249,3 @@ | ||
| var test = tests.reduce(function (expr, curTest) { | ||
| return t.logicalExpression("||", expr, curTest); | ||
| }); | ||
| const test = tests.reduce((expr, curTest) => t.logicalExpression("||", expr, curTest)); | ||
| path.replaceWith(t.conditionalExpression(test, VOID_0, alt)); | ||
@@ -270,3 +258,3 @@ }] | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -277,4 +265,4 @@ if (node.declarations.length < 2) { | ||
| var inits = []; | ||
| var empty = []; | ||
| const inits = []; | ||
| const empty = []; | ||
| var _iteratorNormalCompletion = true; | ||
@@ -286,8 +274,8 @@ var _didIteratorError = false; | ||
| for (var _iterator = node.declarations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
| var _decl = _step.value; | ||
| const decl = _step.value; | ||
| if (!_decl.init) { | ||
| empty.push(_decl); | ||
| if (!decl.init) { | ||
| empty.push(decl); | ||
| } else { | ||
| inits.push(_decl); | ||
| inits.push(decl); | ||
| } | ||
@@ -340,3 +328,3 @@ } // This is based on exprimintation but there is a significant | ||
| enter(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -347,13 +335,13 @@ if (!path.inList || node.init && !t.isExpression(node.init)) { | ||
| var prev = path.getSibling(path.key - 1); | ||
| var consumed = false; | ||
| const prev = path.getSibling(path.key - 1); | ||
| let consumed = false; | ||
| if (prev.isVariableDeclaration()) { | ||
| var referencedOutsideLoop = false; // we don't care if vars are referenced outside the loop as they are fn scope | ||
| let referencedOutsideLoop = false; // we don't care if vars are referenced outside the loop as they are fn scope | ||
| if (prev.node.kind === "let" || prev.node.kind === "const") { | ||
| var ids = Object.keys(prev.getBindingIdentifiers()); | ||
| const ids = Object.keys(prev.getBindingIdentifiers()); | ||
| idloop: for (var i = 0; i < ids.length; i++) { | ||
| var binding = prev.scope.bindings[ids[i]]; // TODO | ||
| idloop: for (let i = 0; i < ids.length; i++) { | ||
| const binding = prev.scope.bindings[ids[i]]; // TODO | ||
| // Temporary Fix | ||
@@ -368,5 +356,5 @@ // if there is no binding, we assume it is referenced outside | ||
| var refs = binding.referencePaths; | ||
| const refs = binding.referencePaths; | ||
| for (var j = 0; j < refs.length; j++) { | ||
| for (let j = 0; j < refs.length; j++) { | ||
| if (!isAncestor(path, refs[j])) { | ||
@@ -385,3 +373,3 @@ referencedOutsideLoop = true; | ||
| } else if (prev.isExpressionStatement()) { | ||
| var expr = prev.node.expression; | ||
| const expr = prev.node.expression; | ||
@@ -408,3 +396,3 @@ if (node.init) { | ||
| exit(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -416,3 +404,3 @@ if (!node.test) { | ||
| if (!path.get("body").isBlockStatement()) { | ||
| var bodyNode = path.get("body").node; | ||
| const bodyNode = path.get("body").node; | ||
@@ -442,9 +430,9 @@ if (!t.isIfStatement(bodyNode)) { | ||
| var statements = node.body.body; | ||
| var exprs = []; | ||
| var ifStatement = null; | ||
| var breakAt = null; | ||
| var i = 0; | ||
| const statements = node.body.body; | ||
| const exprs = []; | ||
| let ifStatement = null; | ||
| let breakAt = null; | ||
| let i = 0; | ||
| for (var statement; statement = statements[i]; i++) { | ||
| for (let statement; statement = statements[i]; i++) { | ||
| if (t.isIfStatement(statement)) { | ||
@@ -478,7 +466,7 @@ if (t.isBreakStatement(statement.consequent, { | ||
| var rest = []; | ||
| const rest = []; | ||
| if (breakAt === "consequent") { | ||
| if (t.isBlockStatement(ifStatement.alternate)) { | ||
| rest.push.apply(rest, _toConsumableArray(ifStatement.alternate.body)); | ||
| rest.push(...ifStatement.alternate.body); | ||
| } else if (ifStatement.alternate) { | ||
@@ -489,3 +477,3 @@ rest.push(ifStatement.alternate); | ||
| if (t.isBlockStatement(ifStatement.consequent)) { | ||
| rest.push.apply(rest, _toConsumableArray(ifStatement.consequent.body)); | ||
| rest.push(...ifStatement.consequent.body); | ||
| } else if (ifStatement.consequent) { | ||
@@ -496,5 +484,5 @@ rest.push(ifStatement.consequent); | ||
| rest.push.apply(rest, _toConsumableArray(statements.slice(i + 1))); | ||
| var test = breakAt === "consequent" ? t.unaryExpression("!", ifStatement.test, true) : ifStatement.test; | ||
| var expr; | ||
| rest.push(...statements.slice(i + 1)); | ||
| const test = breakAt === "consequent" ? t.unaryExpression("!", ifStatement.test, true) : ifStatement.test; | ||
| let expr; | ||
@@ -526,4 +514,4 @@ if (exprs.length === 1) { | ||
| this.fitsInSlidingWindow = path.getSource().length / 10 < 33000; | ||
| var node = path.node; | ||
| var statements = toMultipleSequenceExpressions(node.body); | ||
| const node = path.node; | ||
| const statements = toMultipleSequenceExpressions(node.body); | ||
@@ -539,9 +527,9 @@ if (!statements.length) { | ||
| enter(path) { | ||
| var node = path.node, | ||
| parent = path.parent; | ||
| var top = []; | ||
| var bottom = []; | ||
| const node = path.node, | ||
| parent = path.parent; | ||
| const top = []; | ||
| const bottom = []; | ||
| for (var i = 0; i < node.body.length; i++) { | ||
| var bodyNode = node.body[i]; | ||
| for (let i = 0; i < node.body.length; i++) { | ||
| const bodyNode = node.body[i]; | ||
@@ -555,3 +543,3 @@ if (t.isFunctionDeclaration(bodyNode)) { | ||
| var statements = top.concat(toMultipleSequenceExpressions(bottom)); | ||
| const statements = top.concat(toMultipleSequenceExpressions(bottom)); | ||
@@ -574,4 +562,4 @@ if (!statements.length) { | ||
| exit(path) { | ||
| var node = path.node, | ||
| parent = path.parent; | ||
| const node = path.node, | ||
| parent = path.parent; | ||
@@ -599,3 +587,3 @@ if (t.isArrowFunctionExpression(parent) && node.body.length === 1 && t.isReturnStatement(node.body[0]) && node.body[0].argument !== null) { | ||
| var statements = node.body; | ||
| const statements = node.body; | ||
@@ -612,5 +600,5 @@ if (!statements.length) { | ||
| for (var _iterator2 = statements[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | ||
| var _statement = _step2.value; | ||
| const statement = _step2.value; | ||
| if (!t.isExpressionStatement(_statement)) { | ||
| if (!t.isExpressionStatement(statement)) { | ||
| return; | ||
@@ -644,3 +632,3 @@ } | ||
| function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -669,3 +657,3 @@ if (!path.parentPath.parentPath.isFunction() || path.getSibling(path.key + 1).node) { | ||
| WhileStatement(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
| path.replaceWith(t.forStatement(null, node.test, null, node.body)); | ||
@@ -684,3 +672,3 @@ }, | ||
| node[seqExprSeen] = true; | ||
| var ret = []; | ||
| const ret = []; | ||
| var _iteratorNormalCompletion3 = true; | ||
@@ -692,8 +680,8 @@ var _didIteratorError3 = false; | ||
| for (var _iterator3 = node.expressions[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | ||
| var _n = _step3.value; | ||
| const n = _step3.value; | ||
| if (t.isSequenceExpression(_n)) { | ||
| ret.push.apply(ret, _toConsumableArray(flatten(_n))); | ||
| if (t.isSequenceExpression(n)) { | ||
| ret.push(...flatten(n)); | ||
| } else { | ||
| ret.push(_n); | ||
| ret.push(n); | ||
| } | ||
@@ -725,3 +713,3 @@ } | ||
| SwitchCase(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -739,3 +727,3 @@ if (!node.consequent.length) { | ||
| function (path) { | ||
| var node = path.node; // Need to be careful of side-effects. | ||
| const node = path.node; // Need to be careful of side-effects. | ||
@@ -750,5 +738,5 @@ if (!t.isIdentifier(node.discriminant)) { | ||
| var consTestPairs = []; | ||
| var fallThru = []; | ||
| var defaultRet; | ||
| const consTestPairs = []; | ||
| let fallThru = []; | ||
| let defaultRet; | ||
| var _iteratorNormalCompletion4 = true; | ||
@@ -760,11 +748,11 @@ var _didIteratorError4 = false; | ||
| for (var _iterator4 = node.cases[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { | ||
| var _switchCase = _step4.value; | ||
| const switchCase = _step4.value; | ||
| if (_switchCase.consequent.length > 1) { | ||
| if (switchCase.consequent.length > 1) { | ||
| return; | ||
| } | ||
| var cons = _switchCase.consequent[0]; // default case | ||
| const cons = switchCase.consequent[0]; // default case | ||
| if (!_switchCase.test) { | ||
| if (!switchCase.test) { | ||
| if (!t.isReturnStatement(cons)) { | ||
@@ -778,4 +766,4 @@ return; | ||
| if (!_switchCase.consequent.length) { | ||
| fallThru.push(_switchCase.test); | ||
| if (!switchCase.consequent.length) { | ||
| fallThru.push(switchCase.test); | ||
| continue; | ||
@@ -789,8 +777,6 @@ } // TODO: can we void it? | ||
| var test = t.binaryExpression("===", node.discriminant, _switchCase.test); | ||
| let test = t.binaryExpression("===", node.discriminant, switchCase.test); | ||
| if (fallThru.length && !defaultRet) { | ||
| test = fallThru.reduceRight(function (right, test) { | ||
| return t.logicalExpression("||", t.binaryExpression("===", node.discriminant, test), right); | ||
| }, test); | ||
| test = fallThru.reduceRight((right, test) => t.logicalExpression("||", t.binaryExpression("===", node.discriminant, test), right), test); | ||
| } | ||
@@ -825,3 +811,3 @@ | ||
| if (path.inList) { | ||
| var nextPath = path.getSibling(path.key + 1); | ||
| const nextPath = path.getSibling(path.key + 1); | ||
@@ -842,13 +828,7 @@ if (nextPath.isReturnStatement()) { | ||
| var cond = consTestPairs.reduceRight(function (alt, _ref3) { | ||
| var _ref4 = _slicedToArray(_ref3, 2), | ||
| test = _ref4[0], | ||
| cons = _ref4[1]; | ||
| return t.conditionalExpression(test, cons, alt); | ||
| }, defaultRet.argument || VOID_0); | ||
| const cond = consTestPairs.reduceRight((alt, [test, cons]) => t.conditionalExpression(test, cons, alt), defaultRet.argument || VOID_0); | ||
| path.replaceWith(t.returnStatement(cond)); // Maybe now we can merge with some previous switch statement. | ||
| if (path.inList) { | ||
| var prev = path.getSibling(path.key - 1); | ||
| const prev = path.getSibling(path.key - 1); | ||
@@ -861,3 +841,3 @@ if (prev.isSwitchStatement()) { | ||
| function (path) { | ||
| var node = path.node; // Need to be careful of side-effects. | ||
| const node = path.node; // Need to be careful of side-effects. | ||
@@ -872,5 +852,5 @@ if (!t.isIdentifier(node.discriminant)) { | ||
| var exprTestPairs = []; | ||
| var fallThru = []; | ||
| var defaultExpr; | ||
| const exprTestPairs = []; | ||
| let fallThru = []; | ||
| let defaultExpr; | ||
| var _iteratorNormalCompletion5 = true; | ||
@@ -882,27 +862,27 @@ var _didIteratorError5 = false; | ||
| for (var _iterator5 = node.cases[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { | ||
| var _switchCase2 = _step5.value; | ||
| const switchCase = _step5.value; | ||
| if (!_switchCase2.test) { | ||
| if (_switchCase2.consequent.length !== 1) { | ||
| if (!switchCase.test) { | ||
| if (switchCase.consequent.length !== 1) { | ||
| return; | ||
| } | ||
| if (!t.isExpressionStatement(_switchCase2.consequent[0])) { | ||
| if (!t.isExpressionStatement(switchCase.consequent[0])) { | ||
| return; | ||
| } | ||
| defaultExpr = _switchCase2.consequent[0].expression; | ||
| defaultExpr = switchCase.consequent[0].expression; | ||
| continue; | ||
| } | ||
| if (!_switchCase2.consequent.length) { | ||
| fallThru.push(_switchCase2.test); | ||
| if (!switchCase.consequent.length) { | ||
| fallThru.push(switchCase.test); | ||
| continue; | ||
| } | ||
| var _switchCase2$conseque = _slicedToArray(_switchCase2.consequent, 2), | ||
| cons = _switchCase2$conseque[0], | ||
| breakStatement = _switchCase2$conseque[1]; | ||
| const _switchCase$consequen = _slicedToArray(switchCase.consequent, 2), | ||
| cons = _switchCase$consequen[0], | ||
| breakStatement = _switchCase$consequen[1]; | ||
| if (_switchCase2 === node.cases[node.cases.length - 1]) { | ||
| if (switchCase === node.cases[node.cases.length - 1]) { | ||
| if (breakStatement && !t.isBreakStatement(breakStatement)) { | ||
@@ -915,12 +895,10 @@ return; | ||
| if (!t.isExpressionStatement(cons) || _switchCase2.consequent.length > 2) { | ||
| if (!t.isExpressionStatement(cons) || switchCase.consequent.length > 2) { | ||
| return; | ||
| } | ||
| var test = t.binaryExpression("===", node.discriminant, _switchCase2.test); | ||
| let test = t.binaryExpression("===", node.discriminant, switchCase.test); | ||
| if (fallThru.length && !defaultExpr) { | ||
| test = fallThru.reduceRight(function (right, test) { | ||
| return t.logicalExpression("||", t.binaryExpression("===", node.discriminant, test), right); | ||
| }, test); | ||
| test = fallThru.reduceRight((right, test) => t.logicalExpression("||", t.binaryExpression("===", node.discriminant, test), right), test); | ||
| } | ||
@@ -950,12 +928,6 @@ | ||
| var cond = exprTestPairs.reduceRight(function (alt, _ref5) { | ||
| var _ref6 = _slicedToArray(_ref5, 2), | ||
| test = _ref6[0], | ||
| cons = _ref6[1]; | ||
| return t.conditionalExpression(test, cons, alt); | ||
| }, defaultExpr || VOID_0); | ||
| const cond = exprTestPairs.reduceRight((alt, [test, cons]) => t.conditionalExpression(test, cons, alt), defaultExpr || VOID_0); | ||
| path.replaceWith(cond); | ||
| }, function (path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -966,3 +938,3 @@ if (!node.cases.length) { | ||
| var lastCase = path.get("cases")[node.cases.length - 1]; | ||
| const lastCase = path.get("cases")[node.cases.length - 1]; | ||
@@ -973,3 +945,3 @@ if (!lastCase.node.consequent.length) { | ||
| var potentialBreak = lastCase.get("consequent")[lastCase.node.consequent.length - 1]; | ||
| const potentialBreak = lastCase.get("consequent")[lastCase.node.consequent.length - 1]; | ||
@@ -989,4 +961,4 @@ if (t.isBreakStatement(potentialBreak) && potentialBreak.node.label === null) { | ||
| var test = node.test; | ||
| var flip = false; | ||
| const test = node.test; | ||
| let flip = false; | ||
@@ -1013,3 +985,3 @@ if (t.isBinaryExpression(test)) { | ||
| if (flip) { | ||
| var consequent = node.consequent; | ||
| const consequent = node.consequent; | ||
| node.consequent = node.alternate; | ||
@@ -1041,3 +1013,3 @@ node.alternate = consequent; | ||
| function earlyReturnTransform(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -1048,4 +1020,4 @@ if (!t.isBlockStatement(node.body)) { | ||
| for (var i = node.body.body.length; i >= 0; i--) { | ||
| var statement = node.body.body[i]; | ||
| for (let i = node.body.body.length; i >= 0; i--) { | ||
| const statement = node.body.body[i]; | ||
@@ -1059,3 +1031,3 @@ if (t.isIfStatement(statement) && !statement.alternate && t.isReturnStatement(statement.consequent) && !statement.consequent.argument) { | ||
| function earlyContinueTransform(path) { | ||
| var node = path.node; | ||
| const node = path.node; | ||
@@ -1066,4 +1038,4 @@ if (!t.isBlockStatement(node.body)) { | ||
| for (var i = node.body.body.length; i >= 0; i--) { | ||
| var statement = node.body.body[i]; | ||
| for (let i = node.body.body.length; i >= 0; i--) { | ||
| const statement = node.body.body[i]; | ||
@@ -1082,9 +1054,7 @@ if (t.isIfStatement(statement) && !statement.alternate && t.isContinueStatement(statement.consequent) && !statement.consequent.label) { | ||
| function genericEarlyExitTransform(path) { | ||
| var node = path.node; | ||
| var statements = path.parentPath.get(path.listKey).slice(path.key + 1).filter(function (stmt) { | ||
| return !stmt.isFunctionDeclaration(); | ||
| }); // deopt for any block scoped bindings | ||
| const node = path.node; | ||
| const statements = path.parentPath.get(path.listKey).slice(path.key + 1).filter(stmt => !stmt.isFunctionDeclaration()); // deopt for any block scoped bindings | ||
| // issue#399 | ||
| var deopt = !statements.every(function (stmt) { | ||
| const deopt = !statements.every(stmt => { | ||
| if (!(stmt.isVariableDeclaration({ | ||
@@ -1098,7 +1068,7 @@ kind: "let" | ||
| var ids = Object.keys(stmt.getBindingIdentifiers()); | ||
| const ids = Object.keys(stmt.getBindingIdentifiers()); | ||
| for (var _i2 = 0; _i2 < ids.length; _i2++) { | ||
| var id = ids[_i2]; | ||
| var binding = path.scope.getBinding(id); // TODO | ||
| const id = ids[_i2]; | ||
| const binding = path.scope.getBinding(id); // TODO | ||
| // Temporary Fix | ||
@@ -1112,39 +1082,18 @@ // if there is no binding, we assume it is referenced outside | ||
| var refs = _toConsumableArray(binding.referencePaths).concat(_toConsumableArray(binding.constantViolations)); | ||
| const refs = [...binding.referencePaths, ...binding.constantViolations]; | ||
| var _iteratorNormalCompletion6 = true; | ||
| var _didIteratorError6 = false; | ||
| var _iteratorError6 = undefined; | ||
| for (var _i3 = 0; _i3 < refs.length; _i3++) { | ||
| const ref = refs[_i3]; | ||
| if (!ref.isIdentifier()) return false; | ||
| const fnParent = ref.getFunctionParent(); // TODO | ||
| // Usage of scopes and bindings in simplify plugin results in | ||
| // undefined bindings because scope changes are not updated in the | ||
| // scope tree. So, we deopt whenever we encounter one such issue | ||
| // and not perform the transformation | ||
| try { | ||
| for (var _iterator6 = refs[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { | ||
| var _ref7 = _step6.value; | ||
| if (!_ref7.isIdentifier()) return false; | ||
| if (!fnParent) { | ||
| return false; | ||
| } | ||
| var fnParent = _ref7.getFunctionParent(); // TODO | ||
| // Usage of scopes and bindings in simplify plugin results in | ||
| // undefined bindings because scope changes are not updated in the | ||
| // scope tree. So, we deopt whenever we encounter one such issue | ||
| // and not perform the transformation | ||
| if (!fnParent) { | ||
| return false; | ||
| } | ||
| if (fnParent.scope !== path.scope) return false; | ||
| } | ||
| } catch (err) { | ||
| _didIteratorError6 = true; | ||
| _iteratorError6 = err; | ||
| } finally { | ||
| try { | ||
| if (!_iteratorNormalCompletion6 && _iterator6.return != null) { | ||
| _iterator6.return(); | ||
| } | ||
| } finally { | ||
| if (_didIteratorError6) { | ||
| throw _iteratorError6; | ||
| } | ||
| } | ||
| if (fnParent.scope !== path.scope) return false; | ||
| } | ||
@@ -1166,3 +1115,3 @@ } | ||
| var test = node.test; | ||
| const test = node.test; | ||
@@ -1181,6 +1130,4 @@ if (t.isBinaryExpression(test) && test.operator === "!==") { | ||
| path.get("consequent").replaceWith(t.blockStatement(statements.map(function (stmt) { | ||
| return t.clone(stmt.node); | ||
| }))); | ||
| var l = statements.length; | ||
| path.get("consequent").replaceWith(t.blockStatement(statements.map(stmt => t.clone(stmt.node)))); | ||
| let l = statements.length; | ||
@@ -1198,3 +1145,3 @@ while (l-- > 0) { | ||
| function createPrevExpressionEater(keyword) { | ||
| var key; | ||
| let key; | ||
@@ -1225,4 +1172,4 @@ switch (keyword) { | ||
| var node = path.node; | ||
| var prev = path.getSibling(path.key - 1); | ||
| const node = path.node; | ||
| const prev = path.getSibling(path.key - 1); | ||
@@ -1233,3 +1180,3 @@ if (!prev.isExpressionStatement()) { | ||
| var seq = prev.node.expression; | ||
| let seq = prev.node.expression; | ||
@@ -1244,3 +1191,3 @@ if (node[key]) { | ||
| if (t.isSequenceExpression(seq)) { | ||
| var lastExpr = seq.expressions[seq.expressions.length - 1]; | ||
| const lastExpr = seq.expressions[seq.expressions.length - 1]; | ||
| seq.expressions[seq.expressions.length - 1] = t.unaryExpression("void", lastExpr, true); | ||
@@ -1269,6 +1216,4 @@ } else { | ||
| function isAncestor(path1, path2) { | ||
| return !!path2.findParent(function (parent) { | ||
| return parent === path1; | ||
| }); | ||
| return !!path2.findParent(parent => parent === path1); | ||
| } | ||
| }; |
| "use strict"; | ||
| var h = require("./helpers"); | ||
| const h = require("./helpers"); | ||
| var PatternMatch = require("./pattern-match"); | ||
| const PatternMatch = require("./pattern-match"); | ||
| module.exports = function (t) { | ||
| var OP_AND = function OP_AND(input) { | ||
| return input === "&&"; | ||
| }; | ||
| module.exports = t => { | ||
| const OP_AND = input => input === "&&"; | ||
| var OP_OR = function OP_OR(input) { | ||
| return input === "||"; | ||
| }; | ||
| const OP_OR = input => input === "||"; | ||
| function simplifyPatterns(path) { | ||
| // cache of path.evaluate() | ||
| var evaluateMemo = new Map(); | ||
| const evaluateMemo = new Map(); | ||
| var TRUTHY = function TRUTHY(input) { | ||
| const TRUTHY = input => { | ||
| // !NaN and !undefined are truthy | ||
@@ -29,3 +25,3 @@ // separate check here as they are considered impure by babel | ||
| var evalResult = input.evaluate(); | ||
| const evalResult = input.evaluate(); | ||
| evaluateMemo.set(input, evalResult); | ||
@@ -35,3 +31,3 @@ return evalResult.confident && input.isPure() && evalResult.value; | ||
| var FALSY = function FALSY(input) { | ||
| const FALSY = input => { | ||
| // NaN and undefined are falsy | ||
@@ -45,3 +41,3 @@ // separate check here as they are considered impure by babel | ||
| var evalResult = input.evaluate(); | ||
| const evalResult = input.evaluate(); | ||
| evaluateMemo.set(input, evalResult); | ||
@@ -51,20 +47,12 @@ return evalResult.confident && input.isPure() && !evalResult.value; | ||
| var _h$typeSymbols = h.typeSymbols(t), | ||
| EX = _h$typeSymbols.Expression; // Convention: | ||
| const _h$typeSymbols = h.typeSymbols(t), | ||
| EX = _h$typeSymbols.Expression; // Convention: | ||
| // [left, operator, right, handler(leftNode, rightNode)] | ||
| var matcher = new PatternMatch([[TRUTHY, OP_AND, EX, function (l, r) { | ||
| return r; | ||
| }], [FALSY, OP_AND, EX, function (l) { | ||
| return l; | ||
| }], [TRUTHY, OP_OR, EX, function (l) { | ||
| return l; | ||
| }], [FALSY, OP_OR, EX, function (l, r) { | ||
| return r; | ||
| }]]); | ||
| var left = path.get("left"); | ||
| var right = path.get("right"); | ||
| var operator = path.node.operator; | ||
| var result = matcher.match([left, operator, right], h.isPatternMatchesPath(t)); | ||
| const matcher = new PatternMatch([[TRUTHY, OP_AND, EX, (l, r) => r], [FALSY, OP_AND, EX, l => l], [TRUTHY, OP_OR, EX, l => l], [FALSY, OP_OR, EX, (l, r) => r]]); | ||
| const left = path.get("left"); | ||
| const right = path.get("right"); | ||
| const operator = path.node.operator; | ||
| const result = matcher.match([left, operator, right], h.isPatternMatchesPath(t)); | ||
@@ -74,3 +62,3 @@ if (result.match) { | ||
| // it satisfied one of TRUTHY/FALSY paths | ||
| var value; | ||
| let value; | ||
@@ -77,0 +65,0 @@ if (evaluateMemo.has(left)) { |
+110
-122
@@ -1,168 +0,156 @@ | ||
| function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } | ||
| "use strict"; | ||
| function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
| function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); } | ||
| function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
| function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } | ||
| function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
| function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
| var LEAF_NODE = Symbol("LEAF_NODE"); | ||
| function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } | ||
| module.exports = | ||
| /*#__PURE__*/ | ||
| function () { | ||
| function PatternMatch(patterns) { | ||
| _classCallCheck(this, PatternMatch); | ||
| const LEAF_NODE = Symbol("LEAF_NODE"); | ||
| module.exports = class PatternMatch { | ||
| constructor(patterns) { | ||
| this.decisionTree = this.makeDecisionTree(patterns); | ||
| } | ||
| _createClass(PatternMatch, [{ | ||
| key: "handle", | ||
| value: function handle(input, isMatch) { | ||
| var result = this.match(input, isMatch); | ||
| handle(input, isMatch) { | ||
| const result = this.match(input, isMatch); | ||
| if (!result.match) { | ||
| throw new Error("No Match Found for " + input.toString()); | ||
| } | ||
| if (!result.match) { | ||
| throw new Error("No Match Found for " + input.toString()); | ||
| } | ||
| if (typeof result.value !== "function") { | ||
| throw new Error("Expecting a function. Instead got - " + result.value.toString()); | ||
| } | ||
| result.value.call(null, input, result.keys); | ||
| if (typeof result.value !== "function") { | ||
| throw new Error("Expecting a function. Instead got - " + result.value.toString()); | ||
| } | ||
| }, { | ||
| key: "match", | ||
| value: function match(input) { | ||
| var isMatch = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (a, b) { | ||
| return a === b; | ||
| }; | ||
| var current = this.decisionTree; | ||
| var result = { | ||
| match: false, | ||
| value: void 0, | ||
| keys: [] | ||
| }; // to handle falsy keys | ||
| var NO_MATCH = Symbol("NO_MATCH"); | ||
| result.value.call(null, input, result.keys); | ||
| } | ||
| for (var i = 0; i < input.length; i++) { | ||
| var matchedKey = NO_MATCH; // because map doesn't support custom key equal function | ||
| match(input, isMatch = (a, b) => a === b) { | ||
| let current = this.decisionTree; | ||
| const result = { | ||
| match: false, | ||
| value: void 0, | ||
| keys: [] | ||
| }; // to handle falsy keys | ||
| var _iteratorNormalCompletion = true; | ||
| var _didIteratorError = false; | ||
| var _iteratorError = undefined; | ||
| const NO_MATCH = Symbol("NO_MATCH"); | ||
| try { | ||
| for (var _iterator = current.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
| var _key = _step.value; | ||
| for (let i = 0; i < input.length; i++) { | ||
| let matchedKey = NO_MATCH; // because map doesn't support custom key equal function | ||
| if (isMatch(_key, input[i])) { | ||
| matchedKey = _key; | ||
| result.keys.push(matchedKey); | ||
| break; | ||
| } | ||
| var _iteratorNormalCompletion = true; | ||
| var _didIteratorError = false; | ||
| var _iteratorError = undefined; | ||
| try { | ||
| for (var _iterator = current.keys()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
| const key = _step.value; | ||
| if (isMatch(key, input[i])) { | ||
| matchedKey = key; | ||
| result.keys.push(matchedKey); | ||
| break; | ||
| } | ||
| } catch (err) { | ||
| _didIteratorError = true; | ||
| _iteratorError = err; | ||
| } | ||
| } catch (err) { | ||
| _didIteratorError = true; | ||
| _iteratorError = err; | ||
| } finally { | ||
| try { | ||
| if (!_iteratorNormalCompletion && _iterator.return != null) { | ||
| _iterator.return(); | ||
| } | ||
| } finally { | ||
| try { | ||
| if (!_iteratorNormalCompletion && _iterator.return != null) { | ||
| _iterator.return(); | ||
| } | ||
| } finally { | ||
| if (_didIteratorError) { | ||
| throw _iteratorError; | ||
| } | ||
| if (_didIteratorError) { | ||
| throw _iteratorError; | ||
| } | ||
| } | ||
| } | ||
| if (matchedKey !== NO_MATCH) { | ||
| current = current.get(matchedKey); | ||
| if (matchedKey !== NO_MATCH) { | ||
| current = current.get(matchedKey); | ||
| if (i === input.length - 1) { | ||
| if (current.has(LEAF_NODE)) { | ||
| result.match = true; | ||
| result.value = current.get(LEAF_NODE); | ||
| } | ||
| if (i === input.length - 1) { | ||
| if (current.has(LEAF_NODE)) { | ||
| result.match = true; | ||
| result.value = current.get(LEAF_NODE); | ||
| } | ||
| break; | ||
| } | ||
| } else { | ||
| break; | ||
| } | ||
| } else { | ||
| break; | ||
| } | ||
| return result; | ||
| } | ||
| }, { | ||
| key: "makeDecisionTree", | ||
| value: function makeDecisionTree(patterns) { | ||
| // order of keys in a Map is the order of insertion | ||
| var root = new Map(); | ||
| var _iteratorNormalCompletion2 = true; | ||
| var _didIteratorError2 = false; | ||
| var _iteratorError2 = undefined; | ||
| return result; | ||
| } | ||
| makeDecisionTree(patterns) { | ||
| // order of keys in a Map is the order of insertion | ||
| const root = new Map(); | ||
| var _iteratorNormalCompletion2 = true; | ||
| var _didIteratorError2 = false; | ||
| var _iteratorError2 = undefined; | ||
| try { | ||
| for (var _iterator2 = patterns[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | ||
| const pattern = _step2.value; | ||
| make(root, pattern); | ||
| } | ||
| } catch (err) { | ||
| _didIteratorError2 = true; | ||
| _iteratorError2 = err; | ||
| } finally { | ||
| try { | ||
| for (var _iterator2 = patterns[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | ||
| var _pattern2 = _step2.value; | ||
| make(root, _pattern2); | ||
| if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | ||
| _iterator2.return(); | ||
| } | ||
| } catch (err) { | ||
| _didIteratorError2 = true; | ||
| _iteratorError2 = err; | ||
| } finally { | ||
| try { | ||
| if (!_iteratorNormalCompletion2 && _iterator2.return != null) { | ||
| _iterator2.return(); | ||
| } | ||
| } finally { | ||
| if (_didIteratorError2) { | ||
| throw _iteratorError2; | ||
| } | ||
| if (_didIteratorError2) { | ||
| throw _iteratorError2; | ||
| } | ||
| } | ||
| } | ||
| return root; | ||
| return root; | ||
| function make(parent, pattern) { | ||
| if (pattern.length < 2) { | ||
| throw new Error("at least 2 elements required in a pattern"); | ||
| } | ||
| function make(parent, pattern) { | ||
| if (pattern.length < 2) { | ||
| throw new Error("at least 2 elements required in a pattern"); | ||
| } | ||
| if (pattern.length === 2) { | ||
| if (parent.has(pattern[0])) { | ||
| var pattern0 = parent.get(pattern[0]); | ||
| if (pattern.length === 2) { | ||
| if (parent.has(pattern[0])) { | ||
| const pattern0 = parent.get(pattern[0]); | ||
| if (!pattern0.has(LEAF_NODE)) { | ||
| pattern0.set(LEAF_NODE, pattern[1]); | ||
| } // here we don't handle duplicates | ||
| // this pattern would have already been matched | ||
| if (!pattern0.has(LEAF_NODE)) { | ||
| pattern0.set(LEAF_NODE, pattern[1]); | ||
| } // here we don't handle duplicates | ||
| // this pattern would have already been matched | ||
| } else { | ||
| parent.set(pattern[0], new Map([[LEAF_NODE, pattern[1]]])); | ||
| } | ||
| return parent; | ||
| } else { | ||
| parent.set(pattern[0], new Map([[LEAF_NODE, pattern[1]]])); | ||
| } | ||
| var _pattern = _toArray(pattern), | ||
| return parent; | ||
| } | ||
| const _pattern = _toArray(pattern), | ||
| current = _pattern[0], | ||
| rest = _pattern.slice(1); | ||
| if (parent.has(current)) { | ||
| make(parent.get(current), rest); | ||
| } else { | ||
| parent.set(current, make(new Map(), rest)); | ||
| } | ||
| if (parent.has(current)) { | ||
| make(parent.get(current), rest); | ||
| } else { | ||
| parent.set(current, make(new Map(), rest)); | ||
| } | ||
| return parent; | ||
| } | ||
| return parent; | ||
| } | ||
| }]); | ||
| } | ||
| return PatternMatch; | ||
| }(); | ||
| }; |
+3
-3
| { | ||
| "name": "babel-plugin-minify-simplify", | ||
| "version": "0.5.0-alpha.b5bafaeb", | ||
| "version": "0.5.0-alpha.e9f96ffe", | ||
| "description": "", | ||
@@ -15,6 +15,6 @@ "keywords": [ | ||
| "dependencies": { | ||
| "babel-helper-flip-expressions": "^0.5.0-alpha.b5bafaeb", | ||
| "babel-helper-flip-expressions": "^0.5.0-alpha.e9f96ffe", | ||
| "babel-helper-is-nodes-equiv": "^0.0.1", | ||
| "babel-helper-to-multiple-sequence-expressions": "^0.5.0-alpha.b5bafaeb" | ||
| "babel-helper-to-multiple-sequence-expressions": "^0.5.0-alpha.e9f96ffe" | ||
| } | ||
| } |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
57835
-5.14%1457
-6.54%