From 7ab463685ddbde768475af9755e20255c7c98ad9 Mon Sep 17 00:00:00 2001 From: Lewis Date: Wed, 19 Oct 2022 11:45:35 -0400 Subject: [PATCH 1/3] implement support for regex --- docs/rules/no-restricted-class.md | 2 +- lib/rules/no-restricted-class.js | 15 ++++++++++++--- tests/lib/rules/no-restricted-class.js | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) 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..f2863a150 100644 --- a/lib/rules/no-restricted-class.js +++ b/lib/rules/no-restricted-class.js @@ -5,16 +5,25 @@ 'use strict' const utils = require('../utils') +const regexp = require('../utils/regexp') /** * Report a forbidden class * @param {string} className * @param {*} node * @param {RuleContext} context - * @param {Set} forbiddenClasses + * @param {Array} forbiddenClasses */ const reportForbiddenClass = (className, node, context, forbiddenClasses) => { - if (forbiddenClasses.has(className)) { + const isForbidden = forbiddenClasses.some((cl) => { + if (regexp.isRegExp(cl)) { + const re = regexp.toRegExp(cl) + return re.test(className) + } else { + return className.includes(cl) + } + }) + if (isForbidden) { const loc = node.value ? node.value.loc : node.loc context.report({ node, @@ -112,7 +121,7 @@ module.exports = { /** @param {RuleContext} context */ create(context) { - const forbiddenClasses = new Set(context.options || []) + const forbiddenClasses = context.options || [] return utils.defineTemplateBodyVisitor(context, { /** diff --git a/tests/lib/rules/no-restricted-class.js b/tests/lib/rules/no-restricted-class.js index baf39778f..769fe359f 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)/'] } ] }) From 302e14b0bdac64c15224a0b4b55d90a5419acfe3 Mon Sep 17 00:00:00 2001 From: Lewis Date: Wed, 19 Oct 2022 12:36:21 -0400 Subject: [PATCH 2/3] remove extra quote --- tests/lib/rules/no-restricted-class.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/rules/no-restricted-class.js b/tests/lib/rules/no-restricted-class.js index 769fe359f..02815b2c6 100644 --- a/tests/lib/rules/no-restricted-class.js +++ b/tests/lib/rules/no-restricted-class.js @@ -32,7 +32,7 @@ ruleTester.run('no-restricted-class', rule, { options: ['forbidden'] }, { - code: ``, + code: ``, options: ['/^for(bidden|gotten)/'] } ], From 6e473be4189c287df3fc6a4ffea33d81b11a0b76 Mon Sep 17 00:00:00 2001 From: Lewis Date: Wed, 19 Oct 2022 13:18:11 -0400 Subject: [PATCH 3/3] separate regexps and keep string Set --- lib/rules/no-restricted-class.js | 45 ++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/lib/rules/no-restricted-class.js b/lib/rules/no-restricted-class.js index f2863a150..f25ad6498 100644 --- a/lib/rules/no-restricted-class.js +++ b/lib/rules/no-restricted-class.js @@ -12,18 +12,20 @@ const regexp = require('../utils/regexp') * @param {string} className * @param {*} node * @param {RuleContext} context - * @param {Array} forbiddenClasses + * @param {Set} forbiddenClasses + * @param {Array} forbiddenClassesRegexps */ -const reportForbiddenClass = (className, node, context, forbiddenClasses) => { - const isForbidden = forbiddenClasses.some((cl) => { - if (regexp.isRegExp(cl)) { - const re = regexp.toRegExp(cl) - return re.test(className) - } else { - return className.includes(cl) - } - }) - if (isForbidden) { +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, @@ -121,7 +123,10 @@ module.exports = { /** @param {RuleContext} context */ create(context) { - const forbiddenClasses = context.options || [] + const forbiddenClasses = new Set(context.options || []) + const forbiddenClassesRegexps = (context.options || []) + .filter((cl) => regexp.isRegExp(cl)) + .map((cl) => regexp.toRegExp(cl)) return utils.defineTemplateBodyVisitor(context, { /** @@ -129,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 + ) } }, @@ -144,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 + ) } } })