mirror of
https://github.com/actualbudget/actual.git
synced 2026-03-11 20:44:32 -05:00
88 lines
2.2 KiB
JavaScript
88 lines
2.2 KiB
JavaScript
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;
|
|
}
|
|
|
|
// Only add the color if it doesn't explicitly say no
|
|
// color
|
|
if (attribute.get('value').node.value !== 'none') {
|
|
attribute.replaceWith(newAttribute);
|
|
}
|
|
|
|
return true;
|
|
});
|
|
|
|
if (!replaced) {
|
|
path[method]('attributes', newAttribute);
|
|
}
|
|
},
|
|
);
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
module.exports = addJSXAttribute;
|