zack
feat: πŸš€ Update Chat-nFace configurations
a053984
raw
history blame
2.38 kB
'use strict';
var core = require('@babel/core');
const positionMethod = {
start: "unshiftContainer",
end: "pushContainer"
};
const addJSXAttribute = (_, opts) => {
function getAttributeValue({
literal,
value
}) {
if (typeof value === "boolean") {
return core.types.jsxExpressionContainer(core.types.booleanLiteral(value));
}
if (typeof value === "number") {
return core.types.jsxExpressionContainer(core.types.numericLiteral(value));
}
if (typeof value === "string" && literal) {
return core.types.jsxExpressionContainer(
core.template.ast(value).expression
);
}
if (typeof value === "string") {
return core.types.stringLiteral(value);
}
return null;
}
function getAttribute({ spread, name, value, literal }) {
if (spread) {
return core.types.jsxSpreadAttribute(core.types.identifier(name));
}
return core.types.jsxAttribute(
core.types.jsxIdentifier(name),
getAttributeValue({ value, literal })
);
}
return {
visitor: {
JSXOpeningElement(path) {
if (!core.types.isJSXIdentifier(path.node.name))
return;
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.isJSXSpreadAttribute() && attribute.get("argument").isIdentifier({ name });
return attribute.isJSXAttribute() && 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);
}
}
);
}
}
};
};
module.exports = addJSXAttribute;
//# sourceMappingURL=index.js.map