diff --git a/lib/rules/no-dupe-keys.js b/lib/rules/no-dupe-keys.js index 01b85d9f5..ecfa787cf 100644 --- a/lib/rules/no-dupe-keys.js +++ b/lib/rules/no-dupe-keys.js @@ -58,6 +58,33 @@ function isInsideInitializer(node, references) { ) } +/** + * Collects all renamed props from a pattern + * @param {Pattern | null} pattern - The destructuring pattern + * @returns {Set} - Set of prop names that have been renamed + */ +function collectRenamedProps(pattern) { + const renamedProps = new Set() + + if (!pattern || pattern.type !== 'ObjectPattern') { + return renamedProps + } + + for (const prop of pattern.properties) { + if (prop.type !== 'Property') continue + + if ( + prop.key.type === 'Identifier' && + prop.value.type === 'Identifier' && + prop.key.name !== prop.value.name + ) { + renamedProps.add(prop.key.name) + } + } + + return renamedProps +} + module.exports = { meta: { type: 'problem', @@ -115,9 +142,15 @@ module.exports = { node ] + const renamedProps = collectRenamedProps(propsNode) + for (const prop of props) { if (!prop.propName) continue + if (renamedProps.has(prop.propName)) { + continue + } + const variable = findVariable( utils.getScope(context, node), prop.propName diff --git a/tests/lib/rules/no-dupe-keys.js b/tests/lib/rules/no-dupe-keys.js index 124442ec2..2df95908c 100644 --- a/tests/lib/rules/no-dupe-keys.js +++ b/tests/lib/rules/no-dupe-keys.js @@ -466,7 +466,7 @@ ruleTester.run('no-dupe-keys', rule, { { filename: 'test.vue', code: ` - + `, @@ -475,7 +475,7 @@ ruleTester.run('no-dupe-keys', rule, { { filename: 'test.vue', code: ` - + `, @@ -500,6 +500,17 @@ ruleTester.run('no-dupe-keys', rule, { parser: require('vue-eslint-parser'), parserOptions: { parser: require.resolve('@typescript-eslint/parser') } } + }, + { + filename: 'test.vue', + code: ` + + `, + languageOptions: { parser: require('vue-eslint-parser') } } ], @@ -1105,6 +1116,24 @@ ruleTester.run('no-dupe-keys', rule, { line: 5 } ] + }, + { + filename: 'test.vue', + code: ` + + `, + languageOptions: { parser: require('vue-eslint-parser') }, + errors: [ + { + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 5 + } + ] } ] })