babel-plugin-transform-jue-jsx
Version:
Babel plugin for Jue JSX
62 lines (59 loc) • 2.38 kB
JavaScript
var makeMap = require('./make-map');
var isTopLevel = makeMap('class,staticClass,style,key,ref,refInFor,slot,scopedSlots');
var nestableRE = /^(domProps|on|nativeOn|hook)([-A-Z])/;
var dirRE = /^v-/;
var xlinkRE = /^xlink([A-Z])/;
module.exports = function (props, t) {
var newProps = [];
var currentNestedObjects = Object.create(null);
props.forEach(function (prop) {
var name = prop.key.value || prop.key.name;
if (isTopLevel(name)) {
// Top-level special props
newProps.push(prop);
} else {
// Nested modules
var nestMatch = name.match(nestableRE);
if (nestMatch) {
var prefix = nestMatch[1];
var suffix = name.replace(nestableRE, function (_, $1, $2) {
return $2 === '-' ? '' : $2.toLowerCase();
});
var nestedProp = t.objectProperty(t.stringLiteral(suffix), prop.value);
var nestedObject = currentNestedObjects[prefix];
if (nestedObject) {
nestedObject.value.properties.push(nestedProp);
} else {
nestedObject = currentNestedObjects[prefix] = t.objectProperty(t.identifier(prefix), t.objectExpression([nestedProp]));
newProps.push(nestedObject);
}
} else if (dirRE.test(name)) {
// Custom directive
name = name.replace(dirRE, '');
var dirs = currentNestedObjects.directives;
if (!dirs) {
dirs = currentNestedObjects.directives = t.objectProperty(t.identifier('directives'), t.arrayExpression([]));
newProps.push(dirs);
}
dirs.value.elements.push(t.objectExpression([t.objectProperty(t.identifier('name'), t.stringLiteral(name)), t.objectProperty(t.identifier('value'), prop.value)]));
} else {
// Rest are nested under attrs
var attrs = currentNestedObjects.attrs;
// Guard xlink attributes
if (xlinkRE.test(prop.key.name)) {
prop.key.name = JSON.stringify(prop.key.name.replace(xlinkRE, function (m, p1) {
return 'xlink:' + p1.toLowerCase();
}));
}
if (attrs) {
attrs.value.properties.push(prop);
} else {
attrs = currentNestedObjects.attrs = t.objectProperty(t.identifier('attrs'), t.objectExpression([prop]));
newProps.push(attrs);
}
}
}
});
return t.objectExpression(newProps);
};
;