var Compatibility = require('./utils/compatibility');
+var fs = require('fs');
+var path = require('path');
+
+var SOURCE_MAP_MARKER = '/*# sourceMappingURL=';
+
var CleanCSS = module.exports = function CleanCSS(options) {
options = options || {};
if (Buffer.isBuffer(data))
data = data.toString();
+ if (data.indexOf(SOURCE_MAP_MARKER) > 0)
+ overrideSourceMap(self.options, data);
+
if (options.processImport || data.indexOf('@shallow') > 0) {
// inline all imports
var runner = callback ?
}
};
+function overrideSourceMap(options, source) {
+ var markerAt = source.indexOf(SOURCE_MAP_MARKER);
+ var inputMapPath = source.substring(markerAt + SOURCE_MAP_MARKER.length, source.indexOf('*/', markerAt)).trim();
+ options.sourceMap = fs.readFileSync(path.join(options.root || '', inputMapPath), 'utf-8');
+}
+
function runMinifier(callback, self) {
return function (data) {
data = self.options.debug ?
var assert = require('assert');
var CleanCSS = require('../index');
-var inputSourceMap = '{"version":3,"sources":["styles.less"],"names":[],"mappings":"AAAA,GACE;EACE,UAAA","file":"styles.css"}';
+var fs = require('fs');
+var path = require('path');
+var inputMapPath = path.join('test', 'data', 'source-maps', 'sample.map');
+var inputMap = fs.readFileSync(inputMapPath, 'utf-8');
vows.describe('source-map')
.addBatch({
})
.addBatch({
'input map as string': {
- 'topic': new CleanCSS({ sourceMap: inputSourceMap }).minify('div > a {\n color: red;\n}'),
+ 'topic': new CleanCSS({ sourceMap: inputMap }).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]);
+ }
+ },
+ 'input map from source': {
+ 'topic': new CleanCSS().minify('div > a {\n color: red;\n}/*# sourceMappingURL=' + inputMapPath + ' */'),
+ '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]);
+ }
+ },
+ 'input map from source with root': {
+ 'topic': new CleanCSS({ root: path.dirname(inputMapPath) }).minify('div > a {\n color: red;\n}/*# sourceMappingURL=sample.map */'),
'should have 2 mappings': function (minified) {
assert.equal(2, minified.sourceMap._mappings.length);
},