Skip to content

Commit

Permalink
Improve report location of vue/valid-v-xxx rules (#1565)
Browse files Browse the repository at this point in the history
  • Loading branch information
ota-meshi committed Jul 14, 2021
1 parent 3baeec5 commit c5b8131
Show file tree
Hide file tree
Showing 20 changed files with 251 additions and 193 deletions.
7 changes: 4 additions & 3 deletions docs/rules/valid-v-else-if.md
Expand Up @@ -32,9 +32,10 @@ This rule reports `v-else-if` directives in the following cases:
<div v-else-if="bar"/>
<!-- ✗ BAD -->
<div v-else-if/>
<div v-else-if:aaa="foo"/>
<div v-else-if.bbb="foo"/>
<div /><div v-else-if="foo"/>
<div v-if="x"/><div v-else-if/>
<div v-if="x"/><div v-else-if:aaa="foo"/>
<div v-if="x"/><div v-else-if.bbb="foo"/>
</template>
```

Expand Down
7 changes: 4 additions & 3 deletions docs/rules/valid-v-else.md
Expand Up @@ -32,9 +32,10 @@ This rule reports `v-else` directives in the following cases:
<div v-else/>
<!-- ✗ BAD -->
<div v-else="foo"/>
<div v-else:aaa/>
<div v-else.bbb/>
<div v-else/>
<div v-if="x"/><div v-else="foo"/>
<div v-if="x"/><div v-else:aaa/>
<div v-if="x"/><div v-else.bbb/>
</template>
```

Expand Down
13 changes: 4 additions & 9 deletions lib/rules/valid-v-bind-sync.js
Expand Up @@ -119,7 +119,6 @@ module.exports = {
if (!isValidElement(element)) {
context.report({
node,
loc: node.loc,
messageId: 'unexpectedInvalidElement',
data: { name }
})
Expand All @@ -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'
})
}
Expand All @@ -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 }
})
Expand Down
16 changes: 9 additions & 7 deletions lib/rules/valid-v-bind.js
Expand Up @@ -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) {
Expand All @@ -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 }
})
}
Expand All @@ -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'
})
}
}
Expand Down
24 changes: 15 additions & 9 deletions lib/rules/valid-v-cloak.js
Expand Up @@ -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) {
Expand All @@ -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'
})
}
}
Expand Down
40 changes: 23 additions & 17 deletions lib/rules/valid-v-else-if.js
Expand Up @@ -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) {
Expand All @@ -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'
})
}
}
Expand Down
42 changes: 24 additions & 18 deletions lib/rules/valid-v-else.js
Expand Up @@ -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) {
Expand All @@ -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'
})
}
}
Expand Down

0 comments on commit c5b8131

Please sign in to comment.