You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.2 KiB
102 lines
2.2 KiB
"use strict"; |
|
|
|
exports.__esModule = true; |
|
exports.default = void 0; |
|
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; |
|
attribute.replaceWith(newAttribute); |
|
return true; |
|
}); |
|
|
|
if (!replaced) { |
|
path[method]('attributes', newAttribute); |
|
} |
|
}); |
|
} |
|
|
|
} |
|
}; |
|
}; |
|
|
|
var _default = addJSXAttribute; |
|
exports.default = _default; |