From 184fc601ff5e872f54020e660705d822f7afc20a Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Sun, 12 Apr 2015 15:36:08 +0100 Subject: [PATCH] Fixes #399 - compacting with source maps. Enables compacting when building source maps. This is possible thanks to #429 being fixed. --- History.md | 1 + README.md | 4 - lib/clean.js | 2 +- lib/properties/optimizer.js | 2 +- lib/stringifier/source-maps.js | 3 + test/source-map-test.js | 173 +++++++++++++++++++++------------ 6 files changed, 116 insertions(+), 69 deletions(-) diff --git a/History.md b/History.md index 27cc06ac..80ecf96e 100644 --- a/History.md +++ b/History.md @@ -7,6 +7,7 @@ * Fixed issue [#376](https://github.com/jakubpawlowicz/clean-css/issues/376) - option to disable `0[unit]` -> `0`. * Fixed issue [#396](https://github.com/jakubpawlowicz/clean-css/issues/396) - better input source maps tracking. * Fixed issue [#397](https://github.com/jakubpawlowicz/clean-css/issues/397) - support for source map sources. +* Fixed issue [#399](https://github.com/jakubpawlowicz/clean-css/issues/399) - support compacting with source maps. * Fixed issue [#429](https://github.com/jakubpawlowicz/clean-css/issues/429) - unifies data tokenization. * Fixed issue [#480](https://github.com/jakubpawlowicz/clean-css/issues/480) - extracting uppercase property names. * Fixed issue [#500](https://github.com/jakubpawlowicz/clean-css/issues/500) - merging duplicate adjacent properties. diff --git a/README.md b/README.md index 378c7e38..354d814f 100644 --- a/README.md +++ b/README.md @@ -270,10 +270,6 @@ new CleanCSS({ sourceMap: true, target: pathToOutputDirectory }).minify({ }); ``` -#### Caveats - -* Shorthand compacting is currently disabled when source maps are enabled, see [#399](https://github.com/GoalSmashers/clean-css/issues/399) - ### How to minify multiple files with API #### Passing an array diff --git a/lib/clean.js b/lib/clean.js index a6bf97db..4a51c227 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -49,7 +49,7 @@ var CleanCSS = module.exports = function CleanCSS(options) { restructuring: undefined === options.restructuring ? true : !!options.restructuring, root: options.root || process.cwd(), roundingPrecision: options.roundingPrecision, - shorthandCompacting: !!options.sourceMap ? false : (undefined === options.shorthandCompacting ? true : !!options.shorthandCompacting), + shorthandCompacting: undefined === options.shorthandCompacting ? true : !!options.shorthandCompacting, sourceMap: options.sourceMap, sourceMapInlineSources: !!options.sourceMapInlineSources, target: options.target && fs.existsSync(options.target) && fs.statSync(options.target).isDirectory() ? options.target : path.dirname(options.target) diff --git a/lib/properties/optimizer.js b/lib/properties/optimizer.js index 11f6a3e1..83e60a71 100644 --- a/lib/properties/optimizer.js +++ b/lib/properties/optimizer.js @@ -185,7 +185,7 @@ function optimize(selector, properties, mergeAdjacent, withCompacting, options, populateComponents(_properties, validator); _optimize(_properties, mergeAdjacent, options.aggressiveMerging, validator); - if (withCompacting && options.shorthandCompacting && !options.sourceMap) { + if (withCompacting && options.shorthandCompacting) { compactOverrides(_properties, options.compatibility, validator); compactShorthands(_properties, options.compatibility, validator); } diff --git a/lib/stringifier/source-maps.js b/lib/stringifier/source-maps.js index dc26fd79..5e16ac7a 100644 --- a/lib/stringifier/source-maps.js +++ b/lib/stringifier/source-maps.js @@ -32,6 +32,9 @@ function trackMetadata(element, context) { if (typeof element[sourceAt] == 'object') sourceAt--; + if (typeof element[sourceAt - 1] != 'number') + return; + var source = element[sourceAt] || unknownSource; context.outputMap.addMapping({ diff --git a/test/source-map-test.js b/test/source-map-test.js index bbc8c91f..abacf570 100644 --- a/test/source-map-test.js +++ b/test/source-map-test.js @@ -248,69 +248,6 @@ vows.describe('source-map') assert.deepEqual(minified.sourceMap._mappings._array[9], mapping); } }, - 'shorthands': { - 'topic': function () { - return new CleanCSS({ sourceMap: true }).minify('a{background:url(image.png);background-color:red}'); - }, - 'has 3 mappings': function(minified) { - assert.lengthOf(minified.sourceMap._mappings._array, 5); - }, - 'has `a` mapping': function (minified) { - var mapping = { - generatedLine: 1, - generatedColumn: 0, - originalLine: 1, - originalColumn: 0, - source: '$stdin', - name: null - }; - assert.deepEqual(minified.sourceMap._mappings._array[0], mapping); - }, - 'has `background` mapping': function (minified) { - var mapping = { - generatedLine: 1, - generatedColumn: 2, - originalLine: 1, - originalColumn: 2, - source: '$stdin', - name: null - }; - assert.deepEqual(minified.sourceMap._mappings._array[1], mapping); - }, - 'has `url(image.png)` mapping': function (minified) { - var mapping = { - generatedLine: 1, - generatedColumn: 13, - originalLine: 1, - originalColumn: 13, - source: '$stdin', - name: null - }; - assert.deepEqual(minified.sourceMap._mappings._array[2], mapping); - }, - 'has `background-color` mapping': function (minified) { - var mapping = { - generatedLine: 1, - generatedColumn: 28, - originalLine: 1, - originalColumn: 28, - source: '$stdin', - name: null - }; - assert.deepEqual(minified.sourceMap._mappings._array[3], mapping); - }, - 'has `red` mapping': function (minified) { - var mapping = { - generatedLine: 1, - generatedColumn: 45, - originalLine: 1, - originalColumn: 45, - source: '$stdin', - name: null - }; - assert.deepEqual(minified.sourceMap._mappings._array[4], mapping); - } - }, 'keyframes': { 'topic': function () { return new CleanCSS({ sourceMap: true }).minify('@-webkit-keyframes frames {\n 0% {\n border: 1px;\n }\n 100% {\n border: 3px;\n }\n}'); @@ -1807,6 +1744,116 @@ vows.describe('source-map') }; assert.deepEqual(minified.sourceMap._mappings._array[6], mapping); } + }, + 'overriding': { + 'topic': function () { + return new CleanCSS({ sourceMap: true }).minify('a{background:url(image.png);background-color:#eee;background-repeat:repeat-x}'); + }, + 'has right output': function (minified) { + assert.equal(minified.styles, 'a{background:url(image.png) repeat-x #eee}'); + }, + 'has 5 mappings': function (minified) { + assert.lengthOf(minified.sourceMap._mappings._array, 5); + }, + 'has a `background` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 2, + originalLine: 1, + originalColumn: 2, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[1], mapping); + }, + 'has a `url(image.png)` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 13, + originalLine: 1, + originalColumn: 13, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[2], mapping); + }, + 'has a `repeat-x` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 28, + originalLine: 1, + originalColumn: 68, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[3], mapping); + }, + 'has a `#eee` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 37, + originalLine: 1, + originalColumn: 45, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[4], mapping); + } + }, + 'compacting': { + 'topic': function () { + return new CleanCSS({ sourceMap: true }).minify('a{margin-top:10px;\nmargin-bottom:4px;\nmargin-left:5px;\nmargin-right:5px}'); + }, + 'has right output': function (minified) { + assert.equal(minified.styles, 'a{margin:10px 5px 4px}'); + }, + 'has 4 mappings': function (minified) { + assert.lengthOf(minified.sourceMap._mappings._array, 4); + }, + 'has a `a` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 0, + originalLine: 1, + originalColumn: 0, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[0], mapping); + }, + 'has a `10px` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 9, + originalLine: 1, + originalColumn: 13, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[1], mapping); + }, + 'has a `5px` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 14, + originalLine: 4, + originalColumn: 13, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[2], mapping); + }, + 'has a `4px` mapping': function (minified) { + var mapping = { + generatedLine: 1, + generatedColumn: 18, + originalLine: 2, + originalColumn: 14, + source: '$stdin', + name: null + }; + assert.deepEqual(minified.sourceMap._mappings._array[3], mapping); + } } } }) -- 2.34.1