Skip to content

Commit dcaccd5

Browse files
authored
Fix #614 - Improve errors in valid-v-on, detect forbidden keywords (#642)
* Fix #614 - Improve errors in valid-v-on, detect forbidden keywords * 614 - Update error message
1 parent 501a409 commit dcaccd5

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

Diff for: lib/rules/valid-v-on.js

+21-6
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ module.exports = {
136136
create (context) {
137137
const options = context.options[0] || {}
138138
const customModifiers = new Set(options.modifiers || [])
139+
const sourceCode = context.getSourceCode()
139140

140141
return utils.defineTemplateBodyVisitor(context, {
141142
"VAttribute[directive=true][key.name='on']" (node) {
@@ -149,12 +150,26 @@ module.exports = {
149150
})
150151
}
151152
}
152-
if (!utils.hasAttributeValue(node) && !node.key.modifiers.some(VERB_MODIFIERS.has, VERB_MODIFIERS)) {
153-
context.report({
154-
node,
155-
loc: node.loc,
156-
message: "'v-on' directives require that attribute value or verb modifiers."
157-
})
153+
154+
if (
155+
!utils.hasAttributeValue(node) &&
156+
!node.key.modifiers.some(VERB_MODIFIERS.has, VERB_MODIFIERS)
157+
) {
158+
if (node.value && sourceCode.getText(node.value.expression)) {
159+
const value = sourceCode.getText(node.value)
160+
context.report({
161+
node,
162+
loc: node.loc,
163+
message: 'Avoid using JavaScript keyword as "v-on" value: {{value}}.',
164+
data: { value }
165+
})
166+
} else {
167+
context.report({
168+
node,
169+
loc: node.loc,
170+
message: "'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')."
171+
})
172+
}
158173
}
159174
}
160175
})

Diff for: tests/lib/rules/valid-v-on.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ tester.run('valid-v-on', rule, {
107107
{
108108
filename: 'test.vue',
109109
code: '<template><div v-on:click></div></template>',
110-
errors: ["'v-on' directives require that attribute value or verb modifiers."]
110+
errors: ["'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')."]
111111
},
112112
{
113113
filename: 'test.vue',
114114
code: '<template><div @click></div></template>',
115-
errors: ["'v-on' directives require that attribute value or verb modifiers."]
115+
errors: ["'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')."]
116116
},
117117
{
118118
filename: 'test.vue',
@@ -125,6 +125,16 @@ tester.run('valid-v-on', rule, {
125125
code: '<template><div @keydown.bar.aaa="foo"></div></template>',
126126
errors: ["'v-on' directives don't support the modifier 'bar'."],
127127
options: [{ modifiers: ['aaa'] }]
128+
},
129+
{
130+
filename: 'test.vue',
131+
code: '<template><div @click="const"></div></template>',
132+
errors: ['Avoid using JavaScript keyword as "v-on" value: "const".']
133+
},
134+
{
135+
filename: 'test.vue',
136+
code: '<template><div @click="delete"></div></template>',
137+
errors: ['Avoid using JavaScript keyword as "v-on" value: "delete".']
128138
}
129139
]
130140
})

0 commit comments

Comments
 (0)