UNPKG

babel-plugin-transform-jue-jsx

Version:

Babel plugin for Jue JSX

62 lines (59 loc) 2.38 kB
'use strict'; 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); };