Skip to content

Commit b2b95d5

Browse files
committed
Register config file with Webpack for watching
This change tells Webpack (for those using it) that the config file used should be tracked as a dependency and that the CSS should be re-compiled if that config file changes. It's careful to make sure the config file is loaded fresh every single time to avoid weird caching issues.
1 parent fe22f64 commit b2b95d5

11 files changed

+65
-27
lines changed

docs/tailwind.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
var config = require('../defaultConfig')
1+
var config = require('../lib/index').defaultConfig()
2+
23

34
config.colors = {
45
...config.colors,

src/index.js

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import _ from 'lodash'
55
import postcss from 'postcss'
66
import stylefmt from 'stylefmt'
77

8+
import registerConfigAsDependency from './lib/registerConfigAsDependency'
89
import substitutePreflightAtRule from './lib/substitutePreflightAtRule'
910
import evaluateTailwindFunctions from './lib/evaluateTailwindFunctions'
1011
import generateUtilities from './lib/generateUtilities'
@@ -15,23 +16,30 @@ import substituteScreenAtRules from './lib/substituteScreenAtRules'
1516
import substituteClassApplyAtRules from './lib/substituteClassApplyAtRules'
1617

1718
const plugin = postcss.plugin('tailwind', (config) => {
18-
if (_.isUndefined(config)) {
19-
config = require('../defaultConfig')
19+
const plugins = []
20+
21+
if (! _.isUndefined(config)) {
22+
plugins.push(registerConfigAsDependency(path.resolve(config)))
2023
}
2124

22-
if (_.isString(config)) {
23-
config = require(path.resolve(config))
25+
const lazyConfig = () => {
26+
if (_.isUndefined(config)) {
27+
return require('../defaultConfig')
28+
}
29+
30+
delete require.cache[require.resolve(path.resolve(config))]
31+
return require(path.resolve(config))
2432
}
2533

26-
return postcss([
27-
substitutePreflightAtRule(config),
28-
evaluateTailwindFunctions(config),
29-
generateUtilities(config),
30-
substituteHoverableAtRules(config),
31-
substituteFocusableAtRules(config),
32-
substituteResponsiveAtRules(config),
33-
substituteScreenAtRules(config),
34-
substituteClassApplyAtRules(config),
34+
return postcss(...plugins, ...[
35+
substitutePreflightAtRule(lazyConfig),
36+
evaluateTailwindFunctions(lazyConfig),
37+
generateUtilities(lazyConfig),
38+
substituteHoverableAtRules(lazyConfig),
39+
substituteFocusableAtRules(lazyConfig),
40+
substituteResponsiveAtRules(lazyConfig),
41+
substituteScreenAtRules(lazyConfig),
42+
substituteClassApplyAtRules(lazyConfig),
3543
stylefmt,
3644
])
3745
})

src/lib/evaluateTailwindFunctions.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import _ from 'lodash'
22
import functions from 'postcss-functions'
33

4-
export default function(options) {
4+
export default function(config) {
5+
const options = config()
6+
57
return functions({
68
functions: {
79
config: function (path) {

src/lib/generateUtilities.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ import verticalAlign from '../generators/verticalAlign'
3737
import visibility from '../generators/visibility'
3838
import zIndex from '../generators/zIndex'
3939

40-
export default function(options) {
40+
export default function(config) {
4141
return function(css) {
42+
const options = config()
43+
4244
css.walkAtRules('tailwind', atRule => {
4345
if (atRule.params === 'utilities') {
4446
const utilities = _.flatten([
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import fs from 'fs'
2+
3+
export default function(configFile) {
4+
if (! fs.existsSync(configFile)) {
5+
throw new Error(`Specified Tailwind config file "${configFile}" doesn't exist.`)
6+
}
7+
8+
return function (css, opts) {
9+
opts.messages = [{
10+
type: 'dependency',
11+
file: configFile,
12+
parent: css.source.input.file,
13+
}]
14+
}
15+
}

src/lib/substituteClassApplyAtRules.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ function normalizeClassNames(classNames) {
99
})
1010
}
1111

12-
export default postcss.plugin('tailwind-apply', function(css) {
13-
return function(css) {
12+
export default function(config) {
13+
return function (css) {
14+
const options = config()
1415
css.walkRules(function(rule) {
1516
rule.walkAtRules('apply', atRule => {
1617
const mixins = normalizeClassNames(postcss.list.space(atRule.params))
@@ -42,4 +43,4 @@ export default postcss.plugin('tailwind-apply', function(css) {
4243
})
4344
})
4445
}
45-
})
46+
}

src/lib/substituteFocusableAtRules.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import _ from 'lodash'
22
import postcss from 'postcss'
33
import cloneNodes from '../util/cloneNodes'
44

5-
export default function(options) {
6-
return function(css) {
5+
export default function(config) {
6+
return function (css) {
7+
const options = config()
8+
79
css.walkAtRules('focusable', atRule => {
810

911
atRule.walkRules(rule => {

src/lib/substituteHoverableAtRules.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import _ from 'lodash'
22
import postcss from 'postcss'
33
import cloneNodes from '../util/cloneNodes'
44

5-
export default function(options) {
6-
return function(css) {
5+
export default function(config) {
6+
return function (css) {
7+
const options = config()
8+
79
css.walkAtRules('hoverable', atRule => {
810

911
atRule.walkRules(rule => {

src/lib/substitutePreflightAtRule.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import fs from 'fs'
22
import postcss from 'postcss'
33

4-
export default function(options) {
4+
export default function(config) {
55
return function (css) {
6+
const options = config()
7+
68
css.walkAtRules('tailwind', atRule => {
79
if (atRule.params === 'preflight') {
810
atRule.before(postcss.parse(fs.readFileSync(`${__dirname}/../../css/preflight.css`, 'utf8')))

src/lib/substituteResponsiveAtRules.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ import postcss from 'postcss'
33
import cloneNodes from '../util/cloneNodes'
44
import buildMediaQuery from '../util/buildMediaQuery'
55

6-
export default function({ screens }) {
7-
return function(css) {
6+
7+
export default function(config) {
8+
return function (css) {
9+
const screens = config().screens
810
const rules = []
911

1012
css.walkAtRules('responsive', atRule => {

0 commit comments

Comments
 (0)