Skip to content

Commit 1600fbd

Browse files
authored
Register PurgeCSS content array as PostCSS dependencies (#4530)
1 parent 1aedf10 commit 1600fbd

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

src/lib/purgeUnusedStyles.js

+21-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import postcss from 'postcss'
33
import purgecss from '@fullhuman/postcss-purgecss'
44
import log from '../util/log'
55
import htmlTags from 'html-tags'
6+
import parseGlob from 'parse-glob'
7+
import path from 'path'
68

79
function removeTailwindMarkers(css) {
810
css.walkAtRules('tailwind', (rule) => rule.remove())
@@ -33,7 +35,7 @@ export function tailwindExtractor(content) {
3335
return broadMatches.concat(broadMatchesWithoutTrailingSlash).concat(innerMatches)
3436
}
3537

36-
export default function purgeUnusedUtilities(config, configChanged) {
38+
export default function purgeUnusedUtilities(config, configChanged, registerDependency) {
3739
const purgeEnabled = _.get(
3840
config,
3941
'purge.enabled',
@@ -59,6 +61,23 @@ export default function purgeUnusedUtilities(config, configChanged) {
5961

6062
const { defaultExtractor, ...purgeOptions } = config.purge.options || {}
6163

64+
let content = Array.isArray(config.purge) ? config.purge : config.purge.content
65+
66+
for (let maybeGlob of content) {
67+
let { is, base } = parseGlob(maybeGlob)
68+
69+
if (is.glob) {
70+
// rollup-plugin-postcss does not support dir-dependency messages
71+
// but directories can be watched in the same way as files
72+
registerDependency(
73+
path.resolve(base),
74+
process.env.ROLLUP_WATCH === 'true' ? 'dependency' : 'dir-dependency'
75+
)
76+
} else {
77+
registerDependency(path.resolve(maybeGlob))
78+
}
79+
}
80+
6281
return postcss([
6382
function (css) {
6483
const mode = _.get(config, 'purge.mode', 'layers')
@@ -104,7 +123,7 @@ export default function purgeUnusedUtilities(config, configChanged) {
104123
},
105124
removeTailwindMarkers,
106125
purgecss({
107-
content: Array.isArray(config.purge) ? config.purge : config.purge.content,
126+
content,
108127
defaultExtractor: (content) => {
109128
const extractor = defaultExtractor || tailwindExtractor
110129
const preserved = [...extractor(content)]

src/processTailwindFeatures.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ let processedPlugins = null
2525
let getProcessedPlugins = null
2626

2727
export default function (getConfig) {
28-
return function (css) {
28+
return function (css, result) {
2929
const config = getConfig()
3030
const configChanged = hash(previousConfig) !== hash(config)
3131
previousConfig = config
@@ -56,6 +56,15 @@ export default function (getConfig) {
5656
}
5757
}
5858

59+
function registerDependency(fileName, type = 'dependency') {
60+
result.messages.push({
61+
type,
62+
plugin: 'tailwindcss',
63+
parent: result.opts.from,
64+
[type === 'dir-dependency' ? 'dir' : 'file']: fileName,
65+
})
66+
}
67+
5968
return postcss([
6069
substituteTailwindAtRules(config, getProcessedPlugins()),
6170
evaluateTailwindFunctions(config),
@@ -65,7 +74,7 @@ export default function (getConfig) {
6574
substituteScreenAtRules(config),
6675
substituteClassApplyAtRules(config, getProcessedPlugins, configChanged),
6776
applyImportantConfiguration(config),
68-
purgeUnusedStyles(config, configChanged),
77+
purgeUnusedStyles(config, configChanged, registerDependency),
6978
]).process(css, { from: _.get(css, 'source.input.file') })
7079
}
7180
}

0 commit comments

Comments
 (0)