Skip to content

Commit 9fc6e5e

Browse files
Fixes #18 - allows batch processing of input files via --batch option.
1 parent 4e95574 commit 9fc6e5e

File tree

4 files changed

+98
-34
lines changed

4 files changed

+98
-34
lines changed

History.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
* Bumps clean-css dependency to 5.0.
55
* Bumps commander dependency to 7.0.
6+
* Fixed issue [#18](https://github.com/jakubpawlowicz/clean-css-cli/issues/18) - allows batch processing of input files.
67

78
[4.3.0 / 2019-04-06](https://github.com/jakubpawlowicz/clean-css-cli/compare/4.2...v4.3.0)
89
==================

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ cleancss -o one.min.css one.css
6464

6565
clean-css-cli 5.0 introduces the following changes / features:
6666

67+
* adds `--batch` option (off by default) which processes input files one by one without joining them together;
6768
* clean-css 5.0 with loads of bugfixes;
6869
* drops official support for Node.js 4, 6, and 8;
6970
* `--skip-rebase` option has been removed as rebasing URLs is disabled by default now
@@ -115,6 +116,7 @@ clean-css-cli 4.3 introduces the following changes / features:
115116
```shell
116117
-h, --help output usage information
117118
-v, --version output the version number
119+
-b, --batch If enabled, optimizes input files one by one instead of joining them together
118120
-c, --compatibility [ie7|ie8] Force compatibility mode (see Readme for advanced examples)
119121
-d, --debug Shows debug information (minification time & compression efficiency)
120122
-f, --format <options> Controls output formatting, see examples below

index.js

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ function cli(process, beforeMinifyCallback) {
2525
program
2626
.version(buildVersion, '-v, --version')
2727
.usage('[options] <source-file ...>')
28+
.option('-b, --batch', 'If enabled, optimizes input files one by one instead of joining them together')
2829
.option('-c, --compatibility [ie7|ie8]', 'Force compatibility mode (see Readme for advanced examples)')
2930
.option('-d, --debug', 'Shows debug information (minification time & compression efficiency)')
3031
.option('-f, --format <options>', 'Controls output formatting, see examples below')
@@ -136,6 +137,7 @@ function cli(process, beforeMinifyCallback) {
136137
removeInlinedFiles = inputOptions.removeInlinedFiles;
137138

138139
options = {
140+
batch: inputOptions.batch,
139141
compatibility: inputOptions.compatibility,
140142
format: inputOptions.format,
141143
inline: typeof inputOptions.inline == 'string' ? inputOptions.inline : 'local',
@@ -232,41 +234,63 @@ function minify(process, options, configurations, data) {
232234
applyNonBooleanCompatibilityFlags(cleanCss, options.compatibility);
233235
configurations.beforeMinifyCallback(cleanCss);
234236
cleanCss.minify(data, getSourceMapContent(configurations.inputSourceMap), function (errors, minified) {
235-
var mapFilename;
236-
237-
if (configurations.debugMode) {
238-
console.error('Original: %d bytes', minified.stats.originalSize);
239-
console.error('Minified: %d bytes', minified.stats.minifiedSize);
240-
console.error('Efficiency: %d%', ~~(minified.stats.efficiency * 10000) / 100.0);
241-
console.error('Time spent: %dms', minified.stats.timeSpent);
242-
243-
if (minified.inlinedStylesheets.length > 0) {
244-
console.error('Inlined stylesheets:');
245-
minified.inlinedStylesheets.forEach(function (uri) {
246-
console.error('- %s', uri);
247-
});
237+
var inputPath;
238+
239+
if (options.batch && !('styles' in minified)) {
240+
for (inputPath in minified) {
241+
processMinified(process, configurations, minified[inputPath], inputPath, toOutputPath(inputPath));
248242
}
243+
} else {
244+
processMinified(process, configurations, minified, null, options.output);
249245
}
246+
});
247+
}
248+
249+
function toOutputPath(inputPath) {
250+
return inputPath.replace(/\.css$/, '-min.css');
251+
}
250252

251-
outputFeedback(minified.errors, true);
252-
outputFeedback(minified.warnings);
253+
function processMinified(process, configurations, minified, inputPath, outputPath) {
254+
var mapOutputPath;
253255

254-
if (minified.errors.length > 0) {
255-
process.exit(1);
256+
if (configurations.debugMode) {
257+
if (inputPath) {
258+
console.error('File: %s', inputPath);
256259
}
257260

258-
if (configurations.removeInlinedFiles) {
259-
minified.inlinedStylesheets.forEach(fs.unlinkSync);
260-
}
261+
console.error('Original: %d bytes', minified.stats.originalSize);
262+
console.error('Minified: %d bytes', minified.stats.minifiedSize);
263+
console.error('Efficiency: %d%', ~~(minified.stats.efficiency * 10000) / 100.0);
264+
console.error('Time spent: %dms', minified.stats.timeSpent);
261265

262-
if (minified.sourceMap) {
263-
mapFilename = path.basename(options.output) + '.map';
264-
output(process, options, minified.styles + lineBreak + '/*# sourceMappingURL=' + mapFilename + ' */');
265-
outputMap(options, minified.sourceMap, mapFilename);
266-
} else {
267-
output(process, options, minified.styles);
266+
if (minified.inlinedStylesheets.length > 0) {
267+
console.error('Inlined stylesheets:');
268+
minified.inlinedStylesheets.forEach(function (uri) {
269+
console.error('- %s', uri);
270+
});
268271
}
269-
});
272+
273+
console.error('');
274+
}
275+
276+
outputFeedback(minified.errors, true);
277+
outputFeedback(minified.warnings);
278+
279+
if (minified.errors.length > 0) {
280+
process.exit(1);
281+
}
282+
283+
if (configurations.removeInlinedFiles) {
284+
minified.inlinedStylesheets.forEach(fs.unlinkSync);
285+
}
286+
287+
if (minified.sourceMap) {
288+
mapOutputPath = outputPath + '.map';
289+
output(process, outputPath, minified.styles + lineBreak + '/*# sourceMappingURL=' + path.basename(mapOutputPath) + ' */');
290+
outputMap(mapOutputPath, minified.sourceMap);
291+
} else {
292+
output(process, outputPath, minified.styles);
293+
}
270294
}
271295

272296
function applyNonBooleanCompatibilityFlags(cleanCss, compatibility) {
@@ -319,17 +343,16 @@ function getSourceMapContent(sourceMapPath) {
319343
return content;
320344
}
321345

322-
function output(process, options, minified) {
323-
if (options.output) {
324-
fs.writeFileSync(options.output, minified, 'utf8');
346+
function output(process, outputPath, minified) {
347+
if (outputPath) {
348+
fs.writeFileSync(outputPath, minified, 'utf8');
325349
} else {
326350
process.stdout.write(minified);
327351
}
328352
}
329353

330-
function outputMap(options, sourceMap, mapFilename) {
331-
var mapPath = path.join(path.dirname(options.output), mapFilename);
332-
fs.writeFileSync(mapPath, sourceMap.toString(), 'utf-8');
354+
function outputMap(mapOutputPath, sourceMap) {
355+
fs.writeFileSync(mapOutputPath, sourceMap.toString(), 'utf-8');
333356
}
334357

335358
module.exports = cli;

test/binary-test.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,7 @@ vows.describe('cleancss')
719719
})
720720
.addBatch({
721721
'content of input-source-map': pipedContext(fs.readFileSync('./test/fixtures/source-maps/map/styles.css'), '-o ./test/styles.min.css --input-source-map ./test/fixtures/source-maps/map/input.map', {
722-
'includes the right content of the source map': function() {
722+
'processes content normally': function() {
723723
assert.isTrue(fs.existsSync('test/styles.min.css.map'));
724724
var sourceMap = new SourceMapConsumer(fs.readFileSync('./test/styles.min.css.map', 'utf-8'));
725725

@@ -739,4 +739,42 @@ vows.describe('cleancss')
739739
}
740740
})
741741
})
742+
.addBatch({
743+
'batch processing in piped mode': pipedContext(fs.readFileSync('./test/fixtures/partials/one.css'), '-b', {
744+
'includes the right content of the source map': function (error, stdout) {
745+
assert.equal(stdout, '.one{color:red}');
746+
}
747+
}),
748+
'batch processing with explicitely given paths': binaryContext('-b ./test/fixtures/partials/one.css ./test/fixtures/partials/five.css', {
749+
'creates two separate minified files': function () {
750+
assert.isTrue(fs.existsSync('test/fixtures/partials/one-min.css'));
751+
assert.isFalse(fs.existsSync('test/fixtures/partials/two-min.css'));
752+
assert.isTrue(fs.existsSync('test/fixtures/partials/five-min.css'));
753+
},
754+
'teardown': function () {
755+
deleteFile('test/fixtures/partials/one-min.css');
756+
deleteFile('test/fixtures/partials/five-min.css');
757+
}
758+
})
759+
})
760+
.addBatch({
761+
'batch processing with wildard paths': binaryContext('-b ./test/fixtures/partials/\\*\\*/*.css', {
762+
'creates two separate minified files': function () {
763+
assert.isTrue(fs.existsSync('test/fixtures/partials/extra/four-min.css'));
764+
assert.isTrue(fs.existsSync('test/fixtures/partials/extra/three-min.css'));
765+
assert.isTrue(fs.existsSync('test/fixtures/partials/one-min.css'));
766+
assert.isTrue(fs.existsSync('test/fixtures/partials/two-min.css'));
767+
assert.isTrue(fs.existsSync('test/fixtures/partials/quoted-svg-min.css'));
768+
assert.isTrue(fs.existsSync('test/fixtures/partials/five-min.css'));
769+
},
770+
'teardown': function () {
771+
deleteFile('test/fixtures/partials/extra/four-min.css');
772+
deleteFile('test/fixtures/partials/extra/three-min.css');
773+
deleteFile('test/fixtures/partials/one-min.css');
774+
deleteFile('test/fixtures/partials/two-min.css');
775+
deleteFile('test/fixtures/partials/quoted-svg-min.css');
776+
deleteFile('test/fixtures/partials/five-min.css');
777+
}
778+
})
779+
})
742780
.export(module);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy