mirror of
https://github.com/Snigdha-OS/documentation.git
synced 2025-09-10 19:54:57 +02:00
80 lines
2.3 KiB
JavaScript
80 lines
2.3 KiB
JavaScript
'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
|