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');
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;
+++ /dev/null
-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;
--- /dev/null
+function level0Optimize(tokens) {
+ // noop as level 0 means no optimizations!
+ return tokens;
+}
+
+module.exports = level0Optimize;
+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'];
}
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]) {
});
}
- return HexNameShortener.shorten(value);
+ return shortenHex(value);
}
function pixelLengthMinifier(_, value, compatibility) {
minifyFont(property, options);
}
- restoreFromOptimizing(_properties, true);
+ restoreFromOptimizing(_properties);
removeUnused(_properties);
if (_properties.length != properties.length) {
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;
break;
case Token.BLOCK:
token[1] = tidyBlock(token[1], spaceAfterClosingBrace);
- basicOptimize(token[2], context);
+ level1Optimize(token[2], context);
afterRules = true;
break;
case Token.COMMENT:
return tokens;
}
-module.exports = basicOptimize;
+module.exports = level1Optimize;
-var HexNameShortener = {};
-
var COLORS = {
aliceblue: '#f0f8ff',
antiquewhite: '#faebd7',
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');
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;
// 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;
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);
((redAsHex.length == 1 ? '0' : '') + redAsHex) +
((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
-};
+}
-module.exports = HSLColor;
+module.exports = shortenHsl;
--- /dev/null
+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;
-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 = /[>\+~]/;
-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 = ',';
-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);
-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;
-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'],
}
}
-function optimize(selector, properties, mergeAdjacent, withCompacting, context) {
+function compactorOptimize(selector, properties, mergeAdjacent, withCompacting, context) {
var validator = context.validator;
var warnings = context.warnings;
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);
}
}
compactShorthands(_properties, validator);
}
- restoreFromOptimizing(_properties);
+ restoreFromOptimizing(_properties, restoreWithComponents);
removeUnused(_properties);
}
-module.exports = optimize;
+module.exports = compactorOptimize;
-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) {
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);
overrideByMultiplex(component, multiplexClone);
}
- restoreFromOptimizing([simpleClone]);
+ restoreFromOptimizing([simpleClone], restoreWithComponents);
var lengthAfter = lengthOf(simpleClone);
-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--) {
-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;
// 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 = [];
-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 = /^::/;
-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, [], []];
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) &&
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;
-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);
-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 = {};
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] = [];
}
}
-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++) {
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);
}
}
}
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);
}
}
-function optimize(tokens, context, withRestructuring) {
+function level2Optimize(tokens, context, withRestructuring) {
recursivelyOptimizeBlocks(tokens, context);
recursivelyOptimizeProperties(tokens, context);
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);
}
}
return tokens;
}
-module.exports = optimize;
+module.exports = level2Optimize;
-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;
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;
-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';
-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 = {};
-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 = {};
--- /dev/null
+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;
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++) {
-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;
var Hack = require('./hack');
+
var Marker = require('../tokenizer/marker');
-var compactable = require('./compactable');
var BACKSLASH_HACK = '\\9';
var IMPORTANT_TOKEN = '!important';
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;
continue;
}
- if (!simpleMode && descriptor && descriptor.shorthand) {
- restored = descriptor.restore(property, compactable);
+ if (restoreCallback) {
+ restored = restoreCallback(property);
property.value = restored;
} else {
restored = property.value;
var Hack = require('./hack');
+
var Marker = require('../tokenizer/marker');
var Token = require('../tokenizer/token');
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('simple optimizations')
.addBatch(
-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',
function shortened(target) {
return function (source) {
- assert.equal(HexNameShortener.shorten(source), target);
+ assert.equal(shortenHex(source), target);
};
}
return context;
}
-vows.describe(HexNameShortener)
+vows.describe(shortenHex)
.addBatch(colorShorteningContext())
.export(module);
-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());
-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, {
-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);
-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, {
-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({
-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, {
-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, {
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'];
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('remove duplicates')
.addBatch(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('merge media queries')
.addBatch(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('merge non djacent by body')
.addBatch(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('merge non djacent by selector')
.addBatch(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('level 2 optimizer')
.addBatch(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('remove duplicates')
.addBatch(
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(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('remove duplicate media queries')
.addBatch(
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('remove duplicates')
.addBatch(
-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(
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());
var vows = require('vows');
-var optimizerContext = require('../test-helper').optimizerContext;
+var optimizerContext = require('../../test-helper').optimizerContext;
vows.describe('restructure')
.addBatch(
var vows = require('vows');
-var rulesOverlap = require('../../lib/optimizer/rules-overlap');
+var rulesOverlap = require('../../../lib/optimizer/level-2/rules-overlap');
vows.describe(rulesOverlap)
.addBatch({
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({
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());
wrapped[0].dirty = true;
- restoreFromOptimizing(wrapped, true);
+ restoreFromOptimizing(wrapped);
return properties;
},
'is same as source': function (properties) {
wrapped[0].value = [];
wrapped[0].dirty = true;
- restoreFromOptimizing(wrapped);
+ restoreFromOptimizing(wrapped, restoreWithComponents);
return properties;
},
'updates value': function (properties) {
]);
}
},
- 'in cloned without reference to `all`': {
+ 'in cloned without reference to `all` 123': {
'topic': function () {
var properties = [
[
cloned.components = wrapped[0].components;
cloned.dirty = true;
- restoreFromOptimizing([cloned]);
+ restoreFromOptimizing([cloned], restoreWithComponents);
return cloned;
},
'does not fail': function (cloned) {
];
var wrapped = wrapForOptimizing(properties);
- restoreFromOptimizing(wrapped, true);
+ restoreFromOptimizing(wrapped, restoreWithComponents);
return properties;
},
'restores important': function (properties) {
];
var wrapped = wrapForOptimizing(properties);
- restoreFromOptimizing(wrapped, true);
+ restoreFromOptimizing(wrapped, restoreWithComponents);
return properties;
},
'restores hack': function (properties) {
];
var wrapped = wrapForOptimizing(properties);
- restoreFromOptimizing(wrapped, true);
+ restoreFromOptimizing(wrapped, restoreWithComponents);
return properties;
},
'restores hack': function (properties) {
];
var wrapped = wrapForOptimizing(properties);
- restoreFromOptimizing(wrapped, true);
+ restoreFromOptimizing(wrapped, restoreWithComponents);
return properties;
},
'restores hack': function (properties) {
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({