| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 | var roundingPrecisionFrom = require('./rounding-precision').roundingPrecisionFrom;var override = require('../utils/override');var OptimizationLevel = {  Zero: '0',  One: '1',  Two: '2'};var DEFAULTS = {};DEFAULTS[OptimizationLevel.Zero] = {};DEFAULTS[OptimizationLevel.One] = {  cleanupCharsets: true,  normalizeUrls: true,  optimizeBackground: true,  optimizeBorderRadius: true,  optimizeFilter: true,  optimizeFontWeight: true,  optimizeOutline: true,  removeEmpty: true,  removeNegativePaddings: true,  removeQuotes: true,  removeWhitespace: true,  replaceMultipleZeros: true,  replaceTimeUnits: true,  replaceZeroUnits: true,  roundingPrecision: roundingPrecisionFrom(undefined),  selectorsSortingMethod: 'standard',  specialComments: 'all',  tidyAtRules: true,  tidyBlockScopes: true,  tidySelectors: true,  transform: noop};DEFAULTS[OptimizationLevel.Two] = {  mergeAdjacentRules: true,  mergeIntoShorthands: true,  mergeMedia: true,  mergeNonAdjacentRules: true,  mergeSemantically: false,  overrideProperties: true,  removeEmpty: true,  reduceNonAdjacentRules: true,  removeDuplicateFontRules: true,  removeDuplicateMediaBlocks: true,  removeDuplicateRules: true,  removeUnusedAtRules: false,  restructureRules: false,  skipProperties: []};var ALL_KEYWORD_1 = '*';var ALL_KEYWORD_2 = 'all';var FALSE_KEYWORD_1 = 'false';var FALSE_KEYWORD_2 = 'off';var TRUE_KEYWORD_1 = 'true';var TRUE_KEYWORD_2 = 'on';var LIST_VALUE_SEPARATOR = ',';var OPTION_SEPARATOR = ';';var OPTION_VALUE_SEPARATOR = ':';function noop() {}function optimizationLevelFrom(source) {  var level = override(DEFAULTS, {});  var Zero = OptimizationLevel.Zero;  var One = OptimizationLevel.One;  var Two = OptimizationLevel.Two;  if (undefined === source) {    delete level[Two];    return level;  }  if (typeof source == 'string') {    source = parseInt(source);  }  if (typeof source == 'number' && source === parseInt(Two)) {    return level;  }  if (typeof source == 'number' && source === parseInt(One)) {    delete level[Two];    return level;  }  if (typeof source == 'number' && source === parseInt(Zero)) {    delete level[Two];    delete level[One];    return level;  }  if (typeof source == 'object') {    source = covertValuesToHashes(source);  }  if (One in source && 'roundingPrecision' in source[One]) {    source[One].roundingPrecision = roundingPrecisionFrom(source[One].roundingPrecision);  }  if (Two in source && 'skipProperties' in source[Two] && typeof(source[Two].skipProperties) == 'string') {    source[Two].skipProperties = source[Two].skipProperties.split(LIST_VALUE_SEPARATOR);  }  if (Zero in source || One in source || Two in source) {    level[Zero] = override(level[Zero], source[Zero]);  }  if (One in source && ALL_KEYWORD_1 in source[One]) {    level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_1])));    delete source[One][ALL_KEYWORD_1];  }  if (One in source && ALL_KEYWORD_2 in source[One]) {    level[One] = override(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_2])));    delete source[One][ALL_KEYWORD_2];  }  if (One in source || Two in source) {    level[One] = override(level[One], source[One]);  } else {    delete level[One];  }  if (Two in source && ALL_KEYWORD_1 in source[Two]) {    level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_1])));    delete source[Two][ALL_KEYWORD_1];  }  if (Two in source && ALL_KEYWORD_2 in source[Two]) {    level[Two] = override(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_2])));    delete source[Two][ALL_KEYWORD_2];  }  if (Two in source) {    level[Two] = override(level[Two], source[Two]);  } else {    delete level[Two];  }  return level;}function defaults(level, value) {  var options = override(DEFAULTS[level], {});  var key;  for (key in options) {    if (typeof options[key] == 'boolean') {      options[key] = value;    }  }  return options;}function normalizeValue(value) {  switch (value) {    case FALSE_KEYWORD_1:    case FALSE_KEYWORD_2:      return false;    case TRUE_KEYWORD_1:    case TRUE_KEYWORD_2:      return true;    default:      return value;  }}function covertValuesToHashes(source) {  var clonedSource = override(source, {});  var level;  var i;  for (i = 0; i <= 2; i++) {    level = '' + i;    if (level in clonedSource && (clonedSource[level] === undefined || clonedSource[level] === false)) {      delete clonedSource[level];    }    if (level in clonedSource && clonedSource[level] === true) {      clonedSource[level] = {};    }    if (level in clonedSource && typeof clonedSource[level] == 'string') {      clonedSource[level] = covertToHash(clonedSource[level], level);    }  }  return clonedSource;}function covertToHash(asString, level) {  return asString    .split(OPTION_SEPARATOR)    .reduce(function (accumulator, directive) {      var parts = directive.split(OPTION_VALUE_SEPARATOR);      var name = parts[0];      var value = parts[1];      var normalizedValue = normalizeValue(value);      if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) {        accumulator = override(accumulator, defaults(level, normalizedValue));      } else {        accumulator[name] = normalizedValue;      }      return accumulator;    }, {});}module.exports = {  OptimizationLevel: OptimizationLevel,  optimizationLevelFrom: optimizationLevelFrom,};
 |