1
1
import os from 'os' ;
2
2
3
- import pLimit from 'p-limit' ;
3
+ import { SourceMapConsumer } from 'source-map' ;
4
+ import { SourceMapSource , RawSource } from 'webpack-sources' ;
4
5
import RequestShortener from 'webpack/lib/RequestShortener' ;
5
- import cssnanoPackageJson from 'cssnano/package.json' ;
6
6
import {
7
7
util ,
8
8
ModuleFilenameHelpers ,
9
9
SourceMapDevToolPlugin ,
10
- javascript ,
11
10
version as webpackVersion ,
12
11
} from 'webpack' ;
13
- import { SourceMapSource , RawSource } from 'webpack-sources' ;
14
- import { SourceMapConsumer } from 'source-map' ;
15
12
import validateOptions from 'schema-utils' ;
16
13
import serialize from 'serialize-javascript' ;
14
+ import cssnanoPackageJson from 'cssnano/package.json' ;
15
+ import pLimit from 'p-limit' ;
17
16
import Worker from 'jest-worker' ;
18
17
19
18
import schema from './options.json' ;
20
19
21
20
import { minify as minifyFn } from './minify' ;
22
21
23
- const warningRegex = / \[ .+ : ( [ 0 - 9 ] + ) , ( [ 0 - 9 ] + ) \] / ;
22
+ const warningRegex = / \s .+ : + ( [ 0 - 9 ] + ) : + ( [ 0 - 9 ] + ) / ;
24
23
25
24
class CssnanoPlugin {
26
25
constructor ( options = { } ) {
27
26
validateOptions ( schema , options , {
28
- name : 'Cssnano webpack plugin ' ,
27
+ name : 'Cssnano Plugin ' ,
29
28
baseDataPath : 'options' ,
30
29
} ) ;
31
30
32
31
const {
33
- test = / \. c s s ( \? .* ) ? $ / i,
34
- sourceMap = false ,
32
+ minify,
35
33
cssnanoOptions = {
36
34
preset : 'default' ,
37
35
} ,
36
+ test = / \. c s s ( \? .* ) ? $ / i,
38
37
warningsFilter = ( ) => true ,
38
+ sourceMap = false ,
39
39
cache = true ,
40
40
cacheKeys = ( defaultCacheKeys ) => defaultCacheKeys ,
41
41
parallel = true ,
42
42
include,
43
43
exclude,
44
- minify,
45
44
} = options ;
46
45
47
46
this . options = {
48
47
test,
49
- sourceMap,
50
- cssnanoOptions,
51
48
warningsFilter,
49
+ sourceMap,
52
50
cache,
53
51
cacheKeys,
54
52
parallel,
55
53
include,
56
54
exclude,
57
55
minify,
56
+ cssnanoOptions,
58
57
} ;
59
58
60
59
if ( this . options . sourceMap === true ) {
@@ -74,14 +73,6 @@ class CssnanoPlugin {
74
73
) ;
75
74
}
76
75
77
- static buildSourceMap ( inputSourceMap ) {
78
- if ( ! inputSourceMap || ! CssnanoPlugin . isSourceMap ( inputSourceMap ) ) {
79
- return null ;
80
- }
81
-
82
- return new SourceMapConsumer ( inputSourceMap ) ;
83
- }
84
-
85
76
static buildError ( error , file , sourceMap , requestShortener ) {
86
77
if ( error . line ) {
87
78
const original =
@@ -106,19 +97,19 @@ class CssnanoPlugin {
106
97
}
107
98
108
99
return new Error (
109
- `${ file } from Cssnano Webpack Plugin \n${ error . message } [${ file } :${
110
- error . line
111
- } , ${ error . column } ]${
100
+ `${ file } from Cssnano \n${ error . message } [${ file } :${ error . line } , ${
101
+ error . column
102
+ } ]${
112
103
error . stack ? `\n${ error . stack . split ( '\n' ) . slice ( 1 ) . join ( '\n' ) } ` : ''
113
104
} `
114
105
) ;
115
106
}
116
107
117
108
if ( error . stack ) {
118
- return new Error ( `${ file } from Cssnano Webpack Plugin \n${ error . stack } ` ) ;
109
+ return new Error ( `${ file } from Cssnano\n${ error . stack } ` ) ;
119
110
}
120
111
121
- return new Error ( `${ file } from Cssnano Webpack Plugin \n${ error . message } ` ) ;
112
+ return new Error ( `${ file } from Cssnano\n${ error . message } ` ) ;
122
113
}
123
114
124
115
static buildWarning (
@@ -150,11 +141,11 @@ class CssnanoPlugin {
150
141
requestShortener
151
142
) {
152
143
( { source } = original ) ;
153
- warningMessage = `${ warningMessage . replace ( warningRegex , '' ) } ` ;
154
144
155
- locationMessage = `[${ requestShortener . shorten ( original . source ) } :${
145
+ warningMessage = `${ warningMessage . replace ( warningRegex , '' ) } ` ;
146
+ locationMessage = `${ requestShortener . shorten ( original . source ) } :${
156
147
original . line
157
- } , ${ original . column } ] `;
148
+ } : ${ original . column } `;
158
149
}
159
150
}
160
151
}
@@ -163,7 +154,7 @@ class CssnanoPlugin {
163
154
return null ;
164
155
}
165
156
166
- return `Cssnano Webpack Plugin: ${ warningMessage } ${ locationMessage } ` ;
157
+ return `Cssnano Plugin: ${ warningMessage } ${ locationMessage } ` ;
167
158
}
168
159
169
160
static isWebpack4 ( ) {
@@ -217,8 +208,12 @@ class CssnanoPlugin {
217
208
218
209
let sourceMap = null ;
219
210
220
- if ( error || ( warnings && warnings . length > 0 ) ) {
221
- sourceMap = CssnanoPlugin . buildSourceMap ( inputSourceMap ) ;
211
+ if (
212
+ ( error || ( warnings && warnings . length > 0 ) ) &&
213
+ inputSourceMap &&
214
+ CssnanoPlugin . isSourceMap ( inputSourceMap )
215
+ ) {
216
+ sourceMap = new SourceMapConsumer ( inputSourceMap ) ;
222
217
}
223
218
224
219
// Handling results
@@ -273,12 +268,10 @@ class CssnanoPlugin {
273
268
}
274
269
} ;
275
270
276
- const postcssOptions = { to : file , from : file , map : false } ;
277
-
278
271
const task = {
272
+ file,
279
273
input,
280
274
inputSourceMap,
281
- postcssOptions,
282
275
map : this . options . sourceMap ,
283
276
cssnanoOptions : this . options . cssnanoOptions ,
284
277
minify : this . options . minify ,
@@ -380,10 +373,7 @@ class CssnanoPlugin {
380
373
}
381
374
382
375
if ( cache . isEnabled ( ) && ! taskResult . error ) {
383
- taskResult = await cache . store ( task , taskResult ) . then (
384
- ( ) => taskResult ,
385
- ( ) => taskResult
386
- ) ;
376
+ await cache . store ( task , taskResult ) ;
387
377
}
388
378
389
379
task . callback ( taskResult ) ;
@@ -392,7 +382,7 @@ class CssnanoPlugin {
392
382
} ;
393
383
394
384
scheduledTasks . push (
395
- limit ( ( ) => {
385
+ limit ( async ( ) => {
396
386
const task = getTaskForAsset ( assetName ) . next ( ) . value ;
397
387
398
388
if ( ! task ) {
@@ -401,24 +391,29 @@ class CssnanoPlugin {
401
391
}
402
392
403
393
if ( cache . isEnabled ( ) ) {
404
- return cache . get ( task ) . then (
405
- ( taskResult ) => task . callback ( taskResult ) ,
406
- ( ) => enqueue ( task )
407
- ) ;
394
+ let taskResult ;
395
+
396
+ try {
397
+ taskResult = await cache . get ( task ) ;
398
+ } catch ( ignoreError ) {
399
+ return enqueue ( task ) ;
400
+ }
401
+
402
+ task . callback ( taskResult ) ;
403
+
404
+ return Promise . resolve ( ) ;
408
405
}
409
406
410
407
return enqueue ( task ) ;
411
408
} )
412
409
) ;
413
410
}
414
411
415
- return Promise . all ( scheduledTasks ) . then ( ( ) => {
416
- if ( worker ) {
417
- return worker . end ( ) ;
418
- }
412
+ await Promise . all ( scheduledTasks ) ;
419
413
420
- return Promise . resolve ( ) ;
421
- } ) ;
414
+ if ( worker ) {
415
+ await worker . end ( ) ;
416
+ }
422
417
}
423
418
424
419
apply ( compiler ) {
@@ -486,38 +481,11 @@ class CssnanoPlugin {
486
481
}
487
482
488
483
if ( CssnanoPlugin . isWebpack4 ( ) ) {
489
- const { mainTemplate, chunkTemplate } = compilation ;
490
- const data = serialize ( {
491
- cssnano : cssnanoPackageJson . version ,
492
- cssnanoOptions : this . options . cssnanoOptions ,
493
- } ) ;
494
-
495
- // Regenerate `contenthash` for minified assets
496
- for ( const template of [ mainTemplate , chunkTemplate ] ) {
497
- template . hooks . hashForChunk . tap ( plugin , ( hash ) => {
498
- hash . update ( 'CssnanoPlugin' ) ;
499
- hash . update ( data ) ;
500
- } ) ;
501
- }
502
-
503
484
compilation . hooks . optimizeChunkAssets . tapPromise (
504
485
plugin ,
505
486
optimizeFn . bind ( this , compilation )
506
487
) ;
507
488
} else {
508
- const hooks = javascript . JavascriptModulesPlugin . getCompilationHooks (
509
- compilation
510
- ) ;
511
- const data = serialize ( {
512
- cssnano : cssnanoPackageJson . version ,
513
- cssnanoOptions : this . options . cssnanoOptions ,
514
- } ) ;
515
-
516
- hooks . chunkHash . tap ( plugin , ( chunk , hash ) => {
517
- hash . update ( 'CssnanoPlugin' ) ;
518
- hash . update ( data ) ;
519
- } ) ;
520
-
521
489
compilation . hooks . optimizeAssets . tapPromise (
522
490
plugin ,
523
491
optimizeFn . bind ( this , compilation )
0 commit comments