diff --git a/docs/rules/valid-v-else-if.md b/docs/rules/valid-v-else-if.md index 85c33e55a..5b7b9f63c 100644 --- a/docs/rules/valid-v-else-if.md +++ b/docs/rules/valid-v-else-if.md @@ -32,9 +32,10 @@ This rule reports `v-else-if` directives in the following cases:
-
-
-
+
+
+
+
``` diff --git a/docs/rules/valid-v-else.md b/docs/rules/valid-v-else.md index 35b26ceea..b3424ad28 100644 --- a/docs/rules/valid-v-else.md +++ b/docs/rules/valid-v-else.md @@ -32,9 +32,10 @@ This rule reports `v-else` directives in the following cases:
-
-
-
+
+
+
+
``` diff --git a/lib/rules/valid-v-bind-sync.js b/lib/rules/valid-v-bind-sync.js index 945ab0a77..2a42e1b32 100644 --- a/lib/rules/valid-v-bind-sync.js +++ b/lib/rules/valid-v-bind-sync.js @@ -119,7 +119,6 @@ module.exports = { if (!isValidElement(element)) { context.report({ node, - loc: node.loc, messageId: 'unexpectedInvalidElement', data: { name } }) @@ -136,20 +135,17 @@ module.exports = { } if (isOptionalChainingMemberExpression(expression)) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedOptionalChaining' }) } else if (!isLhs(expression)) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedNonLhsExpression' }) } else if (maybeNullObjectMemberExpression(expression)) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedNullObject' }) } @@ -162,8 +158,7 @@ module.exports = { const variable = reference.variable if (variable) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedUpdateIterationVariable', data: { varName: id.name } }) diff --git a/lib/rules/valid-v-bind.js b/lib/rules/valid-v-bind.js index 385272f71..5b9339c1a 100644 --- a/lib/rules/valid-v-bind.js +++ b/lib/rules/valid-v-bind.js @@ -30,7 +30,12 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-bind.html' }, fixable: null, - schema: [] + schema: [], + messages: { + unsupportedModifier: + "'v-bind' directives don't support the modifier '{{name}}'.", + expectedValue: "'v-bind' directives require an attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -40,10 +45,8 @@ module.exports = { for (const modifier of node.key.modifiers) { if (!VALID_MODIFIERS.has(modifier.name)) { context.report({ - node, - loc: node.key.loc, - message: - "'v-bind' directives don't support the modifier '{{name}}'.", + node: modifier, + messageId: 'unsupportedModifier', data: { name: modifier.name } }) } @@ -52,8 +55,7 @@ module.exports = { if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, - message: "'v-bind' directives require an attribute value." + messageId: 'expectedValue' }) } } diff --git a/lib/rules/valid-v-cloak.js b/lib/rules/valid-v-cloak.js index 4fd51d781..efcaf6940 100644 --- a/lib/rules/valid-v-cloak.js +++ b/lib/rules/valid-v-cloak.js @@ -24,7 +24,12 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-cloak.html' }, fixable: null, - schema: [] + schema: [], + messages: { + unexpectedArgument: "'v-cloak' directives require no argument.", + unexpectedModifier: "'v-cloak' directives require no modifier.", + unexpectedValue: "'v-cloak' directives require no attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -33,23 +38,24 @@ module.exports = { "VAttribute[directive=true][key.name.name='cloak']"(node) { if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-cloak' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-cloak' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (node.value) { context.report({ - node, - loc: node.loc, - message: "'v-cloak' directives require no attribute value." + node: node.value, + messageId: 'unexpectedValue' }) } } diff --git a/lib/rules/valid-v-else-if.js b/lib/rules/valid-v-else-if.js index aafe97b1c..c2c0c8851 100644 --- a/lib/rules/valid-v-else-if.js +++ b/lib/rules/valid-v-else-if.js @@ -24,7 +24,18 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-else-if.html' }, fixable: null, - schema: [] + schema: [], + messages: { + missingVIf: + "'v-else-if' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive.", + withVIf: + "'v-else-if' and 'v-if' directives can't exist on the same element.", + withVElse: + "'v-else-if' and 'v-else' directives can't exist on the same element.", + unexpectedArgument: "'v-else-if' directives require no argument.", + unexpectedModifier: "'v-else-if' directives require no modifier.", + expectedValue: "'v-else-if' directives require that attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -36,46 +47,41 @@ module.exports = { if (!utils.prevElementHasIf(element)) { context.report({ node, - loc: node.loc, - message: - "'v-else-if' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive." + messageId: 'missingVIf' }) } if (utils.hasDirective(element, 'if')) { context.report({ node, - loc: node.loc, - message: - "'v-else-if' and 'v-if' directives can't exist on the same element." + messageId: 'withVIf' }) } if (utils.hasDirective(element, 'else')) { context.report({ node, - loc: node.loc, - message: - "'v-else-if' and 'v-else' directives can't exist on the same element." + messageId: 'withVElse' }) } if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-else-if' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-else-if' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, - message: "'v-else-if' directives require that attribute value." + messageId: 'expectedValue' }) } } diff --git a/lib/rules/valid-v-else.js b/lib/rules/valid-v-else.js index 7a8542787..7c4bd28aa 100644 --- a/lib/rules/valid-v-else.js +++ b/lib/rules/valid-v-else.js @@ -24,7 +24,18 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-else.html' }, fixable: null, - schema: [] + schema: [], + messages: { + missingVIf: + "'v-else' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive.", + withVIf: + "'v-else' and 'v-if' directives can't exist on the same element. You may want 'v-else-if' directives.", + withVElseIf: + "'v-else' and 'v-else-if' directives can't exist on the same element.", + unexpectedArgument: "'v-else' directives require no argument.", + unexpectedModifier: "'v-else' directives require no modifier.", + unexpectedValue: "'v-else' directives require no attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -36,46 +47,41 @@ module.exports = { if (!utils.prevElementHasIf(element)) { context.report({ node, - loc: node.loc, - message: - "'v-else' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive." + messageId: 'missingVIf' }) } if (utils.hasDirective(element, 'if')) { context.report({ node, - loc: node.loc, - message: - "'v-else' and 'v-if' directives can't exist on the same element. You may want 'v-else-if' directives." + messageId: 'withVIf' }) } if (utils.hasDirective(element, 'else-if')) { context.report({ node, - loc: node.loc, - message: - "'v-else' and 'v-else-if' directives can't exist on the same element." + messageId: 'withVElseIf' }) } if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-else' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-else' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (node.value) { context.report({ - node, - loc: node.loc, - message: "'v-else' directives require no attribute value." + node: node.value, + messageId: 'unexpectedValue' }) } } diff --git a/lib/rules/valid-v-for.js b/lib/rules/valid-v-for.js index 0d560aa91..0acf7dba2 100644 --- a/lib/rules/valid-v-for.js +++ b/lib/rules/valid-v-for.js @@ -84,16 +84,13 @@ function checkKey(context, vFor, element) { if (utils.isCustomComponent(element) && vBindKey == null) { context.report({ node: element.startTag, - loc: element.startTag.loc, - message: "Custom elements in iteration require 'v-bind:key' directives." + messageId: 'requireKey' }) } if (vBindKey != null && !isUsingIterationVar(vFor, vBindKey)) { context.report({ node: vBindKey, - loc: vBindKey.loc, - message: - "Expected 'v-bind:key' directive to use the variables which are defined by the 'v-for' directive." + messageId: 'keyUseFVorVars' }) } } @@ -111,7 +108,20 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-for.html' }, fixable: null, - schema: [] + schema: [], + messages: { + requireKey: + "Custom elements in iteration require 'v-bind:key' directives.", + keyUseFVorVars: + "Expected 'v-bind:key' directive to use the variables which are defined by the 'v-for' directive.", + unexpectedArgument: "'v-for' directives require no argument.", + unexpectedModifier: "'v-for' directives require no modifier.", + expectedValue: "'v-for' directives require that attribute value.", + unexpectedExpression: + "'v-for' directives require the special syntax ' in '.", + invalidEmptyAlias: "Invalid alias ''.", + invalidAlias: "Invalid alias '{{text}}'." + } }, /** @param {RuleContext} context */ create(context) { @@ -126,23 +136,24 @@ module.exports = { if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-for' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-for' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, - message: "'v-for' directives require that attribute value." + messageId: 'expectedValue' }) return } @@ -154,9 +165,7 @@ module.exports = { if (expr.type !== 'VForExpression') { context.report({ node: node.value, - loc: node.value.loc, - message: - "'v-for' directives require the special syntax ' in '." + messageId: 'unexpectedExpression' }) return } @@ -169,22 +178,20 @@ module.exports = { if (value === null) { context.report({ node: expr, - message: "Invalid alias ''." + messageId: 'invalidEmptyAlias' }) } if (key !== undefined && (!key || key.type !== 'Identifier')) { context.report({ node: key || expr, - loc: key && key.loc, - message: "Invalid alias '{{text}}'.", + messageId: 'invalidAlias', data: { text: key ? sourceCode.getText(key) : '' } }) } if (index !== undefined && (!index || index.type !== 'Identifier')) { context.report({ node: index || expr, - loc: index && index.loc, - message: "Invalid alias '{{text}}'.", + messageId: 'invalidAlias', data: { text: index ? sourceCode.getText(index) : '' } }) } diff --git a/lib/rules/valid-v-html.js b/lib/rules/valid-v-html.js index d88997682..be39026d0 100644 --- a/lib/rules/valid-v-html.js +++ b/lib/rules/valid-v-html.js @@ -24,7 +24,12 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-html.html' }, fixable: null, - schema: [] + schema: [], + messages: { + unexpectedArgument: "'v-html' directives require no argument.", + unexpectedModifier: "'v-html' directives require no modifier.", + expectedValue: "'v-html' directives require that attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -33,23 +38,24 @@ module.exports = { "VAttribute[directive=true][key.name.name='html']"(node) { if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-html' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-html' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, - message: "'v-html' directives require that attribute value." + messageId: 'expectedValue' }) } } diff --git a/lib/rules/valid-v-if.js b/lib/rules/valid-v-if.js index b61435ab0..7ac4287b3 100644 --- a/lib/rules/valid-v-if.js +++ b/lib/rules/valid-v-if.js @@ -24,7 +24,16 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-if.html' }, fixable: null, - schema: [] + schema: [], + messages: { + withVElse: + "'v-if' and 'v-else' directives can't exist on the same element. You may want 'v-else-if' directives.", + withVElseIf: + "'v-if' and 'v-else-if' directives can't exist on the same element.", + unexpectedArgument: "'v-if' directives require no argument.", + unexpectedModifier: "'v-if' directives require no modifier.", + expectedValue: "'v-if' directives require that attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -36,38 +45,35 @@ module.exports = { if (utils.hasDirective(element, 'else')) { context.report({ node, - loc: node.loc, - message: - "'v-if' and 'v-else' directives can't exist on the same element. You may want 'v-else-if' directives." + messageId: 'withVElse' }) } if (utils.hasDirective(element, 'else-if')) { context.report({ node, - loc: node.loc, - message: - "'v-if' and 'v-else-if' directives can't exist on the same element." + messageId: 'withVElseIf' }) } if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-if' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-if' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, - message: "'v-if' directives require that attribute value." + messageId: 'expectedValue' }) } } diff --git a/lib/rules/valid-v-is.js b/lib/rules/valid-v-is.js index 5c430ce1c..584d7574c 100644 --- a/lib/rules/valid-v-is.js +++ b/lib/rules/valid-v-is.js @@ -60,22 +60,23 @@ module.exports = { "VAttribute[directive=true][key.name.name='is']"(node) { if (node.key.argument) { context.report({ - node, - loc: node.loc, + node: node.key.argument, messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, messageId: 'unexpectedModifier' }) } if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, messageId: 'expectedValue' }) } @@ -86,7 +87,6 @@ module.exports = { const name = element.name context.report({ node, - loc: node.loc, messageId: 'ownerMustBeHTMLElement', data: { name } }) diff --git a/lib/rules/valid-v-model.js b/lib/rules/valid-v-model.js index adfe9c2da..eb8b63b2b 100644 --- a/lib/rules/valid-v-model.js +++ b/lib/rules/valid-v-model.js @@ -159,7 +159,6 @@ module.exports = { if (!isValidElement(element)) { context.report({ node, - loc: node.loc, messageId: 'unexpectedInvalidElement', data: { name } }) @@ -168,7 +167,6 @@ module.exports = { if (name === 'input' && utils.hasAttribute(element, 'type', 'file')) { context.report({ node, - loc: node.loc, messageId: 'unexpectedInputFile' }) } @@ -176,8 +174,7 @@ module.exports = { if (!utils.isCustomComponent(element)) { if (node.key.argument) { context.report({ - node, - loc: node.loc, + node: node.key.argument, messageId: 'unexpectedArgument' }) } @@ -185,8 +182,7 @@ module.exports = { for (const modifier of node.key.modifiers) { if (!VALID_MODIFIERS.has(modifier.name)) { context.report({ - node, - loc: node.loc, + node: modifier, messageId: 'unexpectedModifier', data: { name: modifier.name } }) @@ -197,7 +193,6 @@ module.exports = { if (!node.value || utils.isEmptyValueDirective(node, context)) { context.report({ node, - loc: node.loc, messageId: 'missingValue' }) return @@ -209,20 +204,17 @@ module.exports = { } if (isOptionalChainingMemberExpression(expression)) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedOptionalChaining' }) } else if (!isLhs(expression)) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedNonLhsExpression' }) } else if (maybeNullObjectMemberExpression(expression)) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedNullObject' }) } @@ -236,8 +228,7 @@ module.exports = { const variable = getVariable(id.name, element) if (variable != null) { context.report({ - node, - loc: node.loc, + node: expression, messageId: 'unexpectedUpdateIterationVariable', data: { varName: id.name } diff --git a/lib/rules/valid-v-on.js b/lib/rules/valid-v-on.js index 4d55d7f19..864a5ccf3 100644 --- a/lib/rules/valid-v-on.js +++ b/lib/rules/valid-v-on.js @@ -89,7 +89,15 @@ module.exports = { }, additionalProperties: false } - ] + ], + messages: { + unsupportedModifier: + "'v-on' directives don't support the modifier '{{modifier}}'.", + avoidKeyword: + 'Avoid using JavaScript keyword as "v-on" value: {{value}}.', + expectedValueOrVerb: + "'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')." + } }, /** @param {RuleContext} context */ create(context) { @@ -104,10 +112,8 @@ module.exports = { for (const modifier of node.key.modifiers) { if (!isValidModifier(modifier, customModifiers)) { context.report({ - node, - loc: node.loc, - message: - "'v-on' directives don't support the modifier '{{modifier}}'.", + node: modifier, + messageId: 'unsupportedModifier', data: { modifier: modifier.name } }) } @@ -131,19 +137,15 @@ module.exports = { } if (/^\w+$/.test(innerText)) { context.report({ - node, - loc: node.loc, - message: - 'Avoid using JavaScript keyword as "v-on" value: {{value}}.', + node: node.value, + messageId: 'avoidKeyword', data: { value: valueText } }) } } else { context.report({ node, - loc: node.loc, - message: - "'v-on' directives require a value or verb modifier (like 'stop' or 'prevent')." + messageId: 'expectedValueOrVerb' }) } } diff --git a/lib/rules/valid-v-once.js b/lib/rules/valid-v-once.js index 83ff3ddcf..bacf83304 100644 --- a/lib/rules/valid-v-once.js +++ b/lib/rules/valid-v-once.js @@ -24,7 +24,12 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-once.html' }, fixable: null, - schema: [] + schema: [], + messages: { + unexpectedArgument: "'v-once' directives require no argument.", + unexpectedModifier: "'v-once' directives require no modifier.", + unexpectedValue: "'v-once' directives require no attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -33,23 +38,24 @@ module.exports = { "VAttribute[directive=true][key.name.name='once']"(node) { if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-once' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-once' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (node.value) { context.report({ - node, - loc: node.loc, - message: "'v-once' directives require no attribute value." + node: node.value, + messageId: 'unexpectedValue' }) } } diff --git a/lib/rules/valid-v-pre.js b/lib/rules/valid-v-pre.js index 90174db12..0112ebde3 100644 --- a/lib/rules/valid-v-pre.js +++ b/lib/rules/valid-v-pre.js @@ -24,7 +24,12 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-pre.html' }, fixable: null, - schema: [] + schema: [], + messages: { + unexpectedArgument: "'v-pre' directives require no argument.", + unexpectedModifier: "'v-pre' directives require no modifier.", + unexpectedValue: "'v-pre' directives require no attribute value." + } }, /** @param {RuleContext} context */ create(context) { @@ -33,23 +38,24 @@ module.exports = { "VAttribute[directive=true][key.name.name='pre']"(node) { if (node.key.argument) { context.report({ - node, - loc: node.loc, - message: "'v-pre' directives require no argument." + node: node.key.argument, + messageId: 'unexpectedArgument' }) } if (node.key.modifiers.length > 0) { context.report({ node, - loc: node.loc, - message: "'v-pre' directives require no modifier." + loc: { + start: node.key.modifiers[0].loc.start, + end: node.key.modifiers[node.key.modifiers.length - 1].loc.end + }, + messageId: 'unexpectedModifier' }) } if (node.value) { context.report({ - node, - loc: node.loc, - message: "'v-pre' directives require no attribute value." + node: node.value, + messageId: 'unexpectedValue' }) } } diff --git a/lib/rules/valid-v-show.js b/lib/rules/valid-v-show.js index 721904f4f..59ba9c432 100644 --- a/lib/rules/valid-v-show.js +++ b/lib/rules/valid-v-show.js @@ -24,7 +24,14 @@ module.exports = { url: 'https://eslint.vuejs.org/rules/valid-v-show.html' }, fixable: null, - schema: [] + schema: [], + messages: { + unexpectedArgument: "'v-show' directives require no argument.", + unexpectedModifier: "'v-show' directives require no modifier.", + expectedValue: "'v-show' directives require that attribute value.", + unexpectedTemplate: + "'v-show' directives cannot be put on