@@ -83,15 +83,15 @@ function mergeExtensions({ extend, ...theme }) {
83
83
}
84
84
85
85
function resolveFunctionKeys ( object ) {
86
- const resolveThemePath = ( key , defaultValue ) => {
86
+ const resolvePath = ( key , defaultValue ) => {
87
87
const path = toPath ( key )
88
88
89
89
let index = 0
90
90
let val = object
91
91
92
92
while ( val !== undefined && val !== null && index < path . length ) {
93
93
val = val [ path [ index ++ ] ]
94
- val = isFunction ( val ) ? val ( resolveThemePath , configUtils ) : val
94
+ val = isFunction ( val ) ? val ( resolvePath , configUtils ) : val
95
95
}
96
96
97
97
return val === undefined ? defaultValue : val
@@ -100,7 +100,7 @@ function resolveFunctionKeys(object) {
100
100
return Object . keys ( object ) . reduce ( ( resolved , key ) => {
101
101
return {
102
102
...resolved ,
103
- [ key ] : isFunction ( object [ key ] ) ? object [ key ] ( resolveThemePath , configUtils ) : object [ key ] ,
103
+ [ key ] : isFunction ( object [ key ] ) ? object [ key ] ( resolvePath , configUtils ) : object [ key ] ,
104
104
}
105
105
} , { } )
106
106
}
@@ -128,6 +128,62 @@ function extractPluginConfigs(configs) {
128
128
return allConfigs
129
129
}
130
130
131
+ function resolveVariants ( [ firstConfig , ...variantConfigs ] ) {
132
+ if ( Array . isArray ( firstConfig ) ) {
133
+ return firstConfig
134
+ }
135
+
136
+ return [ firstConfig , ...variantConfigs ] . reverse ( ) . reduce ( ( resolved , variants ) => {
137
+ Object . entries ( variants || { } ) . forEach ( ( [ plugin , pluginVariants ] ) => {
138
+ if ( isFunction ( pluginVariants ) ) {
139
+ resolved [ plugin ] = pluginVariants ( {
140
+ variants : function ( path ) {
141
+ return get ( resolved , path , [ ] )
142
+ } ,
143
+ before : function ( toInsert , variant , existingPluginVariants = get ( resolved , plugin , [ ] ) ) {
144
+ if ( variant === undefined ) {
145
+ return [ ...toInsert , ...existingPluginVariants ]
146
+ }
147
+
148
+ const index = existingPluginVariants . indexOf ( variant )
149
+
150
+ if ( index === - 1 ) {
151
+ return [ ...existingPluginVariants , ...toInsert ]
152
+ }
153
+
154
+ return [
155
+ ...existingPluginVariants . slice ( 0 , index ) ,
156
+ ...toInsert ,
157
+ ...existingPluginVariants . slice ( index ) ,
158
+ ]
159
+ } ,
160
+ after : function ( toInsert , variant , existingPluginVariants = get ( resolved , plugin , [ ] ) ) {
161
+ if ( variant === undefined ) {
162
+ return [ ...existingPluginVariants , ...toInsert ]
163
+ }
164
+
165
+ const index = existingPluginVariants . indexOf ( variant )
166
+
167
+ if ( index === - 1 ) {
168
+ return [ ...toInsert , ...existingPluginVariants ]
169
+ }
170
+
171
+ return [
172
+ ...existingPluginVariants . slice ( 0 , index + 1 ) ,
173
+ ...toInsert ,
174
+ ...existingPluginVariants . slice ( index + 1 ) ,
175
+ ]
176
+ } ,
177
+ } )
178
+ } else {
179
+ resolved [ plugin ] = pluginVariants
180
+ }
181
+ } )
182
+
183
+ return resolved
184
+ } , { } )
185
+ }
186
+
131
187
export default function resolveConfig ( configs ) {
132
188
const allConfigs = extractPluginConfigs ( configs )
133
189
@@ -136,11 +192,14 @@ export default function resolveConfig(configs) {
136
192
theme : resolveFunctionKeys (
137
193
mergeExtensions ( mergeThemes ( map ( allConfigs , t => get ( t , 'theme' , { } ) ) ) )
138
194
) ,
139
- variants : ( firstVariants => {
140
- return Array . isArray ( firstVariants )
141
- ? firstVariants
142
- : defaults ( { } , ...map ( allConfigs , 'variants' ) )
143
- } ) ( defaults ( { } , ...map ( allConfigs ) ) . variants ) ,
195
+ variants : resolveVariants ( allConfigs . map ( c => c . variants ) ) ,
196
+ // variants: resolveFunctionKeys(
197
+ // (firstVariants => {
198
+ // return Array.isArray(firstVariants)
199
+ // ? firstVariants
200
+ // : defaults({}, ...map(allConfigs, 'variants'))
201
+ // })(defaults({}, ...map(allConfigs)).variants)
202
+ // ),
144
203
} ,
145
204
...allConfigs
146
205
)
0 commit comments