File tree 4 files changed +311
-0
lines changed
4 files changed +311
-0
lines changed Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change @@ -81,6 +81,7 @@ module.exports = {
81
81
'no-empty-component-block' : require ( './rules/no-empty-component-block' ) ,
82
82
'no-empty-pattern' : require ( './rules/no-empty-pattern' ) ,
83
83
'no-extra-parens' : require ( './rules/no-extra-parens' ) ,
84
+ 'no-invalid-model-keys' : require ( './rules/no-invalid-model-keys' ) ,
84
85
'no-irregular-whitespace' : require ( './rules/no-irregular-whitespace' ) ,
85
86
'no-lifecycle-after-await' : require ( './rules/no-lifecycle-after-await' ) ,
86
87
'no-lone-template' : require ( './rules/no-lone-template' ) ,
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ } )
You can’t perform that action at this time.
0 commit comments