Skip to content

Commit 2071c01

Browse files
committed
feat: report conditional expression
1 parent 0fd19ef commit 2071c01

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

docs/rules/no-duplicate-class-names.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@ This rule prevents the same class name from appearing multiple times within the
2525
<div :class="'foo bar'"></div>
2626
<div :class="{ 'foo bar': true }"></div>
2727
<div :class="['foo', 'bar']"></div>
28+
<div :class="isActive ? 'foo' : 'bar'"></div>
2829
2930
<!-- ✗ BAD -->
3031
<div class="foo foo"></div>
3132
<div class="foo bar foo baz bar"></div>
3233
<div :class="'foo foo'"></div>
3334
<div :class="{ 'foo foo': true }"></div>
3435
<div :class="['foo foo']"></div>
35-
<div :class="['foo foo', 'bar bar baz']"></div>
3636
<div :class="['foo foo', { 'bar bar baz': true }]"></div>
37+
<div :class="isActive ? 'foo foo' : 'bar'"></div>
3738
</template>
3839
```
3940

lib/rules/no-duplicate-class-names.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,17 @@ function* extractDuplicateNode(node, expression) {
4040
}
4141
case 'ArrayExpression': {
4242
for (const element of nodeExpression.elements) {
43-
if (!element || element.type === 'SpreadElement') {
44-
continue
45-
}
43+
if (!element || element.type === 'SpreadElement') continue
44+
4645
yield* extractDuplicateNode(node, element)
4746
}
4847
break
4948
}
49+
case 'ConditionalExpression': {
50+
yield* extractDuplicateNode(node, nodeExpression.consequent)
51+
yield* extractDuplicateNode(node, nodeExpression.alternate)
52+
break
53+
}
5054
}
5155
}
5256

tests/lib/rules/no-duplicate-class-names.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ tester.run('no-duplicate-class-names', rule, {
5252
{
5353
filename: 'duplicate-class-in-different-directive-mixed.vue',
5454
code: `<template><div :class="['foo', { 'foo bar': true }]"></div></template>`
55+
},
56+
{
57+
filename: 'class-conditional-expression.vue',
58+
code: `<template><div :class="isActive ? 'foo' : 'bar'"></div></template>`
5559
}
5660
],
5761
invalid: [
@@ -154,6 +158,17 @@ tester.run('no-duplicate-class-names', rule, {
154158
type: 'Literal'
155159
}
156160
]
161+
},
162+
{
163+
filename: 'duplicate-class-conditional-expression.vue',
164+
code: `<template><div :class="isActive ? 'foo foo' : 'bar'"></div></template>`,
165+
output: `<template><div :class="isActive ? 'foo' : 'bar'"></div></template>`,
166+
errors: [
167+
{
168+
message: "Duplicate class name 'foo'.",
169+
type: 'VAttribute'
170+
}
171+
]
157172
}
158173
]
159174
})

0 commit comments

Comments
 (0)