From: Jakub Pawlowicz Date: Sun, 8 Jan 2017 17:04:18 +0000 (+0100) Subject: Reorganizes optimizer around levels. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=f7c6a5728ac5f630c79a063535194d64ed4fc898;p=clean-css.git Reorganizes optimizer around levels. Why: * Gets rid of the flat structure where levels' code was mixed; * moves level 2 compacting into a namespace (folderspace?). --- diff --git a/lib/clean.js b/lib/clean.js index ec6c4914..6b1f7adf 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -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 index 2f945482..00000000 --- a/lib/colors/rgb.js +++ /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; diff --git a/lib/properties/hack.js b/lib/optimizer/hack.js 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 index 00000000..2a56f89c --- /dev/null +++ b/lib/optimizer/level-0/optimize.js @@ -0,0 +1,6 @@ +function level0Optimize(tokens) { + // noop as level 0 means no optimizations! + return tokens; +} + +module.exports = level0Optimize; diff --git a/lib/optimizer/basic.js b/lib/optimizer/level-1/optimize.js similarity index 94% rename from lib/optimizer/basic.js rename to lib/optimizer/level-1/optimize.js index 1b491412..fb42d51b 100644 --- a/lib/optimizer/basic.js +++ b/lib/optimizer/level-1/optimize.js @@ -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; diff --git a/lib/colors/hex-name-shortener.js b/lib/optimizer/level-1/shorten-hex.js similarity index 94% rename from lib/colors/hex-name-shortener.js rename to lib/optimizer/level-1/shorten-hex.js index 2af2f4e2..3deea381 100644 --- a/lib/colors/hex-name-shortener.js +++ b/lib/optimizer/level-1/shorten-hex.js @@ -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; diff --git a/lib/colors/hsl.js b/lib/optimizer/level-1/shorten-hsl.js similarity index 82% rename from lib/colors/hsl.js rename to lib/optimizer/level-1/shorten-hsl.js index 5c76b6e6..fe98dfd3 100644 --- a/lib/colors/hsl.js +++ b/lib/optimizer/level-1/shorten-hsl.js @@ -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 index 00000000..3c0a5fa3 --- /dev/null +++ b/lib/optimizer/level-1/shorten-rgb.js @@ -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; diff --git a/lib/optimizer/tidy-at-rule.js b/lib/optimizer/level-1/tidy-at-rule.js similarity index 100% rename from lib/optimizer/tidy-at-rule.js rename to lib/optimizer/level-1/tidy-at-rule.js diff --git a/lib/optimizer/tidy-block.js b/lib/optimizer/level-1/tidy-block.js similarity index 100% rename from lib/optimizer/tidy-block.js rename to lib/optimizer/level-1/tidy-block.js diff --git a/lib/optimizer/tidy-rules.js b/lib/optimizer/level-1/tidy-rules.js similarity index 98% rename from lib/optimizer/tidy-rules.js rename to lib/optimizer/level-1/tidy-rules.js index 9b6c725b..84e9dc33 100644 --- a/lib/optimizer/tidy-rules.js +++ b/lib/optimizer/level-1/tidy-rules.js @@ -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 = /[>\+~]/; diff --git a/lib/properties/break-up.js b/lib/optimizer/level-2/break-up.js similarity index 98% rename from lib/properties/break-up.js rename to lib/optimizer/level-2/break-up.js index 66a342ab..6e6f5775 100644 --- a/lib/properties/break-up.js +++ b/lib/optimizer/level-2/break-up.js @@ -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 = ','; diff --git a/lib/properties/can-override.js b/lib/optimizer/level-2/can-override.js similarity index 100% rename from lib/properties/can-override.js rename to lib/optimizer/level-2/can-override.js diff --git a/lib/properties/clone.js b/lib/optimizer/level-2/clone.js similarity index 86% rename from lib/properties/clone.js rename to lib/optimizer/level-2/clone.js index 05c1b17e..3830095e 100644 --- a/lib/properties/clone.js +++ b/lib/optimizer/level-2/clone.js @@ -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); diff --git a/lib/properties/compactable.js b/lib/optimizer/level-2/compactable.js similarity index 100% rename from lib/properties/compactable.js rename to lib/optimizer/level-2/compactable.js diff --git a/lib/properties/every-combination.js b/lib/optimizer/level-2/compacting/every-combination.js similarity index 87% rename from lib/properties/every-combination.js rename to lib/optimizer/level-2/compacting/every-combination.js index 71a1c0ef..af3efc49 100644 --- a/lib/properties/every-combination.js +++ b/lib/optimizer/level-2/compacting/every-combination.js @@ -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; diff --git a/lib/properties/has-inherit.js b/lib/optimizer/level-2/compacting/has-inherit.js similarity index 100% rename from lib/properties/has-inherit.js rename to lib/optimizer/level-2/compacting/has-inherit.js diff --git a/lib/properties/optimizer.js b/lib/optimizer/level-2/compacting/optimize.js similarity index 91% rename from lib/properties/optimizer.js rename to lib/optimizer/level-2/compacting/optimize.js index 4d843656..33a7118d 100644 --- a/lib/properties/optimizer.js +++ b/lib/optimizer/level-2/compacting/optimize.js @@ -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; diff --git a/lib/properties/override-compactor.js b/lib/optimizer/level-2/compacting/override-compactor.js similarity index 93% rename from lib/properties/override-compactor.js rename to lib/optimizer/level-2/compacting/override-compactor.js index 89180b4f..5d79c3e0 100644 --- a/lib/properties/override-compactor.js +++ b/lib/optimizer/level-2/compacting/override-compactor.js @@ -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); diff --git a/lib/properties/populate-components.js b/lib/optimizer/level-2/compacting/populate-components.js similarity index 88% rename from lib/properties/populate-components.js rename to lib/optimizer/level-2/compacting/populate-components.js index dd8700cc..921d3c1d 100644 --- a/lib/properties/populate-components.js +++ b/lib/optimizer/level-2/compacting/populate-components.js @@ -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--) { diff --git a/lib/properties/shorthand-compactor.js b/lib/optimizer/level-2/compacting/shorthand-compactor.js similarity index 94% rename from lib/properties/shorthand-compactor.js rename to lib/optimizer/level-2/compacting/shorthand-compactor.js index 5c2b2cff..04e14a04 100644 --- a/lib/properties/shorthand-compactor.js +++ b/lib/optimizer/level-2/compacting/shorthand-compactor.js @@ -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; diff --git a/lib/properties/validator.js b/lib/optimizer/level-2/compacting/validator.js similarity index 100% rename from lib/properties/validator.js rename to lib/optimizer/level-2/compacting/validator.js diff --git a/lib/properties/vendor-prefixes.js b/lib/optimizer/level-2/compacting/vendor-prefixes.js similarity index 100% rename from lib/properties/vendor-prefixes.js rename to lib/optimizer/level-2/compacting/vendor-prefixes.js diff --git a/lib/optimizer/extract-properties.js b/lib/optimizer/level-2/extract-properties.js similarity index 91% rename from lib/optimizer/extract-properties.js rename to lib/optimizer/level-2/extract-properties.js index 3a937a95..2df26676 100644 --- a/lib/optimizer/extract-properties.js +++ b/lib/optimizer/level-2/extract-properties.js @@ -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 = []; diff --git a/lib/properties/invalid-property-error.js b/lib/optimizer/level-2/invalid-property-error.js similarity index 100% rename from lib/properties/invalid-property-error.js rename to lib/optimizer/level-2/invalid-property-error.js diff --git a/lib/optimizer/is-mergeable.js b/lib/optimizer/level-2/is-mergeable.js similarity index 98% rename from lib/optimizer/is-mergeable.js rename to lib/optimizer/level-2/is-mergeable.js index 11b26e28..bbd4c43c 100644 --- a/lib/optimizer/is-mergeable.js +++ b/lib/optimizer/level-2/is-mergeable.js @@ -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 = /^::/; diff --git a/lib/optimizer/merge-adjacent.js b/lib/optimizer/level-2/merge-adjacent.js similarity index 78% rename from lib/optimizer/merge-adjacent.js rename to lib/optimizer/level-2/merge-adjacent.js index e2e0702f..4674328e 100644 --- a/lib/optimizer/merge-adjacent.js +++ b/lib/optimizer/level-2/merge-adjacent.js @@ -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) && diff --git a/lib/optimizer/merge-media-queries.js b/lib/optimizer/level-2/merge-media-queries.js similarity index 93% rename from lib/optimizer/merge-media-queries.js rename to lib/optimizer/level-2/merge-media-queries.js index 7d0f3b7d..f5088762 100644 --- a/lib/optimizer/merge-media-queries.js +++ b/lib/optimizer/level-2/merge-media-queries.js @@ -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; diff --git a/lib/optimizer/merge-non-adjacent-by-body.js b/lib/optimizer/level-2/merge-non-adjacent-by-body.js similarity index 87% rename from lib/optimizer/merge-non-adjacent-by-body.js rename to lib/optimizer/level-2/merge-non-adjacent-by-body.js index fcc4f52b..ac7046a5 100644 --- a/lib/optimizer/merge-non-adjacent-by-body.js +++ b/lib/optimizer/level-2/merge-non-adjacent-by-body.js @@ -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); diff --git a/lib/optimizer/merge-non-adjacent-by-selector.js b/lib/optimizer/level-2/merge-non-adjacent-by-selector.js similarity index 90% rename from lib/optimizer/merge-non-adjacent-by-selector.js rename to lib/optimizer/level-2/merge-non-adjacent-by-selector.js index 1b2ef1e5..027ba361 100644 --- a/lib/optimizer/merge-non-adjacent-by-selector.js +++ b/lib/optimizer/level-2/merge-non-adjacent-by-selector.js @@ -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] = []; } } diff --git a/lib/optimizer/advanced.js b/lib/optimizer/level-2/optimize.js similarity index 84% rename from lib/optimizer/advanced.js rename to lib/optimizer/level-2/optimize.js index 022e8893..77ce1c91 100644 --- a/lib/optimizer/advanced.js +++ b/lib/optimizer/level-2/optimize.js @@ -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; diff --git a/lib/optimizer/reduce-non-adjacent.js b/lib/optimizer/level-2/reduce-non-adjacent.js similarity index 93% rename from lib/optimizer/reduce-non-adjacent.js rename to lib/optimizer/level-2/reduce-non-adjacent.js index f4be6d0d..b70022e6 100644 --- a/lib/optimizer/reduce-non-adjacent.js +++ b/lib/optimizer/level-2/reduce-non-adjacent.js @@ -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; diff --git a/lib/optimizer/remove-duplicate-font-at-rules.js b/lib/optimizer/level-2/remove-duplicate-font-at-rules.js similarity index 83% rename from lib/optimizer/remove-duplicate-font-at-rules.js rename to lib/optimizer/level-2/remove-duplicate-font-at-rules.js index 5b0eb515..bc85d5d6 100644 --- a/lib/optimizer/remove-duplicate-font-at-rules.js +++ b/lib/optimizer/level-2/remove-duplicate-font-at-rules.js @@ -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'; diff --git a/lib/optimizer/remove-duplicate-media-queries.js b/lib/optimizer/level-2/remove-duplicate-media-queries.js similarity index 74% rename from lib/optimizer/remove-duplicate-media-queries.js rename to lib/optimizer/level-2/remove-duplicate-media-queries.js index ffde8a3c..2c9742e2 100644 --- a/lib/optimizer/remove-duplicate-media-queries.js +++ b/lib/optimizer/level-2/remove-duplicate-media-queries.js @@ -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 = {}; diff --git a/lib/optimizer/remove-duplicates.js b/lib/optimizer/level-2/remove-duplicates.js similarity index 83% rename from lib/optimizer/remove-duplicates.js rename to lib/optimizer/level-2/remove-duplicates.js index fb777472..9aa6ace9 100644 --- a/lib/optimizer/remove-duplicates.js +++ b/lib/optimizer/level-2/remove-duplicates.js @@ -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/reorderable.js b/lib/optimizer/level-2/reorderable.js similarity index 100% rename from lib/optimizer/reorderable.js rename to lib/optimizer/level-2/reorderable.js diff --git a/lib/optimizer/level-2/restore-with-components.js b/lib/optimizer/level-2/restore-with-components.js new file mode 100644 index 00000000..caf7c4c9 --- /dev/null +++ b/lib/optimizer/level-2/restore-with-components.js @@ -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; diff --git a/lib/properties/restore.js b/lib/optimizer/level-2/restore.js similarity index 98% rename from lib/properties/restore.js rename to lib/optimizer/level-2/restore.js index a770f741..149688c5 100644 --- a/lib/properties/restore.js +++ b/lib/optimizer/level-2/restore.js @@ -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++) { diff --git a/lib/optimizer/restructure.js b/lib/optimizer/level-2/restructure.js similarity index 98% rename from lib/optimizer/restructure.js rename to lib/optimizer/level-2/restructure.js index ba6cb4ac..7ecc434d 100644 --- a/lib/optimizer/restructure.js +++ b/lib/optimizer/level-2/restructure.js @@ -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; diff --git a/lib/optimizer/rules-overlap.js b/lib/optimizer/level-2/rules-overlap.js similarity index 100% rename from lib/optimizer/rules-overlap.js rename to lib/optimizer/level-2/rules-overlap.js diff --git a/lib/optimizer/tidy-rule-duplicates.js b/lib/optimizer/level-2/tidy-rule-duplicates.js similarity index 100% rename from lib/optimizer/tidy-rule-duplicates.js rename to lib/optimizer/level-2/tidy-rule-duplicates.js diff --git a/lib/properties/remove-unused.js b/lib/optimizer/remove-unused.js similarity index 100% rename from lib/properties/remove-unused.js rename to lib/optimizer/remove-unused.js diff --git a/lib/properties/restore-from-optimizing.js b/lib/optimizer/restore-from-optimizing.js similarity index 84% rename from lib/properties/restore-from-optimizing.js rename to lib/optimizer/restore-from-optimizing.js index 02424dc8..73160c87 100644 --- a/lib/properties/restore-from-optimizing.js +++ b/lib/optimizer/restore-from-optimizing.js @@ -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; diff --git a/lib/properties/wrap-for-optimizing.js b/lib/optimizer/wrap-for-optimizing.js similarity index 99% rename from lib/properties/wrap-for-optimizing.js rename to lib/optimizer/wrap-for-optimizing.js index 2b9e1ca8..09dd5685 100644 --- a/lib/properties/wrap-for-optimizing.js +++ b/lib/optimizer/wrap-for-optimizing.js @@ -1,4 +1,5 @@ var Hack = require('./hack'); + var Marker = require('../tokenizer/marker'); var Token = require('../tokenizer/token'); diff --git a/test/optimizer/basic-test.js b/test/optimizer/level-1/basic-test.js similarity index 99% rename from test/optimizer/basic-test.js rename to test/optimizer/level-1/basic-test.js index bf6b79a1..0995ca6e 100644 --- a/test/optimizer/basic-test.js +++ b/test/optimizer/level-1/basic-test.js @@ -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( diff --git a/test/colors/hex-name-shortener-test.js b/test/optimizer/level-1/shorten-hex-test.js similarity index 96% rename from test/colors/hex-name-shortener-test.js rename to test/optimizer/level-1/shorten-hex-test.js index e5cab0b1..80efbdba 100644 --- a/test/colors/hex-name-shortener-test.js +++ b/test/optimizer/level-1/shorten-hex-test.js @@ -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); diff --git a/test/properties/break-up-test.js b/test/optimizer/level-2/break-up-test.js similarity index 99% rename from test/properties/break-up-test.js rename to test/optimizer/level-2/break-up-test.js index 86335e54..885aef6d 100644 --- a/test/properties/break-up-test.js +++ b/test/optimizer/level-2/break-up-test.js @@ -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()); diff --git a/test/properties/longhand-overriding-test.js b/test/optimizer/level-2/compacting/longhand-overriding-test.js similarity index 93% rename from test/properties/longhand-overriding-test.js rename to test/optimizer/level-2/compacting/longhand-overriding-test.js index affa8b25..51431a70 100644 --- a/test/properties/longhand-overriding-test.js +++ b/test/optimizer/level-2/compacting/longhand-overriding-test.js @@ -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, { diff --git a/test/properties/optimizer-test.js b/test/optimizer/level-2/compacting/optimize-test.js similarity index 98% rename from test/properties/optimizer-test.js rename to test/optimizer/level-2/compacting/optimize-test.js index d657feae..cc3d42c8 100644 --- a/test/properties/optimizer-test.js +++ b/test/optimizer/level-2/compacting/optimize-test.js @@ -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); diff --git a/test/properties/override-compacting-test.js b/test/optimizer/level-2/compacting/override-compacting-test.js similarity index 99% rename from test/properties/override-compacting-test.js rename to test/optimizer/level-2/compacting/override-compacting-test.js index ffede129..5199bbba 100644 --- a/test/properties/override-compacting-test.js +++ b/test/optimizer/level-2/compacting/override-compacting-test.js @@ -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, { diff --git a/test/properties/populate-components-test.js b/test/optimizer/level-2/compacting/populate-components-test.js similarity index 93% rename from test/properties/populate-components-test.js rename to test/optimizer/level-2/compacting/populate-components-test.js index 0e4e6491..b40335a0 100644 --- a/test/properties/populate-components-test.js +++ b/test/optimizer/level-2/compacting/populate-components-test.js @@ -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({ diff --git a/test/properties/shorthand-compacting-test.js b/test/optimizer/level-2/compacting/shorthand-compacting-test.js similarity index 98% rename from test/properties/shorthand-compacting-test.js rename to test/optimizer/level-2/compacting/shorthand-compacting-test.js index 066bb108..ed20af09 100644 --- a/test/properties/shorthand-compacting-test.js +++ b/test/optimizer/level-2/compacting/shorthand-compacting-test.js @@ -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, { diff --git a/test/optimizer/extract-properties-test.js b/test/optimizer/level-2/extract-properties-test.js similarity index 98% rename from test/optimizer/extract-properties-test.js rename to test/optimizer/level-2/extract-properties-test.js index c07c9401..55de7105 100644 --- a/test/optimizer/extract-properties-test.js +++ b/test/optimizer/level-2/extract-properties-test.js @@ -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, { diff --git a/test/optimizer/is-mergeable-test.js b/test/optimizer/level-2/is-mergeable-test.js similarity index 98% rename from test/optimizer/is-mergeable-test.js rename to test/optimizer/level-2/is-mergeable-test.js index 0ec17ebd..dfe9b52a 100644 --- a/test/optimizer/is-mergeable-test.js +++ b/test/optimizer/level-2/is-mergeable-test.js @@ -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']; diff --git a/test/optimizer/merge-adjacent-test.js b/test/optimizer/level-2/merge-adjacent-test.js similarity index 98% rename from test/optimizer/merge-adjacent-test.js rename to test/optimizer/level-2/merge-adjacent-test.js index 8f3c6a2a..87c1ee13 100644 --- a/test/optimizer/merge-adjacent-test.js +++ b/test/optimizer/level-2/merge-adjacent-test.js @@ -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( diff --git a/test/optimizer/merge-media-queries-test.js b/test/optimizer/level-2/merge-media-queries-test.js similarity index 99% rename from test/optimizer/merge-media-queries-test.js rename to test/optimizer/level-2/merge-media-queries-test.js index f3433e57..fdd1420a 100644 --- a/test/optimizer/merge-media-queries-test.js +++ b/test/optimizer/level-2/merge-media-queries-test.js @@ -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( diff --git a/test/optimizer/merge-non-adjacent-by-body-test.js b/test/optimizer/level-2/merge-non-adjacent-by-body-test.js similarity index 98% rename from test/optimizer/merge-non-adjacent-by-body-test.js rename to test/optimizer/level-2/merge-non-adjacent-by-body-test.js index 28099957..16eaedd0 100644 --- a/test/optimizer/merge-non-adjacent-by-body-test.js +++ b/test/optimizer/level-2/merge-non-adjacent-by-body-test.js @@ -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( diff --git a/test/optimizer/merge-non-adjacent-by-selector-test.js b/test/optimizer/level-2/merge-non-adjacent-by-selector-test.js similarity index 94% rename from test/optimizer/merge-non-adjacent-by-selector-test.js rename to test/optimizer/level-2/merge-non-adjacent-by-selector-test.js index 6ee8751a..55ec41d7 100644 --- a/test/optimizer/merge-non-adjacent-by-selector-test.js +++ b/test/optimizer/level-2/merge-non-adjacent-by-selector-test.js @@ -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( diff --git a/test/optimizer/advanced-test.js b/test/optimizer/level-2/optimize-test.js similarity index 98% rename from test/optimizer/advanced-test.js rename to test/optimizer/level-2/optimize-test.js index bc1f7ad0..b49298e5 100644 --- a/test/optimizer/advanced-test.js +++ b/test/optimizer/level-2/optimize-test.js @@ -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( diff --git a/test/optimizer/reduce-non-adjacent-test.js b/test/optimizer/level-2/reduce-non-adjacent-test.js similarity index 99% rename from test/optimizer/reduce-non-adjacent-test.js rename to test/optimizer/level-2/reduce-non-adjacent-test.js index 4bfa3d81..df8d945e 100644 --- a/test/optimizer/reduce-non-adjacent-test.js +++ b/test/optimizer/level-2/reduce-non-adjacent-test.js @@ -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( diff --git a/test/optimizer/remove-duplicate-font-at-rules-test.js b/test/optimizer/level-2/remove-duplicate-font-at-rules-test.js similarity index 94% rename from test/optimizer/remove-duplicate-font-at-rules-test.js rename to test/optimizer/level-2/remove-duplicate-font-at-rules-test.js index 216b41cf..20e9a622 100644 --- a/test/optimizer/remove-duplicate-font-at-rules-test.js +++ b/test/optimizer/level-2/remove-duplicate-font-at-rules-test.js @@ -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( diff --git a/test/optimizer/remove-duplicate-media-queries-test.js b/test/optimizer/level-2/remove-duplicate-media-queries-test.js similarity index 95% rename from test/optimizer/remove-duplicate-media-queries-test.js rename to test/optimizer/level-2/remove-duplicate-media-queries-test.js index 7e25111c..20b6df69 100644 --- a/test/optimizer/remove-duplicate-media-queries-test.js +++ b/test/optimizer/level-2/remove-duplicate-media-queries-test.js @@ -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( diff --git a/test/optimizer/remove-duplicates-test.js b/test/optimizer/level-2/remove-duplicates-test.js similarity index 96% rename from test/optimizer/remove-duplicates-test.js rename to test/optimizer/level-2/remove-duplicates-test.js index 19879dcf..cd3c42ba 100644 --- a/test/optimizer/remove-duplicates-test.js +++ b/test/optimizer/level-2/remove-duplicates-test.js @@ -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( diff --git a/test/optimizer/reorderable-test.js b/test/optimizer/level-2/reorderable-test.js similarity index 96% rename from test/optimizer/reorderable-test.js rename to test/optimizer/level-2/reorderable-test.js index 8b7a8e5d..ce9ce9fb 100644 --- a/test/optimizer/reorderable-test.js +++ b/test/optimizer/level-2/reorderable-test.js @@ -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( diff --git a/test/properties/restore-test.js b/test/optimizer/level-2/restore-test.js similarity index 98% rename from test/properties/restore-test.js rename to test/optimizer/level-2/restore-test.js index bf2e8c11..c21f0c54 100644 --- a/test/properties/restore-test.js +++ b/test/optimizer/level-2/restore-test.js @@ -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()); diff --git a/test/optimizer/restructure-test.js b/test/optimizer/level-2/restructure-test.js similarity index 99% rename from test/optimizer/restructure-test.js rename to test/optimizer/level-2/restructure-test.js index 95300c59..0d20b33e 100644 --- a/test/optimizer/restructure-test.js +++ b/test/optimizer/level-2/restructure-test.js @@ -1,5 +1,5 @@ var vows = require('vows'); -var optimizerContext = require('../test-helper').optimizerContext; +var optimizerContext = require('../../test-helper').optimizerContext; vows.describe('restructure') .addBatch( diff --git a/test/optimizer/rules-overlap-test.js b/test/optimizer/level-2/rules-overlap-test.js similarity index 96% rename from test/optimizer/rules-overlap-test.js rename to test/optimizer/level-2/rules-overlap-test.js index 50b1be31..918c5951 100644 --- a/test/optimizer/rules-overlap-test.js +++ b/test/optimizer/level-2/rules-overlap-test.js @@ -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({ diff --git a/test/properties/remove-unused-test.js b/test/optimizer/remove-unused-test.js similarity index 91% rename from test/properties/remove-unused-test.js rename to test/optimizer/remove-unused-test.js index ec593857..6e91e27c 100644 --- a/test/properties/remove-unused-test.js +++ b/test/optimizer/remove-unused-test.js @@ -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({ diff --git a/test/properties/restore-from-optimizing-test.js b/test/optimizer/restore-from-optimizing-test.js similarity index 88% rename from test/properties/restore-from-optimizing-test.js rename to test/optimizer/restore-from-optimizing-test.js index 36b04630..0fe15189 100644 --- a/test/properties/restore-from-optimizing-test.js +++ b/test/optimizer/restore-from-optimizing-test.js @@ -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) { diff --git a/test/properties/wrap-for-optimizing-test.js b/test/optimizer/wrap-for-optimizing-test.js similarity index 99% rename from test/properties/wrap-for-optimizing-test.js rename to test/optimizer/wrap-for-optimizing-test.js index 56458b6d..f18229dc 100644 --- a/test/properties/wrap-for-optimizing-test.js +++ b/test/optimizer/wrap-for-optimizing-test.js @@ -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({