From 22bb2c22d4f783a69b579e5d25ce223d052373e1 Mon Sep 17 00:00:00 2001 From: Yosuke Ota Date: Sat, 16 May 2020 17:32:42 +0900 Subject: [PATCH] Add `vue/no-deprecated-dollar-listeners-api` rule (#1133) --- docs/rules/README.md | 1 + .../no-deprecated-dollar-listeners-api.md | 51 +++++ lib/configs/vue3-essential.js | 1 + lib/index.js | 1 + .../no-deprecated-dollar-listeners-api.js | 65 +++++++ .../no-deprecated-dollar-listeners-api.js | 184 ++++++++++++++++++ tests/lib/rules/no-deprecated-events-api.js | 1 - 7 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 docs/rules/no-deprecated-dollar-listeners-api.md create mode 100644 lib/rules/no-deprecated-dollar-listeners-api.js create mode 100644 tests/lib/rules/no-deprecated-dollar-listeners-api.js diff --git a/docs/rules/README.md b/docs/rules/README.md index a6f2627ea..6ff3780de 100644 --- a/docs/rules/README.md +++ b/docs/rules/README.md @@ -40,6 +40,7 @@ Enforce all the rules in this category, as well as all higher priority rules, wi |:--------|:------------|:---| | [vue/no-async-in-computed-properties](./no-async-in-computed-properties.md) | disallow asynchronous actions in computed properties | | | [vue/no-deprecated-data-object-declaration](./no-deprecated-data-object-declaration.md) | disallow using deprecated object declaration on data (in Vue.js 3.0.0+) | :wrench: | +| [vue/no-deprecated-dollar-listeners-api](./no-deprecated-dollar-listeners-api.md) | disallow using deprecated `$listeners` (in Vue.js 3.0.0+) | | | [vue/no-deprecated-events-api](./no-deprecated-events-api.md) | disallow using deprecated events api (in Vue.js 3.0.0+) | | | [vue/no-deprecated-filter](./no-deprecated-filter.md) | disallow using deprecated filters syntax (in Vue.js 3.0.0+) | | | [vue/no-deprecated-functional-template](./no-deprecated-functional-template.md) | disallow using deprecated the `functional` template (in Vue.js 3.0.0+) | | diff --git a/docs/rules/no-deprecated-dollar-listeners-api.md b/docs/rules/no-deprecated-dollar-listeners-api.md new file mode 100644 index 000000000..99097e15d --- /dev/null +++ b/docs/rules/no-deprecated-dollar-listeners-api.md @@ -0,0 +1,51 @@ +--- +pageClass: rule-details +sidebarDepth: 0 +title: vue/no-deprecated-dollar-listeners-api +description: disallow using deprecated `$listeners` (in Vue.js 3.0.0+) +--- +# vue/no-deprecated-dollar-listeners-api +> disallow using deprecated `$listeners` (in Vue.js 3.0.0+) + +- :gear: This rule is included in all of `"plugin:vue/vue3-essential"`, `"plugin:vue/vue3-strongly-recommended"` and `"plugin:vue/vue3-recommended"`. + +## :book: Rule Details + +This rule reports use of deprecated `$listeners`. (in Vue.js 3.0.0+). + + + +```vue + + +``` + + + +## :wrench: Options + +Nothing. + +## :books: Further reading + +- [Vue RFCs - 0031-attr-fallthrough](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0031-attr-fallthrough.md) + +## :mag: Implementation + +- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-deprecated-dollar-listeners-api.js) +- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-deprecated-dollar-listeners-api.js) diff --git a/lib/configs/vue3-essential.js b/lib/configs/vue3-essential.js index 93e4996ba..64d5eb72e 100644 --- a/lib/configs/vue3-essential.js +++ b/lib/configs/vue3-essential.js @@ -8,6 +8,7 @@ module.exports = { rules: { 'vue/no-async-in-computed-properties': 'error', 'vue/no-deprecated-data-object-declaration': 'error', + 'vue/no-deprecated-dollar-listeners-api': 'error', 'vue/no-deprecated-events-api': 'error', 'vue/no-deprecated-filter': 'error', 'vue/no-deprecated-functional-template': 'error', diff --git a/lib/index.js b/lib/index.js index 9faa91636..63a16b25c 100644 --- a/lib/index.js +++ b/lib/index.js @@ -41,6 +41,7 @@ module.exports = { 'no-confusing-v-for-v-if': require('./rules/no-confusing-v-for-v-if'), 'no-custom-modifiers-on-v-model': require('./rules/no-custom-modifiers-on-v-model'), 'no-deprecated-data-object-declaration': require('./rules/no-deprecated-data-object-declaration'), + 'no-deprecated-dollar-listeners-api': require('./rules/no-deprecated-dollar-listeners-api'), 'no-deprecated-events-api': require('./rules/no-deprecated-events-api'), 'no-deprecated-filter': require('./rules/no-deprecated-filter'), 'no-deprecated-functional-template': require('./rules/no-deprecated-functional-template'), diff --git a/lib/rules/no-deprecated-dollar-listeners-api.js b/lib/rules/no-deprecated-dollar-listeners-api.js new file mode 100644 index 000000000..29c0655d0 --- /dev/null +++ b/lib/rules/no-deprecated-dollar-listeners-api.js @@ -0,0 +1,65 @@ +/** + * @author Yosuke Ota + * See LICENSE file in root directory for full license. + */ +'use strict' + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +const utils = require('../utils') + +// ------------------------------------------------------------------------------ +// Rule Definition +// ------------------------------------------------------------------------------ + +module.exports = { + meta: { + type: 'problem', + docs: { + description: 'disallow using deprecated `$listeners` (in Vue.js 3.0.0+)', + categories: ['vue3-essential'], + url: 'https://eslint.vuejs.org/rules/no-deprecated-dollar-listeners-api.html' + }, + fixable: null, + schema: [], + messages: { + deprecated: 'The `$listeners` is deprecated.' + } + }, + + create (context) { + return utils.defineTemplateBodyVisitor( + context, + { + 'VExpressionContainer' (node) { + for (const reference of node.references) { + if (reference.variable != null) { + // Not vm reference + continue + } + if (reference.id.name === '$listeners') { + context.report({ + node: reference.id, + messageId: 'deprecated' + }) + } + } + } + }, + utils.defineVueVisitor(context, + { + 'MemberExpression > ThisExpression' (node) { + if (node.parent.property.name !== '$listeners') return + + context.report({ + node: node.parent.property, + messageId: 'deprecated' + }) + } + } + ) + ) + } +} diff --git a/tests/lib/rules/no-deprecated-dollar-listeners-api.js b/tests/lib/rules/no-deprecated-dollar-listeners-api.js new file mode 100644 index 000000000..76f7c73cc --- /dev/null +++ b/tests/lib/rules/no-deprecated-dollar-listeners-api.js @@ -0,0 +1,184 @@ +/** + * @author Yosuke Ota + * See LICENSE file in root directory for full license. + */ +'use strict' + +// ------------------------------------------------------------------------------ +// Requirements +// ------------------------------------------------------------------------------ + +const rule = require('../../../lib/rules/no-deprecated-dollar-listeners-api') + +const RuleTester = require('eslint').RuleTester + +// ------------------------------------------------------------------------------ +// Tests +// ------------------------------------------------------------------------------ + +const ruleTester = new RuleTester({ + parser: require.resolve('vue-eslint-parser'), + parserOptions: { ecmaVersion: 2018, sourceType: 'module' } +}) +ruleTester.run('no-deprecated-dollar-listeners-api', rule, { + + valid: [ + { + filename: 'test.vue', + code: ` + + + ` + }, + { + filename: 'test.vue', + code: ` + + ` + }, + { + filename: 'test.vue', + code: ` + + ` + }, + { + filename: 'test.vue', + code: ` + + ` + }, + { + filename: 'test.vue', + code: ` + + + ` + } + ], + + invalid: [ + { + filename: 'test.vue', + code: ` + + + `, + errors: [ + { + line: 3, + column: 22, + messageId: 'deprecated', + endLine: 3, + endColumn: 32 + }, + { + line: 9, + column: 27, + messageId: 'deprecated', + endLine: 9, + endColumn: 37 + } + ] + }, + + { + filename: 'test.vue', + code: ` + + + `, + errors: [ + { + line: 3, + column: 35, + messageId: 'deprecated', + endLine: 3, + endColumn: 45 + }, + { + line: 4, + column: 22, + messageId: 'deprecated', + endLine: 4, + endColumn: 32 + }, + { + line: 10, + column: 23, + messageId: 'deprecated', + endLine: 10, + endColumn: 33 + } + ] + } + ] +}) diff --git a/tests/lib/rules/no-deprecated-events-api.js b/tests/lib/rules/no-deprecated-events-api.js index 59a6c685f..215a47d86 100644 --- a/tests/lib/rules/no-deprecated-events-api.js +++ b/tests/lib/rules/no-deprecated-events-api.js @@ -1,4 +1,3 @@ -/* eslint-disable eslint-plugin/consistent-output */ /** * @fileoverview disallow using deprecated events api * @author yoyo930021