11import { ComponentResolver } from '../types'
2+ import { kebabCase } from '../utils'
23
34/**
45 * Resolver for Ant Design Vue
@@ -10,11 +11,190 @@ import { ComponentResolver } from '../types'
1011 * @author @yangss 3
1112 * @link https://antdv.com/
1213 */
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
2018}
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