Skip to content

Commit 62972a7

Browse files
committed
Lazily evaluate values in the extend section
In a way this combines PRs tailwindlabs#655 and tailwindlabs#774.
1 parent e979ec4 commit 62972a7

File tree

2 files changed

+72
-9
lines changed

2 files changed

+72
-9
lines changed

__tests__/resolveConfig.test.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,3 +757,64 @@ test('the theme function can use a default value if the key is missing', () => {
757757
},
758758
})
759759
})
760+
761+
test('theme values in the extend section are lazily evaluated', () => {
762+
const userConfig = {
763+
theme: {
764+
colors: {
765+
red: 'red',
766+
green: 'green',
767+
blue: 'blue',
768+
},
769+
extend: {
770+
borderColor: theme => ({
771+
default: theme('colors.red'),
772+
}),
773+
},
774+
},
775+
}
776+
777+
const defaultConfig = {
778+
prefix: '-',
779+
important: false,
780+
separator: ':',
781+
theme: {
782+
colors: {
783+
cyan: 'cyan',
784+
magenta: 'magenta',
785+
yellow: 'yellow',
786+
},
787+
borderColor: theme => ({
788+
default: theme('colors.yellow', 'currentColor'),
789+
...theme('colors'),
790+
}),
791+
},
792+
variants: {
793+
borderColor: ['responsive', 'hover', 'focus'],
794+
},
795+
}
796+
797+
const result = resolveConfig([userConfig, defaultConfig])
798+
799+
expect(result).toEqual({
800+
prefix: '-',
801+
important: false,
802+
separator: ':',
803+
theme: {
804+
colors: {
805+
red: 'red',
806+
green: 'green',
807+
blue: 'blue',
808+
},
809+
borderColor: {
810+
default: 'red',
811+
red: 'red',
812+
green: 'green',
813+
blue: 'blue',
814+
},
815+
},
816+
variants: {
817+
borderColor: ['responsive', 'hover', 'focus'],
818+
},
819+
})
820+
})

src/util/resolveConfig.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@ function resolveFunctionKeys(object) {
1717

1818
function mergeExtensions({ extend, ...theme }) {
1919
return mergeWith({}, theme, extend, (_, extensions, key) => {
20-
return isFunction(theme[key])
21-
? mergedTheme => ({
22-
...theme[key](mergedTheme),
23-
...extensions,
24-
})
25-
: {
26-
...theme[key],
27-
...extensions,
28-
}
20+
if (isFunction(theme[key]) || (extend && isFunction(extend[key]))) {
21+
return mergedTheme => ({
22+
...(isFunction(theme[key]) ? theme[key](mergedTheme) : theme[key]),
23+
...(extend && isFunction(extend[key]) ? extend[key](mergedTheme) : extensions),
24+
})
25+
} else {
26+
return {
27+
...theme[key],
28+
...extensions,
29+
}
30+
}
2931
})
3032
}
3133

0 commit comments

Comments
 (0)