Add an option for keeping trailing semicolons in rule (#983)
authorDChristiany <daniel-christiany@gmx.net>
Tue, 7 Nov 2017 16:41:50 +0000 (17:41 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Tue, 7 Nov 2017 16:41:50 +0000 (17:41 +0100)
Adds semicolonAfterLastProperty to format options and force keeping semicolon after last property, defaults to `false`.

lib/options/format.js
lib/writer/helpers.js
test/module-test.js
test/options/format-test.js

index afcf5c9..e641689 100644 (file)
@@ -28,7 +28,8 @@ var DEFAULTS = {
   indentBy: 0,
   indentWith: IndentWith.Space,
   spaces: spaces(false),
-  wrapAt: false
+  wrapAt: false,
+  semicolonAfterLastProperty: false
 };
 
 var BEAUTIFY_ALIAS = 'beautify';
index 5be184f..3ee2642 100644 (file)
@@ -79,7 +79,20 @@ function property(context, tokens, position, lastPropertyAt) {
   var store = context.store;
   var token = tokens[position];
   var isPropertyBlock = token[2][0] == Token.PROPERTY_BLOCK;
-  var needsSemicolon = position < lastPropertyAt || isPropertyBlock;
+
+  var needsSemicolon;
+  if ( context.format ) {
+    if ( context.format.semicolonAfterLastProperty || isPropertyBlock ) {
+      needsSemicolon = true;
+    } else if ( position < lastPropertyAt ) {
+      needsSemicolon = true;
+    } else {
+      needsSemicolon = false;
+    }
+  } else {
+    needsSemicolon = position < lastPropertyAt || isPropertyBlock;
+  }
+
   var isLast = position === lastPropertyAt;
 
   switch (token[0]) {
index 7d38b80..8aede41 100644 (file)
@@ -858,5 +858,16 @@ vows.describe('module tests').addBatch({
     'should give right output': function (minified) {
       assert.equal(minified.styles, '.one{color:red}.three{background-image:url(test/fixtures/partials/extra/down.gif)}');
     }
+  },
+  'keeps trailing semicolons if option is set': {
+    'topic': function() {
+      return new CleanCSS({format: { semicolonAfterLastProperty: true }}).minify('*{ font-size:12px; color:#ea7500; }');
+    },
+    'should minify correctly': function (error, minified) {
+      assert.equal(minified.styles, '*{font-size:12px;color:#ea7500;}');
+    },
+    'should raise no errors': function (error, minified) {
+      assert.isEmpty(minified.errors);
+    }
   }
 }).export(module);
index 17c1af7..87a789d 100644 (file)
@@ -46,7 +46,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -74,7 +75,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -102,7 +104,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -130,7 +133,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -158,7 +162,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -186,7 +191,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: 25
+          wrapAt: 25,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -214,7 +220,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -242,7 +249,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: true,
             beforeValue: true
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     },
@@ -270,7 +278,8 @@ vows.describe(formatFrom)
             beforeBlockBegins: false,
             beforeValue: false
           },
-          wrapAt: false
+          wrapAt: false,
+          semicolonAfterLastProperty: false
         });
       }
     }