Skip to content

Commit 084bfe3

Browse files
New: Add vue/no-invalid-model-keys rule (#1466)
* added no-invalid-model-keys rule * added no-invalid-model-keys to rules list * added no-invalid-model-keys tests * removed unused * added docs for no-invalid-model-keys * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <[email protected]> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <[email protected]> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <[email protected]> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <[email protected]> * Update lib/rules/no-invalid-model-keys.js Co-authored-by: Yosuke Ota <[email protected]> * Update lib/rules/no-invalid-model-keys.js Co-authored-by: Yosuke Ota <[email protected]> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <[email protected]> * Update no-invalid-model-keys.md * Update no-invalid-model-keys.js * Update no-invalid-model-keys.js * Update no-invalid-model-keys.js * Update no-invalid-model-keys.js Co-authored-by: Alex Sokolov <[email protected]> Co-authored-by: Yosuke Ota <[email protected]>
1 parent 26d9920 commit 084bfe3

File tree

4 files changed

+311
-0
lines changed

4 files changed

+311
-0
lines changed

docs/rules/no-invalid-model-keys.md

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
---
2+
pageClass: rule-details
3+
sidebarDepth: 0
4+
title: vue/no-invalid-model-keys
5+
description: require valid keys in model option
6+
---
7+
# vue/no-invalid-model-keys
8+
9+
> require valid keys in model option
10+
11+
12+
## :book: Rule Details
13+
14+
This rule is aimed at preventing invalid keys in model option.
15+
16+
<eslint-code-block :rules="{'vue/no-invalid-model-keys': ['error']}">
17+
```vue
18+
<script>
19+
/* ✓ GOOD */
20+
export default {
21+
model: {
22+
prop: 'list',
23+
}
24+
}
25+
</script>
26+
```
27+
</eslint-code-block>
28+
29+
<eslint-code-block :rules="{'vue/no-invalid-model-keys': ['error']}">
30+
```vue
31+
<script>
32+
/* ✓ GOOD */
33+
export default {
34+
model: {
35+
event: 'update'
36+
}
37+
}
38+
</script>
39+
```
40+
</eslint-code-block>
41+
42+
<eslint-code-block :rules="{'vue/no-invalid-model-keys': ['error']}">
43+
```vue
44+
<script>
45+
/* ✓ GOOD */
46+
export default {
47+
model: {
48+
prop: 'list',
49+
event: 'update'
50+
}
51+
}
52+
</script>
53+
```
54+
</eslint-code-block>
55+
56+
<eslint-code-block :rules="{'vue/no-invalid-model-keys': ['error']}">
57+
```vue
58+
<script>
59+
/* ✗ BAD */
60+
export default {
61+
model: {
62+
prop: 'list',
63+
events: 'update'
64+
}
65+
}
66+
</script>
67+
```
68+
</eslint-code-block>
69+
70+
<eslint-code-block :rules="{'vue/no-invalid-model-keys': ['error']}">
71+
```vue
72+
<script>
73+
/* ✗ BAD */
74+
export default {
75+
model: {
76+
props: 'list',
77+
events: 'update'
78+
}
79+
}
80+
</script>
81+
```
82+
</eslint-code-block>
83+
84+
<eslint-code-block :rules="{'vue/no-invalid-model-keys': ['error']}">
85+
```vue
86+
<script>
87+
/* ✗ BAD */
88+
export default {
89+
model: {
90+
name: 'checked',
91+
props: 'list',
92+
event: 'update'
93+
}
94+
}
95+
</script>
96+
```
97+
</eslint-code-block>
98+
99+
100+
## :mag: Implementation
101+
102+
- [Rule source](https://github.com/vuejs/eslint-plugin-vue/blob/master/lib/rules/no-invalid-model-keys.js)
103+
- [Test source](https://github.com/vuejs/eslint-plugin-vue/blob/master/tests/lib/rules/no-invalid-model-keys.js)

lib/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ module.exports = {
8181
'no-empty-component-block': require('./rules/no-empty-component-block'),
8282
'no-empty-pattern': require('./rules/no-empty-pattern'),
8383
'no-extra-parens': require('./rules/no-extra-parens'),
84+
'no-invalid-model-keys': require('./rules/no-invalid-model-keys'),
8485
'no-irregular-whitespace': require('./rules/no-irregular-whitespace'),
8586
'no-lifecycle-after-await': require('./rules/no-lifecycle-after-await'),
8687
'no-lone-template': require('./rules/no-lone-template'),

lib/rules/no-invalid-model-keys.js

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/**
2+
* @fileoverview Requires valid keys in model option.
3+
* @author Alex Sokolov
4+
*/
5+
'use strict'
6+
7+
const utils = require('../utils')
8+
9+
/**
10+
* @typedef {import('../utils').GroupName} GroupName
11+
*/
12+
13+
// ------------------------------------------------------------------------------
14+
// Rule Definition
15+
// ------------------------------------------------------------------------------
16+
/** @type {GroupName[]} */
17+
const GROUP_NAMES = ['model']
18+
19+
const VALID_MODEL_KEYS = ['prop', 'event']
20+
21+
module.exports = {
22+
meta: {
23+
type: 'problem',
24+
docs: {
25+
description: 'require valid keys in model option',
26+
categories: undefined,
27+
url: 'https://eslint.vuejs.org/rules/no-invalid-model-keys.html'
28+
},
29+
fixable: null,
30+
schema: []
31+
},
32+
/** @param {RuleContext} context */
33+
create(context) {
34+
const groups = new Set(GROUP_NAMES)
35+
36+
// ----------------------------------------------------------------------
37+
// Public
38+
// ----------------------------------------------------------------------
39+
40+
return utils.executeOnVue(context, (obj) => {
41+
const properties = utils.iterateProperties(obj, groups)
42+
43+
for (const o of properties) {
44+
if (VALID_MODEL_KEYS.indexOf(o.name) === -1) {
45+
context.report({
46+
node: o.node,
47+
message: "Invalid key '{{name}}' in model option.",
48+
data: {
49+
name: o.name
50+
}
51+
})
52+
}
53+
}
54+
})
55+
}
56+
}
+151
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/**
2+
* @fileoverview Prevents invalid keys in model option.
3+
* @author Alex Sokolov
4+
*/
5+
'use strict'
6+
7+
// ------------------------------------------------------------------------------
8+
// Requirements
9+
// ------------------------------------------------------------------------------
10+
11+
const rule = require('../../../lib/rules/no-invalid-model-keys')
12+
const RuleTester = require('eslint').RuleTester
13+
14+
// ------------------------------------------------------------------------------
15+
// Tests
16+
// ------------------------------------------------------------------------------
17+
18+
const ruleTester = new RuleTester({
19+
parserOptions: {
20+
ecmaVersion: 2018,
21+
sourceType: 'module'
22+
}
23+
})
24+
ruleTester.run('no-invalid-model-keys', rule, {
25+
valid: [
26+
{
27+
filename: 'test.vue',
28+
code: `
29+
export default {
30+
model: {
31+
prop: 'list'
32+
}
33+
}
34+
`
35+
},
36+
{
37+
filename: 'test.vue',
38+
code: `
39+
export default {
40+
model: {
41+
event: 'update'
42+
}
43+
}
44+
`
45+
},
46+
{
47+
filename: 'test.vue',
48+
code: `
49+
export default {
50+
model: {
51+
prop: 'list',
52+
event: 'update'
53+
}
54+
}
55+
`
56+
}
57+
],
58+
59+
invalid: [
60+
{
61+
filename: 'test.vue',
62+
code: `
63+
export default {
64+
model: {
65+
props: 'list'
66+
}
67+
}
68+
`,
69+
errors: ["Invalid key 'props' in model option."]
70+
},
71+
{
72+
filename: 'test.vue',
73+
code: `
74+
export default {
75+
model: {
76+
events: 'update'
77+
}
78+
}
79+
`,
80+
errors: ["Invalid key 'events' in model option."]
81+
},
82+
{
83+
filename: 'test.vue',
84+
code: `
85+
export default {
86+
model: {
87+
props: 'list',
88+
event: 'update'
89+
}
90+
}
91+
`,
92+
errors: ["Invalid key 'props' in model option."]
93+
},
94+
{
95+
filename: 'test.vue',
96+
code: `
97+
export default {
98+
model: {
99+
prop: 'list',
100+
events: 'update'
101+
}
102+
}
103+
`,
104+
errors: ["Invalid key 'events' in model option."]
105+
},
106+
{
107+
filename: 'test.vue',
108+
code: `
109+
export default {
110+
model: {
111+
props: 'list',
112+
events: 'update'
113+
}
114+
}
115+
`,
116+
errors: [
117+
"Invalid key 'props' in model option.",
118+
"Invalid key 'events' in model option."
119+
]
120+
},
121+
{
122+
filename: 'test.vue',
123+
code: `
124+
export default {
125+
model: {
126+
prop: 'checked',
127+
props: 'list',
128+
event: 'update'
129+
}
130+
}
131+
`,
132+
errors: ["Invalid key 'props' in model option."]
133+
},
134+
{
135+
filename: 'test.vue',
136+
code: `
137+
export default {
138+
model: {
139+
name: 'checked',
140+
props: 'list',
141+
event: 'update'
142+
}
143+
}
144+
`,
145+
errors: [
146+
"Invalid key 'name' in model option.",
147+
"Invalid key 'props' in model option."
148+
]
149+
}
150+
]
151+
})

0 commit comments

Comments
 (0)