babel/scripts/build-plugins/inline-node-builders.js
2015-08-24 15:34:31 -04:00

53 lines
1.5 KiB
JavaScript

module.exports = function (babel) {
var t = babel.types;
return new babel.Plugin("inline-node-builders", {
visitor: {
CallExpression: function (node, parent, scope) {
var callee = this.get("callee");
if (!callee.isMemberExpression()) return;
var obj = callee.get("object");
if (!obj.referencesImport("babel-types", "*")) return;
var prop = callee.get("property");
if (!prop.isIdentifier()) return;
var type = prop.node.name;
var builder = t.BUILDER_KEYS[type] || t.BUILDER_KEYS[type[0].toUpperCase() + type.slice(1)];
if (!builder) return;
var props = [];
var i = 0;
for (var key in builder) {
var def = builder[key];
var arg = node.arguments[i];
if (arg) {
if (t.isLiteral(arg)) {
props.push(t.property("init", t.identifier(key), arg));
} else {
var uid = scope.generateDeclaredUidIdentifier("temp");
props.push(t.property("init", t.identifier(key), t.sequenceExpression([
t.assignmentExpression("=", uid, arg),
t.conditionalExpression(
t.logicalExpression("===", uid, t.identifier("undefined")),
t.valueToNode(def),
uid
)
])));
}
} else {
props.push(t.property("init", t.identifier(key), t.valueToNode(def)));
}
}
return t.objectExpression(props);
}
}
});
};