Skip to content

Commit c5b8131

Browse files
authored
Improve report location of vue/valid-v-xxx rules (#1565)
1 parent 3baeec5 commit c5b8131

20 files changed

+251
-193
lines changed

docs/rules/valid-v-else-if.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ This rule reports `v-else-if` directives in the following cases:
3232
<div v-else-if="bar"/>
3333
3434
<!-- ✗ BAD -->
35-
<div v-else-if/>
36-
<div v-else-if:aaa="foo"/>
37-
<div v-else-if.bbb="foo"/>
35+
<div /><div v-else-if="foo"/>
36+
<div v-if="x"/><div v-else-if/>
37+
<div v-if="x"/><div v-else-if:aaa="foo"/>
38+
<div v-if="x"/><div v-else-if.bbb="foo"/>
3839
</template>
3940
```
4041

docs/rules/valid-v-else.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ This rule reports `v-else` directives in the following cases:
3232
<div v-else/>
3333
3434
<!-- ✗ BAD -->
35-
<div v-else="foo"/>
36-
<div v-else:aaa/>
37-
<div v-else.bbb/>
35+
<div v-else/>
36+
<div v-if="x"/><div v-else="foo"/>
37+
<div v-if="x"/><div v-else:aaa/>
38+
<div v-if="x"/><div v-else.bbb/>
3839
</template>
3940
```
4041

lib/rules/valid-v-bind-sync.js

+4-9
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ module.exports = {
119119
if (!isValidElement(element)) {
120120
context.report({
121121
node,
122-
loc: node.loc,
123122
messageId: 'unexpectedInvalidElement',
124123
data: { name }
125124
})
@@ -136,20 +135,17 @@ module.exports = {
136135
}
137136
if (isOptionalChainingMemberExpression(expression)) {
138137
context.report({
139-
node,
140-
loc: node.loc,
138+
node: expression,
141139
messageId: 'unexpectedOptionalChaining'
142140
})
143141
} else if (!isLhs(expression)) {
144142
context.report({
145-
node,
146-
loc: node.loc,
143+
node: expression,
147144
messageId: 'unexpectedNonLhsExpression'
148145
})
149146
} else if (maybeNullObjectMemberExpression(expression)) {
150147
context.report({
151-
node,
152-
loc: node.loc,
148+
node: expression,
153149
messageId: 'unexpectedNullObject'
154150
})
155151
}
@@ -162,8 +158,7 @@ module.exports = {
162158
const variable = reference.variable
163159
if (variable) {
164160
context.report({
165-
node,
166-
loc: node.loc,
161+
node: expression,
167162
messageId: 'unexpectedUpdateIterationVariable',
168163
data: { varName: id.name }
169164
})

lib/rules/valid-v-bind.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ module.exports = {
3030
url: 'https://eslint.vuejs.org/rules/valid-v-bind.html'
3131
},
3232
fixable: null,
33-
schema: []
33+
schema: [],
34+
messages: {
35+
unsupportedModifier:
36+
"'v-bind' directives don't support the modifier '{{name}}'.",
37+
expectedValue: "'v-bind' directives require an attribute value."
38+
}
3439
},
3540
/** @param {RuleContext} context */
3641
create(context) {
@@ -40,10 +45,8 @@ module.exports = {
4045
for (const modifier of node.key.modifiers) {
4146
if (!VALID_MODIFIERS.has(modifier.name)) {
4247
context.report({
43-
node,
44-
loc: node.key.loc,
45-
message:
46-
"'v-bind' directives don't support the modifier '{{name}}'.",
48+
node: modifier,
49+
messageId: 'unsupportedModifier',
4750
data: { name: modifier.name }
4851
})
4952
}
@@ -52,8 +55,7 @@ module.exports = {
5255
if (!node.value || utils.isEmptyValueDirective(node, context)) {
5356
context.report({
5457
node,
55-
loc: node.loc,
56-
message: "'v-bind' directives require an attribute value."
58+
messageId: 'expectedValue'
5759
})
5860
}
5961
}

lib/rules/valid-v-cloak.js

+15-9
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ module.exports = {
2424
url: 'https://eslint.vuejs.org/rules/valid-v-cloak.html'
2525
},
2626
fixable: null,
27-
schema: []
27+
schema: [],
28+
messages: {
29+
unexpectedArgument: "'v-cloak' directives require no argument.",
30+
unexpectedModifier: "'v-cloak' directives require no modifier.",
31+
unexpectedValue: "'v-cloak' directives require no attribute value."
32+
}
2833
},
2934
/** @param {RuleContext} context */
3035
create(context) {
@@ -33,23 +38,24 @@ module.exports = {
3338
"VAttribute[directive=true][key.name.name='cloak']"(node) {
3439
if (node.key.argument) {
3540
context.report({
36-
node,
37-
loc: node.loc,
38-
message: "'v-cloak' directives require no argument."
41+
node: node.key.argument,
42+
messageId: 'unexpectedArgument'
3943
})
4044
}
4145
if (node.key.modifiers.length > 0) {
4246
context.report({
4347
node,
44-
loc: node.loc,
45-
message: "'v-cloak' directives require no modifier."
48+
loc: {
49+
start: node.key.modifiers[0].loc.start,
50+
end: node.key.modifiers[node.key.modifiers.length - 1].loc.end
51+
},
52+
messageId: 'unexpectedModifier'
4653
})
4754
}
4855
if (node.value) {
4956
context.report({
50-
node,
51-
loc: node.loc,
52-
message: "'v-cloak' directives require no attribute value."
57+
node: node.value,
58+
messageId: 'unexpectedValue'
5359
})
5460
}
5561
}

lib/rules/valid-v-else-if.js

+23-17
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@ module.exports = {
2424
url: 'https://eslint.vuejs.org/rules/valid-v-else-if.html'
2525
},
2626
fixable: null,
27-
schema: []
27+
schema: [],
28+
messages: {
29+
missingVIf:
30+
"'v-else-if' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive.",
31+
withVIf:
32+
"'v-else-if' and 'v-if' directives can't exist on the same element.",
33+
withVElse:
34+
"'v-else-if' and 'v-else' directives can't exist on the same element.",
35+
unexpectedArgument: "'v-else-if' directives require no argument.",
36+
unexpectedModifier: "'v-else-if' directives require no modifier.",
37+
expectedValue: "'v-else-if' directives require that attribute value."
38+
}
2839
},
2940
/** @param {RuleContext} context */
3041
create(context) {
@@ -36,46 +47,41 @@ module.exports = {
3647
if (!utils.prevElementHasIf(element)) {
3748
context.report({
3849
node,
39-
loc: node.loc,
40-
message:
41-
"'v-else-if' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive."
50+
messageId: 'missingVIf'
4251
})
4352
}
4453
if (utils.hasDirective(element, 'if')) {
4554
context.report({
4655
node,
47-
loc: node.loc,
48-
message:
49-
"'v-else-if' and 'v-if' directives can't exist on the same element."
56+
messageId: 'withVIf'
5057
})
5158
}
5259
if (utils.hasDirective(element, 'else')) {
5360
context.report({
5461
node,
55-
loc: node.loc,
56-
message:
57-
"'v-else-if' and 'v-else' directives can't exist on the same element."
62+
messageId: 'withVElse'
5863
})
5964
}
6065
if (node.key.argument) {
6166
context.report({
62-
node,
63-
loc: node.loc,
64-
message: "'v-else-if' directives require no argument."
67+
node: node.key.argument,
68+
messageId: 'unexpectedArgument'
6569
})
6670
}
6771
if (node.key.modifiers.length > 0) {
6872
context.report({
6973
node,
70-
loc: node.loc,
71-
message: "'v-else-if' directives require no modifier."
74+
loc: {
75+
start: node.key.modifiers[0].loc.start,
76+
end: node.key.modifiers[node.key.modifiers.length - 1].loc.end
77+
},
78+
messageId: 'unexpectedModifier'
7279
})
7380
}
7481
if (!node.value || utils.isEmptyValueDirective(node, context)) {
7582
context.report({
7683
node,
77-
loc: node.loc,
78-
message: "'v-else-if' directives require that attribute value."
84+
messageId: 'expectedValue'
7985
})
8086
}
8187
}

lib/rules/valid-v-else.js

+24-18
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@ module.exports = {
2424
url: 'https://eslint.vuejs.org/rules/valid-v-else.html'
2525
},
2626
fixable: null,
27-
schema: []
27+
schema: [],
28+
messages: {
29+
missingVIf:
30+
"'v-else' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive.",
31+
withVIf:
32+
"'v-else' and 'v-if' directives can't exist on the same element. You may want 'v-else-if' directives.",
33+
withVElseIf:
34+
"'v-else' and 'v-else-if' directives can't exist on the same element.",
35+
unexpectedArgument: "'v-else' directives require no argument.",
36+
unexpectedModifier: "'v-else' directives require no modifier.",
37+
unexpectedValue: "'v-else' directives require no attribute value."
38+
}
2839
},
2940
/** @param {RuleContext} context */
3041
create(context) {
@@ -36,46 +47,41 @@ module.exports = {
3647
if (!utils.prevElementHasIf(element)) {
3748
context.report({
3849
node,
39-
loc: node.loc,
40-
message:
41-
"'v-else' directives require being preceded by the element which has a 'v-if' or 'v-else-if' directive."
50+
messageId: 'missingVIf'
4251
})
4352
}
4453
if (utils.hasDirective(element, 'if')) {
4554
context.report({
4655
node,
47-
loc: node.loc,
48-
message:
49-
"'v-else' and 'v-if' directives can't exist on the same element. You may want 'v-else-if' directives."
56+
messageId: 'withVIf'
5057
})
5158
}
5259
if (utils.hasDirective(element, 'else-if')) {
5360
context.report({
5461
node,
55-
loc: node.loc,
56-
message:
57-
"'v-else' and 'v-else-if' directives can't exist on the same element."
62+
messageId: 'withVElseIf'
5863
})
5964
}
6065
if (node.key.argument) {
6166
context.report({
62-
node,
63-
loc: node.loc,
64-
message: "'v-else' directives require no argument."
67+
node: node.key.argument,
68+
messageId: 'unexpectedArgument'
6569
})
6670
}
6771
if (node.key.modifiers.length > 0) {
6872
context.report({
6973
node,
70-
loc: node.loc,
71-
message: "'v-else' directives require no modifier."
74+
loc: {
75+
start: node.key.modifiers[0].loc.start,
76+
end: node.key.modifiers[node.key.modifiers.length - 1].loc.end
77+
},
78+
messageId: 'unexpectedModifier'
7279
})
7380
}
7481
if (node.value) {
7582
context.report({
76-
node,
77-
loc: node.loc,
78-
message: "'v-else' directives require no attribute value."
83+
node: node.value,
84+
messageId: 'unexpectedValue'
7985
})
8086
}
8187
}

0 commit comments

Comments
 (0)