Reorganizes optimizer around levels.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 8 Jan 2017 17:04:18 +0000 (18:04 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Sun, 8 Jan 2017 17:04:18 +0000 (18:04 +0100)
Why:

* Gets rid of the flat structure where levels' code was mixed;
* moves level 2 compacting into a namespace (folderspace?).

70 files changed:
lib/clean.js
lib/colors/rgb.js [deleted file]
lib/optimizer/hack.js [moved from lib/properties/hack.js with 100% similarity]
lib/optimizer/level-0/optimize.js [new file with mode: 0644]
lib/optimizer/level-1/optimize.js [moved from lib/optimizer/basic.js with 94% similarity]
lib/optimizer/level-1/shorten-hex.js [moved from lib/colors/hex-name-shortener.js with 94% similarity]
lib/optimizer/level-1/shorten-hsl.js [moved from lib/colors/hsl.js with 82% similarity]
lib/optimizer/level-1/shorten-rgb.js [new file with mode: 0644]
lib/optimizer/level-1/tidy-at-rule.js [moved from lib/optimizer/tidy-at-rule.js with 100% similarity]
lib/optimizer/level-1/tidy-block.js [moved from lib/optimizer/tidy-block.js with 100% similarity]
lib/optimizer/level-1/tidy-rules.js [moved from lib/optimizer/tidy-rules.js with 98% similarity]
lib/optimizer/level-2/break-up.js [moved from lib/properties/break-up.js with 98% similarity]
lib/optimizer/level-2/can-override.js [moved from lib/properties/can-override.js with 100% similarity]
lib/optimizer/level-2/clone.js [moved from lib/properties/clone.js with 86% similarity]
lib/optimizer/level-2/compactable.js [moved from lib/properties/compactable.js with 100% similarity]
lib/optimizer/level-2/compacting/every-combination.js [moved from lib/properties/every-combination.js with 87% similarity]
lib/optimizer/level-2/compacting/has-inherit.js [moved from lib/properties/has-inherit.js with 100% similarity]
lib/optimizer/level-2/compacting/optimize.js [moved from lib/properties/optimizer.js with 91% similarity]
lib/optimizer/level-2/compacting/override-compactor.js [moved from lib/properties/override-compactor.js with 93% similarity]
lib/optimizer/level-2/compacting/populate-components.js [moved from lib/properties/populate-components.js with 88% similarity]
lib/optimizer/level-2/compacting/shorthand-compactor.js [moved from lib/properties/shorthand-compactor.js with 94% similarity]
lib/optimizer/level-2/compacting/validator.js [moved from lib/properties/validator.js with 100% similarity]
lib/optimizer/level-2/compacting/vendor-prefixes.js [moved from lib/properties/vendor-prefixes.js with 100% similarity]
lib/optimizer/level-2/extract-properties.js [moved from lib/optimizer/extract-properties.js with 91% similarity]
lib/optimizer/level-2/invalid-property-error.js [moved from lib/properties/invalid-property-error.js with 100% similarity]
lib/optimizer/level-2/is-mergeable.js [moved from lib/optimizer/is-mergeable.js with 98% similarity]
lib/optimizer/level-2/merge-adjacent.js [moved from lib/optimizer/merge-adjacent.js with 78% similarity]
lib/optimizer/level-2/merge-media-queries.js [moved from lib/optimizer/merge-media-queries.js with 93% similarity]
lib/optimizer/level-2/merge-non-adjacent-by-body.js [moved from lib/optimizer/merge-non-adjacent-by-body.js with 87% similarity]
lib/optimizer/level-2/merge-non-adjacent-by-selector.js [moved from lib/optimizer/merge-non-adjacent-by-selector.js with 90% similarity]
lib/optimizer/level-2/optimize.js [moved from lib/optimizer/advanced.js with 84% similarity]
lib/optimizer/level-2/reduce-non-adjacent.js [moved from lib/optimizer/reduce-non-adjacent.js with 93% similarity]
lib/optimizer/level-2/remove-duplicate-font-at-rules.js [moved from lib/optimizer/remove-duplicate-font-at-rules.js with 83% similarity]
lib/optimizer/level-2/remove-duplicate-media-queries.js [moved from lib/optimizer/remove-duplicate-media-queries.js with 74% similarity]
lib/optimizer/level-2/remove-duplicates.js [moved from lib/optimizer/remove-duplicates.js with 83% similarity]
lib/optimizer/level-2/reorderable.js [moved from lib/optimizer/reorderable.js with 100% similarity]
lib/optimizer/level-2/restore-with-components.js [new file with mode: 0644]
lib/optimizer/level-2/restore.js [moved from lib/properties/restore.js with 98% similarity]
lib/optimizer/level-2/restructure.js [moved from lib/optimizer/restructure.js with 98% similarity]
lib/optimizer/level-2/rules-overlap.js [moved from lib/optimizer/rules-overlap.js with 100% similarity]
lib/optimizer/level-2/tidy-rule-duplicates.js [moved from lib/optimizer/tidy-rule-duplicates.js with 100% similarity]
lib/optimizer/remove-unused.js [moved from lib/properties/remove-unused.js with 100% similarity]
lib/optimizer/restore-from-optimizing.js [moved from lib/properties/restore-from-optimizing.js with 84% similarity]
lib/optimizer/wrap-for-optimizing.js [moved from lib/properties/wrap-for-optimizing.js with 99% similarity]
test/optimizer/level-1/basic-test.js [moved from test/optimizer/basic-test.js with 99% similarity]
test/optimizer/level-1/shorten-hex-test.js [moved from test/colors/hex-name-shortener-test.js with 96% similarity]
test/optimizer/level-2/break-up-test.js [moved from test/properties/break-up-test.js with 99% similarity]
test/optimizer/level-2/compacting/longhand-overriding-test.js [moved from test/properties/longhand-overriding-test.js with 93% similarity]
test/optimizer/level-2/compacting/optimize-test.js [moved from test/properties/optimizer-test.js with 98% similarity]
test/optimizer/level-2/compacting/override-compacting-test.js [moved from test/properties/override-compacting-test.js with 99% similarity]
test/optimizer/level-2/compacting/populate-components-test.js [moved from test/properties/populate-components-test.js with 93% similarity]
test/optimizer/level-2/compacting/shorthand-compacting-test.js [moved from test/properties/shorthand-compacting-test.js with 98% similarity]
test/optimizer/level-2/extract-properties-test.js [moved from test/optimizer/extract-properties-test.js with 98% similarity]
test/optimizer/level-2/is-mergeable-test.js [moved from test/optimizer/is-mergeable-test.js with 98% similarity]
test/optimizer/level-2/merge-adjacent-test.js [moved from test/optimizer/merge-adjacent-test.js with 98% similarity]
test/optimizer/level-2/merge-media-queries-test.js [moved from test/optimizer/merge-media-queries-test.js with 99% similarity]
test/optimizer/level-2/merge-non-adjacent-by-body-test.js [moved from test/optimizer/merge-non-adjacent-by-body-test.js with 98% similarity]
test/optimizer/level-2/merge-non-adjacent-by-selector-test.js [moved from test/optimizer/merge-non-adjacent-by-selector-test.js with 94% similarity]
test/optimizer/level-2/optimize-test.js [moved from test/optimizer/advanced-test.js with 98% similarity]
test/optimizer/level-2/reduce-non-adjacent-test.js [moved from test/optimizer/reduce-non-adjacent-test.js with 99% similarity]
test/optimizer/level-2/remove-duplicate-font-at-rules-test.js [moved from test/optimizer/remove-duplicate-font-at-rules-test.js with 94% similarity]
test/optimizer/level-2/remove-duplicate-media-queries-test.js [moved from test/optimizer/remove-duplicate-media-queries-test.js with 95% similarity]
test/optimizer/level-2/remove-duplicates-test.js [moved from test/optimizer/remove-duplicates-test.js with 96% similarity]
test/optimizer/level-2/reorderable-test.js [moved from test/optimizer/reorderable-test.js with 96% similarity]
test/optimizer/level-2/restore-test.js [moved from test/properties/restore-test.js with 98% similarity]
test/optimizer/level-2/restructure-test.js [moved from test/optimizer/restructure-test.js with 99% similarity]
test/optimizer/level-2/rules-overlap-test.js [moved from test/optimizer/rules-overlap-test.js with 96% similarity]
test/optimizer/remove-unused-test.js [moved from test/properties/remove-unused-test.js with 91% similarity]
test/optimizer/restore-from-optimizing-test.js [moved from test/properties/restore-from-optimizing-test.js with 88% similarity]
test/optimizer/wrap-for-optimizing-test.js [moved from test/properties/wrap-for-optimizing-test.js with 99% similarity]

index ec6c491..6b1f7ad 100644 (file)
@@ -11,9 +11,10 @@ var url = require('url');
 var OptimizationLevel = require('./options/optimization-level').OptimizationLevel;
 var optimizationLevelFrom = require('./options/optimization-level').optimizationLevelFrom;
 
-var advancedOptimize = require('./optimizer/advanced');
-var basicOptimize = require('./optimizer/basic');
-var Validator = require('./properties/validator');
+var level0Optimize = require('./optimizer/level-0/optimize');
+var level1Optimize = require('./optimizer/level-1/optimize');
+var level2Optimize = require('./optimizer/level-2/optimize');
+var Validator = require('./optimizer/level-2/compacting/validator');
 
 var inputSourceMapTracker = require('./reader/input-source-map-tracker');
 var readSources = require('./reader/read-sources');
@@ -121,11 +122,12 @@ function runner(localOnly) {
 function optimize(tokens, context) {
   var optimized;
 
+  optimized = level0Optimize(tokens, context);
   optimized = OptimizationLevel.One in context.options.level ?
-    basicOptimize(tokens, context) :
+    level1Optimize(tokens, context) :
     tokens;
   optimized = OptimizationLevel.Two in context.options.level ?
-    advancedOptimize(tokens, context, true) :
+    level2Optimize(tokens, context, true) :
     optimized;
 
   return optimized;
diff --git a/lib/colors/rgb.js b/lib/colors/rgb.js
deleted file mode 100644 (file)
index 2f94548..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-function RGB(red, green, blue) {
-  this.red = red;
-  this.green = green;
-  this.blue = blue;
-}
-
-RGB.prototype.toHex = function () {
-  var red = Math.max(0, Math.min(~~this.red, 255));
-  var green = Math.max(0, Math.min(~~this.green, 255));
-  var blue = Math.max(0, Math.min(~~this.blue, 255));
-
-  // Credit: Asen  http://jsbin.com/UPUmaGOc/2/edit?js,console
-  return '#' + ('00000' + (red << 16 | green << 8 | blue).toString(16)).slice(-6);
-};
-
-module.exports = RGB;
similarity index 100%
rename from lib/properties/hack.js
rename to lib/optimizer/hack.js
diff --git a/lib/optimizer/level-0/optimize.js b/lib/optimizer/level-0/optimize.js
new file mode 100644 (file)
index 0000000..2a56f89
--- /dev/null
@@ -0,0 +1,6 @@
+function level0Optimize(tokens) {
+  // noop as level 0 means no optimizations!
+  return tokens;
+}
+
+module.exports = level0Optimize;
similarity index 94%
rename from lib/optimizer/basic.js
rename to lib/optimizer/level-1/optimize.js
index 1b49141..fb42d51 100644 (file)
@@ -1,28 +1,28 @@
+var shortenHex = require('./shorten-hex');
+var shortenHsl = require('./shorten-hsl');
+var shortenRgb = require('./shorten-rgb');
 var tidyRules = require('./tidy-rules');
 var tidyBlock = require('./tidy-block');
 var tidyAtRule = require('./tidy-at-rule');
-var split = require('../utils/split');
-var formatPosition = require('../utils/format-position');
 
-var Token = require('../tokenizer/token');
-var Marker = require('../tokenizer/marker');
+var Hack = require('../hack');
+var removeUnused = require('../remove-unused');
+var restoreFromOptimizing = require('../restore-from-optimizing');
+var wrapForOptimizing = require('../wrap-for-optimizing').all;
 
-var RGB = require('../colors/rgb');
-var HSL = require('../colors/hsl');
-var HexNameShortener = require('../colors/hex-name-shortener');
+var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
 
-var Hack = require('../properties/hack');
+var Token = require('../../tokenizer/token');
+var Marker = require('../../tokenizer/marker');
 
-var OptimizationLevel = require('../options/optimization-level').OptimizationLevel;
+var formatPosition = require('../../utils/format-position');
+var split = require('../../utils/split');
 
-var wrapForOptimizing = require('../properties/wrap-for-optimizing').all;
-var restoreFromOptimizing = require('../properties/restore-from-optimizing');
-var removeUnused = require('../properties/remove-unused');
-
-var DEFAULT_ROUNDING_PRECISION = require('../utils/rounding-precision').DEFAULT;
 var CHARSET_TOKEN = '@charset';
 var CHARSET_REGEXP = new RegExp('^' + CHARSET_TOKEN, 'i');
 
+var DEFAULT_ROUNDING_PRECISION = require('../../utils/rounding-precision').DEFAULT;
+
 var FONT_NUMERAL_WEIGHTS = ['100', '200', '300', '400', '500', '600', '700', '800', '900'];
 var FONT_NAME_WEIGHTS = ['normal', 'bold', 'bolder', 'lighter'];
 var FONT_NAME_WEIGHTS_WITHOUT_NORMAL = ['bold', 'bolder', 'lighter'];
@@ -157,15 +157,16 @@ function multipleZerosMinifier(property) {
 }
 
 function colorMininifier(name, value, compatibility) {
-  if (value.indexOf('#') === -1 && value.indexOf('rgb') == -1 && value.indexOf('hsl') == -1)
-    return HexNameShortener.shorten(value);
+  if (value.indexOf('#') === -1 && value.indexOf('rgb') == -1 && value.indexOf('hsl') == -1) {
+    return shortenHex(value);
+  }
 
   value = value
     .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/g, function (match, red, green, blue) {
-      return new RGB(red, green, blue).toHex();
+      return shortenRgb(red, green, blue);
     })
     .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/g, function (match, hue, saturation, lightness) {
-      return new HSL(hue, saturation, lightness).toHex();
+      return shortenHsl(hue, saturation, lightness);
     })
     .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color) {
       if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) {
@@ -202,7 +203,7 @@ function colorMininifier(name, value, compatibility) {
     });
   }
 
