Skip to content

Commit bd770c2

Browse files
przemkowota-meshi
andauthored
feat(RFC0015): add no-deprecated-filter rule (#1043)
Co-authored-by: Yosuke Ota <[email protected]>
1 parent ef95155 commit bd770c2

File tree

5 files changed

+167
-0
lines changed

5 files changed

+167
-0
lines changed

Diff for: docs/rules/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ For example:
160160
| [vue/match-component-file-name](./match-component-file-name.md) | require component name property to match its file name | |
161161
| [vue/max-len](./max-len.md) | enforce a maximum line length | |
162162
| [vue/no-boolean-default](./no-boolean-default.md) | disallow boolean defaults | :wrench: |
163+
| [vue/no-deprecated-filter](./no-deprecated-filter.md) | disallow using deprecated filters syntax | |
163164
| [vue/no-deprecated-scope-attribute](./no-deprecated-scope-attribute.md) | disallow deprecated `scope` attribute (in Vue.js 2.5.0+) | :wrench: |
164165
| [vue/no-deprecated-slot-attribute](./no-deprecated-slot-attribute.md) | disallow deprecated `slot` attribute (in Vue.js 2.6.0+) | :wrench: |
165166
| [vue/no-deprecated-slot-scope-attribute](./no-deprecated-slot-scope-attribute.md) | disallow deprecated `slot-scope` attribute (in Vue.js 2.6.0+) | :wrench: |

Diff for: docs/rules/no-deprecated-filter.md

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
---
2+
pageClass: rule-details
3+
sidebarDepth: 0
4+
title: vue/no-deprecated-filter
5+
description: disallow using deprecated filters syntax
6+
---
7+
# vue/no-deprecated-filter
8+
> disallow using deprecated filters syntax
9+
10+
11+
## :book: Rule Details
12+
13+
This rule reports deprecated `filters` syntax (removed in Vue.js v3.0.0+)
14+
15+
<eslint-code-block :rules="{'vue/no-deprecated-filter': ['error']}">
16+
17+
```vue
18+
<template>
19+
<!-- ✓ GOOD -->
20+
{{ filter(msg) }}
21+
{{ filter(msg, '€') }}
22+
{{ filterB(filterA(msg)) }}
23+
<div v-bind:id="filter(msg)"></div>
24+
<div v-bind:id="filter(msg, '€')"></div>
25+
<div v-bind:id="filterB(filterA(msg))"></div>
26+
27+
<!-- ✗ BAD -->
28+
{{ msg | filter }}
29+
{{ msg | filter('€') }}
30+
{{ msg | filterA | filterB }}
31+
<div v-bind:id="msg | filter"></div>
32+
<div v-bind:id="msg | filter('€')"></div>
33+
<div v-bind:id="msg | filterA | filterB"></div>
34+
</template>
35+
```
36+
37+
</eslint-code-block>
38+
39+
### :wrench: Options
40+
41+
Nothing.
42+
43+
## :books: Further Reading
44+
45+
- [Vue RFCs - Remove support for filters.](https://github.com/vuejs/rfcs/blob/master/active-rfcs/0015-remove-filters.md)
46+
47+
## :mag: Implementation
48+
49+
- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-deprecated-filter.js)
50+
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-deprecated-filter.js)

