UNPKG

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
"use strict"; 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) {} } }; };