-  return HexNameShortener.shorten(value);
+  return shortenHex(value);
 }
 
 function pixelLengthMinifier(_, value, compatibility) {
@@ -449,7 +450,7 @@ function optimizeBody(properties, context) {
       minifyFont(property, options);
   }
 
-  restoreFromOptimizing(_properties, true);
+  restoreFromOptimizing(_properties);
   removeUnused(_properties);
 
   if (_properties.length != properties.length) {
@@ -558,7 +559,7 @@ function isImport(token) {
   return IMPORT_PREFIX_PATTERN.test(token[1]);
 }
 
-function basicOptimize(tokens, context) {
+function level1Optimize(tokens, context) {
   var options = context.options;
   var ie7Hack = options.compatibility.selectors.ie7Hack;
   var adjacentSpace = options.compatibility.selectors.adjacentSpace;
@@ -585,7 +586,7 @@ function basicOptimize(tokens, context) {
         break;
       case Token.BLOCK:
         token[1] = tidyBlock(token[1], spaceAfterClosingBrace);
-        basicOptimize(token[2], context);
+        level1Optimize(token[2], context);
         afterRules = true;
         break;
       case Token.COMMENT:
@@ -612,4 +613,4 @@ function basicOptimize(tokens, context) {
   return tokens;
 }
 
-module.exports = basicOptimize;
+module.exports = level1Optimize;
similarity index 94%
rename from lib/colors/hex-name-shortener.js
rename to lib/optimizer/level-1/shorten-hex.js
index 2af2f4e..3deea38 100644 (file)
@@ -1,5 +1,3 @@
-var HexNameShortener = {};
-
 var COLORS = {
   aliceblue: '#f0f8ff',
   antiquewhite: '#faebd7',
@@ -156,10 +154,12 @@ var toName = {};
 
 for (var name in COLORS) {
   var hex = COLORS[name];
-  if (name.length < hex.length)
+
+  if (name.length < hex.length) {
     toName[hex] = name;
-  else
+  } else {
     toHex[name] = hex;
+  }
 }
 
 var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig');
@@ -173,14 +173,17 @@ function nameConverter(match, colorValue, suffix) {
   return toName[colorValue.toLowerCase()] + suffix;
 }
 
-HexNameShortener.shorten = function (value) {
+function shortenHex(value) {
   var hasHex = value.indexOf('#') > -1;
   var shortened = value.replace(toHexPattern, hexConverter);
 
-  if (shortened != value)
+  if (shortened != value) {
     shortened = shortened.replace(toHexPattern, hexConverter);
+  }
 
-  return hasHex ? shortened.replace(toNamePattern, nameConverter) : shortened;
-};
+  return hasHex ?
+    shortened.replace(toNamePattern, nameConverter) :
+    shortened;
+}
 
-module.exports = HexNameShortener;
+module.exports = shortenHex;
similarity index 82%
rename from lib/colors/hsl.js
rename to lib/optimizer/level-1/shorten-hsl.js
index 5c76b6e..fe98dfd 100644 (file)
@@ -1,12 +1,6 @@
 // HSL to RGB converter. Both methods adapted from:
 // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
 
-function HSLColor(hue, saturation, lightness) {
-  this.hue = hue;
-  this.saturation = saturation;
-  this.lightness = lightness;
-}
-
 function hslToRgb(h, s, l) {
   var r, g, b;
 
@@ -52,8 +46,8 @@ function hueToRgb(p, q, t) {
   return p;
 }
 
-HSLColor.prototype.toHex = function () {
-  var asRgb = hslToRgb(this.hue, this.saturation, this.lightness);
+function shortenHsl(hue, saturation, lightness) {
+  var asRgb = hslToRgb(hue, saturation, lightness);
   var redAsHex = asRgb[0].toString(16);
   var greenAsHex = asRgb[1].toString(16);
   var blueAsHex = asRgb[2].toString(16);
@@ -62,6 +56,6 @@ HSLColor.prototype.toHex = function () {
     ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
     ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
     ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
-};
+}
 
-module.exports = HSLColor;
+module.exports = shortenHsl;
diff --git a/lib/optimizer/level-1/shorten-rgb.js b/lib/optimizer/level-1/shorten-rgb.js
new file mode 100644 (file)
index 0000000..3c0a5fa
--- /dev/null
@@ -0,0 +1,10 @@
+function shortenRgb(red, green, blue) {
+  var normalizedRed = Math.max(0, Math.min(parseInt(red), 255));
+  var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255));
+  var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255));
+
+  // Credit: Asen  http://jsbin.com/UPUmaGOc/2/edit?js,console
+  return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6);
+}
+
+module.exports = shortenRgb;
similarity index 98%
rename from lib/optimizer/tidy-rules.js
rename to lib/optimizer/level-1/tidy-rules.js
index 9b6c725..84e9dc3 100644 (file)
@@ -1,5 +1,5 @@
-var Marker = require('../tokenizer/marker');
-var formatPosition = require('../utils/format-position');
+var Marker = require('../../tokenizer/marker');
+var formatPosition = require('../../utils/format-position');
 
 var HTML_COMMENT_PATTERN = /^(?:(?:<!--|-->)\s*)+/;
 var RELATION_PATTERN = /[>\+~]/;
similarity index 98%
rename from lib/properties/break-up.js
rename to lib/optimizer/level-2/break-up.js
index 66a342a..6e6f577 100644 (file)
@@ -1,8 +1,10 @@
-var wrapSingle = require('./wrap-for-optimizing').single;
 var InvalidPropertyError = require('./invalid-property-error');
 
-var Token = require('../tokenizer/token');
-var formatPosition = require('../utils/format-position');
+var wrapSingle = require('../wrap-for-optimizing').single;
+
+var Token = require('../../tokenizer/token');
+
+var formatPosition = require('../../utils/format-position');
 
 var MULTIPLEX_SEPARATOR = ',';
 
similarity index 86%
rename from lib/properties/clone.js
rename to lib/optimizer/level-2/clone.js
index 05c1b17..3830095 100644 (file)
@@ -1,5 +1,6 @@
-var wrapSingle = require('./wrap-for-optimizing').single;
-var Token = require('../tokenizer/token');
+var wrapSingle = require('../wrap-for-optimizing').single;
+
+var Token = require('../../tokenizer/token');
 
 function deep(property) {
   var cloned = shallow(property);
similarity index 87%
rename from lib/properties/every-combination.js
rename to lib/optimizer/level-2/compacting/every-combination.js
index 71a1c0e..af3efc4 100644 (file)
@@ -1,6 +1,6 @@
-var shallowClone = require('./clone').shallow;
+var shallowClone = require('../clone').shallow;
 
-var Marker = require('../tokenizer/marker');
+var Marker = require('../../../tokenizer/marker');
 
 function everyCombination(fn, left, right, validator) {
   var samePositon = !left.shorthand && !right.shorthand && !left.multiplex && !right.multiplex;
similarity index 91%
rename from lib/properties/optimizer.js
rename to lib/optimizer/level-2/compacting/optimize.js
index 4d84365..33a7118 100644 (file)
@@ -1,13 +1,17 @@
-var compactable = require('./compactable');
-var wrapForOptimizing = require('./wrap-for-optimizing').all;
 var populateComponents = require('./populate-components');
 var compactOverrides = require('./override-compactor');
 var compactShorthands = require('./shorthand-compactor');
-var removeUnused = require('./remove-unused');
-var restoreFromOptimizing = require('./restore-from-optimizing');
-var serializeProperty = require('../writer/one-time').property;
 
-var OptimizationLevel = require('../options/optimization-level').OptimizationLevel;
+var compactable = require('../compactable');
+var restoreWithComponents = require('../restore-with-components');
+
+var wrapForOptimizing = require('../../wrap-for-optimizing').all;
+var removeUnused = require('../../remove-unused');
+var restoreFromOptimizing = require('../../restore-from-optimizing');
+
+var OptimizationLevel = require('../../../options/optimization-level').OptimizationLevel;
+
+var serializeProperty = require('../../../writer/one-time').property;
 
 var shorthands = {
   'animation-delay': ['animation'],
@@ -191,7 +195,7 @@ function _optimize(properties, mergeAdjacent, aggressiveMerging, validator) {
   }
 }
 
-function optimize(selector, properties, mergeAdjacent, withCompacting, context) {
+function compactorOptimize(selector, properties, mergeAdjacent, withCompacting, context) {
   var validator = context.validator;
   var warnings = context.warnings;
 
@@ -202,7 +206,7 @@ function optimize(selector, properties, mergeAdjacent, withCompacting, context)
   for (var i = 0, l = _properties.length; i < l; i++) {
     var _property = _properties[i];
     if (_property.block) {
-      optimize(selector, _property.value[0][1], mergeAdjacent, withCompacting, context);
+      compactorOptimize(selector, _property.value[0][1], mergeAdjacent, withCompacting, context);
     }
   }
 
@@ -211,8 +215,8 @@ function optimize(selector, properties, mergeAdjacent, withCompacting, context)
     compactShorthands(_properties, validator);
   }
 
-  restoreFromOptimizing(_properties);
+  restoreFromOptimizing(_properties, restoreWithComponents);
   removeUnused(_properties);
 }
 
-module.exports = optimize;
+module.exports = compactorOptimize;
@@ -1,16 +1,19 @@
-var canOverride = require('./can-override');
-var compactable = require('./compactable');
-var deepClone = require('./clone').deep;
-var shallowClone = require('./clone').shallow;
 var hasInherit = require('./has-inherit');
-var restoreFromOptimizing = require('./restore-from-optimizing');
 var everyCombination = require('./every-combination');
 var sameVendorPrefixesIn = require('./vendor-prefixes').same;
 
-var serializeProperty = require('../writer/one-time').property;
+var canOverride = require('../can-override');
+var compactable = require('../compactable');
+var deepClone = require('../clone').deep;
+var restoreWithComponents = require('../restore-with-components');
+var shallowClone = require('../clone').shallow;
 
-var Token = require('../tokenizer/token');
-var Marker = require('../tokenizer/marker');
+var restoreFromOptimizing = require('../../restore-from-optimizing', restoreWithComponents);
+
+var Token = require('../../../tokenizer/token');
+var Marker = require('../../../tokenizer/marker');
+
+var serializeProperty = require('../../../writer/one-time').property;
 
 // Used when searching for a component that matches property
 function nameMatchFilter(to) {
@@ -156,10 +159,10 @@ function wouldResultInLongerValue(left, right) {
   var component;
 
   var multiplexClone = deepClone(multiplex);
-  restoreFromOptimizing([multiplexClone]);
+  restoreFromOptimizing([multiplexClone], restoreWithComponents);
 
   var simpleClone = deepClone(simple);
-  restoreFromOptimizing([simpleClone]);
+  restoreFromOptimizing([simpleClone], restoreWithComponents);
 
   var lengthBefore = lengthOf(multiplexClone) + 1 + lengthOf(simpleClone);
 
@@ -172,7 +175,7 @@ function wouldResultInLongerValue(left, right) {
     overrideByMultiplex(component, multiplexClone);
   }
 
-  restoreFromOptimizing([simpleClone]);
+  restoreFromOptimizing([simpleClone], restoreWithComponents);
 
   var lengthAfter = lengthOf(simpleClone);
 
@@ -1,5 +1,5 @@
-var compactable = require('./compactable');
-var InvalidPropertyError = require('./invalid-property-error');
+var compactable = require('../compactable');
+var InvalidPropertyError = require('../invalid-property-error');
 
 function populateComponents(properties, validator, warnings) {
   for (var i = properties.length - 1; i >= 0; i--) {
@@ -1,11 +1,13 @@
-var compactable = require('./compactable');
-var deepClone = require('./clone').deep;
+var everyCombination = require('./every-combination');
 var hasInherit = require('./has-inherit');
 var populateComponents = require('./populate-components');
-var wrapSingle = require('./wrap-for-optimizing').single;
-var everyCombination = require('./every-combination');
 
-var Token = require('../tokenizer/token');
+var compactable = require('../compactable');
+var deepClone = require('../clone').deep;
+
+var wrapSingle = require('../../wrap-for-optimizing').single;
+
+var Token = require('../../../tokenizer/token');
 
 function mixedImportance(components) {
   var important;
similarity index 91%
rename from lib/optimizer/extract-properties.js
rename to lib/optimizer/level-2/extract-properties.js
index 3a937a9..2df2667 100644 (file)
@@ -2,9 +2,9 @@
 // IMPORTANT: Mind Token class and this code is not related!
 // Properties will be tokenized in one step, see #429
 
-var serializeRules = require('../writer/one-time').rules;
-var serializeValue = require('../writer/one-time').value;
-var Token = require('../tokenizer/token');
+var Token = require('../../tokenizer/token');
+var serializeRules = require('../../writer/one-time').rules;
+var serializeValue = require('../../writer/one-time').value;
 
 function extractProperties(token) {
   var properties = [];
similarity index 98%
rename from lib/optimizer/is-mergeable.js
rename to lib/optimizer/level-2/is-mergeable.js
index 11b26e2..bbd4c43 100644 (file)
@@ -1,5 +1,5 @@
-var Marker = require('../tokenizer/marker');
-var split = require('../utils/split');
+var Marker = require('../../tokenizer/marker');
+var split = require('../../utils/split');
 
 var DEEP_SELECTOR_PATTERN = /\/deep\//;
 var DOUBLE_COLON_PATTERN = /^::/;
similarity index 78%
rename from lib/optimizer/merge-adjacent.js
rename to lib/optimizer/level-2/merge-adjacent.js
index e2e0702..4674328 100644 (file)
@@ -1,11 +1,13 @@
-var optimizeProperties = require('../properties/optimizer');
-
-var serializeBody = require('../writer/one-time').body;
-var serializeRules = require('../writer/one-time').rules;
-var tidyRules = require('./tidy-rules');
 var isMergeable = require('./is-mergeable');
 
-var Token = require('../tokenizer/token');
+var compactorOptimize = require('./compacting/optimize');
+
+var tidyRules = require('../level-1/tidy-rules');
+
+var serializeBody = require('../../writer/one-time').body;
+var serializeRules = require('../../writer/one-time').rules;
+
+var Token = require('../../tokenizer/token');
 
 function mergeAdjacent(tokens, context) {
   var lastToken = [null, [], []];
@@ -25,7 +27,7 @@ function mergeAdjacent(tokens, context) {
     if (lastToken[0] == Token.RULE && serializeRules(token[1]) == serializeRules(lastToken[1])) {
       var joinAt = [lastToken[2].length];
       Array.prototype.push.apply(lastToken[2], token[2]);
-      optimizeProperties(token[1], lastToken[2], joinAt, true, context);
+      compactorOptimize(token[1], lastToken[2], joinAt, true, context);
       token[2] = [];
     } else if (lastToken[0] == Token.RULE && serializeBody(token[2]) == serializeBody(lastToken[2]) &&
         isMergeable(serializeRules(token[1]), mergeablePseudoClasses, mergeablePseudoElements) &&
similarity index 93%
rename from lib/optimizer/merge-media-queries.js
rename to lib/optimizer/level-2/merge-media-queries.js
index 7d0f3b7..f508876 100644 (file)
@@ -3,9 +3,9 @@ var canReorderSingle = require('./reorderable').canReorderSingle;
 var extractProperties = require('./extract-properties');
 var rulesOverlap = require('./rules-overlap');
 
-var serializeRules = require('../writer/one-time').rules;
-var OptimizationLevel = require('../options/optimization-level').OptimizationLevel;
-var Token = require('../tokenizer/token');
+var serializeRules = require('../../writer/one-time').rules;
+var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
+var Token = require('../../tokenizer/token');
 
 function mergeMediaQueries(tokens, context) {
   var semanticMerging = context.options.level[OptimizationLevel.Two].semanticMerging;
@@ -1,10 +1,13 @@
-var serializeBody = require('../writer/one-time').body;
-var serializeRules = require('../writer/one-time').rules;
-var tidyRules = require('./tidy-rules');
 var isMergeable = require('./is-mergeable');
 
-var OptimizationLevel = require('../options/optimization-level').OptimizationLevel;
-var Token = require('../tokenizer/token');
+var tidyRules = require('../level-1/tidy-rules');
+
+var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
+
+var serializeBody = require('../../writer/one-time').body;
+var serializeRules = require('../../writer/one-time').rules;
+
+var Token = require('../../tokenizer/token');
 
 function unsafeSelector(value) {
   return /\.|\*| :/.test(value);
@@ -1,9 +1,11 @@
-var optimizeProperties = require('../properties/optimizer');
-var serializeRules = require('../writer/one-time').rules;
-var extractProperties = require('./extract-properties');
 var canReorder = require('./reorderable').canReorder;
+var extractProperties = require('./extract-properties');
+
+var compactorOptimize = require('./compacting/optimize');
+
+var serializeRules = require('../../writer/one-time').rules;
 
-var Token = require('../tokenizer/token');
+var Token = require('../../tokenizer/token');
 
 function mergeNonAdjacentBySelector(tokens, context) {
   var allSelectors = {};
@@ -68,7 +70,7 @@ function mergeNonAdjacentBySelector(tokens, context) {
           Array.prototype.push.apply(target[2], moved[2]);
         }
 
-        optimizeProperties(target[1], target[2], joinAt, true, context);
+        compactorOptimize(target[1], target[2], joinAt, true, context);
         moved[2] = [];
       }
     }
similarity index 84%
rename from lib/optimizer/advanced.js
rename to lib/optimizer/level-2/optimize.js
index 022e889..77ce1c9 100644 (file)
@@ -1,17 +1,18 @@
-var optimizeProperties = require('../properties/optimizer');
-
-var removeDuplicates = require('./remove-duplicates');
 var mergeAdjacent = require('./merge-adjacent');
-var reduceNonAdjacent = require('./reduce-non-adjacent');
-var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
+var mergeMediaQueries = require('./merge-media-queries');
 var mergeNonAdjacentByBody = require('./merge-non-adjacent-by-body');
-var restructure = require('./restructure');
+var mergeNonAdjacentBySelector = require('./merge-non-adjacent-by-selector');
+var reduceNonAdjacent = require('./reduce-non-adjacent');
 var removeDuplicateFontAtRules = require('./remove-duplicate-font-at-rules');
 var removeDuplicateMediaQueries = require('./remove-duplicate-media-queries');
-var mergeMediaQueries = require('./merge-media-queries');
+var removeDuplicates = require('./remove-duplicates');
+var restructure = require('./restructure');
+
+var compactorOptimize = require('./compacting/optimize');
+
+var OptimizationLevel = require('../../options/optimization-level').OptimizationLevel;
 
-var OptimizationLevel = require('../options/optimization-level').OptimizationLevel;
-var Token = require('../tokenizer/token');
+var Token = require('../../tokenizer/token');
 
 function removeEmpty(tokens) {
   for (var i = 0, l = tokens.length; i < l; i++) {
@@ -44,7 +45,7 @@ function recursivelyOptimizeBlocks(tokens, context) {
 
     if (token[0] == Token.BLOCK) {
       var isKeyframes = /@(-moz-|-o-|-webkit-)?keyframes/.test(token[1][0][1]);
-      optimize(token[2], context, !isKeyframes);
+      level2Optimize(token[2], context, !isKeyframes);
     }
   }
 }
@@ -55,7 +56,7 @@ function recursivelyOptimizeProperties(tokens, context) {
 
     switch (token[0]) {
       case Token.RULE:
-        optimizeProperties(token[1], token[2], false, true, context);
+        compactorOptimize(token[1], token[2], false, true, context);
         break;
       case Token.BLOCK:
         recursivelyOptimizeProperties(token[2], context);
@@ -63,7 +64,7 @@ function recursivelyOptimizeProperties(tokens, context) {
   }
 }
 
-function optimize(tokens, context, withRestructuring) {
+function level2Optimize(tokens, context, withRestructuring) {
   recursivelyOptimizeBlocks(tokens, context);
   recursivelyOptimizeProperties(tokens, context);
 
@@ -85,7 +86,7 @@ function optimize(tokens, context, withRestructuring) {
     removeDuplicateMediaQueries(tokens, context);
     var reduced = mergeMediaQueries(tokens, context);
     for (var i = reduced.length - 1; i >= 0; i--) {
-      optimize(reduced[i][2], context, false);
+      level2Optimize(reduced[i][2], context, false);
     }
   }
 
@@ -94,4 +95,4 @@ function optimize(tokens, context, withRestructuring) {
   return tokens;
 }
 
-module.exports = optimize;
+module.exports = level2Optimize;
similarity index 93%
rename from lib/optimizer/reduce-non-adjacent.js
rename to lib/optimizer/level-2/reduce-non-adjacent.js
index f4be6d0..b70022e 100644 (file)
@@ -1,10 +1,13 @@
-var optimizeProperties = require('../properties/optimizer');
-var serializeBody = require('../writer/one-time').body;
-var serializeRules = require('../writer/one-time').rules;
 var isMergeable = require('./is-mergeable');
-var cloneArray = require('../utils/clone-array');
 
-var Token = require('../tokenizer/token');
+var compactorOptimize = require('./compacting/optimize');
+
+var cloneArray = require('../../utils/clone-array');
+
+var Token = require('../../tokenizer/token');
+
+var serializeBody = require('../../writer/one-time').body;
+var serializeRules = require('../../writer/one-time').rules;
 
 function reduceNonAdjacent(tokens, context) {
   var options = context.options;
@@ -159,7 +162,7 @@ function reduceSelector(tokens, selector, data, context, options, outerContext)
       joinsAt.push((joinsAt.length > 0 ? joinsAt[joinsAt.length - 1] : 0) + bodiesAsList[j].length);
   }
 
-  optimizeProperties(selector, bodies, joinsAt, false, outerContext);
+  compactorOptimize(selector, bodies, joinsAt, false, outerContext);
 
   var processedCount = processedTokens.length;
   var propertyIdx = bodies.length - 1;
@@ -1,6 +1,6 @@
-var serializeAll = require('../writer/one-time').all;
+var Token = require('../../tokenizer/token');
 
-var Token = require('../tokenizer/token');
+var serializeAll = require('../../writer/one-time').all;
 
 var FONT_FACE_SCOPE = '@font-face';
 
@@ -1,7 +1,7 @@
-var serializeAll = require('../writer/one-time').all;
-var serializeRules = require('../writer/one-time').rules;
+var Token = require('../../tokenizer/token');
 
-var Token = require('../tokenizer/token');
+var serializeAll = require('../../writer/one-time').all;
+var serializeRules = require('../../writer/one-time').rules;
 
 function removeDuplicateMediaQueries(tokens) {
   var candidates = {};
similarity index 83%
rename from lib/optimizer/remove-duplicates.js
rename to lib/optimizer/level-2/remove-duplicates.js
index fb77747..9aa6ace 100644 (file)
@@ -1,7 +1,7 @@
-var serializeBody = require('../writer/one-time').body;
-var serializeRules = require('../writer/one-time').rules;
+var Token = require('../../tokenizer/token');
 
-var Token = require('../tokenizer/token');
+var serializeBody = require('../../writer/one-time').body;
+var serializeRules = require('../../writer/one-time').rules;
 
 function removeDuplicates(tokens) {
   var matched = {};
diff --git a/lib/optimizer/level-2/restore-with-components.js b/lib/optimizer/level-2/restore-with-components.js
new file mode 100644 (file)
index 0000000..caf7c4c
--- /dev/null
@@ -0,0 +1,13 @@
+var compactable = require('./compactable');
+
+function restoreWithComponents(property) {
+  var descriptor = compactable[property.name];
+
+  if (descriptor && descriptor.shorthand) {
+    return descriptor.restore(property, compactable);
+  } else {
+    return property.value;
+  }
+}
+
+module.exports = restoreWithComponents;
similarity index 98%
rename from lib/properties/restore.js
rename to lib/optimizer/level-2/restore.js
index a770f74..149688c 100644 (file)
@@ -1,6 +1,7 @@
 var shallowClone = require('./clone').shallow;
-var Token = require('../tokenizer/token');
-var Marker = require('../tokenizer/marker');
+
+var Token = require('../../tokenizer/token');
+var Marker = require('../../tokenizer/marker');
 
 function isInheritOnly(values) {
   for (var i = 0, l = values.length; i < l; i++) {
similarity index 98%
rename from lib/optimizer/restructure.js
rename to lib/optimizer/level-2/restructure.js
index ba6cb4a..7ecc434 100644 (file)
@@ -1,12 +1,14 @@
-var extractProperties = require('./extract-properties');
 var canReorderSingle = require('./reorderable').canReorderSingle;
-var serializeBody = require('../writer/one-time').body;
-var serializeRules = require('../writer/one-time').rules;
-var tidyRuleDuplicates = require('./tidy-rule-duplicates');
+var extractProperties = require('./extract-properties');
 var isMergeable = require('./is-mergeable');
-var cloneArray = require('../utils/clone-array');
+var tidyRuleDuplicates = require('./tidy-rule-duplicates');
+
+var Token = require('../../tokenizer/token');
+
+var cloneArray = require('../../utils/clone-array');
 
-var Token = require('../tokenizer/token');
+var serializeBody = require('../../writer/one-time').body;
+var serializeRules = require('../../writer/one-time').rules;
 
 function naturalSorter(a, b) {
   return a > b ? 1 : -1;
similarity index 84%
rename from lib/properties/restore-from-optimizing.js
rename to lib/optimizer/restore-from-optimizing.js
index 02424dc..73160c8 100644 (file)
@@ -1,6 +1,6 @@
 var Hack = require('./hack');
+
 var Marker = require('../tokenizer/marker');
-var compactable = require('./compactable');
 
 var BACKSLASH_HACK = '\\9';
 var IMPORTANT_TOKEN = '!important';
@@ -8,16 +8,14 @@ var STAR_HACK = '*';
 var UNDERSCORE_HACK = '_';
 var BANG_HACK = '!ie';
 
-function restoreFromOptimizing(properties, simpleMode) {
+function restoreFromOptimizing(properties, restoreCallback) {
   var property;
-  var descriptor;
   var restored;
   var current;
   var i;
 
   for (i = properties.length - 1; i >= 0; i--) {
     property = properties[i];
-    descriptor = compactable[property.name];
 
     if (property.unused) {
       continue;
@@ -27,8 +25,8 @@ function restoreFromOptimizing(properties, simpleMode) {
       continue;
     }
 
-    if (!simpleMode && descriptor && descriptor.shorthand) {
-      restored = descriptor.restore(property, compactable);
+    if (restoreCallback) {
+      restored = restoreCallback(property);
       property.value = restored;
     } else {
       restored = property.value;
similarity index 99%
rename from lib/properties/wrap-for-optimizing.js
rename to lib/optimizer/wrap-for-optimizing.js
index 2b9e1ca..09dd568 100644 (file)
@@ -1,4 +1,5 @@
 var Hack = require('./hack');
+
 var Marker = require('../tokenizer/marker');
 var Token = require('../tokenizer/token');
 
similarity index 99%
rename from test/optimizer/basic-test.js
rename to test/optimizer/level-1/basic-test.js
index bf6b79a..0995ca6 100644 (file)
@@ -1,6 +1,6 @@
 var vows = require('vows');
 
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('simple optimizations')
   .addBatch(
similarity index 96%
rename from test/colors/hex-name-shortener-test.js
rename to test/optimizer/level-1/shorten-hex-test.js
index e5cab0b..80efbdb 100644 (file)
@@ -1,6 +1,8 @@
-var vows = require('vows');
 var assert = require('assert');
-var HexNameShortener = require('../../lib/colors/hex-name-shortener');
+
+var vows = require('vows');
+
+var shortenHex = require('../../../lib/optimizer/level-1/shorten-hex');
 
 var COLORS = {
   aliceblue: '#f0f8ff',
@@ -158,7 +160,7 @@ function colorShorteningContext() {
 
   function shortened(target) {
     return function (source) {
-      assert.equal(HexNameShortener.shorten(source), target);
+      assert.equal(shortenHex(source), target);
     };
   }
 
@@ -186,6 +188,6 @@ function colorShorteningContext() {
   return context;
 }
 
-vows.describe(HexNameShortener)
+vows.describe(shortenHex)
   .addBatch(colorShorteningContext())
   .export(module);
similarity index 99%
rename from test/properties/break-up-test.js
rename to test/optimizer/level-2/break-up-test.js
index 86335e5..885aef6 100644 (file)
@@ -1,12 +1,12 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
 
-var wrapForOptimizing = require('../../lib/properties/wrap-for-optimizing').all;
-var populateComponents = require('../../lib/properties/populate-components');
-var Validator = require('../../lib/properties/validator');
-var compatibility = require('../../lib/utils/compatibility');
+var wrapForOptimizing = require('../../../lib/optimizer/wrap-for-optimizing').all;
+var populateComponents = require('../../../lib/optimizer/level-2/compacting/populate-components');
+var Validator = require('../../../lib/optimizer/level-2/compacting/validator');
+var compatibility = require('../../../lib/utils/compatibility');
 
-var breakUp = require('../../lib/properties/break-up');
+var breakUp = require('../../../lib/optimizer/level-2/break-up');
 
 function _breakUp(properties) {
   var validator = new Validator(compatibility());
@@ -1,12 +1,12 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
 
-var optimize = require('../../lib/properties/optimizer');
+var optimize = require('../../../../lib/optimizer/level-2/compacting/optimize');
 
-var tokenize = require('../../lib/tokenizer/tokenize');
-var inputSourceMapTracker = require('../../lib/reader/input-source-map-tracker');
-var compatibility = require('../../lib/utils/compatibility');
-var Validator = require('../../lib/properties/validator');
+var tokenize = require('../../../../lib/tokenizer/tokenize');
+var inputSourceMapTracker = require('../../../../lib/reader/input-source-map-tracker');
+var compatibility = require('../../../../lib/utils/compatibility');
+var Validator = require('../../../../lib/optimizer/level-2/compacting/validator');
 
 function _optimize(source) {
   var tokens = tokenize(source, {
similarity index 98%
rename from test/properties/optimizer-test.js
rename to test/optimizer/level-2/compacting/optimize-test.js
index d657fea..cc3d42c 100644 (file)
@@ -1,12 +1,12 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
 
-var optimize = require('../../lib/properties/optimizer');
+var optimize = require('../../../../lib/optimizer/level-2/compacting/optimize');
 
-var tokenize = require('../../lib/tokenizer/tokenize');
-var inputSourceMapTracker = require('../../lib/reader/input-source-map-tracker');
-var compatibility = require('../../lib/utils/compatibility');
-var Validator = require('../../lib/properties/validator');
+var tokenize = require('../../../../lib/tokenizer/tokenize');
+var inputSourceMapTracker = require('../../../../lib/reader/input-source-map-tracker');
+var compatibility = require('../../../../lib/utils/compatibility');
+var Validator = require('../../../../lib/optimizer/level-2/compacting/validator');
 
 function _optimize(source, mergeAdjacent, aggressiveMerging, compatibilityOptions) {
   var compat = compatibility(compatibilityOptions);
@@ -1,12 +1,12 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
 
-var optimize = require('../../lib/properties/optimizer');
+var optimize = require('../../../../lib/optimizer/level-2/compacting/optimize');
 
-var tokenize = require('../../lib/tokenizer/tokenize');
-var inputSourceMapTracker = require('../../lib/reader/input-source-map-tracker');
-var compatibility = require('../../lib/utils/compatibility');
-var Validator = require('../../lib/properties/validator');
+var tokenize = require('../../../../lib/tokenizer/tokenize');
+var inputSourceMapTracker = require('../../../../lib/reader/input-source-map-tracker');
+var compatibility = require('../../../../lib/utils/compatibility');
+var Validator = require('../../../../lib/optimizer/level-2/compacting/validator');
 
 function _optimize(source, compat, aggressiveMerging) {
   var tokens = tokenize(source, {
@@ -1,8 +1,9 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
+
+var wrapForOptimizing = require('../../../../lib/optimizer/wrap-for-optimizing').all;
 
-var wrapForOptimizing = require('../../lib/properties/wrap-for-optimizing').all;
-var populateComponents = require('../../lib/properties/populate-components');
+var populateComponents = require('../../../../lib/optimizer/level-2/compacting/populate-components');
 
 vows.describe(populateComponents)
   .addBatch({
@@ -1,12 +1,12 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
 
-var optimize = require('../../lib/properties/optimizer');
+var optimize = require('../../../../lib/optimizer/level-2/compacting/optimize');
 
-var tokenize = require('../../lib/tokenizer/tokenize');
-var inputSourceMapTracker = require('../../lib/reader/input-source-map-tracker');
-var compatibility = require('../../lib/utils/compatibility');
-var Validator = require('../../lib/properties/validator');
+var tokenize = require('../../../../lib/tokenizer/tokenize');
+var inputSourceMapTracker = require('../../../../lib/reader/input-source-map-tracker');
+var compatibility = require('../../../../lib/utils/compatibility');
+var Validator = require('../../../../lib/optimizer/level-2/compacting/validator');
 
 function _optimize(source) {
   var tokens = tokenize(source, {
@@ -1,8 +1,10 @@
-var vows = require('vows');
 var assert = require('assert');
-var tokenize = require('../../lib/tokenizer/tokenize');
-var inputSourceMapTracker = require('../../lib/reader/input-source-map-tracker');
-var extractProperties = require('../../lib/optimizer/extract-properties');
+var vows = require('vows');
+
+var extractProperties = require('../../../lib/optimizer/level-2/extract-properties');
+
+var tokenize = require('../../../lib/tokenizer/tokenize');
+var inputSourceMapTracker = require('../../../lib/reader/input-source-map-tracker');
 
 function _tokenize(source) {
   return tokenize(source, {
similarity index 98%
rename from test/optimizer/is-mergeable-test.js
rename to test/optimizer/level-2/is-mergeable-test.js
index 0ec17eb..dfe9b52 100644 (file)
@@ -2,7 +2,8 @@ var assert = require('assert');
 
 var vows = require('vows');
 
-var isMergeable = require('../../lib/optimizer/is-mergeable');
+var isMergeable = require('../../../lib/optimizer/level-2/is-mergeable');
+
 var mergeablePseudoClasses = [':after'];
 var mergeablePseudoElements = ['::before'];
 
similarity index 98%
rename from test/optimizer/merge-adjacent-test.js
rename to test/optimizer/level-2/merge-adjacent-test.js
index 8f3c6a2..87c1ee1 100644 (file)
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('remove duplicates')
   .addBatch(
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('merge media queries')
   .addBatch(
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('merge non djacent by body')
   .addBatch(
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('merge non djacent by selector')
   .addBatch(
similarity index 98%
rename from test/optimizer/advanced-test.js
rename to test/optimizer/level-2/optimize-test.js
index bc1f7ad..b49298e 100644 (file)
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('level 2 optimizer')
   .addBatch(
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('remove duplicates')
   .addBatch(
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('remove duplicate @font-face at-rules')
   .addBatch(
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('remove duplicate media queries')
   .addBatch(
similarity index 96%
rename from test/optimizer/remove-duplicates-test.js
rename to test/optimizer/level-2/remove-duplicates-test.js
index 19879dc..cd3c42b 100644 (file)
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('remove duplicates')
   .addBatch(
similarity index 96%
rename from test/optimizer/reorderable-test.js
rename to test/optimizer/level-2/reorderable-test.js
index 8b7a8e5..ce9ce9f 100644 (file)
@@ -1,11 +1,13 @@
-var vows = require('vows');
 var assert = require('assert');
+var vows = require('vows');
+
+var canReorder = require('../../../lib/optimizer/level-2/reorderable').canReorder;
+
+var extractProperties = require('../../../lib/optimizer/level-2/extract-properties');
+var canReorderSingle = require('../../../lib/optimizer/level-2/reorderable').canReorderSingle;
 
-var tokenize = require('../../lib/tokenizer/tokenize');
-var inputSourceMapTracker = require('../../lib/reader/input-source-map-tracker');
-var extractProperties = require('../../lib/optimizer/extract-properties');
-var canReorder = require('../../lib/optimizer/reorderable').canReorder;
-var canReorderSingle = require('../../lib/optimizer/reorderable').canReorderSingle;
+var tokenize = require('../../../lib/tokenizer/tokenize');
+var inputSourceMapTracker = require('../../../lib/reader/input-source-map-tracker');
 
 function propertiesIn(source) {
   return extractProperties(
similarity index 98%
rename from test/properties/restore-test.js
rename to test/optimizer/level-2/restore-test.js
index bf2e8c1..c21f0c5 100644 (file)
@@ -1,12 +1,12 @@
 var vows = require('vows');
 var assert = require('assert');
 
-var wrapForOptimizing = require('../../lib/properties/wrap-for-optimizing').single;
-var compactable = require('../../lib/properties/compactable');
-var compatibility = require('../../lib/utils/compatibility');
-var Validator = require('../../lib/properties/validator');
+var wrapForOptimizing = require('../../../lib/optimizer/wrap-for-optimizing').single;
+var compactable = require('../../../lib/optimizer/level-2/compactable');
+var compatibility = require('../../../lib/utils/compatibility');
+var Validator = require('../../../lib/optimizer/level-2/compacting/validator');
 
-var restore = require('../../lib/properties/restore');
+var restore = require('../../../lib/optimizer/level-2/restore');
 
 function _breakUp(property) {
   var validator = new Validator(compatibility());
similarity index 99%
rename from test/optimizer/restructure-test.js
rename to test/optimizer/level-2/restructure-test.js
index 95300c5..0d20b33 100644 (file)
@@ -1,5 +1,5 @@
 var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
 
 vows.describe('restructure')
   .addBatch(
similarity index 96%
rename from test/optimizer/rules-overlap-test.js
rename to test/optimizer/level-2/rules-overlap-test.js
index 50b1be3..918c595 100644 (file)
@@ -2,7 +2,7 @@ var assert = require('assert');
 
 var vows = require('vows');
 
-var rulesOverlap = require('../../lib/optimizer/rules-overlap');
+var rulesOverlap = require('../../../lib/optimizer/level-2/rules-overlap');
 
 vows.describe(rulesOverlap)
   .addBatch({
similarity index 91%
rename from test/properties/remove-unused-test.js
rename to test/optimizer/remove-unused-test.js
index ec59385..6e91e27 100644 (file)
@@ -1,8 +1,8 @@
 var vows = require('vows');
 var assert = require('assert');
 
-var removeUnused = require('../../lib/properties/remove-unused');
-var wrapForOptimizing = require('../../lib/properties/wrap-for-optimizing').all;
+var removeUnused = require('../../lib/optimizer/remove-unused');
+var wrapForOptimizing = require('../../lib/optimizer/wrap-for-optimizing').all;
 
 vows.describe(removeUnused)
   .addBatch({
@@ -1,14 +1,16 @@
 var vows = require('vows');
 var assert = require('assert');
 
-var wrapForOptimizing = require('../../lib/properties/wrap-for-optimizing').all;
-var populateComponents = require('../../lib/properties/populate-components');
-var shallowClone = require('../../lib/properties/clone').shallow;
+var restoreFromOptimizing = require('../../lib/optimizer/restore-from-optimizing');
+var wrapForOptimizing = require('../../lib/optimizer/wrap-for-optimizing').all;
 
-var restoreFromOptimizing = require('../../lib/properties/restore-from-optimizing');
+var shallowClone = require('../../lib/optimizer/level-2/clone').shallow;
+var restoreWithComponents = require('../../lib/optimizer/level-2/restore-with-components');
+
+var populateComponents = require('../../lib/optimizer/level-2/compacting/populate-components');
+var Validator = require('../../lib/optimizer/level-2/compacting/validator');
 
 var compatibility = require('../../lib/utils/compatibility');
-var Validator = require('../../lib/properties/validator');
 
 var validator = new Validator(compatibility());
 
@@ -138,7 +140,7 @@ vows.describe(restoreFromOptimizing)
 
         wrapped[0].dirty = true;
 
-        restoreFromOptimizing(wrapped, true);
+        restoreFromOptimizing(wrapped);
         return properties;
       },
       'is same as source': function (properties) {
@@ -167,7 +169,7 @@ vows.describe(restoreFromOptimizing)
         wrapped[0].value = [];
         wrapped[0].dirty = true;
 
-        restoreFromOptimizing(wrapped);
+        restoreFromOptimizing(wrapped, restoreWithComponents);
         return properties;
       },
       'updates value': function (properties) {
@@ -180,7 +182,7 @@ vows.describe(restoreFromOptimizing)
         ]);
       }
     },
-    'in cloned without reference to `all`': {
+    'in cloned without reference to `all` 123': {
       'topic': function () {
         var properties = [
           [
@@ -196,7 +198,7 @@ vows.describe(restoreFromOptimizing)
         cloned.components = wrapped[0].components;
         cloned.dirty = true;
 
-        restoreFromOptimizing([cloned]);
+        restoreFromOptimizing([cloned], restoreWithComponents);
         return cloned;
       },
       'does not fail': function (cloned) {
@@ -216,7 +218,7 @@ vows.describe(restoreFromOptimizing)
         ];
         var wrapped = wrapForOptimizing(properties);
 
-        restoreFromOptimizing(wrapped, true);
+        restoreFromOptimizing(wrapped, restoreWithComponents);
         return properties;
       },
       'restores important': function (properties) {
@@ -240,7 +242,7 @@ vows.describe(restoreFromOptimizing)
         ];
         var wrapped = wrapForOptimizing(properties);
 
-        restoreFromOptimizing(wrapped, true);
+        restoreFromOptimizing(wrapped, restoreWithComponents);
         return properties;
       },
       'restores hack': function (properties) {
@@ -264,7 +266,7 @@ vows.describe(restoreFromOptimizing)
         ];
         var wrapped = wrapForOptimizing(properties);
 
-        restoreFromOptimizing(wrapped, true);
+        restoreFromOptimizing(wrapped, restoreWithComponents);
         return properties;
       },
       'restores hack': function (properties) {
@@ -288,7 +290,7 @@ vows.describe(restoreFromOptimizing)
         ];
         var wrapped = wrapForOptimizing(properties);
 
-        restoreFromOptimizing(wrapped, true);
+        restoreFromOptimizing(wrapped, restoreWithComponents);
         return properties;
       },
       'restores hack': function (properties) {
similarity index 99%
rename from test/properties/wrap-for-optimizing-test.js
rename to test/optimizer/wrap-for-optimizing-test.js
index 56458b6..f18229d 100644 (file)
@@ -1,7 +1,7 @@
 var vows = require('vows');
 var assert = require('assert');
 
-var wrapForOptimizing = require('../../lib/properties/wrap-for-optimizing').all;
+var wrapForOptimizing = require('../../lib/optimizer/wrap-for-optimizing').all;
 
 vows.describe(wrapForOptimizing)
   .addBatch({