@@ -5,10 +5,12 @@ import isUndefined from 'lodash/isUndefined'
5
5
import defaults from 'lodash/defaults'
6
6
import map from 'lodash/map'
7
7
import get from 'lodash/get'
8
+ import uniq from 'lodash/uniq'
8
9
import toPath from 'lodash/toPath'
9
10
import negateValue from './negateValue'
10
11
import { corePluginList } from '../corePluginList'
11
12
import configurePlugins from './configurePlugins'
13
+ import defaultConfig from '../../stubs/defaultConfig.stub'
12
14
13
15
const configUtils = {
14
16
negative ( scale ) {
@@ -39,31 +41,29 @@ function value(valueToResolve, ...args) {
39
41
return isFunction ( valueToResolve ) ? valueToResolve ( ...args ) : valueToResolve
40
42
}
41
43
42
- function mergeThemes ( themes ) {
43
- const theme = ( ( { extend : _ , ... t } ) => t ) (
44
- themes . reduce ( ( merged , t ) => {
45
- return defaults ( merged , t )
46
- } , { } )
47
- )
44
+ function collectExtends ( items ) {
45
+ return items . reduce ( ( merged , { extend } ) => {
46
+ return mergeWith ( merged , extend , ( mergedValue , extendValue ) => {
47
+ if ( isUndefined ( mergedValue ) ) {
48
+ return [ extendValue ]
49
+ }
48
50
51
+ if ( Array . isArray ( mergedValue ) ) {
52
+ return [ extendValue , ...mergedValue ]
53
+ }
54
+
55
+ return [ extendValue , mergedValue ]
56
+ } )
57
+ } , { } )
58
+ }
59
+
60
+ function mergeThemes ( themes ) {
49
61
return {
50
- ...theme ,
62
+ ...themes . reduce ( ( merged , theme ) => defaults ( merged , theme ) , { } ) ,
51
63
52
64
// In order to resolve n config objects, we combine all of their `extend` properties
53
65
// into arrays instead of objects so they aren't overridden.
54
- extend : themes . reduce ( ( merged , { extend } ) => {
55
- return mergeWith ( merged , extend , ( mergedValue , extendValue ) => {
56
- if ( isUndefined ( mergedValue ) ) {
57
- return [ extendValue ]
58
- }
59
-
60
- if ( Array . isArray ( mergedValue ) ) {
61
- return [ extendValue , ...mergedValue ]
62
- }
63
-
64
- return [ extendValue , mergedValue ]
65
- } )
66
- } , { } ) ,
66
+ extend : collectExtends ( themes ) ,
67
67
}
68
68
}
69
69
@@ -130,12 +130,8 @@ function extractPluginConfigs(configs) {
130
130
return allConfigs
131
131
}
132
132
133
- function resolveVariants ( [ firstConfig , ...variantConfigs ] ) {
134
- if ( Array . isArray ( firstConfig ) ) {
135
- return firstConfig
136
- }
137
-
138
- return [ firstConfig , ...variantConfigs ] . reverse ( ) . reduce ( ( resolved , variants ) => {
133
+ function mergeVariants ( variants ) {
134
+ const mergedVariants = variants . reduce ( ( resolved , variants ) => {
139
135
Object . entries ( variants || { } ) . forEach ( ( [ plugin , pluginVariants ] ) => {
140
136
if ( isFunction ( pluginVariants ) ) {
141
137
resolved [ plugin ] = pluginVariants ( {
@@ -187,10 +183,39 @@ function resolveVariants([firstConfig, ...variantConfigs]) {
187
183
188
184
return resolved
189
185
} , { } )
186
+
187
+ return {
188
+ ...mergedVariants ,
189
+ extend : collectExtends ( variants ) ,
190
+ }
191
+ }
192
+
193
+ function mergeVariantExtensions ( { extend, ...variants } , variantOrder ) {
194
+ return mergeWith ( variants , extend , ( variantsValue , extensions ) => {
195
+ const merged = uniq ( [ ...variantsValue , ...extensions ] . flat ( ) )
196
+
197
+ if ( extensions . flat ( ) . length === 0 ) {
198
+ return merged
199
+ }
200
+
201
+ return merged . sort ( ( a , z ) => variantOrder . indexOf ( a ) - variantOrder . indexOf ( z ) )
202
+ } )
203
+ }
204
+
205
+ function resolveVariants ( [ firstConfig , ...variantConfigs ] , variantOrder ) {
206
+ // Global variants configuration like `variants: ['hover', 'focus']`
207
+ if ( Array . isArray ( firstConfig ) ) {
208
+ return firstConfig
209
+ }
210
+
211
+ return mergeVariantExtensions (
212
+ mergeVariants ( [ firstConfig , ...variantConfigs ] . reverse ( ) ) ,
213
+ variantOrder
214
+ )
190
215
}
191
216
192
217
function resolveCorePlugins ( corePluginConfigs ) {
193
- const result = [ ...corePluginConfigs ] . reverse ( ) . reduce ( ( resolved , corePluginConfig ) => {
218
+ const result = [ ...corePluginConfigs ] . reduceRight ( ( resolved , corePluginConfig ) => {
194
219
if ( isFunction ( corePluginConfig ) ) {
195
220
return corePluginConfig ( { corePlugins : resolved } )
196
221
}
@@ -201,31 +226,38 @@ function resolveCorePlugins(corePluginConfigs) {
201
226
}
202
227
203
228
function resolvePluginLists ( pluginLists ) {
204
- const result = [ ...pluginLists ] . reverse ( ) . reduce ( ( resolved , pluginList ) => {
229
+ const result = [ ...pluginLists ] . reduceRight ( ( resolved , pluginList ) => {
205
230
return [ ...resolved , ...pluginList ]
206
231
} , [ ] )
207
232
208
233
return result
209
234
}
210
235
211
236
export default function resolveConfig ( configs ) {
212
- const allConfigs = extractPluginConfigs ( configs )
237
+ const allConfigs = [
238
+ ...extractPluginConfigs ( configs ) ,
239
+ {
240
+ darkMode : false ,
241
+ prefix : '' ,
242
+ important : false ,
243
+ separator : ':' ,
244
+ variantOrder : defaultConfig . variantOrder ,
245
+ } ,
246
+ ]
247
+ const { variantOrder } = allConfigs . find ( ( c ) => c . variantOrder )
213
248
214
249
return defaults (
215
250
{
216
251
theme : resolveFunctionKeys (
217
252
mergeExtensions ( mergeThemes ( map ( allConfigs , ( t ) => get ( t , 'theme' , { } ) ) ) )
218
253
) ,
219
- variants : resolveVariants ( allConfigs . map ( ( c ) => c . variants ) ) ,
254
+ variants : resolveVariants (
255
+ allConfigs . map ( ( c ) => get ( c , 'variants' , { } ) ) ,
256
+ variantOrder
257
+ ) ,
220
258
corePlugins : resolveCorePlugins ( allConfigs . map ( ( c ) => c . corePlugins ) ) ,
221
259
plugins : resolvePluginLists ( configs . map ( ( c ) => get ( c , 'plugins' , [ ] ) ) ) ,
222
260
} ,
223
- ...allConfigs ,
224
- {
225
- darkMode : false ,
226
- prefix : '' ,
227
- important : false ,
228
- separator : ':' ,
229
- }
261
+ ...allConfigs
230
262
)
231
263
}
0 commit comments