Fixes #399 - compacting with source maps.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 12 Apr 2015 14:36:08 +0000 (15:36 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 12 Apr 2015 16:58:11 +0000 (17:58 +0100)
Enables compacting when building source maps. This is possible thanks
to #429 being fixed.

History.md
README.md
lib/clean.js
lib/properties/optimizer.js
lib/stringifier/source-maps.js
test/source-map-test.js

index 27cc06a..80ecf96 100644 (file)
@@ -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.
index 378c7e3..354d814 100644 (file)
--- 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
index a6bf97d..4a51c22 100644 (file)
@@ -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)
index 11f6a3e..83e60a7 100644 (file)
@@ -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);
   }
index dc26fd7..5e16ac7 100644 (file)
@@ -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({
index bbc8c91..abacf57 100644 (file)
@@ -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);
+        }
       }
     }
   })