1
1
import { ComponentResolver } from '../types'
2
+ import { kebabCase } from '../utils'
2
3
3
4
/**
4
5
* Resolver for Ant Design Vue
@@ -10,11 +11,190 @@ import { ComponentResolver } from '../types'
10
11
* @author @yangss 3
11
12
* @link https://antdv.com/
12
13
*/
13
- export const AntDesignVueResolver = ( ) : ComponentResolver => ( name : string ) => {
14
- if ( name . match ( / ^ A [ A - Z ] / ) )
15
- return {
16
- importName : name . slice ( 1 ) ,
17
- path : 'ant-design-vue/es' ,
18
- sideEffects : "ant-design-vue/es/style" ,
19
- }
14
+
15
+ interface IMatcher {
16
+ pattern : RegExp
17
+ styleDir : string
20
18
}
19
+ const matchComponents : IMatcher [ ] = [
20
+ {
21
+ pattern : / ^ A v a t a r / ,
22
+ styleDir : 'avatar' ,
23
+ } ,
24
+ {
25
+ pattern : / ^ A u t o C o m p l e t e / ,
26
+ styleDir : 'auto-complete' ,
27
+ } ,
28
+ {
29
+ pattern : / ^ A n c h o r / ,
30
+ styleDir : 'anchor' ,
31
+ } ,
32
+
33
+ {
34
+ pattern : / ^ B a d g e / ,
35
+ styleDir : 'badge' ,
36
+ } ,
37
+ {
38
+ pattern : / ^ B r e a d c r u m b / ,
39
+ styleDir : 'breadcrumb' ,
40
+ } ,
41
+ {
42
+ pattern : / ^ B u t t o n / ,
43
+ styleDir : 'button' ,
44
+ } ,
45
+ {
46
+ pattern : / ^ C h e c k b o x / ,
47
+ styleDir : 'checkbox' ,
48
+ } ,
49
+ {
50
+ pattern : / ^ C a r d / ,
51
+ styleDir : 'card' ,
52
+ } ,
53
+ {
54
+ pattern : / ^ C o l l a p s e / ,
55
+ styleDir : 'collapse' ,
56
+ } ,
57
+ {
58
+ pattern : / ^ D e s c r i p t i o n s / ,
59
+ styleDir : 'descriptions' ,
60
+ } ,
61
+ {
62
+ pattern : / ^ R a n g e P i c k e r | ^ W e e k P i c k e r | ^ M o n t h P i c k e r / ,
63
+ styleDir : 'date-picker' ,
64
+ } ,
65
+ {
66
+ pattern : / ^ D r o p d o w n / ,
67
+ styleDir : 'dropdown' ,
68
+ } ,
69
+
70
+ {
71
+ pattern : / ^ F o r m / ,
72
+ styleDir : 'form' ,
73
+ } ,
74
+ {
75
+ pattern : / ^ I n p u t N u m b e r / ,
76
+ styleDir : 'input-number' ,
77
+ } ,
78
+
79
+ {
80
+ pattern : / ^ I n p u t | ^ T e x t a r e a / ,
81
+ styleDir : 'input' ,
82
+ } ,
83
+ {
84
+ pattern : / ^ S t a t i s t i c / ,
85
+ styleDir : 'statistic' ,
86
+ } ,
87
+ {
88
+ pattern : / ^ C h e c k a b l e T a g / ,
89
+ styleDir : 'tag' ,
90
+ } ,
91
+ {
92
+ pattern : / ^ L a y o u t / ,
93
+ styleDir : 'layout' ,
94
+ } ,
95
+ {
96
+ pattern : / ^ M e n u | ^ S u b M e n u / ,
97
+ styleDir : 'menu' ,
98
+ } ,
99
+
100
+ {
101
+ pattern : / ^ T a b l e / ,
102
+ styleDir : 'table' ,
103
+ } ,
104
+ {
105
+ pattern : / ^ R a d i o / ,
106
+ styleDir : 'radio' ,
107
+ } ,
108
+
109
+ {
110
+ pattern : / ^ I m a g e / ,
111
+ styleDir : 'image' ,
112
+ } ,
113
+
114
+ {
115
+ pattern : / ^ L i s t / ,
116
+ styleDir : 'list' ,
117
+ } ,
118
+
119
+ {
120
+ pattern : / ^ T a b / ,
121
+ styleDir : 'tabs' ,
122
+ } ,
123
+ {
124
+ pattern : / ^ M e n t i o n s / ,
125
+ styleDir : 'mentions' ,
126
+ } ,
127
+
128
+ {
129
+ pattern : / ^ M e n t i o n s / ,
130
+ styleDir : 'mentions' ,
131
+ } ,
132
+
133
+ {
134
+ pattern : / ^ S t e p / ,
135
+ styleDir : 'steps' ,
136
+ } ,
137
+ {
138
+ pattern : / ^ S k e l e t o n / ,
139
+ styleDir : 'skeleton' ,
140
+ } ,
141
+
142
+ {
143
+ pattern : / ^ S e l e c t / ,
144
+ styleDir : 'select' ,
145
+ } ,
146
+ {
147
+ pattern : / ^ T r e e S e l e c t / ,
148
+ styleDir : 'tree-select' ,
149
+ } ,
150
+ {
151
+ pattern : / ^ T r e e | ^ D i r e c t o r y T r e e / ,
152
+ styleDir : 'tree' ,
153
+ } ,
154
+ {
155
+ pattern : / ^ T y p o g r a p h y / ,
156
+ styleDir : 'typography' ,
157
+ } ,
158
+ {
159
+ pattern : / ^ T i m e l i n e / ,
160
+ styleDir : 'timeline' ,
161
+ } ,
162
+ ]
163
+
164
+ export interface AntDesignVueResolverOptions {
165
+ /**
166
+ * import less along with components
167
+ *
168
+ * @default true
169
+ */
170
+ importLess ?: boolean
171
+ }
172
+
173
+ export const AntDesignVueResolver
174
+ = ( options : AntDesignVueResolverOptions = { } ) : ComponentResolver =>
175
+ ( name : string ) => {
176
+ if ( name . match ( / ^ A [ A - Z ] / ) ) {
177
+ const { importLess = true } = options
178
+ const importName = name . slice ( 1 )
179
+ let styleDir
180
+ if ( importLess ) {
181
+ const total = matchComponents . length
182
+ for ( let i = 0 ; i < total ; i ++ ) {
183
+ const matcher = matchComponents [ i ]
184
+ if ( importName . match ( matcher . pattern ) ) {
185
+ styleDir = matcher . styleDir
186
+ break
187
+ }
188
+ }
189
+ if ( ! styleDir ) styleDir = kebabCase ( importName )
190
+ }
191
+
192
+ return {
193
+ importName,
194
+ path : 'ant-design-vue/es' ,
195
+ sideEffects : importLess
196
+ ? `ant-design-vue/es/${ styleDir } /style`
197
+ : undefined ,
198
+ }
199
+ }
200
+ }
0 commit comments