From 5911bd704cb00c88f0977e6819b0cdf1f78b28b7 Mon Sep 17 00:00:00 2001 From: Adam Wathan Date: Sun, 13 Oct 2019 20:31:32 -0400 Subject: [PATCH] Reverse extend array to guarantee correct precedence --- __tests__/resolveConfig.test.js | 72 +++++++++++++++++++++++++++++++++ src/util/resolveConfig.js | 5 +-- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/__tests__/resolveConfig.test.js b/__tests__/resolveConfig.test.js index 9fa7c0581..35b159a5a 100644 --- a/__tests__/resolveConfig.test.js +++ b/__tests__/resolveConfig.test.js @@ -1639,3 +1639,75 @@ test('plugin theme extensions are added even if user overrides top-level theme c plugins: userConfig.plugins, }) }) + +test('user theme extensions take precedence over plugin theme extensions with the same key', () => { + const userConfig = { + theme: { + extend: { + width: { + xl: '6rem' + }, + }, + }, + plugins: [ + { + config: { + theme: { + extend: { + width: { + xl: '4rem', + } + } + }, + }, + handler() {}, + }, + ], + } + + const defaultConfig = { + prefix: '', + important: false, + separator: ':', + theme: { + width: { + sm: '1rem', + md: '2rem', + lg: '3rem', + }, + screens: { + mobile: '400px', + }, + }, + variants: { + appearance: ['responsive'], + borderCollapse: [], + borderColors: ['responsive', 'hover', 'focus'], + }, + } + + const result = resolveConfig([userConfig, defaultConfig]) + + expect(result).toEqual({ + prefix: '', + important: false, + separator: ':', + theme: { + width: { + sm: '1rem', + md: '2rem', + lg: '3rem', + xl: '6rem', + }, + screens: { + mobile: '400px', + }, + }, + variants: { + appearance: ['responsive'], + borderCollapse: [], + borderColors: ['responsive', 'hover', 'focus'], + }, + plugins: userConfig.plugins, + }) +}) diff --git a/src/util/resolveConfig.js b/src/util/resolveConfig.js index be2c64762..4ad99126b 100644 --- a/src/util/resolveConfig.js +++ b/src/util/resolveConfig.js @@ -45,10 +45,10 @@ function mergeThemes(themes) { } if (Array.isArray(mergedValue)) { - return [...mergedValue, extendValue] + return [extendValue, ...mergedValue] } - return [mergedValue, extendValue] + return [extendValue, mergedValue] }) }, {}), } @@ -119,7 +119,6 @@ export default function resolveConfig(configs) { return defaults( { - // Need to get a default empty object if the config has no theme theme: resolveFunctionKeys( mergeExtensions(mergeThemes(map(allConfigs, t => get(t, 'theme', {})))) ),