* `sourceMap` option can be given as source map string.
* Particularly useful for preprocessed stylesheets.
* `roundingPrecision` - rounding precision; defaults to `2`; `-1` disables rounding
* `shorthandCompacting` - set to false to skip shorthand compacting (default is true unless sourceMap is set when it's false)
* `sourceMap` - exposes source map under `sourceMap` property, e.g. `new CleanCSS().minify(source).sourceMap` (default is false)
+ If input styles are a product of CSS preprocessor (LESS, SASS) an input source map can be passed as a string.
* `target` - path to a folder or an output file to which __rebase__ all URLs
### How to use clean-css with build tools?
root: options.root,
roundingPrecision: options.roundingPrecision,
shorthandCompacting: !!options.sourceMap ? false : (undefined === options.shorthandCompacting ? true : !!options.shorthandCompacting),
- sourceMap: !!options.sourceMap,
+ sourceMap: options.sourceMap,
target: options.target
};
run(freeTextProcessor, 'escape');
run(function() {
- var stringifier = new stringifierClass(options.keepBreaks, function (data) {
+ var stringifier = new stringifierClass(options, function (data) {
data = freeTextProcessor.restore(data);
data = urlsProcessor.restore(data);
data = options.rebase ? urlRebase.process(data) : data;
+var SourceMapConsumer = require('source-map').SourceMapConsumer;
var SourceMapGenerator = require('source-map').SourceMapGenerator;
var lineBreak = require('os').EOL;
-function SourceMapStringifier(keepBreaks, restoreCallback) {
- this.keepBreaks = keepBreaks;
+function SourceMapStringifier(options, restoreCallback) {
+ this.keepBreaks = options.keepBreaks;
this.restoreCallback = restoreCallback;
- this.sourceMap = new SourceMapGenerator();
+ this.outputMap = new SourceMapGenerator();
+ this.inputMap = typeof options.sourceMap == 'string' ?
+ new SourceMapConsumer(options.sourceMap) :
+ null;
}
function valueRebuilder(list, store, separator) {
function track(context, value, metadata) {
if (metadata) {
- context.sourceMap.addMapping({
+ var original = context.inputMap ?
+ context.inputMap.originalPositionFor(metadata) :
+ {};
+
+ context.outputMap.addMapping({
generated: {
line: context.line,
column: context.column,
},
- source: metadata.source || '__stdin__.css',
+ source: original.source || metadata.source || '__stdin__.css',
original: {
- line: metadata.line,
- column: metadata.column
+ line: original.line || metadata.line,
+ column: original.column || metadata.column
},
name: value
});
var context = {
column: 1,
line: 1,
- sourceMap: this.sourceMap
+ inputMap: this.inputMap,
+ outputMap: this.outputMap
};
function store(token) {
rebuild(tokens, store, this.keepBreaks, false);
return {
- sourceMap: this.sourceMap,
+ sourceMap: this.outputMap,
styles: output.join('').trim()
};
};
var lineBreak = require('os').EOL;
-function Stringifier(keepBreaks, restoreCallback) {
- this.keepBreaks = keepBreaks;
+function Stringifier(options, restoreCallback) {
+ this.keepBreaks = options.keepBreaks;
this.restoreCallback = restoreCallback;
}
var assert = require('assert');
var CleanCSS = require('../index');
+var inputSourceMap = '{"version":3,"sources":["styles.less"],"names":[],"mappings":"AAAA,GACE;EACE,UAAA","file":"styles.css"}';
+
vows.describe('source-map')
.addBatch({
'module #1': {
}
},
})
+ .addBatch({
+ 'input map as string': {
+ 'topic': new CleanCSS({ sourceMap: inputSourceMap }).minify('div > a {\n color: red;\n}'),
+ 'should have 2 mappings': function (minified) {
+ assert.equal(2, minified.sourceMap._mappings.length);
+ },
+ 'should have selector mapping': function (minified) {
+ var mapping = {
+ generatedLine: 1,
+ generatedColumn: 1,
+ originalLine: 1,
+ originalColumn: 1,
+ source: 'styles.less',
+ name: 'div>a'
+ };
+ assert.deepEqual(mapping, minified.sourceMap._mappings[0]);
+ },
+ 'should have _color:red_ mapping': function (minified) {
+ var mapping = {
+ generatedLine: 1,
+ generatedColumn: 7,
+ originalLine: 3,
+ originalColumn: 4,
+ source: 'styles.less',
+ name: 'color:red'
+ };
+ assert.deepEqual(mapping, minified.sourceMap._mappings[1]);
+ }
+ }
+ })
.export(module);