babel-plugin-shield
Version:
A babel plugin to shield code against undefined properties
87 lines (72 loc) • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { 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"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (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"); } }; }();
exports.default = function (_ref) {
var t = _ref.types;
return {
visitor: {
CallExpression: function CallExpression(path) {
var node = path.node;
if (t.isIdentifier(node.callee, { name: 'shield_' })) {
var finalexpr = transform(path, node, t);
path.replaceWith(finalexpr);
}
}
}
};
};
function replaceObject(t, expression, variable) {
switch (expression.type) {
case 'MemberExpression':
expression.object = variable;
break;
case 'CallExpression':
expression.callee = variable;
break;
}
return expression;
}
function transformHelper(path, expression, t) {
var leftExpr,
rightExpr = expression,
finalExpr = expression,
refs = [],
temp = [],
newVar;
if (expression) {
switch (expression.type) {
case 'MemberExpression':
var _transformHelper = transformHelper(path, expression.object, t);
var _transformHelper2 = _slicedToArray(_transformHelper, 2);
leftExpr = _transformHelper2[0];
temp = _transformHelper2[1];
break;
case 'CallExpression':
var _transformHelper3 = transformHelper(path, expression.callee, t);
var _transformHelper4 = _slicedToArray(_transformHelper3, 2);
leftExpr = _transformHelper4[0];
temp = _transformHelper4[1];
break;
}
if (leftExpr) {
newVar = path.scope.generateUidIdentifier("uid");
refs = temp.concat(t.variableDeclarator(newVar, leftExpr));
finalExpr = t.logicalExpression('&&', newVar, replaceObject(t, rightExpr, newVar));
}
}
return [finalExpr, refs];
}
function transform(path, expression, t) {
var _transformHelper5 = transformHelper(path, expression.arguments[0], t, null),
_transformHelper6 = _slicedToArray(_transformHelper5, 2),
logicalExpr = _transformHelper6[0],
refs = _transformHelper6[1];
var blockArgs = [t.returnStatement(logicalExpr)];
if (refs.length > 0) {
blockArgs = [t.variableDeclaration('var', refs), t.returnStatement(logicalExpr)];
}
var newBlock = t.blockStatement(blockArgs);
return t.expressionStatement(t.callExpression(t.callExpression(t.memberExpression(t.functionExpression(null, [], newBlock, false, false), t.identifier('bind')), [t.thisExpression()]), []));
}