Files
30-seconds-of-code/node_modules/babel-plugin-minify-simplify/lib/conditional-expression.js
2019-08-20 15:52:05 +02:00

58 lines
1.5 KiB
JavaScript

"use strict";
var h = require("./helpers");
var PatternMatch = require("./pattern-match");
module.exports = function (t) {
// small abstractions
var not = function not(node) {
return t.unaryExpression("!", node);
};
var notnot = function notnot(node) {
return not(not(node));
};
var or = function or(a, b) {
return t.logicalExpression("||", a, b);
};
var and = function and(a, b) {
return t.logicalExpression("&&", a, b);
};
function simplifyPatterns(path) {
var test = path.get("test");
var consequent = path.get("consequent");
var alternate = path.get("alternate");
var _h$typeSymbols = h.typeSymbols(t),
EX = _h$typeSymbols.Expression;
// Convention:
// ===============
// 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));
if (result.match) {
path.replaceWith(result.value(test.node, consequent.node, alternate.node));
}
}
return {
simplifyPatterns
};
};