mirror of
https://github.com/JamesIves/github-pages-deploy-action.git
synced 2023-12-15 20:03:39 +08:00
46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
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()}'`)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|