Skip to content

Commit 84f07e3

Browse files
committed
#136: Remove duplicates from ordered classNames instead of unordered classNames
1 parent a8bfa5a commit 84f07e3

File tree

3 files changed

+18
-20
lines changed

3 files changed

+18
-20
lines changed

lib/rules/classnames-order.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -300,10 +300,6 @@ module.exports = {
300300
return;
301301
}
302302

303-
if (removeDuplicates) {
304-
removeDuplicatesFromClassnamesAndWhitespaces(classNames, whitespaces, headSpace, tailSpace);
305-
}
306-
307303
let orderedClassNames;
308304

309305
// Sorting
@@ -329,6 +325,10 @@ module.exports = {
329325
orderedClassNames = prependCustom ? [...mergedExtras, ...flatted] : [...flatted, ...mergedExtras];
330326
}
331327

328+
if (removeDuplicates) {
329+
removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace);
330+
}
331+
332332
// Generates the validated/sorted attribute value
333333
let validatedClassNamesValue = '';
334334
for (let i = 0; i < orderedClassNames.length; i++) {
Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
11
'use strict';
22

3-
function removeDuplicatesFromClassnamesAndWhitespaces(classNames, whitespaces, headSpace, tailSpace) {
4-
const uniqueSet = new Set(classNames);
5-
if (uniqueSet.size === classNames.length) {
6-
return;
7-
}
3+
function removeDuplicatesFromClassnamesAndWhitespaces(orderedClassNames, whitespaces, headSpace, tailSpace) {
4+
let previous = orderedClassNames[0];
85
const offset = (!headSpace && !tailSpace) || tailSpace ? -1 : 0;
9-
uniqueSet.forEach((cls) => {
10-
let duplicatedInstances = classNames.filter((el) => el === cls).length - 1;
11-
while (duplicatedInstances > 0) {
12-
const idx = classNames.lastIndexOf(cls);
13-
classNames.splice(idx, 1);
14-
whitespaces.splice(idx + offset, 1);
15-
duplicatedInstances--;
6+
for (let i = 1; i < orderedClassNames.length; i++) {
7+
const cls = orderedClassNames[i];
8+
// This function assumes that the list of classNames is ordered, so just comparing to the previous className is enough
9+
if (cls === previous) {
10+
orderedClassNames.splice(i, 1);
11+
whitespaces.splice(i + offset, 1);
12+
i--;
1613
}
17-
});
14+
previous = cls;
15+
}
1816
}
1917

2018
module.exports = removeDuplicatesFromClassnamesAndWhitespaces;

tests/lib/rules/classnames-order.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,17 +382,17 @@ ruleTester.run("classnames-order", rule, {
382382
},
383383
{
384384
code: `<div class="w-12 lg:w-6 w-12">Single line dups + no head/tail spaces</div>`,
385-
output: `<div class="w-12 lg:w-6">Single line dups + no head/tail spaces</div>`,
385+
output: `<div class="w-12 lg:w-6">Single line dups + no head/tail spaces</div>`,
386386
errors: errors,
387387
},
388388
{
389389
code: `<div class=" w-12 lg:w-6 w-12">Single dups line + head spaces</div>`,
390-
output: `<div class=" w-12 lg:w-6">Single dups line + head spaces</div>`,
390+
output: `<div class=" w-12 lg:w-6">Single dups line + head spaces</div>`,
391391
errors: errors,
392392
},
393393
{
394394
code: `<div class="w-12 lg:w-6 w-12 ">Single line dups + tail spaces</div>`,
395-
output: `<div class="w-12 lg:w-6 ">Single line dups + tail spaces</div>`,
395+
output: `<div class="w-12 lg:w-6 ">Single line dups + tail spaces</div>`,
396396
errors: errors,
397397
},
398398
{

0 commit comments

Comments
 (0)