Skip to content

Commit a485400

Browse files
authored
Merge pull request #644 from tailwindcss/configure-plugins
Allow users to override a core plugin's configuration
2 parents a187253 + 44bccca commit a485400

File tree

3 files changed

+204
-6
lines changed

3 files changed

+204
-6
lines changed

__tests__/configurePlugins.test.js

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
import configurePlugins from '../src/util/configurePlugins'
2+
3+
test('setting a plugin to false removes it', () => {
4+
const plugins = {
5+
fontSize: options => {
6+
return {
7+
plugin: 'fontSize',
8+
options,
9+
}
10+
},
11+
display: options => {
12+
return {
13+
plugin: 'display',
14+
options,
15+
}
16+
},
17+
backgroundPosition: options => {
18+
return {
19+
plugin: 'backgroundPosition',
20+
options,
21+
}
22+
},
23+
}
24+
25+
const configuredPlugins = configurePlugins(plugins, {
26+
fontSize: {},
27+
display: false,
28+
backgroundPosition: {},
29+
})
30+
31+
expect(configuredPlugins).toEqual([
32+
{ plugin: 'fontSize', options: {} },
33+
{ plugin: 'backgroundPosition', options: {} },
34+
])
35+
})
36+
37+
test('setting a plugin to an object configures that plugin', () => {
38+
const plugins = {
39+
fontSize: options => {
40+
return {
41+
plugin: 'fontSize',
42+
options,
43+
}
44+
},
45+
display: options => {
46+
return {
47+
plugin: 'display',
48+
options,
49+
}
50+
},
51+
backgroundPosition: options => {
52+
return {
53+
plugin: 'backgroundPosition',
54+
options,
55+
}
56+
},
57+
}
58+
59+
const configuredPlugins = configurePlugins(plugins, {
60+
fontSize: {
61+
variants: ['responsive', 'hover'],
62+
values: { '12': '12px', '14': '14px', '16': '16px' },
63+
},
64+
display: { variants: ['responsive'] },
65+
backgroundPosition: {},
66+
})
67+
68+
expect(configuredPlugins).toEqual([
69+
{
70+
plugin: 'fontSize',
71+
options: {
72+
variants: ['responsive', 'hover'],
73+
values: { '12': '12px', '14': '14px', '16': '16px' },
74+
},
75+
},
76+
{ plugin: 'display', options: { variants: ['responsive'] } },
77+
{ plugin: 'backgroundPosition', options: {} },
78+
])
79+
})
80+
81+
test('plugins are configured with their default configuration if no custom config is provided', () => {
82+
const plugins = {
83+
fontSize: options => {
84+
return {
85+
plugin: 'fontSize',
86+
options,
87+
}
88+
},
89+
display: options => {
90+
return {
91+
plugin: 'display',
92+
options,
93+
}
94+
},
95+
backgroundPosition: options => {
96+
return {
97+
plugin: 'backgroundPosition',
98+
options,
99+
}
100+
},
101+
}
102+
103+
const configuredPlugins = configurePlugins(
104+
plugins,
105+
{
106+
fontSize: {
107+
variants: ['responsive', 'hover'],
108+
values: { '12': '12px', '14': '14px', '16': '16px' },
109+
},
110+
backgroundPosition: {},
111+
},
112+
{
113+
display: { variants: ['responsive'] },
114+
}
115+
)
116+
117+
expect(configuredPlugins).toEqual([
118+
{
119+
plugin: 'fontSize',
120+
options: {
121+
variants: ['responsive', 'hover'],
122+
values: { '12': '12px', '14': '14px', '16': '16px' },
123+
},
124+
},
125+
{ plugin: 'display', options: { variants: ['responsive'] } },
126+
{ plugin: 'backgroundPosition', options: {} },
127+
])
128+
})
129+
130+
test('custom plugin configuration overrides default plugin configuration', () => {
131+
const plugins = {
132+
fontSize: options => {
133+
return {
134+
plugin: 'fontSize',
135+
options,
136+
}
137+
},
138+
display: options => {
139+
return {
140+
plugin: 'display',
141+
options,
142+
}
143+
},
144+
backgroundPosition: options => {
145+
return {
146+
plugin: 'backgroundPosition',
147+
options,
148+
}
149+
},
150+
}
151+
152+
const configuredPlugins = configurePlugins(
153+
plugins,
154+
{
155+
fontSize: {
156+
variants: ['responsive', 'hover'],
157+
values: { '12': '12px', '14': '14px', '16': '16px' },
158+
},
159+
display: { variants: ['responsive'] },
160+
backgroundPosition: {},
161+
},
162+
{
163+
fontSize: {
164+
variants: ['focus', 'active'],
165+
values: { sm: '.75rem', md: '1rem', lg: '1.5rem' },
166+
},
167+
}
168+
)
169+
170+
expect(configuredPlugins).toEqual([
171+
{
172+
plugin: 'fontSize',
173+
options: {
174+
variants: ['responsive', 'hover'],
175+
values: { '12': '12px', '14': '14px', '16': '16px' },
176+
},
177+
},
178+
{ plugin: 'display', options: { variants: ['responsive'] } },
179+
{ plugin: 'backgroundPosition', options: {} },
180+
])
181+
})

src/corePlugins.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,21 @@ import whitespace from './plugins/whitespace'
4949
import width from './plugins/width'
5050
import zIndex from './plugins/zIndex'
5151

52+
import _ from 'lodash'
53+
import configurePlugins from './util/configurePlugins'
54+
5255
function loadPlugins({ theme, variants, corePlugins }, plugins) {
53-
return Object.keys(plugins)
54-
.filter(plugin => corePlugins[plugin] !== false)
55-
.map(plugin =>
56-
plugins[plugin]({
56+
const defaultCorePluginConfig = _.fromPairs(
57+
Object.keys(plugins).map(plugin => [
58+
plugin,
59+
{
5760
values: theme[plugin],
5861
variants: variants[plugin],
59-
})
60-
)
62+
},
63+
])
64+
)
65+
66+
return configurePlugins(plugins, corePlugins, defaultCorePluginConfig)
6167
}
6268

6369
export default function(config) {

src/util/configurePlugins.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import _ from 'lodash'
2+
3+
export default function(plugins, pluginConfig, defaultPluginConfig = {}) {
4+
return Object.keys(plugins)
5+
.filter(pluginName => {
6+
return pluginConfig[pluginName] !== false
7+
})
8+
.map(pluginName => {
9+
return plugins[pluginName](_.get(pluginConfig, pluginName, defaultPluginConfig[pluginName]))
10+
})
11+
}

0 commit comments

Comments
 (0)