diff --git a/packages/eslint-plugin/docs/rules/no-duplicate-enum-values.mdx b/packages/eslint-plugin/docs/rules/no-duplicate-enum-values.mdx index 65162a62a6dc..d28eb7afb615 100644 --- a/packages/eslint-plugin/docs/rules/no-duplicate-enum-values.mdx +++ b/packages/eslint-plugin/docs/rules/no-duplicate-enum-values.mdx @@ -32,6 +32,7 @@ enum E { enum E { A = 'A', B = 'A', + C = `A`, } ``` @@ -49,6 +50,7 @@ enum E { enum E { A = 'A', B = 'B', + C = `C`, } ``` diff --git a/packages/eslint-plugin/src/rules/no-duplicate-enum-values.ts b/packages/eslint-plugin/src/rules/no-duplicate-enum-values.ts index 4b616fe65a50..40a0ccee82b3 100644 --- a/packages/eslint-plugin/src/rules/no-duplicate-enum-values.ts +++ b/packages/eslint-plugin/src/rules/no-duplicate-enum-values.ts @@ -36,6 +36,16 @@ export default createRule({ ); } + function isStaticTemplateLiteral( + node: TSESTree.Expression, + ): node is TSESTree.TemplateLiteral { + return ( + node.type === AST_NODE_TYPES.TemplateLiteral && + node.expressions.length === 0 && + node.quasis.length === 1 + ); + } + return { TSEnumDeclaration(node: TSESTree.TSEnumDeclaration): void { const enumMembers = node.body.members; @@ -51,6 +61,8 @@ export default createRule({ value = String(member.initializer.value); } else if (isNumberLiteral(member.initializer)) { value = Number(member.initializer.value); + } else if (isStaticTemplateLiteral(member.initializer)) { + value = member.initializer.quasis[0].value.cooked; } if (value == null) { diff --git a/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-duplicate-enum-values.shot b/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-duplicate-enum-values.shot index 33ac7b3e3444..b46c26d3c0d8 100644 --- a/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-duplicate-enum-values.shot +++ b/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-duplicate-enum-values.shot @@ -18,6 +18,8 @@ enum E { A = 'A', B = 'A', ~~~~~~~ Duplicate enum member value A. + C = \`A\`, + ~~~~~~~ Duplicate enum member value A. } " `; @@ -38,6 +40,7 @@ exports[`Validating rule docs no-duplicate-enum-values.mdx code examples ESLint enum E { A = 'A', B = 'B', + C = \`C\`, } " `; diff --git a/packages/eslint-plugin/tests/rules/no-duplicate-enum-values.test.ts b/packages/eslint-plugin/tests/rules/no-duplicate-enum-values.test.ts index a8864bfb6aa6..a2e00872bd7c 100644 --- a/packages/eslint-plugin/tests/rules/no-duplicate-enum-values.test.ts +++ b/packages/eslint-plugin/tests/rules/no-duplicate-enum-values.test.ts @@ -71,6 +71,13 @@ enum E { A = 0, B = -0, C = NaN, +} + `, + ` +const A = 'A'; +enum E { + A = 'A', + B = \`\${A}\`, } `, ], @@ -131,5 +138,37 @@ enum E { }, ], }, + { + code: ` +enum E { + A = 'A', + B = \`A\`, +} + `, + errors: [ + { + column: 3, + data: { value: 'A' }, + line: 4, + messageId: 'duplicateValue', + }, + ], + }, + { + code: ` +enum E { + A = \`A\`, + B = \`A\`, +} + `, + errors: [ + { + column: 3, + data: { value: 'A' }, + line: 4, + messageId: 'duplicateValue', + }, + ], + }, ], });