You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

102 lines
2.2 KiB

"use strict";
exports.__esModule = true;
exports.default = void 0;
const positionMethod = {
start: 'unshiftContainer',
end: 'pushContainer'
};
const addJSXAttribute = ({
types: t,
template
}, opts) => {
function getAttributeValue({
literal,
value
}) {
if (typeof value === 'boolean') {
return t.jsxExpressionContainer(t.booleanLiteral(value));
}
if (typeof value === 'number') {
return t.jsxExpressionContainer(t.numericLiteral(value));
}
if (typeof value === 'string' && literal) {
return t.jsxExpressionContainer(template.ast(value).expression);
}
if (typeof value === 'string') {
return t.stringLiteral(value);
}
return null;
}
function getAttribute({
spread,
name,
value,
literal
}) {
if (spread) {
return t.jsxSpreadAttribute(t.identifier(name));
}
return t.jsxAttribute(t.jsxIdentifier(name), getAttributeValue({
value,
literal
}));
}
return {
visitor: {
JSXOpeningElement(path) {
if (!opts.elements.includes(path.node.name.name)) return;
opts.attributes.forEach(({
name,
value = null,
spread = false,
literal = false,
position = 'end'
}) => {
const method = positionMethod[position];
const newAttribute = getAttribute({
spread,
name,
value,
literal
});
const attributes = path.get('attributes');
const isEqualAttribute = attribute => {
if (spread) {
return attribute.get('argument').isIdentifier({
name
});
}
return attribute.get('name').isJSXIdentifier({
name
});
};
const replaced = attributes.some(attribute => {
if (!isEqualAttribute(attribute)) return false;
attribute.replaceWith(newAttribute);
return true;
});
if (!replaced) {
path[method]('attributes', newAttribute);
}
});
}
}
};
};
var _default = addJSXAttribute;
exports.default = _default;