From 4c58085f00c116331998cd804faeb25a697774e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sajn=C3=B3g?= Date: Sun, 11 Nov 2018 01:43:24 +0100 Subject: [PATCH 1/2] Fix #614 - Improve errors in valid-v-on, detect forbidden keywords --- lib/rules/valid-v-on.js | 27 +++++++++++++++++++++------ tests/lib/rules/valid-v-on.js | 14 ++++++++++++-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/rules/valid-v-on.js b/lib/rules/valid-v-on.js index 13073d9ab..df8e963d0 100644 --- a/lib/rules/valid-v-on.js +++ b/lib/rules/valid-v-on.js @@ -136,6 +136,7 @@ module.exports = { create (context) { const options = context.options[0] || {} const customModifiers = new Set(options.modifiers || []) + const sourceCode = context.getSourceCode() return utils.defineTemplateBodyVisitor(context, { "VAttribute[directive=true][key.name='on']" (node) { @@ -149,12 +150,26 @@ module.exports = { }) } } - if (!utils.hasAttributeValue(node) && !node.key.modifiers.some(VERB_MODIFIERS.has, VERB_MODIFIERS)) { - context.report({ - node, - loc: node.loc, - message: "'v-on' directives require that attribute value or verb modifiers." - }) + + if ( + !utils.hasAttributeValue(node) && + !node.key.modifiers.some(VERB_MODIFIERS.has, VERB_MODIFIERS) + ) { + if (node.value && sourceCode.getText(node.value.expression)) { + const value = sourceCode.getText(node.value) + context.report({ + node, + loc: node.loc, + message: 'Avoid using JavaScript keyword as "v-on" value: {{value}}.', + data: { value } + }) + } else { + context.report({ + node, + loc: node.loc, + message: "'v-on' directives require a value or verb modifiers (like 'stop' or 'prevent')." + }) + } } } }) diff --git a/tests/lib/rules/valid-v-on.js b/tests/lib/rules/valid-v-on.js index f24e10dcf..f02f748cc 100644 --- a/tests/lib/rules/valid-v-on.js +++ b/tests/lib/rules/valid-v-on.js @@ -107,12 +107,12 @@ tester.run('valid-v-on', rule, { { filename: 'test.vue', code: '', - errors: ["'v-on' directives require that attribute value or verb modifiers."] + errors: ["'v-on' directives require a value or verb modifiers (like 'stop' or 'prevent')."] }, { filename: 'test.vue', code: '', - errors: ["'v-on' directives require that attribute value or verb modifiers."] + errors: ["'v-on' directives require a value or verb modifiers (like 'stop' or 'prevent')."] }, { filename: 'test.vue', @@ -125,6 +125,16 @@ tester.run('valid-v-on', rule, { code: '', errors: ["'v-on' directives don't support the modifier 'bar'."], options: [{ modifiers: ['aaa'] }] + }, + { + filename: 'test.vue', + code: '', + errors: ['Avoid using JavaScript keyword as "v-on" value: "const".'] + }, + { + filename: 'test.vue', + code: '', + errors: ['Avoid using JavaScript keyword as "v-on" value: "delete".'] } ] }) From df6b8e5b0a4bd35b210086437a849161144288dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sajn=C3=B3g?= Date: Sun, 11 Nov 2018 02:47:29 +0100 Subject: [PATCH 2/2] 614 - Update error message --- lib/rules/valid-v-on.js | 2 +- tests/lib/rules/valid-v-on.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/rules/valid-v-on.js b/lib/rules/valid-v-on.js index df8e963d0..fceec8c3c 100644 --- a/lib/rules/valid-v-on.js +++ b/lib/rules/valid-v-on.js @@ -167,7 +167,7 @@ module.exports = { context.report({ node, loc: node.loc, - message: "'v-on' directives require a value or verb modifiers (like 'stop' or 'prevent')." + message: "'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')." }) } } diff --git a/tests/lib/rules/valid-v-on.js b/tests/lib/rules/valid-v-on.js index f02f748cc..87420ef3e 100644 --- a/tests/lib/rules/valid-v-on.js +++ b/tests/lib/rules/valid-v-on.js @@ -107,12 +107,12 @@ tester.run('valid-v-on', rule, { { filename: 'test.vue', code: '', - errors: ["'v-on' directives require a value or verb modifiers (like 'stop' or 'prevent')."] + errors: ["'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')."] }, { filename: 'test.vue', code: '', - errors: ["'v-on' directives require a value or verb modifiers (like 'stop' or 'prevent')."] + errors: ["'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')."] }, { filename: 'test.vue',