Skip to content

Commit 101cabf

Browse files
Improve docs and error message for vue/no-dupe-keys (#2260)
1 parent 28efd94 commit 101cabf

File tree

5 files changed

+82
-45
lines changed

5 files changed

+82
-45
lines changed

docs/rules/no-dupe-keys.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ since: v3.9.0
1111
1212
- :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"`.
1313

14-
This rule prevents to use duplicated names.
14+
This rule prevents using duplicate key names.
1515

1616
## :book: Rule Details
1717

18-
This rule is aimed at preventing duplicated property names.
18+
This rule prevents duplicate `props`/`data`/`methods`/etc. key names defined on a component.
19+
Even if a key name does not conflict in the `<script>` tag itself, it still may lead to a conflict in the `<template>` since Vue allows directly accessing these keys from there.
1920

2021
<eslint-code-block :rules="{'vue/no-dupe-keys': ['error']}">
2122

docs/rules/no-duplicate-attr-inheritance.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ since: v7.0.0
1111
1212
## :book: Rule Details
1313

14-
This rule aims to prevent duplicated attribute inheritance.
14+
This rule aims to prevent duplicate attribute inheritance.
1515
This rule to warn to apply `inheritAttrs: false` when it detects `v-bind="$attrs"` being used.
1616

1717
<eslint-code-block :rules="{'vue/no-duplicate-attr-inheritance': ['error']}">

docs/rules/no-duplicate-attributes.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@ since: v3.0.0
1111
1212
- :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"`.
1313

14-
When duplicate arguments exist, only the last one is valid.
15-
It's possibly mistakes.
14+
When there are multiple attributes with the same name on a component, only the last one is used and the rest are ignored, so this is usually a mistake.
1615

1716
## :book: Rule Details
1817

1918
This rule reports duplicate attributes.
20-
`v-bind:foo` directives are handled as the attributes `foo`.
19+
`v-bind:foo` directives are handled as the attribute `foo`.
2120

2221
<eslint-code-block :rules="{'vue/no-duplicate-attributes': ['error']}">
2322

lib/rules/no-dupe-keys.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ module.exports = {
7979
}
8080
],
8181
messages: {
82-
duplicatedKey: "Duplicated key '{{name}}'."
82+
duplicateKey:
83+
"Duplicate key '{{name}}'. May cause name collision in script or template tag."
8384
}
8485
},
8586
/** @param {RuleContext} context */
@@ -96,7 +97,7 @@ module.exports = {
9697
if (usedNames.has(o.name)) {
9798
context.report({
9899
node: o.node,
99-
messageId: 'duplicatedKey',
100+
messageId: 'duplicateKey',
100101
data: {
101102
name: o.name
102103
}
@@ -131,7 +132,7 @@ module.exports = {
131132

132133
context.report({
133134
node: variable.defs[0].node,
134-
messageId: 'duplicatedKey',
135+
messageId: 'duplicateKey',
135136
data: {
136137
name: prop.propName
137138
}

tests/lib/rules/no-dupe-keys.js

+72-36
Original file line numberDiff line numberDiff line change
@@ -529,19 +529,23 @@ ruleTester.run('no-dupe-keys', rule, {
529529
`,
530530
errors: [
531531
{
532-
message: "Duplicated key 'foo'.",
532+
message:
533+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
533534
line: 5
534535
},
535536
{
536-
message: "Duplicated key 'foo'.",
537+
message:
538+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
537539
line: 10
538540
},
539541
{
540-
message: "Duplicated key 'foo'.",
542+
message:
543+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
541544
line: 14
542545
},
543546
{
544-
message: "Duplicated key 'foo'.",
547+
message:
548+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
545549
line: 21
546550
}
547551
]
@@ -575,19 +579,23 @@ ruleTester.run('no-dupe-keys', rule, {
575579
`,
576580
errors: [
577581
{
578-
message: "Duplicated key 'foo'.",
582+
message:
583+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
579584
line: 5
580585
},
581586
{
582-
message: "Duplicated key 'foo'.",
587+
message:
588+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
583589
line: 10
584590
},
585591
{
586-
message: "Duplicated key 'foo'.",
592+
message:
593+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
587594
line: 14
588595
},
589596
{
590-
message: "Duplicated key 'foo'.",
597+
message:
598+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
591599
line: 21
592600
}
593601
]
@@ -612,15 +620,18 @@ ruleTester.run('no-dupe-keys', rule, {
612620
`,
613621
errors: [
614622
{
615-
message: "Duplicated key 'foo'.",
623+
message:
624+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
616625
line: 5
617626
},
618627
{
619-
message: "Duplicated key 'foo'.",
628+
message:
629+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
620630
line: 9
621631
},
622632
{
623-
message: "Duplicated key 'foo'.",
633+
message:
634+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
624635
line: 12
625636
}
626637
]
@@ -656,19 +667,23 @@ ruleTester.run('no-dupe-keys', rule, {
656667
`,
657668
errors: [
658669
{
659-
message: "Duplicated key 'foo'.",
670+
message:
671+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
660672
line: 7
661673
},
662674
{
663-
message: "Duplicated key 'foo'.",
675+
message:
676+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
664677
line: 13
665678
},
666679
{
667-
message: "Duplicated key 'foo'.",
680+
message:
681+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
668682
line: 16
669683
},
670684
{
671-
message: "Duplicated key 'foo'.",
685+
message:
686+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
672687
line: 23
673688
}
674689
]
@@ -688,7 +703,8 @@ ruleTester.run('no-dupe-keys', rule, {
688703
options: [{ groups: ['foo'] }],
689704
errors: [
690705
{
691-
message: "Duplicated key 'bar'.",
706+
message:
707+
"Duplicate key 'bar'. May cause name collision in script or template tag.",
692708
line: 7
693709
}
694710
]
@@ -713,7 +729,8 @@ ruleTester.run('no-dupe-keys', rule, {
713729
`,
714730
errors: [
715731
{
716-
message: "Duplicated key 'foo'.",
732+
message:
733+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
717734
line: 12
718735
}
719736
]
@@ -736,7 +753,8 @@ ruleTester.run('no-dupe-keys', rule, {
736753
`,
737754
errors: [
738755
{
739-
message: "Duplicated key 'foo'.",
756+
message:
757+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
740758
line: 10
741759
}
742760
]
@@ -757,7 +775,8 @@ ruleTester.run('no-dupe-keys', rule, {
757775
`,
758776
errors: [
759777
{
760-
message: "Duplicated key 'foo'.",
778+
message:
779+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
761780
line: 9
762781
}
763782
]
@@ -778,7 +797,8 @@ ruleTester.run('no-dupe-keys', rule, {
778797
`,
779798
errors: [
780799
{
781-
message: "Duplicated key 'foo'.",
800+
message:
801+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
782802
line: 9
783803
}
784804
]
@@ -799,7 +819,8 @@ ruleTester.run('no-dupe-keys', rule, {
799819
`,
800820
errors: [
801821
{
802-
message: "Duplicated key 'foo'.",
822+
message:
823+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
803824
line: 9
804825
}
805826
]
@@ -820,7 +841,8 @@ ruleTester.run('no-dupe-keys', rule, {
820841
`,
821842
errors: [
822843
{
823-
message: "Duplicated key 'foo'.",
844+
message:
845+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
824846
line: 9
825847
}
826848
]
@@ -840,7 +862,8 @@ ruleTester.run('no-dupe-keys', rule, {
840862
options: [{ groups: ['foo'] }],
841863
errors: [
842864
{
843-
message: "Duplicated key 'bar'.",
865+
message:
866+
"Duplicate key 'bar'. May cause name collision in script or template tag.",
844867
line: 7
845868
}
846869
]
@@ -860,7 +883,8 @@ ruleTester.run('no-dupe-keys', rule, {
860883
options: [{ groups: ['foo'] }],
861884
errors: [
862885
{
863-
message: "Duplicated key 'bar'.",
886+
message:
887+
"Duplicate key 'bar'. May cause name collision in script or template tag.",
864888
line: 7
865889
}
866890
]
@@ -884,7 +908,8 @@ ruleTester.run('no-dupe-keys', rule, {
884908
`,
885909
errors: [
886910
{
887-
message: "Duplicated key 'foo'.",
911+
message:
912+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
888913
line: 6
889914
}
890915
]
@@ -904,7 +929,8 @@ ruleTester.run('no-dupe-keys', rule, {
904929
`,
905930
errors: [
906931
{
907-
message: "Duplicated key 'foo'.",
932+
message:
933+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
908934
line: 7
909935
}
910936
]
@@ -923,7 +949,8 @@ ruleTester.run('no-dupe-keys', rule, {
923949
`,
924950
errors: [
925951
{
926-
message: "Duplicated key 'foo'.",
952+
message:
953+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
927954
line: 6
928955
}
929956
]
@@ -943,7 +970,8 @@ ruleTester.run('no-dupe-keys', rule, {
943970
`,
944971
errors: [
945972
{
946-
message: "Duplicated key 'foo'.",
973+
message:
974+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
947975
line: 7
948976
}
949977
]
@@ -963,7 +991,8 @@ ruleTester.run('no-dupe-keys', rule, {
963991
`,
964992
errors: [
965993
{
966-
message: "Duplicated key 'foo'.",
994+
message:
995+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
967996
line: 7
968997
}
969998
]
@@ -981,7 +1010,8 @@ ruleTester.run('no-dupe-keys', rule, {
9811010
parser: require.resolve('vue-eslint-parser'),
9821011
errors: [
9831012
{
984-
message: "Duplicated key 'foo'.",
1013+
message:
1014+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
9851015
line: 6
9861016
}
9871017
]
@@ -1008,15 +1038,18 @@ ruleTester.run('no-dupe-keys', rule, {
10081038
parser: require.resolve('vue-eslint-parser'),
10091039
errors: [
10101040
{
1011-
message: "Duplicated key 'baz'.",
1041+
message:
1042+
"Duplicate key 'baz'. May cause name collision in script or template tag.",
10121043
line: 4
10131044
},
10141045
{
1015-
message: "Duplicated key 'foo'.",
1046+
message:
1047+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
10161048
line: 12
10171049
},
10181050
{
1019-
message: "Duplicated key 'bar'.",
1051+
message:
1052+
"Duplicate key 'bar'. May cause name collision in script or template tag.",
10201053
line: 15
10211054
}
10221055
]
@@ -1038,11 +1071,13 @@ ruleTester.run('no-dupe-keys', rule, {
10381071
parserOptions: { parser: require.resolve('@typescript-eslint/parser') },
10391072
errors: [
10401073
{
1041-
message: "Duplicated key 'foo'.",
1074+
message:
1075+
"Duplicate key 'foo'. May cause name collision in script or template tag.",
10421076
line: 8
10431077
},
10441078
{
1045-
message: "Duplicated key 'bar'.",
1079+
message:
1080+
"Duplicate key 'bar'. May cause name collision in script or template tag.",
10461081
line: 9
10471082
}
10481083
]
@@ -1059,7 +1094,8 @@ ruleTester.run('no-dupe-keys', rule, {
10591094
parser: require.resolve('vue-eslint-parser'),
10601095
errors: [
10611096
{
1062-
message: "Duplicated key 'bar'.",
1097+
message:
1098+
"Duplicate key 'bar'. May cause name collision in script or template tag.",
10631099
line: 5
10641100
}
10651101
]

0 commit comments

Comments
 (0)