import { pascalCase } from 'scule' type Slots = 'header-start' | 'header-after-logo' | 'header-after-menu' | 'header-end' | 'main-sidebar-top' | 'main-sidebar-after-logo' | 'main-sidebar-after-menu' | 'main-sidebar-bottom' | 'sub-sidebar-top' | 'sub-sidebar-after-logo' | 'sub-sidebar-after-menu' | 'sub-sidebar-bottom' | 'tabbar-start' | 'tabbar-end' | 'toolbar-start' | 'toolbar-end' | 'free-position' function tryLoadComponent(name: Slots) { const componentMap = import.meta.glob('./*/index.vue', { eager: true }) const path = `./${pascalCase(name as unknown as string)}/index.vue` const component = componentMap[path as keyof typeof componentMap] if (!component) { return { default: defineComponent({ name: 'SlotsInvalidComponent', render: () => null, }), } } return component } export function useSlots(name: Slots) { const component = tryLoadComponent(name) return defineComponent((component as any).default) }