Skip to content

Commit 7cdcd5d

Browse files
committed
fix: handle LogicalExpression
1 parent fde5af0 commit 7cdcd5d

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ function* extractClassNodes(node, expression, unconditional = true) {
6262
}
6363
break
6464
}
65+
case 'LogicalExpression': {
66+
yield* extractClassNodes(node, nodeExpression.left, unconditional)
67+
yield* extractClassNodes(node, nodeExpression.right, unconditional)
68+
break
69+
}
6570
}
6671
}
6772

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,96 @@ tester.run('no-duplicate-class-names', rule, {
472472
endColumn: 48
473473
}
474474
]
475+
},
476+
{
477+
filename: 'duplicate-class-logical-expression-and.vue',
478+
code: `<template><div :class="isActive && 'foo foo'"></div></template>`,
479+
output: `<template><div :class="isActive && 'foo'"></div></template>`,
480+
errors: [
481+
{
482+
message: "Duplicate class name 'foo'.",
483+
type: 'Literal',
484+
line: 1,
485+
column: 36,
486+
endLine: 1,
487+
endColumn: 45
488+
}
489+
]
490+
},
491+
{
492+
filename: 'duplicate-class-logical-expression-or.vue',
493+
code: `<template><div :class="isActive || 'foo foo'"></div></template>`,
494+
output: `<template><div :class="isActive || 'foo'"></div></template>`,
495+
errors: [
496+
{
497+
message: "Duplicate class name 'foo'.",
498+
type: 'Literal',
499+
line: 1,
500+
column: 36,
501+
endLine: 1,
502+
endColumn: 45
503+
}
504+
]
505+
},
506+
{
507+
filename: 'duplicate-class-logical-expression-nullish-coalescing.vue',
508+
code: `<template><div :class="isActive ?? 'foo foo'"></div></template>`,
509+
output: `<template><div :class="isActive ?? 'foo'"></div></template>`,
510+
errors: [
511+
{
512+
message: "Duplicate class name 'foo'.",
513+
type: 'Literal',
514+
line: 1,
515+
column: 36,
516+
endLine: 1,
517+
endColumn: 45
518+
}
519+
]
520+
},
521+
{
522+
filename: 'duplicate-class-nested-logical-expression.vue',
523+
code: `<template><div :class="isActive ?? isAnotherActive ?? 'foo foo'"></div></template>`,
524+
output: `<template><div :class="isActive ?? isAnotherActive ?? 'foo'"></div></template>`,
525+
errors: [
526+
{
527+
message: "Duplicate class name 'foo'.",
528+
type: 'Literal',
529+
line: 1,
530+
column: 55,
531+
endLine: 1,
532+
endColumn: 64
533+
}
534+
]
535+
},
536+
{
537+
filename: 'duplicate-class-logical-expression-in-array.vue',
538+
code: `<template><div :class="['foo', isActive ?? 'foo']"></div></template>`,
539+
output: null,
540+
errors: [
541+
{
542+
message: "Duplicate class name 'foo'.",
543+
type: 'ArrayExpression',
544+
line: 1,
545+
column: 24,
546+
endLine: 1,
547+
endColumn: 50
548+
}
549+
]
550+
},
551+
{
552+
filename: 'duplicate-class-logical-expression-in-conditional.vue',
553+
code: `<template><div :class="isActive ? 'foo foo' : 'bar'"></div></template>`,
554+
output: `<template><div :class="isActive ? 'foo' : 'bar'"></div></template>`,
555+
errors: [
556+
{
557+
message: "Duplicate class name 'foo'.",
558+
type: 'Literal',
559+
line: 1,
560+
column: 35,
561+
endLine: 1,
562+
endColumn: 44
563+
}
564+
]
475565
}
476566
]
477567
})

0 commit comments

Comments
 (0)