1
1
import _ from 'lodash'
2
2
import postcss from 'postcss'
3
- import purgecss from '@fullhuman/postcss- purgecss'
3
+ import PurgeCSS , { defaultOptions , standardizeSafelist , mergeExtractorSelectors } from 'purgecss'
4
4
import log from '../util/log'
5
5
import htmlTags from 'html-tags'
6
6
import path from 'path'
@@ -134,10 +134,11 @@ export default function purgeUnusedUtilities(config, configChanged, registerDepe
134
134
registerDependency ( parseDependency ( fileOrGlob ) )
135
135
}
136
136
137
+ let hasLayers = false
138
+
139
+ const mode = _ . get ( config , 'purge.mode' , 'layers' )
137
140
return postcss ( [
138
141
function ( css ) {
139
- const mode = _ . get ( config , 'purge.mode' , 'layers' )
140
-
141
142
if ( ! [ 'all' , 'layers' ] . includes ( mode ) ) {
142
143
throw new Error ( 'Purge `mode` must be one of `layers` or `all`.' )
143
144
}
@@ -164,6 +165,7 @@ export default function purgeUnusedUtilities(config, configChanged, registerDepe
164
165
switch ( comment . text . trim ( ) ) {
165
166
case `tailwind start ${ layer } ` :
166
167
comment . text = 'purgecss end ignore'
168
+ hasLayers = true
167
169
break
168
170
case `tailwind end ${ layer } ` :
169
171
comment . text = 'purgecss start ignore'
@@ -178,14 +180,44 @@ export default function purgeUnusedUtilities(config, configChanged, registerDepe
178
180
css . append ( postcss . comment ( { text : 'purgecss end ignore' } ) )
179
181
} ,
180
182
removeTailwindMarkers ,
181
- purgecss ( {
182
- defaultExtractor : ( content ) => {
183
- const transformer = getTransformer ( config )
184
- return defaultExtractor ( transformer ( content ) )
185
- } ,
186
- extractors : fileSpecificExtractors ,
187
- ...purgeOptions ,
188
- content,
189
- } ) ,
183
+
184
+ async function ( css ) {
185
+ if ( mode === 'layers' && ! hasLayers ) {
186
+ return
187
+ }
188
+ const purgeCSS = new PurgeCSS ( )
189
+ purgeCSS . options = {
190
+ ...defaultOptions ,
191
+
192
+ defaultExtractor : ( content ) => {
193
+ const transformer = getTransformer ( config )
194
+ return defaultExtractor ( transformer ( content ) )
195
+ } ,
196
+ extractors : fileSpecificExtractors ,
197
+ ...purgeOptions ,
198
+ safelist : standardizeSafelist ( purgeOptions . safelist ) ,
199
+ }
200
+
201
+ if ( purgeCSS . options . variables ) {
202
+ purgeCSS . variablesStructure . safelist = purgeCSS . options . safelist . variables || [ ]
203
+ }
204
+
205
+ const fileFormatContents = content . filter ( ( o ) => typeof o === 'string' )
206
+ const rawFormatContents = content . filter ( ( o ) => typeof o === 'object' )
207
+
208
+ const cssFileSelectors = await purgeCSS . extractSelectorsFromFiles (
209
+ fileFormatContents ,
210
+ purgeCSS . options . extractors
211
+ )
212
+ const cssRawSelectors = await purgeCSS . extractSelectorsFromString (
213
+ rawFormatContents ,
214
+ purgeCSS . options . extractors
215
+ )
216
+ const cssSelectors = mergeExtractorSelectors ( cssFileSelectors , cssRawSelectors )
217
+ purgeCSS . walkThroughCSS ( css , cssSelectors )
218
+ if ( purgeCSS . options . fontFace ) purgeCSS . removeUnusedFontFaces ( )
219
+ if ( purgeCSS . options . keyframes ) purgeCSS . removeUnusedKeyframes ( )
220
+ if ( purgeCSS . options . variables ) purgeCSS . removeUnusedCSSVariables ( )
221
+ } ,
190
222
] )
191
223
}
0 commit comments