| 1234567891011121314151617181920212223242526272829 |
- 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)
- }
|