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

+1
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

+2
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

+56-33
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

+39-1
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)