Skip to content

Commit f0c52c0

Browse files
committed
refactor: rename functions and improve code
1 parent 1b04b2a commit f0c52c0

File tree

1 file changed

+17
-21
lines changed

1 file changed

+17
-21
lines changed

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

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const utils = require('../utils')
1212
* @param {Expression} [expression]
1313
* @return {IterableIterator<{ node: Literal | TemplateElement }>}
1414
*/
15-
function* extractDuplicateNode(node, expression) {
15+
function* extractClassNodes(node, expression) {
1616
const nodeExpression = expression ?? node.value?.expression
1717
if (!nodeExpression) return
1818

@@ -25,8 +25,7 @@ function* extractDuplicateNode(node, expression) {
2525
for (const prop of nodeExpression.properties) {
2626
if (
2727
prop.type === 'Property' &&
28-
prop.key &&
29-
prop.key.type === 'Literal' &&
28+
prop.key?.type === 'Literal' &&
3029
typeof prop.key.value === 'string' &&
3130
prop.key.value.includes(' ')
3231
) {
@@ -39,28 +38,28 @@ function* extractDuplicateNode(node, expression) {
3938
for (const element of nodeExpression.elements) {
4039
if (!element || element.type === 'SpreadElement') continue
4140

42-
yield* extractDuplicateNode(node, element)
41+
yield* extractClassNodes(node, element)
4342
}
4443
break
4544
}
4645
case 'ConditionalExpression': {
47-
yield* extractDuplicateNode(node, nodeExpression.consequent)
48-
yield* extractDuplicateNode(node, nodeExpression.alternate)
46+
yield* extractClassNodes(node, nodeExpression.consequent)
47+
yield* extractClassNodes(node, nodeExpression.alternate)
4948
break
5049
}
5150
case 'TemplateLiteral': {
5251
for (const quasi of nodeExpression.quasis) {
5352
yield { node: quasi }
5453
}
5554
for (const expr of nodeExpression.expressions) {
56-
yield* extractDuplicateNode(node, expr)
55+
yield* extractClassNodes(node, expr)
5756
}
5857
break
5958
}
6059
case 'BinaryExpression': {
6160
if (nodeExpression.operator === '+') {
62-
yield* extractDuplicateNode(node, nodeExpression.left)
63-
yield* extractDuplicateNode(node, nodeExpression.right)
61+
yield* extractClassNodes(node, nodeExpression.left)
62+
yield* extractClassNodes(node, nodeExpression.right)
6463
}
6564
break
6665
}
@@ -71,7 +70,8 @@ function* extractDuplicateNode(node, expression) {
7170
* @param {string} raw - raw class names string including quotes
7271
* @returns {string}
7372
*/
74-
function dedupePreserveSpaces(raw) {
73+
function removeDuplicateClassNames(raw) {
74+
const quote = raw[0]
7575
const inner = raw.slice(1, -1)
7676
const tokens = inner.split(/(\s+)/)
7777

@@ -128,7 +128,6 @@ function dedupePreserveSpaces(raw) {
128128
}
129129
}
130130

131-
const quote = raw[0]
132131
return quote + kept.join('') + quote
133132
}
134133

@@ -152,7 +151,7 @@ module.exports = {
152151
* @param {VLiteral | Literal | TemplateElement | null} node
153152
*/
154153
function reportDuplicateClasses(node) {
155-
if (!node || !node.value) return
154+
if (!node?.value) return
156155

157156
const classList =
158157
typeof node.value === 'object' && 'raw' in node.value
@@ -165,29 +164,26 @@ module.exports = {
165164
if (classNames.length <= 1) return
166165

167166
const seen = new Set()
168-
/** @type {string[]} */
169-
const duplicates = []
167+
const duplicates = new Set()
170168

171169
for (const className of classNames) {
172170
if (seen.has(className)) {
173-
if (!duplicates.includes(className)) {
174-
duplicates.push(className)
175-
}
171+
duplicates.add(className)
176172
} else {
177173
seen.add(className)
178174
}
179175
}
180176

181-
if (duplicates.length === 0) return
177+
if (duplicates.size === 0) return
182178

183179
context.report({
184180
node,
185181
messageId: 'duplicateClassName',
186-
data: { name: duplicates.join(', ') },
182+
data: { name: [...duplicates].join(', ') },
187183
fix: (fixer) => {
188184
const sourceCode = context.getSourceCode()
189185
const raw = sourceCode.text.slice(node.range[0], node.range[1])
190-
return fixer.replaceText(node, dedupePreserveSpaces(raw))
186+
return fixer.replaceText(node, removeDuplicateClassNames(raw))
191187
}
192188
})
193189
}
@@ -203,7 +199,7 @@ module.exports = {
203199
"VAttribute[directive=true][key.argument.name='class'][value.type='VExpressionContainer']"(
204200
node
205201
) {
206-
for (const { node: reportNode } of extractDuplicateNode(node)) {
202+
for (const { node: reportNode } of extractClassNodes(node)) {
207203
reportDuplicateClasses(reportNode)
208204
}
209205
}

0 commit comments

Comments
 (0)