diff --git a/.changeset/dry-colts-open.md b/.changeset/dry-colts-open.md new file mode 100644 index 000000000..fd2d97221 --- /dev/null +++ b/.changeset/dry-colts-open.md @@ -0,0 +1,5 @@ +--- +'eslint-plugin-svelte': patch +--- + +fix(no-unused-class-name): detect duplicated class names diff --git a/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts b/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts index 090690577..e7d1dd5f6 100644 --- a/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts +++ b/packages/eslint-plugin-svelte/src/rules/no-unused-class-name.ts @@ -36,7 +36,10 @@ export default createRule('no-unused-class-name', { return {}; } const allowedClassNames = context.options[0]?.allowedClassNames ?? []; - const classesUsedInTemplate: Record = {}; + const classesUsedInTemplate: { + className: string; + loc: AST.SourceLocation; + }[] = []; return { SvelteElement(node) { @@ -45,7 +48,7 @@ export default createRule('no-unused-class-name', { } const classes = node.startTag.attributes.flatMap(findClassesInAttribute); for (const className of classes) { - classesUsedInTemplate[className] = node.startTag.loc; + classesUsedInTemplate.push({ className, loc: node.startTag.loc }); } }, 'Program:exit'() { @@ -57,7 +60,8 @@ export default createRule('no-unused-class-name', { styleContext.status === 'success' ? findClassesInPostCSSNode(styleContext.sourceAst, sourceCode.parserServices) : []; - for (const className in classesUsedInTemplate) { + + for (const { className, loc } of classesUsedInTemplate) { if ( !allowedClassNames.some((allowedClassName: string) => toRegExp(allowedClassName).test(className) @@ -65,7 +69,7 @@ export default createRule('no-unused-class-name', { !classesUsedInStyle.includes(className) ) { context.report({ - loc: classesUsedInTemplate[className], + loc, message: `Unused class "${className}".` }); } diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-class-name/invalid/duplicated-class-name-errors.yaml b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-class-name/invalid/duplicated-class-name-errors.yaml new file mode 100644 index 000000000..4f5c9cd5a --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-class-name/invalid/duplicated-class-name-errors.yaml @@ -0,0 +1,8 @@ +- message: Unused class "div-class". + line: 1 + column: 1 + suggestions: null +- message: Unused class "div-class". + line: 3 + column: 1 + suggestions: null diff --git a/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-class-name/invalid/duplicated-class-name-input.svelte b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-class-name/invalid/duplicated-class-name-input.svelte new file mode 100644 index 000000000..57d433dce --- /dev/null +++ b/packages/eslint-plugin-svelte/tests/fixtures/rules/no-unused-class-name/invalid/duplicated-class-name-input.svelte @@ -0,0 +1,3 @@ +
Hello
+ +World!