Skip to content

Commit 99332c1

Browse files
authored
Fix custom classnames rule with VueJS objects within list. (francoismassart#359)
* fix: no-custom-classname rule with VueJS objects within list. * test: adding tests for other props * chore: remove custom npm script
1 parent c05d17c commit 99332c1

File tree

2 files changed

+95
-4
lines changed

2 files changed

+95
-4
lines changed

lib/util/ast.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ function isVueValidAttributeValue(node) {
121121
case isArrayExpression(node): // ['tw-unknown-class']
122122
case isObjectExpression(node): // {'tw-unknown-class': true}
123123
return true;
124-
break;
125124
default:
126125
return false;
127126
}
@@ -218,10 +217,8 @@ function extractValueFromNode(node) {
218217
switch (node.value.expression.type) {
219218
case 'ArrayExpression':
220219
return node.value.expression.elements;
221-
break;
222220
case 'ObjectExpression':
223221
return node.value.expression.properties;
224-
break;
225222
}
226223
return node.value.expression.value;
227224
default:
@@ -302,7 +299,7 @@ function parseNodeRecursive(rootNode, childNode, cb, skipConditional = false, is
302299
return;
303300
case 'ObjectExpression':
304301
childNode.properties.forEach((prop) => {
305-
const isUsedByClassNamesPlugin = rootNode.callee && rootNode.callee.name === 'classnames';
302+
const isUsedByClassNamesPlugin = (rootNode.callee && rootNode.callee.name === 'classnames') || rootNode.type === 'VAttribute';
306303

307304
if (prop.type === 'SpreadElement') {
308305
// Ignore spread elements

tests/lib/rules/no-custom-classname.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,41 @@ ruleTester.run("no-custom-classname", rule, {
10891089
filename: "test.vue",
10901090
parser: require.resolve("vue-eslint-parser"),
10911091
},
1092+
{
1093+
code: `<template><div :class="[{'text-red-500': true, 'bg-transparent': false}]">Issue #319</div></template>`,
1094+
filename: "test.vue",
1095+
parser: require.resolve("vue-eslint-parser"),
1096+
},
1097+
{
1098+
code: `<template><div :class="['hidden',{'text-red-500': true, 'bg-transparent': false}, 'text-red-200']">Issue #319</div></template>`,
1099+
filename: "test.vue",
1100+
parser: require.resolve("vue-eslint-parser"),
1101+
},
1102+
{
1103+
code: `<template><div :class="[{'text-red-500': true}, 'bg-white']" :prop="['baz', true, 'foo']" :other="['val', {'baz': true, 'text-green-400': false}]">Issue #319</div></template>`,
1104+
filename: "test.vue",
1105+
parser: require.resolve("vue-eslint-parser"),
1106+
},
1107+
{
1108+
code: `<template><div :class="['tw-hidden',{'tw-text-red-500': true, 'tw-bg-transparent': false}, 'tw-text-red-200']">Issue #319</div></template>`,
1109+
filename: "test.vue",
1110+
parser: require.resolve("vue-eslint-parser"),
1111+
options: [
1112+
{
1113+
config: {
1114+
prefix: "tw-",
1115+
theme: {
1116+
extend: {},
1117+
},
1118+
},
1119+
},
1120+
],
1121+
},
1122+
{
1123+
code: `<template><div :class="['hidden',{'text-red-500': true, 'bg-transparent': false}, {'text-green-500': true}, 'bg-white']">Issue #319</div></template>`,
1124+
filename: "test.vue",
1125+
parser: require.resolve("vue-eslint-parser"),
1126+
}
10921127
],
10931128

10941129
invalid: [
@@ -1435,6 +1470,65 @@ ruleTester.run("no-custom-classname", rule, {
14351470
filename: "test.vue",
14361471
parser: require.resolve("vue-eslint-parser"),
14371472
},
1473+
{
1474+
code: `
1475+
<script>
1476+
export default {
1477+
data() {
1478+
return {}
1479+
}
1480+
}
1481+
</script>
1482+
<template>
1483+
<span :class="['text-red-200', {'tw-unknown-class': true, 'tw-unknown-class-two': false}, 'tw-unknown-class-three', 'tw-bg-transparent']" />
1484+
</template>
1485+
`,
1486+
options: [
1487+
{
1488+
config: {
1489+
prefix: "tw-",
1490+
theme: {
1491+
extend: {},
1492+
},
1493+
},
1494+
},
1495+
],
1496+
errors: generateErrors(
1497+
"text-red-200 tw-unknown-class tw-unknown-class-two tw-unknown-class-three"
1498+
),
1499+
filename: "test.vue",
1500+
parser: require.resolve("vue-eslint-parser"),
1501+
},
1502+
{
1503+
code: `<template><div :class="[{'baz': true, 'foo': false}]">Issue #319</div></template>`,
1504+
filename: "test.vue",
1505+
parser: require.resolve("vue-eslint-parser"),
1506+
errors: generateErrors("baz foo"),
1507+
},
1508+
{
1509+
code: `<template><div :class="['unknown',{'baz': true, 'foo': false}]">Issue #319</div></template>`,
1510+
filename: "test.vue",
1511+
parser: require.resolve("vue-eslint-parser"),
1512+
errors: generateErrors("unknown baz foo"),
1513+
},
1514+
{
1515+
code: `<template><div :class="['text-red-200','unknown',{'baz': true, 'foo': false}, 'tw-unknown-class']">Issue #319</div></template>`,
1516+
filename: "test.vue",
1517+
parser: require.resolve("vue-eslint-parser"),
1518+
errors: generateErrors("unknown baz foo tw-unknown-class"),
1519+
},
1520+
{
1521+
code: `<template><div :class="['tw-hidden',{'custom': true, '🧑‍💻': false}, {'text-green-500': true}, 'bg-tw']">Issue #319</div></template>`,
1522+
filename: "test.vue",
1523+
parser: require.resolve("vue-eslint-parser"),
1524+
errors: generateErrors("tw-hidden custom 🧑‍💻 bg-tw"),
1525+
},
1526+
{
1527+
code: `<template><div :class="[{'baz': true, 'foo': false}]" :prop="['baz', true, 'foo']" :other="['val', {'baz': true, 'foo': false}]">Issue #319</div></template>`,
1528+
filename: "test.vue",
1529+
parser: require.resolve("vue-eslint-parser"),
1530+
errors: generateErrors("baz foo"),
1531+
},
14381532
{
14391533
code: `<div className="group-hover/edit:unknown-class">Custom group name variant with invalid class name</div>`,
14401534
errors: generateErrors("group-hover/edit:unknown-class"),

0 commit comments

Comments
 (0)