eslint-plugin-styled-components-a11y
Version:
This plugin adds the ability to lint styled components according to the rules outlined in eslint-plugin-jsx-a11y.
51 lines (49 loc) • 2.07 kB
JavaScript
;
var mergeStyledAttrsWithNodeAttrs = require('../mergeStyledAttrsWithNodeAttrs');
var getAsProp = require('../getAsProp');
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);
var asProp = getAsProp(allAttrs);
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: asProp || tag,
start: originalNodeName.start,
end: originalNodeName.end,
loc: originalNodeName.loc,
range: originalNodeName.range,
parent: originalNodeName.parent
};
// if we haven't discovered what type of tag the component is based off, bail
if (!(asProp || tag)) return;
rule.create(context).JSXOpeningElement(node);
} finally {
node.name = originalNodeName;
node.attributes = originalNodeAttr;
}
}
} catch (_unused) {}
}
};
};