eslint-plugin-styled-component-jsx-attributes
Version:
A simple plugin for enforcing the use of the id attribute on styled components.
54 lines (44 loc) • 1.85 kB
JavaScript
var mergeStyledAttrsWithNodeAttrs = require('../mergeStyledAttrsWithNodeAttrs');
var mapChainExpressions = require('../mapChainExpressions');
var _require = require('util'),
inspect = _require.inspect;
module.exports = function (context, styledComponents, rule, name) {
return {
JSXOpeningElement: function JSXOpeningElement(node) {
var func = function func(inspectee) {
return name.includes('scope') && context.report(node, inspect(inspectee || node));
};
try {
var elementName = node.name.name;
if (!elementName && node.name.type === 'JSXMemberExpression') {
elementName = "".concat(node.name.object.name, ".").concat(node.name.property.name);
}
var styledComponent = styledComponents[elementName];
if (styledComponent) {
var tag = styledComponent.tag,
attrs = styledComponent.attrs;
var originalNodeAttr = node.attributes;
var originalNodeName = node.name;
try {
var allAttrs = mergeStyledAttrsWithNodeAttrs(attrs, originalNodeAttr);
node.attributes = mapChainExpressions(allAttrs); // Convert JSXMemberExpression to JSXIdentifier, so it'll be properly handled by eslint-plugin-jsx-a11y plugin
node.name = {
type: 'JSXIdentifier',
name: tag,
start: originalNodeName.start,
end: originalNodeName.end,
loc: originalNodeName.loc,
range: originalNodeName.range,
parent: originalNodeName.parent
};
rule.create(context, styledComponent).JSXOpeningElement(node);
} finally {
node.name = originalNodeName;
node.attributes = originalNodeAttr;
}
}
} catch (_unused) {}
}
};
};
;