diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index cbb2d92966..33b6c4f2ea 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -171,28 +171,22 @@ export function resolveConfig( export function mergeConfigs( configs: UserConfig[], ): UserConfig { - function getMerged(key: T): ToArray>[T]> { - return uniq(configs.flatMap(p => toArray(p[key] || []) as any[])) as any - } - - const merged = Object.assign( - {}, - ...configs, - { - theme: mergeThemes(configs.map(c => c.theme)), - presets: getMerged('presets'), - safelist: getMerged('safelist'), - preprocess: getMerged('preprocess'), - postprocess: getMerged('postprocess'), - preflights: getMerged('preflights'), - rules: getMerged('rules'), - variants: getMerged('variants'), - shortcuts: getMerged('shortcuts'), - extractors: getMerged('extractors'), - }, - ) - - return merged + const maybeArrays = ['shortcuts', 'preprocess', 'postprocess'] + const config = configs.map(config => Object.entries(config) + .reduce>((acc, [key, value]) => ({ + ...acc, + [key]: maybeArrays.includes(key) ? toArray(value) : value, + }), {})) + .reduce>(({ theme: themeA, ...a }, { theme: themeB, ...b }) => { + const c = mergeDeep>(a, b, true) + + if (themeA || themeB) + c.theme = mergeThemes([themeA, themeB]) + + return c + }, {}) + + return config } function mergeThemes(themes: (Theme | undefined)[]): Theme { diff --git a/test/config.test.ts b/test/config.test.ts index 7f012d38e5..4efea81bfb 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -153,13 +153,6 @@ describe('mergeConfigs', () => { ])) .toMatchInlineSnapshot(` { - "extractors": [], - "postprocess": [], - "preflights": [], - "preprocess": [], - "presets": [], - "rules": [], - "safelist": [], "shortcuts": [ { "foo": "string", @@ -172,8 +165,6 @@ describe('mergeConfigs', () => { [Function], ], ], - "theme": {}, - "variants": [], } `) }) @@ -182,6 +173,7 @@ describe('mergeConfigs', () => { { theme: { fontSize: { + sm: ['0.875rem', '1.125rem'], md: ['1.125rem', '1.5rem'], lg: ['1.25rem', '1.5rem'], }, @@ -190,21 +182,14 @@ describe('mergeConfigs', () => { { theme: { fontSize: { - sm: ['0.875rem', '1.125rem'], + sm: ['1rem', '1.125rem'], + xl: ['1.5rem', '1.75rem'], }, }, }, ])) .toMatchInlineSnapshot(` { - "extractors": [], - "postprocess": [], - "preflights": [], - "preprocess": [], - "presets": [], - "rules": [], - "safelist": [], - "shortcuts": [], "theme": { "fontSize": { "lg": [ @@ -216,12 +201,15 @@ describe('mergeConfigs', () => { "1.5rem", ], "sm": [ - "0.875rem", + "1rem", "1.125rem", ], + "xl": [ + "1.5rem", + "1.75rem", + ], }, }, - "variants": [], } `) })