-
-
Notifications
You must be signed in to change notification settings - Fork 367
/
Copy pathdevui.ts
122 lines (93 loc) · 3.18 KB
/
devui.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { kebabCase } from '../utils'
import type { ComponentInfo, ComponentResolver } from '../../types'
export interface DevResolverOptions {
/**
* bring in components and styles
*
* @default true
*/
importStyle?: boolean
/**
* auto import for directives
*
* @default true
*/
directives?: boolean
/**
* use umd lib file
*/
ssr?: boolean
}
const LIB_NAME = 'vue-devui'
const HARMLESS = ['ripple']
// Locate the target path folder.
function resolveDirectory(name: string, filename: string) {
return `${LIB_NAME}/${name}/${filename}`
}
// Gets the component style file
function getSideEffects(name: string, filename: string) {
if (HARMLESS.includes(name))
return
if (['row', 'col'].includes(name))
return resolveDirectory('grid', filename)
if (['aside', 'content', 'footer', 'header', 'layout'].includes(name))
return resolveDirectory('layout', filename)
if (['overlay', 'fixed-overlay', 'flexible-overlay'].includes(name))
return resolveDirectory('overlay', filename)
if (['panel', 'panel-header', 'panel-body'].includes(name))
return resolveDirectory('panel', filename)
if (['menu', 'menu-item', 'sub-menu'].includes(name))
return resolveDirectory('menu', filename)
if (['tabs', 'tab'].includes(name))
return resolveDirectory('tabs', filename)
if (['form', 'form-item'].includes(name))
return resolveDirectory('form', filename)
if (['collapse', 'collapse-item'].includes(name))
return resolveDirectory('collapse', filename)
if (['steps', 'step'].includes(name))
return resolveDirectory('steps', filename)
if (['radio', 'radio-group', 'radio-button'].includes(name))
return resolveDirectory('radio', filename)
if (['column'].includes(name))
return resolveDirectory('table', filename)
if (['timeline-item'].includes(name))
return resolveDirectory('timeline', filename)
if (['splitter-pane'].includes(name))
return resolveDirectory('splitter', filename)
return resolveDirectory(name, filename)
}
function componentsResolver(name: string, { ssr }: DevResolverOptions): ComponentInfo | undefined {
if (!name.match(/^D[A-Z]/))
return
// Alert => alert; DatePicker => date-picker
const resolveId = kebabCase(name = name.slice(1))
return {
name,
sideEffects: getSideEffects(resolveId, 'style.css'),
from: getSideEffects(resolveId, `index.${ssr ? 'umd' : 'es'}.js`)!,
}
}
function directivesResolver(name: string, { ssr }: DevResolverOptions): ComponentInfo | undefined {
const resolveId = kebabCase(name)
return {
name: `${name}Directive`,
sideEffects: getSideEffects(resolveId, 'style.css'),
from: resolveDirectory(resolveId, `index.${ssr ? 'umd' : 'es'}.js`),
}
}
export function DevUiResolver(options: DevResolverOptions = {}): ComponentResolver[] {
const config = { directives: true, importStyle: true, ssr: false, ...options }
const resolvers: ComponentResolver[] = [
{
type: 'component',
resolve: (name: string) => componentsResolver(name, config),
},
]
if (config.directives) {
resolvers.push({
type: 'directive',
resolve: (name: string) => directivesResolver(name, config),
})
}
return resolvers
}