Skip to content

Commit 548f088

Browse files
committed
fix(require-explicit-slots): ignore attribute binding
1 parent 207eb98 commit 548f088

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

lib/rules/require-explicit-slots.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,27 @@ module.exports = {
137137
}
138138
}),
139139
utils.defineTemplateBodyVisitor(context, {
140+
/** @param {VElement} node */
140141
"VElement[name='slot']"(node) {
141-
let slotName = 'default'
142-
143-
const slotNameAttr = utils.getAttribute(node, 'name')
142+
const nameNode = node.startTag.attributes.find(
143+
(node) =>
144+
(!node.directive && node.key.name === 'name') ||
145+
(node.directive &&
146+
node.key.name.name === 'bind' &&
147+
node.key.argument?.type === 'VIdentifier' &&
148+
node.key.argument?.name === 'name')
149+
)
144150

145-
if (slotNameAttr?.value) {
146-
slotName = slotNameAttr.value.value
151+
/** @type {string | undefined} */
152+
let slotName = ''
153+
if (!nameNode) {
154+
// If no slot name is declared, default to 'default'
155+
slotName = 'default'
156+
} else if (nameNode.directive) {
157+
// ignore attribute binding
158+
return
159+
} else {
160+
slotName = nameNode.value?.value
147161
}
148162

149163
if (!slotsDefined.has(slotName)) {

tests/lib/rules/require-explicit-slots.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,19 @@ tester.run('require-explicit-slots', rule, {
160160
parser: null
161161
}
162162
}
163+
},
164+
// ignore attribute binding
165+
{
166+
filename: 'test.vue',
167+
code: `
168+
<template>
169+
<div>
170+
<slot :name="'foo'"></slot>
171+
</div>
172+
</template>
173+
<script setup lang="ts">
174+
defineSlots<{}>()
175+
</script>`
163176
}
164177
],
165178
invalid: [

0 commit comments

Comments
 (0)