From fe24ff35600c54d994000d66382175ccadfebbb8 Mon Sep 17 00:00:00 2001 From: KazumaOhashi Date: Tue, 14 Nov 2023 17:46:38 +0900 Subject: [PATCH 1/5] Add new option to specify tags to ignore `vue/no-deprecated-slot-attribute` --- lib/rules/no-deprecated-slot-attribute.js | 12 ++++++- lib/rules/syntaxes/slot-attribute.js | 9 ++++++ .../lib/rules/no-deprecated-slot-attribute.js | 32 ++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lib/rules/no-deprecated-slot-attribute.js b/lib/rules/no-deprecated-slot-attribute.js index 6459cdff4..e77310f03 100644 --- a/lib/rules/no-deprecated-slot-attribute.js +++ b/lib/rules/no-deprecated-slot-attribute.js @@ -16,7 +16,17 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/no-deprecated-slot-attribute.html' }, fixable: 'code', - schema: [], + schema: [ + { + type: 'object', + properties: { + ignore: { + type: 'array' + } + }, + additionalProperties: false + } + ], messages: { forbiddenSlotAttribute: '`slot` attributes are deprecated.' } diff --git a/lib/rules/syntaxes/slot-attribute.js b/lib/rules/syntaxes/slot-attribute.js index 3292cd9de..713ff958a 100644 --- a/lib/rules/syntaxes/slot-attribute.js +++ b/lib/rules/syntaxes/slot-attribute.js @@ -11,6 +11,12 @@ module.exports = { supported: '<3.0.0', /** @param {RuleContext} context @returns {TemplateListener} */ createTemplateBodyVisitor(context) { + const options = context.options[0] || {} + /** @type {string[]} */ + const ignore = Array.isArray(options.ignore) + ? options.ignore + : [options.ignore] + const sourceCode = context.getSourceCode() const tokenStore = context.parserServices.getTemplateBodyTokenStore && @@ -95,6 +101,9 @@ module.exports = { * @returns {void} */ function reportSlot(slotAttr) { + if (ignore.includes(slotAttr.parent.parent.name)) { + return + } context.report({ node: slotAttr.key, messageId: 'forbiddenSlotAttribute', diff --git a/tests/lib/rules/no-deprecated-slot-attribute.js b/tests/lib/rules/no-deprecated-slot-attribute.js index 8f61e9225..6e0858e21 100644 --- a/tests/lib/rules/no-deprecated-slot-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-attribute.js @@ -46,7 +46,17 @@ tester.run('no-deprecated-slot-attribute', rule, { - ` + `, + { + code: ``, + options: [{ ignore: ['one', 'two', 'my-component'] }] + } ], invalid: [ { @@ -594,6 +604,26 @@ tester.run('no-deprecated-slot-attribute', rule, { '`slot` attributes are deprecated.', '`slot` attributes are deprecated.' ] + }, + { + code: ` + `, + output: null, + options: [ + { + ignore: ['one'] + } + ], + errors: ['`slot` attributes are deprecated.'] } ] }) From a637815082e6a275432c59afe709f6ba2358f0fd Mon Sep 17 00:00:00 2001 From: Kazuma Ohashi Date: Tue, 14 Nov 2023 19:01:40 +0900 Subject: [PATCH 2/5] Update lib/rules/no-deprecated-slot-attribute.js Co-authored-by: Flo Edelmann --- lib/rules/no-deprecated-slot-attribute.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/rules/no-deprecated-slot-attribute.js b/lib/rules/no-deprecated-slot-attribute.js index e77310f03..f4c893538 100644 --- a/lib/rules/no-deprecated-slot-attribute.js +++ b/lib/rules/no-deprecated-slot-attribute.js @@ -21,7 +21,9 @@ module.exports = { type: 'object', properties: { ignore: { - type: 'array' + type: 'array', + items: { type: 'string' }, + uniqueItems: true } }, additionalProperties: false From 847a0986d974e78ed66f21ce03857365a261b329 Mon Sep 17 00:00:00 2001 From: KazumaOhashi Date: Tue, 14 Nov 2023 19:27:25 +0900 Subject: [PATCH 3/5] Cover the conditions about Casings --- lib/rules/syntaxes/slot-attribute.js | 15 ++++++++++----- tests/lib/rules/no-deprecated-slot-attribute.js | 2 ++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/rules/syntaxes/slot-attribute.js b/lib/rules/syntaxes/slot-attribute.js index 713ff958a..57d567bc1 100644 --- a/lib/rules/syntaxes/slot-attribute.js +++ b/lib/rules/syntaxes/slot-attribute.js @@ -5,6 +5,7 @@ 'use strict' const canConvertToVSlot = require('./utils/can-convert-to-v-slot') +const casing = require('../../utils/casing') module.exports = { deprecated: '2.6.0', @@ -12,10 +13,8 @@ module.exports = { /** @param {RuleContext} context @returns {TemplateListener} */ createTemplateBodyVisitor(context) { const options = context.options[0] || {} - /** @type {string[]} */ - const ignore = Array.isArray(options.ignore) - ? options.ignore - : [options.ignore] + /** @type {Set} */ + const ignore = new Set(options.ignore) const sourceCode = context.getSourceCode() const tokenStore = @@ -101,9 +100,15 @@ module.exports = { * @returns {void} */ function reportSlot(slotAttr) { - if (ignore.includes(slotAttr.parent.parent.name)) { + const componentName = slotAttr.parent.parent.rawName + if ( + ignore.has(componentName) || + ignore.has(casing.pascalCase(componentName)) || + ignore.has(casing.kebabCase(componentName)) + ) { return } + context.report({ node: slotAttr.key, messageId: 'forbiddenSlotAttribute', diff --git a/tests/lib/rules/no-deprecated-slot-attribute.js b/tests/lib/rules/no-deprecated-slot-attribute.js index 6e0858e21..7f3bcbf0d 100644 --- a/tests/lib/rules/no-deprecated-slot-attribute.js +++ b/tests/lib/rules/no-deprecated-slot-attribute.js @@ -53,6 +53,8 @@ tester.run('no-deprecated-slot-attribute', rule, { + + `, options: [{ ignore: ['one', 'two', 'my-component'] }] From f3879f40c3aa73635e0266973c8e053d363af738 Mon Sep 17 00:00:00 2001 From: KazumaOhashi Date: Wed, 29 Nov 2023 19:06:38 +0900 Subject: [PATCH 4/5] Update document for options of vue/no-deprecated-slot-attribute --- docs/rules/no-deprecated-slot-attribute.md | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/docs/rules/no-deprecated-slot-attribute.md b/docs/rules/no-deprecated-slot-attribute.md index 59e2c068f..40090bb18 100644 --- a/docs/rules/no-deprecated-slot-attribute.md +++ b/docs/rules/no-deprecated-slot-attribute.md @@ -37,6 +37,49 @@ This rule reports deprecated `slot` attribute in Vue.js v2.6.0+. +## :wrench: Options + +```json +{ + "vue/no-deprecated-slot-attribute": ["error", { + "ignore": ["my-component"] + }] +} +``` + +- `"ignore"` (`string[]`) An array of tags that ignore this rules. This option will check both kebab-case and PascalCase versions of the given tag names. Default is empty. + +### `"ignore": ["my-component"]` + + + +```vue + +``` + + + ## :books: Further Reading - [API - slot](https://v2.vuejs.org/v2/api/#slot-deprecated) From b795bd8fba701513305087cd092597a3b04c4e81 Mon Sep 17 00:00:00 2001 From: KazumaOhashi Date: Wed, 29 Nov 2023 19:24:12 +0900 Subject: [PATCH 5/5] Fix typo --- docs/rules/no-deprecated-slot-attribute.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/rules/no-deprecated-slot-attribute.md b/docs/rules/no-deprecated-slot-attribute.md index 40090bb18..afe02f830 100644 --- a/docs/rules/no-deprecated-slot-attribute.md +++ b/docs/rules/no-deprecated-slot-attribute.md @@ -63,7 +63,7 @@ This rule reports deprecated `slot` attribute in Vue.js v2.6.0+. - + {{ props.title }}