codemods/lib/modifyProps.js (41 lines of code) (raw):
module.exports = (ast, j, moduleName, propsMap) => {
const importsByName = {}
ast
.find(j.ImportDeclaration, decl => decl.source.value === moduleName)
.forEach(decl => {
j(decl)
.find(j.ImportSpecifier)
.forEach(spec => {
importsByName[spec.node.imported.name] = spec.node.local.name
})
})
ast
.find(j.JSXElement, {
openingElement: {
name: {
name: name => {
return name in importsByName
}
}
}
})
.forEach(el => {
j(el)
.find(j.JSXAttribute, {
name: name => {
return name.name in propsMap
}
})
.forEach(attr => {
const name = attr.value.name.name
const op = propsMap[name]
if (typeof op === 'function') {
op(attr, el)
} else if (typeof op === 'string' && attr.value.name instanceof Object) {
attr.value.name.name = op
} else if (op instanceof Object) {
j(attr).replaceWith(op)
}
})
})
}