Skip to content

Commit

Permalink
Add vue/no-deprecated-dollar-listeners-api rule (#1133)
Browse files Browse the repository at this point in the history
  • Loading branch information
ota-meshi committed May 16, 2020
1 parent d78ec7d commit 22bb2c2
Show file tree
Hide file tree
Showing 7 changed files with 303 additions and 1 deletion.
1 change: 1 addition & 0 deletions docs/rules/README.md
Expand Up @@ -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+) | |
Expand Down
51 changes: 51 additions & 0 deletions 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+).

<eslint-code-block :rules="{'vue/no-deprecated-dollar-listeners-api': ['error']}">

```vue
<template>
<!-- ✗ BAD -->
<MyInput v-on="$listeners">
</template>
<script>
export default {
computed: {
listeners() {
return {
/* ✗ BAD */
...this.$listeners,
input() { /* */ }
}
}
}
}
</script>
```

</eslint-code-block>

## :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)
1 change: 1 addition & 0 deletions lib/configs/vue3-essential.js
Expand Up @@ -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',
Expand Down
1 change: 1 addition & 0 deletions lib/index.js
Expand Up @@ -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'),
Expand Down
65 changes: 65 additions & 0 deletions 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'
})
}
}
)
)
}
}
184 changes: 184 additions & 0 deletions 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: `
<template>
<div v-bind="$attrs"/>
</template>
<script>
export default {
mounted () {
this.$emit('start')
}
}
</script>
`
},
{
filename: 'test.vue',
code: `
<script>
export default {
methods: {
click () {
this.$emit('click')
}
}
}
</script>
`
},
{
filename: 'test.vue',
code: `
<script>
export default {
}
const another = function () {
console.log(this.$listeners)
}
</script>
`
},
{
filename: 'test.vue',
code: `
<template>
<div foo="$listeners"/>
</template>
`
},
{
filename: 'test.vue',
code: `
<template>
<div v-on="() => {
function click ($listeners) {
fn(foo.$listeners)
fn($listeners)
}
}"/>
<div v-for="$listeners in list">
<div v-on="$listeners">
</div>
<VueComp>
<template v-slot="{$listeners}">
<div v-on="$listeners">
</template>
</VueComp>
</template>
<script>
export default {
methods: {
click ($listeners) {
foo.$listeners
}
}
}
</script>
`
}
],

invalid: [
{
filename: 'test.vue',
code: `
<template>
<div v-on="$listeners"/>
</template>
<script>
export default {
computed: {
foo () {
return this.$listeners
}
}
}
</script>
`,
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: `
<template>
<div v-for="listener in $listeners"/>
<div :foo="$listeners"/>
</template>
<script>
export default {
computed: {
foo () {
fn(this.$listeners)
}
}
}
</script>
`,
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
}
]
}
]
})
1 change: 0 additions & 1 deletion 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
Expand Down

0 comments on commit 22bb2c2

Please sign in to comment.