File tree Expand file tree Collapse file tree 4 files changed +311
-0
lines changed Expand file tree Collapse file tree 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 = {
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' ) ,
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