Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 084bfe3

Browse files
Alex-Sokolovota-meshi
andauthored
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 <otameshiyo23@gmail.com> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com> * Update lib/rules/no-invalid-model-keys.js Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com> * Update lib/rules/no-invalid-model-keys.js Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com> * Update docs/rules/no-invalid-model-keys.md Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com> * 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 <4497128+Alex-Sokolov@users.noreply.github.com> Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com>
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‎

Lines changed: 103 additions & 0 deletions
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‎

Lines changed: 1 addition & 0 deletions
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‎

Lines changed: 56 additions & 0 deletions
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+
}
Lines changed: 151 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /