Skip to content

Commit 6a9c3e7

Browse files
authored
Register dark mode plugin outside of resolveConfig code path (#2368)
1 parent fd194f0 commit 6a9c3e7

5 files changed

+51
-48
lines changed

resolveConfig.js

+1-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ const resolveConfigObjects = require('./lib/util/resolveConfig').default
22
const getAllConfigs = require('./lib/util/getAllConfigs').default
33

44
module.exports = function resolveConfig(...configs) {
5-
// Make sure the correct config object is mutated to include flagged config plugins.
6-
// This sucks, refactor soon.
7-
const firstConfigWithPlugins = configs.find(c => Array.isArray(c.plugins)) || configs[0]
8-
const [, ...defaultConfigs] = getAllConfigs(firstConfigWithPlugins)
5+
const [, ...defaultConfigs] = getAllConfigs(configs[0])
96

107
return resolveConfigObjects([...configs, ...defaultConfigs])
118
}

src/flagged/darkModeVariant.js

-39
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import buildSelectorVariant from '../util/buildSelectorVariant'
21
import defaultConfig from '../../defaultConfig'
32

43
export default {
@@ -11,42 +10,4 @@ export default {
1110
placeholderColor: [...defaultConfig.variants.placeholderColor, 'dark'],
1211
textColor: [...defaultConfig.variants.textColor, 'dark'],
1312
},
14-
plugins: [
15-
function({ addVariant, config, postcss, prefix }) {
16-
addVariant('dark', ({ container, separator, modifySelectors }) => {
17-
if (config('dark') === 'media') {
18-
const modified = modifySelectors(({ selector }) => {
19-
return buildSelectorVariant(selector, 'dark', separator, message => {
20-
throw container.error(message)
21-
})
22-
})
23-
const mediaQuery = postcss.atRule({
24-
name: 'media',
25-
params: '(prefers-color-scheme: dark)',
26-
})
27-
mediaQuery.append(modified)
28-
container.append(mediaQuery)
29-
return container
30-
}
31-
32-
if (config('dark') === 'class') {
33-
const modified = modifySelectors(({ selector }) => {
34-
return buildSelectorVariant(selector, 'dark', separator, message => {
35-
throw container.error(message)
36-
})
37-
})
38-
39-
modified.walkRules(rule => {
40-
rule.selectors = rule.selectors.map(selector => {
41-
return `${prefix('.dark')} ${selector}`
42-
})
43-
})
44-
45-
return modified
46-
}
47-
48-
throw new Error("The `dark` config option must be either 'media' or 'class'.")
49-
})
50-
},
51-
],
5213
}

src/flagged/darkModeVariantPlugin.js

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import buildSelectorVariant from '../util/buildSelectorVariant'
2+
3+
export default function({ addVariant, config, postcss, prefix }) {
4+
addVariant('dark', ({ container, separator, modifySelectors }) => {
5+
if (config('dark') === 'media') {
6+
const modified = modifySelectors(({ selector }) => {
7+
return buildSelectorVariant(selector, 'dark', separator, message => {
8+
throw container.error(message)
9+
})
10+
})
11+
const mediaQuery = postcss.atRule({
12+
name: 'media',
13+
params: '(prefers-color-scheme: dark)',
14+
})
15+
mediaQuery.append(modified)
16+
container.append(mediaQuery)
17+
return container
18+
}
19+
20+
if (config('dark') === 'class') {
21+
const modified = modifySelectors(({ selector }) => {
22+
return buildSelectorVariant(selector, 'dark', separator, message => {
23+
throw container.error(message)
24+
})
25+
})
26+
27+
modified.walkRules(rule => {
28+
rule.selectors = rule.selectors.map(selector => {
29+
return `${prefix('.dark')} ${selector}`
30+
})
31+
})
32+
33+
return modified
34+
}
35+
36+
throw new Error("The `dark` config option must be either 'media' or 'class'.")
37+
})
38+
}

src/processTailwindFeatures.js

+12-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import purgeUnusedStyles from './lib/purgeUnusedStyles'
1414
import corePlugins from './corePlugins'
1515
import processPlugins from './util/processPlugins'
1616
import cloneNodes from './util/cloneNodes'
17-
import { issueFlagNotices } from './featureFlags.js'
17+
import { issueFlagNotices, flagEnabled } from './featureFlags.js'
18+
19+
import darkModeVariantPlugin from './flagged/darkModeVariantPlugin'
1820

1921
import hash from 'object-hash'
2022

@@ -31,7 +33,15 @@ export default function(getConfig) {
3133
if (configChanged) {
3234
issueFlagNotices(config)
3335

34-
processedPlugins = processPlugins([...corePlugins(config), ...config.plugins], config)
36+
processedPlugins = processPlugins(
37+
[
38+
...corePlugins(config),
39+
...[flagEnabled(config, 'darkModeVariant') ? darkModeVariantPlugin : () => {}],
40+
...config.plugins,
41+
],
42+
config
43+
)
44+
3545
getProcessedPlugins = function() {
3646
return {
3747
...processedPlugins,

src/util/getAllConfigs.js

-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ export default function getAllConfigs(config) {
3232

3333
if (flagEnabled(config, 'darkModeVariant')) {
3434
configs.unshift(darkModeVariant)
35-
if (Array.isArray(config.plugins)) {
36-
config.plugins = [...darkModeVariant.plugins, ...config.plugins]
37-
}
3835
}
3936

4037
return [config, ...configs]

0 commit comments

Comments
 (0)