diff --git a/docs/rules/no-restricted-class.md b/docs/rules/no-restricted-class.md index 849c71e8c..b6fa69b3a 100644 --- a/docs/rules/no-restricted-class.md +++ b/docs/rules/no-restricted-class.md @@ -20,7 +20,7 @@ in the rule configuration. ```json { - "vue/no-restricted-class": ["error", "forbidden", "forbidden-two", "forbidden-three"] + "vue/no-restricted-class": ["error", "forbidden", "forbidden-two", "forbidden-three", "/^for(bidden|gotten)/"] } ``` diff --git a/lib/rules/no-restricted-class.js b/lib/rules/no-restricted-class.js index 4d6c3c42d..f25ad6498 100644 --- a/lib/rules/no-restricted-class.js +++ b/lib/rules/no-restricted-class.js @@ -5,6 +5,7 @@ 'use strict' const utils = require('../utils') +const regexp = require('../utils/regexp') /** * Report a forbidden class @@ -12,9 +13,19 @@ const utils = require('../utils') * @param {*} node * @param {RuleContext} context * @param {Set} forbiddenClasses + * @param {Array} forbiddenClassesRegexps */ -const reportForbiddenClass = (className, node, context, forbiddenClasses) => { - if (forbiddenClasses.has(className)) { +const reportForbiddenClass = ( + className, + node, + context, + forbiddenClasses, + forbiddenClassesRegexps +) => { + if ( + forbiddenClasses.has(className) || + forbiddenClassesRegexps.some((re) => re.test(className)) + ) { const loc = node.value ? node.value.loc : node.loc context.report({ node, @@ -113,6 +124,9 @@ module.exports = { /** @param {RuleContext} context */ create(context) { const forbiddenClasses = new Set(context.options || []) + const forbiddenClassesRegexps = (context.options || []) + .filter((cl) => regexp.isRegExp(cl)) + .map((cl) => regexp.toRegExp(cl)) return utils.defineTemplateBodyVisitor(context, { /** @@ -120,7 +134,13 @@ module.exports = { */ 'VAttribute[directive=false][key.name="class"]'(node) { for (const className of node.value.value.split(/\s+/)) { - reportForbiddenClass(className, node, context, forbiddenClasses) + reportForbiddenClass( + className, + node, + context, + forbiddenClasses, + forbiddenClassesRegexps + ) } }, @@ -135,7 +155,13 @@ module.exports = { for (const { className, reportNode } of extractClassNames( /** @type {Expression} */ (node.expression) )) { - reportForbiddenClass(className, reportNode, context, forbiddenClasses) + reportForbiddenClass( + className, + reportNode, + context, + forbiddenClasses, + forbiddenClassesRegexps + ) } } }) diff --git a/tests/lib/rules/no-restricted-class.js b/tests/lib/rules/no-restricted-class.js index baf39778f..02815b2c6 100644 --- a/tests/lib/rules/no-restricted-class.js +++ b/tests/lib/rules/no-restricted-class.js @@ -30,6 +30,10 @@ ruleTester.run('no-restricted-class', rule, { { code: ``, options: ['forbidden'] + }, + { + code: ``, + options: ['/^for(bidden|gotten)/'] } ], @@ -113,6 +117,16 @@ ruleTester.run('no-restricted-class', rule, { } ], options: ['forbidden'] + }, + { + code: ``, + errors: [ + { + message: "'forbidden' class is not allowed.", + type: 'VAttribute' + } + ], + options: ['/^for(bidden|gotten)/'] } ] })