const svgElementAttributes = require('svg-element-attributes') const attributeCalls = /^(get|has|set|remove)Attribute$/ const validAttributeName = /^[a-z][a-z0-9-]*$/ // these are common SVG attributes that *must* have the correct case to work const camelCaseAttributes = Object.values(svgElementAttributes) .reduce((all, elementAttrs) => all.concat(elementAttrs), []) .filter(name => !validAttributeName.test(name)) const validSVGAttributeSet = new Set(camelCaseAttributes) // lowercase variants of camelCase SVG attributes are probably an error const invalidSVGAttributeSet = new Set(camelCaseAttributes.map(name => name.toLowerCase())) function isValidAttribute(name) { return validSVGAttributeSet.has(name) || (validAttributeName.test(name) && !invalidSVGAttributeSet.has(name)) } module.exports = function(context) { return { CallExpression(node) { if (!node.callee.property) return const calleeName = node.callee.property.name if (!attributeCalls.test(calleeName)) return const attributeNameNode = node.arguments[0] if (!attributeNameNode) return if (!isValidAttribute(attributeNameNode.value)) { context.report({ meta: { fixable: 'code' }, node: attributeNameNode, message: 'Attributes should be lowercase and hyphen separated, or part of the SVG whitelist.', fix(fixer) { return fixer.replaceText(attributeNameNode, `'${attributeNameNode.value.toLowerCase()}'`) } }) } } } }