Spaces:
Sleeping
Sleeping
File size: 2,220 Bytes
cc651f6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
"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; |