1
- var fs = require ( 'fs' ) ;
2
- var path = require ( 'path' ) ;
3
- var cli = require ( 'clap' ) ;
4
- var csso = require ( 'csso' ) ;
5
- var SourceMapConsumer = require ( 'source-map-js' ) . SourceMapConsumer ;
1
+ const fs = require ( 'fs' ) ;
2
+ const path = require ( 'path' ) ;
3
+ const cli = require ( 'clap' ) ;
4
+ const csso = require ( 'csso' ) ;
5
+ const SourceMapConsumer = require ( 'source-map-js' ) . SourceMapConsumer ;
6
6
7
7
function unixPathname ( pathname ) {
8
8
return pathname . replace ( / \\ / g, '/' ) ;
9
9
}
10
10
11
11
function readFromStream ( stream , minify ) {
12
- var buffer = [ ] ;
12
+ const buffer = [ ] ;
13
13
14
14
stream
15
15
. setEncoding ( 'utf8' )
16
- . on ( 'data' , function ( chunk ) {
17
- buffer . push ( chunk ) ;
18
- } )
19
- . on ( 'end' , function ( ) {
20
- minify ( buffer . join ( '' ) ) ;
21
- } ) ;
16
+ . on ( 'data' , ( chunk ) => buffer . push ( chunk ) )
17
+ . on ( 'end' , ( ) => minify ( buffer . join ( '' ) ) ) ;
22
18
}
23
19
24
20
function showStat ( filename , source , result , inputMap , map , time , mem ) {
25
21
function fmt ( size ) {
26
- return String ( size ) . split ( '' ) . reverse ( ) . reduce ( function ( size , digit , idx ) {
22
+ return String ( size ) . split ( '' ) . reverse ( ) . reduce ( ( size , digit , idx ) => {
27
23
if ( idx && idx % 3 === 0 ) {
28
24
size = ' ' + size ;
29
25
}
26
+
30
27
return digit + size ;
31
28
} , '' ) ;
32
29
}
@@ -49,42 +46,15 @@ function showStat(filename, source, result, inputMap, map, time, mem) {
49
46
console . error ( 'Memory: ' , ( mem / ( 1024 * 1024 ) ) . toFixed ( 3 ) , 'MB' ) ;
50
47
}
51
48
52
- function showParseError ( source , filename , details , message ) {
53
- function processLines ( start , end ) {
54
- return lines . slice ( start , end ) . map ( function ( line , idx ) {
55
- var num = String ( start + idx + 1 ) ;
56
-
57
- while ( num . length < maxNumLength ) {
58
- num = ' ' + num ;
59
- }
60
-
61
- return num + ' |' + line ;
62
- } ) . join ( '\n' ) ;
63
- }
64
-
65
- var lines = source . split ( / \n | \r \n ? | \f / ) ;
66
- var column = details . column ;
67
- var line = details . line ;
68
- var startLine = Math . max ( 1 , line - 2 ) ;
69
- var endLine = Math . min ( line + 2 , lines . length + 1 ) ;
70
- var maxNumLength = Math . max ( 4 , String ( endLine ) . length ) + 1 ;
71
-
72
- console . error ( '\nParse error ' + filename + ': ' + message ) ;
73
- console . error ( processLines ( startLine - 1 , line ) ) ;
74
- console . error ( new Array ( column + maxNumLength + 2 ) . join ( '-' ) + '^' ) ;
75
- console . error ( processLines ( line , endLine ) ) ;
76
- console . error ( ) ;
77
- }
78
-
79
49
function debugLevel ( level ) {
80
50
// level is undefined when no param -> 1
81
51
return isNaN ( level ) ? 1 : Math . max ( Number ( level ) , 0 ) ;
82
52
}
83
53
84
54
function resolveSourceMap ( source , inputMap , outputMap , inputFile , outputFile ) {
85
- var inputMapContent = null ;
86
- var inputMapFile = null ;
87
- var outputMapFile = null ;
55
+ let inputMapContent = null ;
56
+ let inputMapFile = null ;
57
+ let outputMapFile = null ;
88
58
89
59
switch ( outputMap ) {
90
60
case 'none' :
@@ -128,7 +98,7 @@ function resolveSourceMap(source, inputMap, outputMap, inputFile, outputFile) {
128
98
case 'auto' :
129
99
if ( outputMap ) {
130
100
// try fetch source map from source
131
- var inputMapComment = source . match ( / \/ \* # s o u r c e M a p p i n g U R L = ( \S + ) \s * \* \/ \s * $ / ) ;
101
+ let inputMapComment = source . match ( / \/ \* # s o u r c e M a p p i n g U R L = ( \S + ) \s * \* \/ \s * $ / ) ;
132
102
133
103
if ( inputFile === '<stdin>' ) {
134
104
inputFile = false ;
@@ -189,19 +159,19 @@ function processCommentsOption(value) {
189
159
}
190
160
191
161
function processOptions ( options , args ) {
192
- var inputFile = options . input || args [ 0 ] ;
193
- var outputFile = options . output ;
194
- var usageFile = options . usage ;
195
- var usageData = false ;
196
- var sourceMap = options . sourceMap ;
197
- var inputSourceMap = options . inputSourceMap ;
198
- var declarationList = options . declarationList ;
199
- var restructure = Boolean ( options . restructure ) ;
200
- var forceMediaMerge = Boolean ( options . forceMediaMerge ) ;
201
- var comments = processCommentsOption ( options . comments ) ;
202
- var debug = options . debug ;
203
- var statistics = options . stat ;
204
- var watch = options . watch ;
162
+ let inputFile = options . input || args [ 0 ] ;
163
+ let outputFile = options . output ;
164
+ const usageFile = options . usage ;
165
+ let usageData = false ;
166
+ const sourceMap = options . sourceMap ;
167
+ const inputSourceMap = options . inputSourceMap ;
168
+ const declarationList = options . declarationList ;
169
+ const restructure = Boolean ( options . restructure ) ;
170
+ const forceMediaMerge = Boolean ( options . forceMediaMerge ) ;
171
+ const comments = processCommentsOption ( options . comments ) ;
172
+ const debug = options . debug ;
173
+ const statistics = options . stat ;
174
+ const watch = options . watch ;
205
175
206
176
if ( process . stdin . isTTY && ! inputFile && ! outputFile ) {
207
177
return null ;
@@ -234,69 +204,58 @@ function processOptions(options, args) {
234
204
}
235
205
236
206
return {
237
- inputFile : inputFile ,
238
- outputFile : outputFile ,
239
- usageData : usageData ,
240
- sourceMap : sourceMap ,
241
- inputSourceMap : inputSourceMap ,
242
- declarationList : declarationList ,
243
- restructure : restructure ,
244
- forceMediaMerge : forceMediaMerge ,
245
- comments : comments ,
246
- statistics : statistics ,
247
- debug : debug ,
248
- watch : watch
207
+ inputFile,
208
+ outputFile,
209
+ usageData,
210
+ sourceMap,
211
+ inputSourceMap,
212
+ declarationList,
213
+ restructure,
214
+ forceMediaMerge,
215
+ comments,
216
+ statistics,
217
+ debug,
218
+ watch
249
219
} ;
250
220
}
251
221
252
222
function minifyStream ( options ) {
253
- var inputStream = options . inputFile !== '<stdin>'
223
+ const inputStream = options . inputFile !== '<stdin>'
254
224
? fs . createReadStream ( options . inputFile )
255
225
: process . stdin ;
256
226
257
- readFromStream ( inputStream , function ( source ) {
258
- var time = process . hrtime ( ) ;
259
- var mem = process . memoryUsage ( ) . heapUsed ;
260
- var relInputFilename = path . relative ( process . cwd ( ) , options . inputFile ) ;
261
- var sourceMap = resolveSourceMap (
227
+ readFromStream ( inputStream , ( source ) => {
228
+ const startTime = Date . now ( ) ;
229
+ const mem = process . memoryUsage ( ) . heapUsed ;
230
+ const relInputFilename = path . relative ( process . cwd ( ) , options . inputFile ) ;
231
+ const sourceMap = resolveSourceMap (
262
232
source ,
263
233
options . inputSourceMap ,
264
234
options . sourceMap ,
265
235
options . inputFile ,
266
236
options . outputFile
267
237
) ;
268
- var sourceMapAnnotation = '' ;
269
- var result ;
238
+ let sourceMapAnnotation = '' ;
239
+ let result ;
270
240
271
241
// main action
272
- try {
273
- var minifyFunc = options . declarationList ? csso . minifyBlock : csso . minify ;
274
- result = minifyFunc ( source , {
275
- filename : unixPathname ( relInputFilename ) ,
276
- sourceMap : Boolean ( sourceMap . output ) ,
277
- usage : options . usageData ,
278
- restructure : options . restructure ,
279
- forceMediaMerge : options . forceMediaMerge ,
280
- comments : options . comments ,
281
- debug : options . debug
282
- } ) ;
283
-
284
- // for backward capability minify returns a string
285
- if ( typeof result === 'string' ) {
286
- result = {
287
- css : result ,
288
- map : null
289
- } ;
290
- }
291
- } catch ( e ) {
292
- if ( e . parseError ) {
293
- showParseError ( source , options . inputFile , e . parseError , e . message ) ;
294
- if ( ! options . debug ) {
295
- process . exit ( 2 ) ;
296
- }
297
- }
242
+ const minifyFunc = options . declarationList ? csso . minifyBlock : csso . minify ;
243
+ result = minifyFunc ( source , {
244
+ filename : unixPathname ( relInputFilename ) ,
245
+ sourceMap : Boolean ( sourceMap . output ) ,
246
+ usage : options . usageData ,
247
+ restructure : options . restructure ,
248
+ forceMediaMerge : options . forceMediaMerge ,
249
+ comments : options . comments ,
250
+ debug : options . debug
251
+ } ) ;
298
252
299
- throw e ;
253
+ // for backward capability minify returns a string
254
+ if ( typeof result === 'string' ) {
255
+ result = {
256
+ css : result ,
257
+ map : null
258
+ } ;
300
259
}
301
260
302
261
if ( sourceMap . output && result . map ) {
@@ -336,21 +295,20 @@ function minifyStream(options) {
336
295
337
296
// output statistics
338
297
if ( options . statistics ) {
339
- var timeDiff = process . hrtime ( time ) ;
340
298
showStat (
341
299
relInputFilename ,
342
300
source . length ,
343
301
result . css . length ,
344
302
sourceMap . inputFile ,
345
303
sourceMapAnnotation . length ,
346
- parseInt ( timeDiff [ 0 ] * 1e3 + timeDiff [ 1 ] / 1e6 , 10 ) ,
304
+ Date . now ( ) - startTime ,
347
305
process . memoryUsage ( ) . heapUsed - mem
348
306
) ;
349
307
}
350
308
} ) ;
351
309
}
352
310
353
- var command = cli . command ( 'csso [input]' )
311
+ const command = cli . command ( 'csso [input]' )
354
312
. version ( require ( 'csso/package.json' ) . version )
355
313
. option ( '-i, --input <filename>' , 'Input file' )
356
314
. option ( '-o, --output <filename>' , 'Output file (result outputs to stdout if not set)' )
@@ -364,7 +322,7 @@ var command = cli.command('csso [input]')
364
322
. option ( '--stat' , 'Output statistics in stderr' )
365
323
. option ( '--debug [level]' , 'Output intermediate state of CSS during a compression' , debugLevel , 0 )
366
324
. option ( '--watch' , 'Watch source file for changes' )
367
- . action ( function ( { options, args } ) {
325
+ . action ( ( { options, args } ) => {
368
326
options = processOptions ( options , args ) ;
369
327
370
328
if ( options === null ) {
@@ -378,15 +336,13 @@ var command = cli.command('csso [input]')
378
336
if ( options . watch && options . inputFile !== '<stdin>' ) {
379
337
// NOTE: require chokidar here to keep down start up time when --watch doesn't use
380
338
// (yep, chokidar adds a penalty ~0.2-0.3s on its init)
381
- require ( 'chokidar' ) . watch ( options . inputFile ) . on ( 'change' , function ( ) {
382
- minifyStream ( options ) ;
383
- } ) ;
339
+ require ( 'chokidar' )
340
+ . watch ( options . inputFile )
341
+ . on ( 'change' , ( ) => minifyStream ( options ) ) ;
384
342
}
385
343
} ) ;
386
344
387
345
module . exports = {
388
- run : command . run . bind ( command ) ,
389
- isCliError : function ( err ) {
390
- return err instanceof cli . Error ;
391
- }
346
+ run : ( ...args ) => command . run ( ...args ) ,
347
+ isCliError : ( err ) => err instanceof cli . Error
392
348
} ;
0 commit comments