Skip to content

Commit ec35351

Browse files
authored
feat: detect $slots usages in template (#26)
1 parent 6e70ad3 commit ec35351

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

src/utils/parseTemplate.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { SFCDescriptor } from '@vue/compiler-sfc'
22
import { compileTemplate } from '@vue/compiler-sfc'
33

44
export function parseTemplate (id: string, descriptor: SFCDescriptor) {
5+
const slots = []
56
if (!descriptor.template) {
67
return {
78
slots: []
@@ -25,7 +26,21 @@ export function parseTemplate (id: string, descriptor: SFCDescriptor) {
2526
]
2627
}
2728

29+
// Detect `$slots` usage
30+
const $slots = template.source.matchAll(/\$slots(\.([-_\w]+)|\[['"]([-_\w]+)['"]\])/g)
31+
let $slot = $slots.next()
32+
while (!$slot.done) {
33+
slots.push({
34+
name: $slot.value[2] || $slot.value[3]
35+
})
36+
$slot = $slots.next()
37+
}
38+
39+
// Detect `<slot>` usage
40+
const slotsAst = findSlots(template.ast.children)
41+
slots.push(...slotsAst)
42+
2843
return {
29-
slots: findSlots(template.ast?.children || [])
44+
slots
3045
}
3146
}

test/basic-component.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ describe('Basic Component', async () => {
1111

1212
test('Slots', () => {
1313
expect(slots).toEqual([
14+
{ name: 'variable' },
15+
{ name: 'foo-bar' },
1416
{ name: 'default' },
1517
{ name: 'nuxt' }
1618
])

test/fixtures/basic/components/BasicComponent.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
<slot />
44
<hr>
55
<slot name="nuxt" />
6+
7+
<SomeComponent :prop="$slots.variable" />
8+
<SomeComponent :prop="$slots['foo-bar']" />
69
</div>
710
</template>
811

0 commit comments

Comments
 (0)