Skip to content

Commit 032ff4a

Browse files
authored
fix: transform useSlots usages into dummy <slot /> in templates (#64)
1 parent 1a173aa commit 032ff4a

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<template>
2+
<div>
3+
Dummy component to test useSlots
4+
</div>
5+
</template>
6+
7+
<script setup lang="ts">
8+
const slots = useSlots()
9+
10+
const defaultSlot = computed(() => slots.default?.())
11+
12+
</script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<template>
2+
<div>
3+
Dummy component to test useSlots
4+
</div>
5+
</template>
6+
7+
<script setup lang="ts">
8+
const { title, default: dd } = useSlots()
9+
</script>

src/module.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,27 @@ export default defineNuxtModule<ModuleOptions>({
5252
return `<slot ${slotName === 'default' ? '' : `name="${slotName}"`} />`
5353
}
5454
)
55+
// Handle `(const|let|var) slots = useSlots()`
56+
const name = code.match(/(const|let|var) ([a-zA-Z][a-zA-Z-_0-9]*) = useSlots\(\)/)?.[2] || '$slots'
57+
const _slots = code.match(new RegExp(`${name}\\.[a-zA-Z]+`, 'gm'))
58+
if (_slots) {
59+
const slots = _slots
60+
.map(s => s.replace(name + '.', ''))
61+
.map(s => `<slot name="${s}" />`)
62+
code = code.replace(/<template>/, `<template>\n${slots.join('\n')}\n`)
63+
}
64+
65+
// Handle `(const|let|var) { title, default: defaultSlot } = useSlots()`
66+
const slotNames = code.match(/(const|let|var) {([^}]+)}\s*=\s*useSlots\(\)/)?.[2]
67+
// \s*(([a-zA-Z][a-zA-Z-_0-9]*(\s*:\s*[a-zA-Z][a-zA-Z-_0-9]*)?\s*,?\s*)+)\s*
68+
if (slotNames) {
69+
const slots = slotNames
70+
.trim()
71+
.split(',')
72+
.map(s => s.trim().split(':')[0].trim())
73+
.map(s => `<slot name="${s}" />`)
74+
code = code.replace(/<template>/, `<template>\n${slots.join('\n')}\n`)
75+
}
5576

5677
return { component, code }
5778
}

0 commit comments

Comments
 (0)