Skip to content

Commit 9d94342

Browse files
committed
feat: check multi root
1 parent cd74105 commit 9d94342

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-1
lines changed

lib/rules/no-duplicate-attr-inheritance.js

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,43 @@
66

77
const utils = require('../utils')
88

9+
/** @param {VElement[]} elements */
10+
function isConditionalGroup(elements) {
11+
let hasIf = false
12+
let hasElse = false
13+
14+
for (const element of elements) {
15+
if (utils.hasDirective(element, 'if')) {
16+
if (hasIf || hasElse) {
17+
return false
18+
}
19+
hasIf = true
20+
} else if (utils.hasDirective(element, 'else-if')) {
21+
if (!hasIf || hasElse) {
22+
return false
23+
}
24+
} else if (utils.hasDirective(element, 'else')) {
25+
if (!hasIf || hasElse) {
26+
return false
27+
}
28+
hasElse = true
29+
} else {
30+
return false
31+
}
32+
}
33+
34+
return hasIf && (elements.length === 1 || hasElse)
35+
}
36+
37+
/** @param {VElement[]} elements */
38+
function isMultiRoot(elements) {
39+
if (elements.length > 1 && !isConditionalGroup(elements)) {
40+
return true
41+
}
42+
43+
return false
44+
}
45+
946
module.exports = {
1047
meta: {
1148
type: 'suggestion',
@@ -77,7 +114,10 @@ module.exports = {
77114
}
78115

79116
const rootElements = element.children.filter(utils.isVElement)
80-
if (rootElements.length === 1 && attrsRefs.length > 0) {
117+
// ignore multi root
118+
if (isMultiRoot(rootElements)) return
119+
120+
if (attrsRefs.length > 0) {
81121
for (const attrsRef of attrsRefs) {
82122
context.report({
83123
node: attrsRef.id,

tests/lib/rules/no-duplicate-attr-inheritance.js

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,47 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, {
5252
<template><div v-bind="$attrs"/><div/></template>
5353
`
5454
},
55+
// ignore multi root
56+
{
57+
filename: 'test.vue',
58+
code: `
59+
<template>
60+
<div v-if="condition1"></div>
61+
<div v-if="condition2" v-bind="$attrs"></div>
62+
<div v-else></div>
63+
</template>
64+
`
65+
},
66+
{
67+
filename: 'test.vue',
68+
code: `
69+
<template>
70+
<div v-if="condition1"></div>
71+
<div v-else-if="condition2"></div>
72+
<div v-bind="$attrs"></div>
73+
</template>
74+
`
75+
},
76+
{
77+
filename: 'test.vue',
78+
code: `
79+
<template>
80+
<div v-bind="$attrs"></div>
81+
<div v-if="condition1"></div>
82+
<div v-else></div>
83+
</template>
84+
`
85+
},
86+
{
87+
filename: 'test.vue',
88+
code: `
89+
<template>
90+
<div v-if="condition1"></div>
91+
<div v-else-if="condition2"></div>
92+
<div v-if="condition3" v-bind="$attrs"></div>
93+
</template>
94+
`
95+
},
5596
{
5697
filename: 'test.vue',
5798
code: `
@@ -160,6 +201,49 @@ ruleTester.run('no-duplicate-attr-inheritance', rule, {
160201
line: 5
161202
}
162203
]
204+
},
205+
// single root with a condition group
206+
{
207+
filename: 'test.vue',
208+
code: `
209+
<template>
210+
<div v-if="condition1" v-bind="$attrs"></div>
211+
<div v-else-if="condition2"></div>
212+
<div v-else></div>
213+
</template>
214+
`,
215+
errors: [{ message: 'Set "inheritAttrs" to false.' }]
216+
},
217+
{
218+
filename: 'test.vue',
219+
code: `
220+
<template>
221+
<div v-if="condition1" v-bind="$attrs"></div>
222+
<div v-else-if="condition2"></div>
223+
<div v-else-if="condition3"></div>
224+
<div v-else></div>
225+
</template>
226+
`,
227+
errors: [{ message: 'Set "inheritAttrs" to false.' }]
228+
},
229+
{
230+
filename: 'test.vue',
231+
code: `
232+
<template>
233+
<div v-if="condition1" v-bind="$attrs"></div>
234+
<div v-else></div>
235+
</template>
236+
`,
237+
errors: [{ message: 'Set "inheritAttrs" to false.' }]
238+
},
239+
{
240+
filename: 'test.vue',
241+
code: `
242+
<template>
243+
<div v-if="condition1" v-bind="$attrs"></div>
244+
</template>
245+
`,
246+
errors: [{ message: 'Set "inheritAttrs" to false.' }]
163247
}
164248
]
165249
})

0 commit comments

Comments
 (0)