Skip to content

Commit 8a5931a

Browse files
mihai-vlcjakubpawlowicz
authored andcommitted
Adds support for the --input-source-map flag.
1 parent a053a2c commit 8a5931a

File tree

6 files changed

+86
-9
lines changed

6 files changed

+86
-9
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ clean-css-cli 4.1 introduces the following changes / features:
102102
--skip-rebase Disable URLs rebasing
103103
--source-map Enables building input's source map
104104
--source-map-inline-sources Enables inlining sources inside source maps
105+
--input-source-map [file] Specifies the path of the input source map file
105106
```
106107
107108
## Compatibility modes

index.js

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ function cli(process, beforeMinifyCallback) {
3434
.option('--remove-inlined-files', 'Remove files inlined in <source-file ...> or via `@import` statements')
3535
.option('--skip-rebase', 'Disable URLs rebasing')
3636
.option('--source-map', 'Enables building input\'s source map')
37-
.option('--source-map-inline-sources', 'Enables inlining sources inside source maps');
37+
.option('--source-map-inline-sources', 'Enables inlining sources inside source maps')
38+
.option('--input-source-map [file]', 'Specifies the path of the input source map file');
3839

3940
commands.on('--help', function () {
4041
console.log(' Examples:\n');
@@ -156,14 +157,25 @@ function cli(process, beforeMinifyCallback) {
156157
sourceMapInlineSources: commands.sourceMapInlineSources
157158
};
158159

160+
if (commands.inputSourceMap && !options.sourceMap) {
161+
options.sourceMap = true;
162+
}
163+
159164
if (options.sourceMap && !options.output) {
160165
outputFeedback(['Source maps will not be built because you have not specified an output file.'], true);
161166
options.sourceMap = false;
162167
}
163168

169+
var configurations = {
170+
beforeMinifyCallback: beforeMinifyCallback,
171+
debugMode: debugMode,
172+
removeInlinedFiles: removeInlinedFiles,
173+
inputSourceMap: commands.inputSourceMap
174+
};
175+
164176
// ... and do the magic!
165177
if (commands.args.length > 0) {
166-
minify(process, beforeMinifyCallback, options, debugMode, removeInlinedFiles, expandGlobs(commands.args));
178+
minify(process, options, configurations, expandGlobs(commands.args));
167179
} else {
168180
stdin = process.openStdin();
169181
stdin.setEncoding('utf-8');
@@ -172,7 +184,7 @@ function cli(process, beforeMinifyCallback) {
172184
data += chunk;
173185
});
174186
stdin.on('end', function () {
175-
minify(process, beforeMinifyCallback, options, debugMode, removeInlinedFiles, data);
187+
minify(process, options, configurations, data);
176188
});
177189
}
178190
}
@@ -211,15 +223,15 @@ function expandGlobs(paths) {
211223
}, []);
212224
}
213225

214-
function minify(process, beforeMinifyCallback, options, debugMode, removeInlinedFiles, data) {
226+
function minify(process, options, configurations, data) {
215227
var cleanCss = new CleanCSS(options);
216228

217229
applyNonBooleanCompatibilityFlags(cleanCss, options.compatibility);
218-
beforeMinifyCallback(cleanCss);
219-
cleanCss.minify(data, function (errors, minified) {
230+
configurations.beforeMinifyCallback(cleanCss);
231+
cleanCss.minify(data, getSourceMapContent(configurations.inputSourceMap), function (errors, minified) {
220232
var mapFilename;
221233

222-
if (debugMode) {
234+
if (configurations.debugMode) {
223235
console.error('Original: %d bytes', minified.stats.originalSize);
224236
console.error('Minified: %d bytes', minified.stats.minifiedSize);
225237
console.error('Efficiency: %d%', ~~(minified.stats.efficiency * 10000) / 100.0);
@@ -240,7 +252,7 @@ function minify(process, beforeMinifyCallback, options, debugMode, removeInlined
240252
process.exit(1);
241253
}
242254

243-
if (removeInlinedFiles) {
255+
if (configurations.removeInlinedFiles) {
244256
minified.inlinedStylesheets.forEach(fs.unlinkSync);
245257
}
246258

@@ -289,6 +301,21 @@ function outputFeedback(messages, isError) {
289301
});
290302
}
291303

304+
function getSourceMapContent(sourceMapPath) {
305+
if (!sourceMapPath || !fs.existsSync(sourceMapPath)) {
306+
return null;
307+
}
308+
var content = null;
309+
310+
try {
311+
content = fs.readFileSync(sourceMapPath).toString();
312+
} catch (e) {
313+
console.error('Failed to read the input source map file.');
314+
}
315+
316+
return content;
317+
}
318+
292319
function output(process, options, minified) {
293320
if (options.output) {
294321
fs.writeFileSync(options.output, minified, 'utf8');

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "clean-css-cli",
3-
"version": "4.2.0",
3+
"version": "4.3.0",
44
"description": "A command-line interface to clean-css CSS optimization library",
55
"scripts": {
66
"check": "jshint ./bin/cleancss .",

test/binary-test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,4 +694,49 @@ vows.describe('cleancss')
694694
}
695695
}
696696
})
697+
.addBatch({
698+
'process an 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', {
699+
'enables the source map flag': function() {
700+
assert.isTrue(fs.existsSync('test/styles.min.css'));
701+
assert.isTrue(fs.existsSync('test/styles.min.css.map'));
702+
},
703+
'teardown': function () {
704+
deleteFile('test/styles.min.css');
705+
deleteFile('test/styles.min.css.map');
706+
}
707+
})
708+
})
709+
.addBatch({
710+
'missing an input-source-map': pipedContext(fs.readFileSync('./test/fixtures/source-maps/map/styles.css'), '-o ./test/styles.min.css', {
711+
'does not generate a source map if the parameter is missing': function() {
712+
assert.isTrue(fs.existsSync('test/styles.min.css'));
713+
assert.isFalse(fs.existsSync('test/styles.min.css.map'));
714+
},
715+
'teardown': function () {
716+
deleteFile('test/styles.min.css');
717+
}
718+
})
719+
})
720+
.addBatch({
721+
'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() {
723+
assert.isTrue(fs.existsSync('test/styles.min.css.map'));
724+
var sourceMap = new SourceMapConsumer(fs.readFileSync('./test/styles.min.css.map', 'utf-8'));
725+
726+
assert.deepEqual(
727+
sourceMap.originalPositionFor({ line: 1, column: 1 }),
728+
{
729+
source: 'styles.less',
730+
line: 1,
731+
column: 4,
732+
name: null
733+
}
734+
);
735+
},
736+
'teardown': function () {
737+
deleteFile('test/styles.min.css');
738+
deleteFile('test/styles.min.css.map');
739+
}
740+
})
741+
})
697742
.export(module);

test/fixtures/source-maps/map/input.map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
div > a {
2+
color: blue;
3+
}

0 commit comments

Comments
 (0)