Spaces:
Configuration error
Configuration error
; | |
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 | |