From 23ff0c3756ce22d6276f79b5b18dc923e30cff22 Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Mon, 31 Jul 2023 13:00:59 -0400 Subject: [PATCH 1/5] Touchup docs and error message for no-dupe-keys --- docs/rules/no-dupe-keys.md | 4 +- docs/rules/no-duplicate-attr-inheritance.md | 2 +- docs/rules/no-duplicate-attributes.md | 5 +- lib/rules/no-dupe-keys.js | 129 +++--- tests/lib/rules/no-dupe-keys.js | 439 +++++++++++--------- 5 files changed, 304 insertions(+), 275 deletions(-) diff --git a/docs/rules/no-dupe-keys.md b/docs/rules/no-dupe-keys.md index 41f4a962f..23b9bf2ee 100644 --- a/docs/rules/no-dupe-keys.md +++ b/docs/rules/no-dupe-keys.md @@ -11,11 +11,11 @@ since: v3.9.0 - :gear: This rule is included in all of `"plugin:vue/vue3-essential"`, `"plugin:vue/essential"`, `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. -This rule prevents to use duplicated names. +This rule prevents using duplicate names. ## :book: Rule Details -This rule is aimed at preventing duplicated property names. +This rule prevents duplicate `props`/`data`/`methods`/etc. key names defined on a component. Even if a key name does not conflict in the ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser'), - parserOptions: { parser: require.resolve('@typescript-eslint/parser') } + parser: require.resolve("vue-eslint-parser"), + parserOptions: { parser: require.resolve("@typescript-eslint/parser") }, }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` const {foo,bar} = defineProps(['foo', 'bar']) `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` const {foo=42,bar='abc'} = defineProps(['foo', 'bar']) `, - parser: require.resolve('vue-eslint-parser') + parser: require.resolve("vue-eslint-parser"), }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser'), - parserOptions: { parser: require.resolve('@typescript-eslint/parser') } - } + parser: require.resolve("vue-eslint-parser"), + parserOptions: { parser: require.resolve("@typescript-eslint/parser") }, + }, ], invalid: [ { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: ['foo'], @@ -529,25 +529,29 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 5 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 5, }, { - message: "Duplicated key 'foo'.", - line: 10 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 10, }, { - message: "Duplicated key 'foo'.", - line: 14 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 14, }, { - message: "Duplicated key 'foo'.", - line: 21 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 21, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: ['foo'], @@ -575,25 +579,29 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 5 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 5, }, { - message: "Duplicated key 'foo'.", - line: 10 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 10, }, { - message: "Duplicated key 'foo'.", - line: 14 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 14, }, { - message: "Duplicated key 'foo'.", - line: 21 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 21, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: ['foo'], @@ -612,21 +620,24 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 5 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 5, }, { - message: "Duplicated key 'foo'.", - line: 9 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9, }, { - message: "Duplicated key 'foo'.", - line: 12 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 12, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: { @@ -656,25 +667,29 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 7 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7, }, { - message: "Duplicated key 'foo'.", - line: 13 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 13, }, { - message: "Duplicated key 'foo'.", - line: 16 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 16, }, { - message: "Duplicated key 'foo'.", - line: 23 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 23, + }, + ], }, { - filename: 'test.js', + filename: "test.js", code: ` new Vue({ foo: { @@ -685,16 +700,16 @@ ruleTester.run('no-dupe-keys', rule, { }, }) `, - options: [{ groups: ['foo'] }], + options: [{ groups: ["foo"] }], errors: [ { - message: "Duplicated key 'bar'.", - line: 7 - } - ] + message: "Duplicate key 'bar'.", + line: 7, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { methods: { @@ -713,13 +728,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 12 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 12, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { methods: { @@ -736,13 +752,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 10 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 10, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { methods: { @@ -757,13 +774,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 9 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { computed: { @@ -778,13 +796,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 9 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { data() { @@ -799,13 +818,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 9 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { data() { @@ -820,13 +840,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 9 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9, + }, + ], }, { - filename: 'test.js', + filename: "test.js", code: ` defineComponent({ foo: { @@ -837,16 +858,16 @@ ruleTester.run('no-dupe-keys', rule, { }, }) `, - options: [{ groups: ['foo'] }], + options: [{ groups: ["foo"] }], errors: [ { - message: "Duplicated key 'bar'.", - line: 7 - } - ] + message: "Duplicate key 'bar'.", + line: 7, + }, + ], }, { - filename: 'test.js', + filename: "test.js", code: ` export default defineComponent({ foo: { @@ -857,16 +878,16 @@ ruleTester.run('no-dupe-keys', rule, { }, }) `, - options: [{ groups: ['foo'] }], + options: [{ groups: ["foo"] }], errors: [ { - message: "Duplicated key 'bar'.", - line: 7 - } - ] + message: "Duplicate key 'bar'.", + line: 7, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: ['foo'], @@ -884,13 +905,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 6 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 6, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: ['foo'], @@ -904,13 +926,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 7 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { props: ['foo'], @@ -923,13 +946,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 6 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 6, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { data () { @@ -943,13 +967,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 7 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` export default { data () { @@ -963,13 +988,14 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicated key 'foo'.", - line: 7 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser'), + parser: require.resolve("vue-eslint-parser"), errors: [ { - message: "Duplicated key 'foo'.", - line: 6 - } - ] + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 6, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser'), + parser: require.resolve("vue-eslint-parser"), errors: [ { - message: "Duplicated key 'baz'.", - line: 4 + message: "Duplicate key 'baz'.", + line: 4, }, { - message: "Duplicated key 'foo'.", - line: 12 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 12, }, { - message: "Duplicated key 'bar'.", - line: 15 - } - ] + message: "Duplicate key 'bar'.", + line: 15, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser'), - parserOptions: { parser: require.resolve('@typescript-eslint/parser') }, + parser: require.resolve("vue-eslint-parser"), + parserOptions: { parser: require.resolve("@typescript-eslint/parser") }, errors: [ { - message: "Duplicated key 'foo'.", - line: 8 + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 8, }, { - message: "Duplicated key 'bar'.", - line: 9 - } - ] + message: "Duplicate key 'bar'.", + line: 9, + }, + ], }, { - filename: 'test.vue', + filename: "test.vue", code: ` `, - parser: require.resolve('vue-eslint-parser'), + parser: require.resolve("vue-eslint-parser"), errors: [ { - message: "Duplicated key 'bar'.", - line: 5 - } - ] - } - ] -}) + message: "Duplicate key 'bar'.", + line: 5, + }, + ], + }, + ], +}); From e16b857ac06328772b0d9c832302897980a0989e Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Mon, 31 Jul 2023 13:11:56 -0400 Subject: [PATCH 2/5] Undo prettier format --- lib/rules/no-dupe-keys.js | 129 +++++----- tests/lib/rules/no-dupe-keys.js | 439 +++++++++++++++----------------- 2 files changed, 269 insertions(+), 299 deletions(-) diff --git a/lib/rules/no-dupe-keys.js b/lib/rules/no-dupe-keys.js index cff904fb6..03cb06e0a 100644 --- a/lib/rules/no-dupe-keys.js +++ b/lib/rules/no-dupe-keys.js @@ -2,10 +2,10 @@ * @fileoverview Prevents duplication of field names. * @author Armano */ -"use strict"; +'use strict' -const { findVariable } = require("@eslint-community/eslint-utils"); -const utils = require("../utils"); +const { findVariable } = require('@eslint-community/eslint-utils') +const utils = require('../utils') /** * @typedef {import('../utils').GroupName} GroupName @@ -14,7 +14,7 @@ const utils = require("../utils"); */ /** @type {GroupName[]} */ -const GROUP_NAMES = ["props", "computed", "data", "methods", "setup"]; +const GROUP_NAMES = ['props', 'computed', 'data', 'methods', 'setup'] /** * Gets the props pattern node from given `defineProps()` node @@ -22,25 +22,25 @@ const GROUP_NAMES = ["props", "computed", "data", "methods", "setup"]; * @returns {Pattern|null} */ function getPropsPattern(node) { - let target = node; + let target = node if ( target.parent && - target.parent.type === "CallExpression" && + target.parent.type === 'CallExpression' && target.parent.arguments[0] === target && - target.parent.callee.type === "Identifier" && - target.parent.callee.name === "withDefaults" + target.parent.callee.type === 'Identifier' && + target.parent.callee.name === 'withDefaults' ) { - target = target.parent; + target = target.parent } if ( !target.parent || - target.parent.type !== "VariableDeclarator" || + target.parent.type !== 'VariableDeclarator' || target.parent.init !== target ) { - return null; + return null } - return target.parent.id; + return target.parent.id } /** @@ -49,98 +49,97 @@ function getPropsPattern(node) { * @param {ESNode[]} references */ function isInsideInitializer(node, references) { - const init = node.init; + const init = node.init if (!init) { - return false; + return false } return references.some( (id) => init.range[0] <= id.range[0] && id.range[1] <= init.range[1] - ); + ) } module.exports = { meta: { - type: "problem", + type: 'problem', docs: { - description: "disallow duplication of field names", - categories: ["vue3-essential", "essential"], - url: "https://eslint.vuejs.org/rules/no-dupe-keys.html", + description: 'disallow duplication of field names', + categories: ['vue3-essential', 'essential'], + url: 'https://eslint.vuejs.org/rules/no-dupe-keys.html' }, fixable: null, schema: [ { - type: "object", + type: 'object', properties: { groups: { - type: "array", - }, + type: 'array' + } }, - additionalProperties: false, - }, + additionalProperties: false + } ], messages: { - duplicateKey: - "Duplicate key '{{name}}'. May cause name collision in script or template tag.", - }, + duplicateKey: "Duplicate key '{{name}}'. May cause name collision in script or template tag." + } }, /** @param {RuleContext} context */ create(context) { - const options = context.options[0] || {}; - const groups = new Set([...GROUP_NAMES, ...(options.groups || [])]); + const options = context.options[0] || {} + const groups = new Set([...GROUP_NAMES, ...(options.groups || [])]) return utils.compositingVisitors( utils.executeOnVue(context, (obj) => { - const properties = utils.iterateProperties(obj, groups); + const properties = utils.iterateProperties(obj, groups) /** @type {Set} */ - const usedNames = new Set(); + const usedNames = new Set() for (const o of properties) { if (usedNames.has(o.name)) { context.report({ node: o.node, - messageId: "duplicateKey", + messageId: 'duplicateKey', data: { - name: o.name, - }, - }); + name: o.name + } + }) } - usedNames.add(o.name); + usedNames.add(o.name) } }), utils.defineScriptSetupVisitor(context, { onDefinePropsEnter(node, props) { - const propsNode = getPropsPattern(node); + const propsNode = getPropsPattern(node) const propReferences = [ ...(propsNode ? extractReferences(propsNode) : []), - node, - ]; + node + ] for (const prop of props) { - if (!prop.propName) continue; + if (!prop.propName) continue - const variable = findVariable(context.getScope(), prop.propName); - if (!variable || variable.defs.length === 0) continue; + const variable = findVariable(context.getScope(), prop.propName) + if (!variable || variable.defs.length === 0) continue if ( variable.defs.some((def) => { - if (def.type !== "Variable") return false; - return isInsideInitializer(def.node, propReferences); + if (def.type !== 'Variable') return false + return isInsideInitializer(def.node, propReferences) }) ) { - continue; + continue } context.report({ node: variable.defs[0].node, - messageId: "duplicateKey", + messageId: 'duplicateKey', data: { - name: prop.propName, - }, - }); + name: prop.propName + } + }) } - }, + } }) - ); + ) /** * Extracts references from the given node. @@ -148,25 +147,25 @@ module.exports = { * @returns {Identifier[]} References */ function extractReferences(node) { - if (node.type === "Identifier") { - const variable = findVariable(context.getScope(), node); + if (node.type === 'Identifier') { + const variable = findVariable(context.getScope(), node) if (!variable) { - return []; + return [] } - return variable.references.map((ref) => ref.identifier); + return variable.references.map((ref) => ref.identifier) } - if (node.type === "ObjectPattern") { + if (node.type === 'ObjectPattern') { return node.properties.flatMap((prop) => - extractReferences(prop.type === "Property" ? prop.value : prop) - ); + extractReferences(prop.type === 'Property' ? prop.value : prop) + ) } - if (node.type === "AssignmentPattern") { - return extractReferences(node.left); + if (node.type === 'AssignmentPattern') { + return extractReferences(node.left) } - if (node.type === "RestElement") { - return extractReferences(node.argument); + if (node.type === 'RestElement') { + return extractReferences(node.argument) } - return []; + return [] } - }, -}; + } +} \ No newline at end of file diff --git a/tests/lib/rules/no-dupe-keys.js b/tests/lib/rules/no-dupe-keys.js index ba0d4c65c..191eedb20 100644 --- a/tests/lib/rules/no-dupe-keys.js +++ b/tests/lib/rules/no-dupe-keys.js @@ -2,21 +2,21 @@ * @fileoverview Prevents duplication of field names. * @author Armano */ -"use strict"; +'use strict' -const rule = require("../../../lib/rules/no-dupe-keys"); -const RuleTester = require("eslint").RuleTester; +const rule = require('../../../lib/rules/no-dupe-keys') +const RuleTester = require('eslint').RuleTester const ruleTester = new RuleTester({ parserOptions: { ecmaVersion: 2018, - sourceType: "module", - }, -}); -ruleTester.run("no-dupe-keys", rule, { + sourceType: 'module' + } +}) +ruleTester.run('no-dupe-keys', rule, { valid: [ { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -38,10 +38,10 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -68,11 +68,11 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -94,11 +94,11 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -118,11 +118,11 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { ...foo(), @@ -154,11 +154,11 @@ ruleTester.run("no-dupe-keys", rule, { } }, } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { ...foo(), @@ -198,11 +198,11 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { ...foo(), @@ -234,11 +234,11 @@ ruleTester.run("no-dupe-keys", rule, { } }, } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { ...foo(), @@ -268,11 +268,11 @@ ruleTester.run("no-dupe-keys", rule, { ...dat }), } - `, + ` }, { - filename: "test.js", + filename: 'test.js', code: ` // @vue/component export const compA = { @@ -287,10 +287,10 @@ ruleTester.run("no-dupe-keys", rule, { propA: String } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` // @vue/component export const compA = { @@ -319,10 +319,10 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data () { @@ -336,10 +336,10 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data () { @@ -353,10 +353,10 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data () { @@ -371,11 +371,11 @@ ruleTester.run("no-dupe-keys", rule, { } } } - `, + ` }, { // https://github.com/vuejs/eslint-plugin-vue/issues/1687 - filename: "test.vue", + filename: 'test.vue', code: ` export default { asyncData() { @@ -389,10 +389,10 @@ ruleTester.run("no-dupe-keys", rule, { } }, } - `, + ` }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), - parserOptions: { parser: require.resolve("@typescript-eslint/parser") }, + parser: require.resolve('vue-eslint-parser'), + parserOptions: { parser: require.resolve('@typescript-eslint/parser') } }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` const {foo,bar} = defineProps(['foo', 'bar']) `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` const {foo=42,bar='abc'} = defineProps(['foo', 'bar']) `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser') }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), - parserOptions: { parser: require.resolve("@typescript-eslint/parser") }, - }, + parser: require.resolve('vue-eslint-parser'), + parserOptions: { parser: require.resolve('@typescript-eslint/parser') } + } ], invalid: [ { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -529,29 +529,25 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 5, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 5 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 10, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 10 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 14, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 14 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 21, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 21 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -579,29 +575,25 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 5, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 5 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 10, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 10 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 14, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 14 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 21, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 21 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -620,24 +612,21 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 5, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 5 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 12, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 12 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: { @@ -667,29 +656,25 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 13, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 13 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 16, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 16 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 23, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 23 + } + ] }, { - filename: "test.js", + filename: 'test.js', code: ` new Vue({ foo: { @@ -700,16 +685,16 @@ ruleTester.run("no-dupe-keys", rule, { }, }) `, - options: [{ groups: ["foo"] }], + options: [{ groups: ['foo'] }], errors: [ { - message: "Duplicate key 'bar'.", - line: 7, - }, - ], + message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 7 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { methods: { @@ -728,14 +713,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 12, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 12 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { methods: { @@ -752,14 +736,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 10, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 10 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { methods: { @@ -774,14 +757,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { computed: { @@ -796,14 +778,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data() { @@ -818,14 +799,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data() { @@ -840,14 +820,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 9, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 9 + } + ] }, { - filename: "test.js", + filename: 'test.js', code: ` defineComponent({ foo: { @@ -858,16 +837,16 @@ ruleTester.run("no-dupe-keys", rule, { }, }) `, - options: [{ groups: ["foo"] }], + options: [{ groups: ['foo'] }], errors: [ { - message: "Duplicate key 'bar'.", - line: 7, - }, - ], + message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 7 + } + ] }, { - filename: "test.js", + filename: 'test.js', code: ` export default defineComponent({ foo: { @@ -878,16 +857,16 @@ ruleTester.run("no-dupe-keys", rule, { }, }) `, - options: [{ groups: ["foo"] }], + options: [{ groups: ['foo'] }], errors: [ { - message: "Duplicate key 'bar'.", - line: 7, - }, - ], + message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 7 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -905,14 +884,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 6, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 6 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -926,14 +904,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { props: ['foo'], @@ -946,14 +923,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 6, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 6 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data () { @@ -967,14 +943,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` export default { data () { @@ -988,14 +963,13 @@ ruleTester.run("no-dupe-keys", rule, { `, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 7, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 7 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser'), errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 6, - }, - ], + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 6 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser'), errors: [ { - message: "Duplicate key 'baz'.", - line: 4, + message: "Duplicate key 'baz'. May cause name collision in script or template tag.", + line: 4 }, { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 12, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 12 }, { - message: "Duplicate key 'bar'.", - line: 15, - }, - ], + message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 15 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), - parserOptions: { parser: require.resolve("@typescript-eslint/parser") }, + parser: require.resolve('vue-eslint-parser'), + parserOptions: { parser: require.resolve('@typescript-eslint/parser') }, errors: [ { - message: - "Duplicate key 'foo'. May cause name collision in script or template tag.", - line: 8, + message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + line: 8 }, { - message: "Duplicate key 'bar'.", - line: 9, - }, - ], + message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 9 + } + ] }, { - filename: "test.vue", + filename: 'test.vue', code: ` `, - parser: require.resolve("vue-eslint-parser"), + parser: require.resolve('vue-eslint-parser'), errors: [ { - message: "Duplicate key 'bar'.", - line: 5, - }, - ], - }, - ], -}); + message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + line: 5 + } + ] + } + ] +}) \ No newline at end of file From 3aa3766acd4770edb8fdd36e678ac68f43d4fc8c Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Mon, 31 Jul 2023 13:13:50 -0400 Subject: [PATCH 3/5] EOF fix --- lib/rules/no-dupe-keys.js | 2 +- tests/lib/rules/no-dupe-keys.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rules/no-dupe-keys.js b/lib/rules/no-dupe-keys.js index 03cb06e0a..909da9dae 100644 --- a/lib/rules/no-dupe-keys.js +++ b/lib/rules/no-dupe-keys.js @@ -168,4 +168,4 @@ module.exports = { return [] } } -} \ No newline at end of file +} diff --git a/tests/lib/rules/no-dupe-keys.js b/tests/lib/rules/no-dupe-keys.js index 191eedb20..b6ca9feac 100644 --- a/tests/lib/rules/no-dupe-keys.js +++ b/tests/lib/rules/no-dupe-keys.js @@ -1065,4 +1065,4 @@ ruleTester.run('no-dupe-keys', rule, { ] } ] -}) \ No newline at end of file +}) From 87a062829f123a5f97cb4ed008be633bec7b41ab Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Mon, 31 Jul 2023 13:18:04 -0400 Subject: [PATCH 4/5] Fix prettier line wrap? --- lib/rules/no-dupe-keys.js | 3 +- tests/lib/rules/no-dupe-keys.js | 108 +++++++++++++++++++++----------- 2 files changed, 74 insertions(+), 37 deletions(-) diff --git a/lib/rules/no-dupe-keys.js b/lib/rules/no-dupe-keys.js index 909da9dae..c690d8aa5 100644 --- a/lib/rules/no-dupe-keys.js +++ b/lib/rules/no-dupe-keys.js @@ -79,7 +79,8 @@ module.exports = { } ], messages: { - duplicateKey: "Duplicate key '{{name}}'. May cause name collision in script or template tag." + duplicateKey: + "Duplicate key '{{name}}'. May cause name collision in script or template tag." } }, /** @param {RuleContext} context */ diff --git a/tests/lib/rules/no-dupe-keys.js b/tests/lib/rules/no-dupe-keys.js index b6ca9feac..72ea22620 100644 --- a/tests/lib/rules/no-dupe-keys.js +++ b/tests/lib/rules/no-dupe-keys.js @@ -529,19 +529,23 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 5 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 10 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 14 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 21 } ] @@ -575,19 +579,23 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 5 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 10 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 14 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 21 } ] @@ -612,15 +620,18 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 5 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 9 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 12 } ] @@ -656,19 +667,23 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 7 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 13 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 16 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 23 } ] @@ -688,7 +703,8 @@ ruleTester.run('no-dupe-keys', rule, { options: [{ groups: ['foo'] }], errors: [ { - message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", line: 7 } ] @@ -713,7 +729,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 12 } ] @@ -736,7 +753,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 10 } ] @@ -757,7 +775,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 9 } ] @@ -778,7 +797,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 9 } ] @@ -799,7 +819,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 9 } ] @@ -820,7 +841,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 9 } ] @@ -840,7 +862,8 @@ ruleTester.run('no-dupe-keys', rule, { options: [{ groups: ['foo'] }], errors: [ { - message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", line: 7 } ] @@ -860,7 +883,8 @@ ruleTester.run('no-dupe-keys', rule, { options: [{ groups: ['foo'] }], errors: [ { - message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", line: 7 } ] @@ -884,7 +908,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 6 } ] @@ -904,7 +929,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 7 } ] @@ -923,7 +949,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 6 } ] @@ -943,7 +970,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 7 } ] @@ -963,7 +991,8 @@ ruleTester.run('no-dupe-keys', rule, { `, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 7 } ] @@ -981,7 +1010,8 @@ ruleTester.run('no-dupe-keys', rule, { parser: require.resolve('vue-eslint-parser'), errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 6 } ] @@ -1008,15 +1038,18 @@ ruleTester.run('no-dupe-keys', rule, { parser: require.resolve('vue-eslint-parser'), errors: [ { - message: "Duplicate key 'baz'. May cause name collision in script or template tag.", + message: + "Duplicate key 'baz'. May cause name collision in script or template tag.", line: 4 }, { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 12 }, { - message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", line: 15 } ] @@ -1038,11 +1071,13 @@ ruleTester.run('no-dupe-keys', rule, { parserOptions: { parser: require.resolve('@typescript-eslint/parser') }, errors: [ { - message: "Duplicate key 'foo'. May cause name collision in script or template tag.", + message: + "Duplicate key 'foo'. May cause name collision in script or template tag.", line: 8 }, { - message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", line: 9 } ] @@ -1059,7 +1094,8 @@ ruleTester.run('no-dupe-keys', rule, { parser: require.resolve('vue-eslint-parser'), errors: [ { - message: "Duplicate key 'bar'. May cause name collision in script or template tag.", + message: + "Duplicate key 'bar'. May cause name collision in script or template tag.", line: 5 } ] From 636f623354c6443aa6b32ca6fbf8cfafa03fb9a2 Mon Sep 17 00:00:00 2001 From: Vincent Rubinetti Date: Mon, 31 Jul 2023 13:21:00 -0400 Subject: [PATCH 5/5] Fix md script tag --- docs/rules/no-dupe-keys.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/rules/no-dupe-keys.md b/docs/rules/no-dupe-keys.md index 23b9bf2ee..1d9d20f24 100644 --- a/docs/rules/no-dupe-keys.md +++ b/docs/rules/no-dupe-keys.md @@ -11,11 +11,12 @@ since: v3.9.0 - :gear: This rule is included in all of `"plugin:vue/vue3-essential"`, `"plugin:vue/essential"`, `"plugin:vue/vue3-strongly-recommended"`, `"plugin:vue/strongly-recommended"`, `"plugin:vue/vue3-recommended"` and `"plugin:vue/recommended"`. -This rule prevents using duplicate names. +This rule prevents using duplicate key names. ## :book: Rule Details -This rule prevents duplicate `props`/`data`/`methods`/etc. key names defined on a component. Even if a key name does not conflict in the `