Diff for: lib/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ module.exports = {
3939
'no-async-in-computed-properties': require('./rules/no-async-in-computed-properties'),
4040
'no-boolean-default': require('./rules/no-boolean-default'),
4141
'no-confusing-v-for-v-if': require('./rules/no-confusing-v-for-v-if'),
42+
'no-deprecated-filter': require('./rules/no-deprecated-filter'),
4243
'no-custom-modifiers-on-v-model': require('./rules/no-custom-modifiers-on-v-model'),
4344
'no-deprecated-scope-attribute': require('./rules/no-deprecated-scope-attribute'),
4445
'no-deprecated-slot-attribute': require('./rules/no-deprecated-slot-attribute'),

Diff for: lib/rules/no-deprecated-filter.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* @author Przemyslaw Falowski (@przemkow)
3+
* @fileoverview disallow using deprecated filters syntax
4+
*/
5+
'use strict'
6+
7+
// ------------------------------------------------------------------------------
8+
// Requirements
9+
// ------------------------------------------------------------------------------
10+
11+
const utils = require('../utils')
12+
13+
// ------------------------------------------------------------------------------
14+
// Rule Definition
15+
// ------------------------------------------------------------------------------
16+
17+
module.exports = {
18+
meta: {
19+
type: 'problem',
20+
docs: {
21+
description: 'disallow using deprecated filters syntax',
22+
category: undefined,
23+
url: 'https://eslint.vuejs.org/rules/no-deprecated-filter.html'
24+
},
25+
fixable: null,
26+
schema: [],
27+
messages: {
28+
noDeprecatedFilter: 'Filters are deprecated.'
29+
}
30+
},
31+
32+
create: function (context) {
33+
return utils.defineTemplateBodyVisitor(context, {
34+
'VFilterSequenceExpression' (node) {
35+
context.report({
36+
node,
37+
loc: node.loc,
38+
messageId: 'noDeprecatedFilter'
39+
})
40+
}
41+
})
42+
}
43+
}

Diff for: tests/lib/rules/no-deprecated-filter.js

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/**
2+
* @author Przemyslaw Falowski (@przemkow)
3+
* @fileoverview disallow using deprecated filters syntax
4+
*/
5+
'use strict'
6+
7+
// ------------------------------------------------------------------------------
8+
// Requirements
9+
// ------------------------------------------------------------------------------
10+
11+
const rule = require('../../../lib/rules/no-deprecated-filter')
12+
const RuleTester = require('eslint').RuleTester
13+
14+
// ------------------------------------------------------------------------------
15+
// Tests
16+
// ------------------------------------------------------------------------------
17+
18+
const ruleTester = new RuleTester({
19+
parser: require.resolve('vue-eslint-parser'),
20+
parserOptions: { ecmaVersion: 2015 }
21+
})
22+
23+
ruleTester.run('no-deprecated-filter', rule, {
24+
valid: [
25+
{
26+
filename: 'test.vue',
27+
code: '<template>{{ msg }}</template>'
28+
},
29+
{
30+
filename: 'test.vue',
31+
code: '<template>{{ method(msg) }}</template>'
32+
}
33+
],
34+
35+
invalid: [
36+
{
37+
filename: 'test.vue',
38+
code: '<template>{{ msg | filter }}</template>',
39+
errors: ['Filters are deprecated.']
40+
},
41+
{
42+
filename: 'test.vue',
43+
code: '<template>{{ msg | filter(x) }}</template>',
44+
errors: ['Filters are deprecated.']
45+
},
46+
{
47+
filename: 'test.vue',
48+
code: '<template>{{ msg | filterA | filterB }}</template>',
49+
errors: ['Filters are deprecated.']
50+
},
51+
{
52+
filename: 'test.vue',
53+
code: '<template><div v-for="msg in messages">{{ msg | filter }}</div></template>',
54+
errors: ['Filters are deprecated.']
55+
},
56+
{
57+
filename: 'test.vue',
58+
code: '<template><div v-bind:id="msg | filter"></div></template>',
59+
errors: ['Filters are deprecated.']
60+
},
61+
{
62+
filename: 'test.vue',
63+
code: '<template><div v-bind:id="msg | filter(aaa)"></div></template>',
64+
errors: ['Filters are deprecated.']
65+
},
66+
{
67+
filename: 'test.vue',
68+
code: '<template><div v-bind:id="msg | filterA | filterB"></div></template>',
69+
errors: ['Filters are deprecated.']
70+
}
71+
]
72+
})

0 commit comments

Comments
 (0)