Détail du package

clean-css

clean-css66.7mMIT5.3.3

A well-tested CSS minifier

css, minifier

readme


clean-css logo

npm version Build Status PPC Linux Build Status Dependency Status npm Downloads

clean-css is a fast and efficient CSS optimizer for Node.js platform and any modern browser.

According to tests it is one of the best available.

Table of Contents

Node.js version support

clean-css requires Node.js 10.0+ (tested on Linux, OS X, and Windows)

Install

npm install --save-dev clean-css

Use

var CleanCSS = require('clean-css');
var input = 'a{font-weight:bold;}';
var options = { /* options */ };
var output = new CleanCSS(options).minify(input);

What's new in version 5.3

clean-css 5.3 introduces one new feature:

  • variables can be optimized using level 1's variableValueOptimizers option, which accepts a list of value optimizers or a list of their names, e.g. variableValueOptimizers: ['color', 'fraction'].

What's new in version 5.0

clean-css 5.0 introduced some breaking changes:

  • Node.js 6.x and 8.x are officially no longer supported;
  • transform callback in level-1 optimizations is removed in favor of new plugins interface;
  • changes default Internet Explorer compatibility from 10+ to >11, to revert the old default use { compatibility: 'ie10' } flag;
  • changes default rebase option from true to false so URLs are not rebased by default. Please note that if you set rebaseTo option it still counts as setting rebase: true to preserve some of the backward compatibility.

And on the new features side of things:

  • format options now accepts numerical values for all breaks, which will allow you to have more control over output formatting, e.g. format: {breaks: {afterComment: 2}} means clean-css will add two line breaks after each comment
  • a new batch option (defaults to false) is added, when set to true it will process all inputs, given either as an array or a hash, without concatenating them.

What's new in version 4.2

clean-css 4.2 introduces the following changes / features:

  • Adds process method for compatibility with optimize-css-assets-webpack-plugin;
  • new transition property optimizer;
  • preserves any CSS content between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments;
  • allows filtering based on selector in transform callback, see example;
  • adds configurable line breaks via format: { breakWith: 'lf' } option.

What's new in version 4.1

clean-css 4.1 introduces the following changes / features:

  • inline: false as an alias to inline: ['none'];
  • multiplePseudoMerging compatibility flag controlling merging of rules with multiple pseudo classes / elements;
  • removeEmpty flag in level 1 optimizations controlling removal of rules and nested blocks;
  • removeEmpty flag in level 2 optimizations controlling removal of rules and nested blocks;
  • compatibility: { selectors: { mergeLimit: <number> } } flag in compatibility settings controlling maximum number of selectors in a single rule;
  • minify method improved signature accepting a list of hashes for a predictable traversal;
  • selectorsSortingMethod level 1 optimization allows false or 'none' for disabling selector sorting;
  • fetch option controlling a function for handling remote requests;
  • new font shorthand and font-* longhand optimizers;
  • removal of optimizeFont flag in level 1 optimizations due to new font shorthand optimizer;
  • skipProperties flag in level 2 optimizations controlling which properties won't be optimized;
  • new animation shorthand and animation-* longhand optimizers;
  • removeUnusedAtRules level 2 optimization controlling removal of unused @counter-style, @font-face, @keyframes, and @namespace at rules;
  • the web interface gets an improved settings panel with "reset to defaults", instant option changes, and settings being persisted across sessions.

Important: 4.0 breaking changes

clean-css 4.0 introduces some breaking changes:

  • API and CLI interfaces are split, so API stays in this repository while CLI moves to clean-css-cli;
  • root, relativeTo, and target options are replaced by a single rebaseTo option - this means that rebasing URLs and import inlining is much simpler but may not be (YMMV) as powerful as in 3.x;
  • debug option is gone as stats are always provided in output object under stats property;
  • roundingPrecision is disabled by default;
  • roundingPrecision applies to all units now, not only px as in 3.x;
  • processImport and processImportFrom are merged into inline option which defaults to local. Remote @import rules are NOT inlined by default anymore;
  • splits inliner: { request: ..., timeout: ... } option into inlineRequest and inlineTimeout options;
  • remote resources without a protocol, e.g. //fonts.googleapis.com/css?family=Domine:700, are not inlined anymore;
  • changes default Internet Explorer compatibility from 9+ to 10+, to revert the old default use { compatibility: 'ie9' } flag;
  • renames keepSpecialComments to specialComments;
  • moves roundingPrecision and specialComments to level 1 optimizations options, see examples;
  • moves mediaMerging, restructuring, semanticMerging, and shorthandCompacting to level 2 optimizations options, see examples below;
  • renames shorthandCompacting option to mergeIntoShorthands;
  • level 1 optimizations are the new default, up to 3.x it was level 2;
  • keepBreaks option is replaced with { format: 'keep-breaks' } to ease transition;
  • sourceMap option has to be a boolean from now on - to specify an input source map pass it a 2nd argument to minify method or via a hash instead;
  • aggressiveMerging option is removed as aggressive merging is replaced by smarter override merging.

Constructor options

clean-css constructor accepts a hash as a parameter with the following options available:

  • compatibility - controls compatibility mode used; defaults to ie10+; see compatibility modes for examples;
  • fetch - controls a function for handling remote requests; see fetch option for examples (since 4.1.0);
  • format - controls output CSS formatting; defaults to false; see formatting options for examples;
  • inline - controls @import inlining rules; defaults to 'local'; see inlining options for examples;
  • inlineRequest - controls extra options for inlining remote @import rules, can be any of HTTP(S) request options;
  • inlineTimeout - controls number of milliseconds after which inlining a remote @import fails; defaults to 5000;
  • level - controls optimization level used; defaults to 1; see optimization levels for examples;
  • rebase - controls URL rebasing; defaults to false;
  • rebaseTo - controls a directory to which all URLs are rebased, most likely the directory under which the output file will live; defaults to the current directory;
  • returnPromise - controls whether minify method returns a Promise object or not; defaults to false; see promise interface for examples;
  • sourceMap - controls whether an output source map is built; defaults to false;
  • sourceMapInlineSources - controls embedding sources inside a source map's sourcesContent field; defaults to false.

Compatibility modes

There is a certain number of compatibility mode shortcuts, namely:

  • new CleanCSS({ compatibility: '*' }) (default) - Internet Explorer 10+ compatibility mode
  • new CleanCSS({ compatibility: 'ie9' }) - Internet Explorer 9+ compatibility mode
  • new CleanCSS({ compatibility: 'ie8' }) - Internet Explorer 8+ compatibility mode
  • new CleanCSS({ compatibility: 'ie7' }) - Internet Explorer 7+ compatibility mode

Each of these modes is an alias to a fine grained configuration, with the following options available:

new CleanCSS({
  compatibility: {
    colors: {
      hexAlpha: false, // controls 4- and 8-character hex color support
      opacity: true // controls `rgba()` / `hsla()` color support
    },
    properties: {
      backgroundClipMerging: true, // controls background-clip merging into shorthand
      backgroundOriginMerging: true, // controls background-origin merging into shorthand
      backgroundSizeMerging: true, // controls background-size merging into shorthand
      colors: true, // controls color optimizations
      ieBangHack: false, // controls keeping IE bang hack
      ieFilters: false, // controls keeping IE `filter` / `-ms-filter`
      iePrefixHack: false, // controls keeping IE prefix hack
      ieSuffixHack: false, // controls keeping IE suffix hack
      merging: true, // controls property merging based on understandability
      shorterLengthUnits: false, // controls shortening pixel units into `pc`, `pt`, or `in` units
      spaceAfterClosingBrace: true, // controls keeping space after closing brace - `url() no-repeat` into `url()no-repeat`
      urlQuotes: true, // controls keeping quoting inside `url()`
      zeroUnits: true // controls removal of units `0` value
    },
    selectors: {
      adjacentSpace: false, // controls extra space before `nav` element
      ie7Hack: true, // controls removal of IE7 selector hacks, e.g. `*+html...`
      mergeablePseudoClasses: [':active', ...], // controls a whitelist of mergeable pseudo classes
      mergeablePseudoElements: ['::after', ...], // controls a whitelist of mergeable pseudo elements
      mergeLimit: 8191, // controls maximum number of selectors in a single rule (since 4.1.0)
      multiplePseudoMerging: true // controls merging of rules with multiple pseudo classes / elements (since 4.1.0)
    },
    units: {
      ch: true, // controls treating `ch` as a supported unit
      in: true, // controls treating `in` as a supported unit
      pc: true, // controls treating `pc` as a supported unit
      pt: true, // controls treating `pt` as a supported unit
      rem: true, // controls treating `rem` as a supported unit
      vh: true, // controls treating `vh` as a supported unit
      vm: true, // controls treating `vm` as a supported unit
      vmax: true, // controls treating `vmax` as a supported unit
      vmin: true // controls treating `vmin` as a supported unit
    }
  }
})

You can also use a string when setting a compatibility mode, e.g.

new CleanCSS({
  compatibility: 'ie9,-properties.merging' // sets compatibility to IE9 mode with disabled property merging
})

Fetch option

The fetch option accepts a function which handles remote resource fetching, e.g.

var request = require('request');
var source = '@import url(http://example.com/path/to/stylesheet.css);';
new CleanCSS({
  fetch: function (uri, inlineRequest, inlineTimeout, callback) {
    request(uri, function (error, response, body) {
      if (error) {
        callback(error, null);
      } else if (response && response.statusCode != 200) {
        callback(response.statusCode, null);
      } else {
        callback(null, body);
      }
    });
  }
}).minify(source);

This option provides a convenient way of overriding the default fetching logic if it doesn't support a particular feature, say CONNECT proxies.

Unless given, the default loadRemoteResource logic is used.

Formatting options

By default output CSS is formatted without any whitespace unless a format option is given. First of all there are two shorthands:

new CleanCSS({
  format: 'beautify' // formats output in a really nice way
})

and

new CleanCSS({
  format: 'keep-breaks' // formats output the default way but adds line breaks for improved readability
})

however format option also accept a fine-grained set of options:

new CleanCSS({
  format: {
    breaks: { // controls where to insert breaks
      afterAtRule: false, // controls if a line break comes after an at-rule; e.g. `@charset`; defaults to `false`
      afterBlockBegins: false, // controls if a line break comes after a block begins; e.g. `@media`; defaults to `false`
      afterBlockEnds: false, // controls if a line break comes after a block ends, defaults to `false`
      afterComment: false, // controls if a line break comes after a comment; defaults to `false`
      afterProperty: false, // controls if a line break comes after a property; defaults to `false`
      afterRuleBegins: false, // controls if a line break comes after a rule begins; defaults to `false`
      afterRuleEnds: false, // controls if a line break comes after a rule ends; defaults to `false`
      beforeBlockEnds: false, // controls if a line break comes before a block ends; defaults to `false`
      betweenSelectors: false // controls if a line break comes between selectors; defaults to `false`
    },
    breakWith: '\n', // controls the new line character, can be `'\r\n'` or `'\n'` (aliased as `'windows'` and `'unix'` or `'crlf'` and `'lf'`); defaults to system one, so former on Windows and latter on Unix
    indentBy: 0, // controls number of characters to indent with; defaults to `0`
    indentWith: 'space', // controls a character to indent with, can be `'space'` or `'tab'`; defaults to `'space'`
    spaces: { // controls where to insert spaces
      aroundSelectorRelation: false, // controls if spaces come around selector relations; e.g. `div > a`; defaults to `false`
      beforeBlockBegins: false, // controls if a space comes before a block begins; e.g. `.block {`; defaults to `false`
      beforeValue: false // controls if a space comes before a value; e.g. `width: 1rem`; defaults to `false`
    },
    wrapAt: false, // controls maximum line length; defaults to `false`
    semicolonAfterLastProperty: false // controls removing trailing semicolons in rule; defaults to `false` - means remove
  }
})

Also since clean-css 5.0 you can use numerical values for all line breaks, which will repeat a line break that many times, e.g:

  new CleanCSS({
    format: {
      breaks: {
        afterAtRule: 2,
        afterBlockBegins: 1, // 1 is synonymous with `true`
        afterBlockEnds: 2,
        afterComment: 1,
        afterProperty: 1,
        afterRuleBegins: 1,
        afterRuleEnds: 1,
        beforeBlockEnds: 1,
        betweenSelectors: 0 // 0 is synonymous with `false`
      }
    }
  })

which will add nicer spacing between at rules and blocks.

Inlining options

inline option whitelists which @import rules will be processed, e.g.

new CleanCSS({
  inline: ['local'] // default; enables local inlining only
})
new CleanCSS({
  inline: ['none'] // disables all inlining
})
// introduced in clean-css 4.1.0

new CleanCSS({
  inline: false // disables all inlining (alias to `['none']`)
})
new CleanCSS({
  inline: ['all'] // enables all inlining, same as ['local', 'remote']
})
new CleanCSS({
  inline: ['local', 'mydomain.example.com'] // enables local inlining plus given remote source
})
new CleanCSS({
  inline: ['local', 'remote', '!fonts.googleapis.com'] // enables all inlining but from given remote source
})

Optimization levels

The level option can be either 0, 1 (default), or 2, e.g.

new CleanCSS({
  level: 2
})

or a fine-grained configuration given via a hash.

Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.

Level 0 optimizations

Level 0 optimizations simply means "no optimizations". Use it when you'd like to inline imports and / or rebase URLs but skip everything else.

Level 1 optimizations

Level 1 optimizations (default) operate on single properties only, e.g. can remove units when not required, turn rgb colors to a shorter hex representation, remove comments, etc

Here is a full list of available options:

new CleanCSS({
  level: {
    1: {
      cleanupCharsets: true, // controls `@charset` moving to the front of a stylesheet; defaults to `true`
      normalizeUrls: true, // controls URL normalization; defaults to `true`
      optimizeBackground: true, // controls `background` property optimizations; defaults to `true`
      optimizeBorderRadius: true, // controls `border-radius` property optimizations; defaults to `true`
      optimizeFilter: true, // controls `filter` property optimizations; defaults to `true`
      optimizeFont: true, // controls `font` property optimizations; defaults to `true`
      optimizeFontWeight: true, // controls `font-weight` property optimizations; defaults to `true`
      optimizeOutline: true, // controls `outline` property optimizations; defaults to `true`
      removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
      removeNegativePaddings: true, // controls removing negative paddings; defaults to `true`
      removeQuotes: true, // controls removing quotes when unnecessary; defaults to `true`
      removeWhitespace: true, // controls removing unused whitespace; defaults to `true`
      replaceMultipleZeros: true, // contols removing redundant zeros; defaults to `true`
      replaceTimeUnits: true, // controls replacing time units with shorter values; defaults to `true`
      replaceZeroUnits: true, // controls replacing zero values with units; defaults to `true`
      roundingPrecision: false, // rounds pixel values to `N` decimal places; `false` disables rounding; defaults to `false`
      selectorsSortingMethod: 'standard', // denotes selector sorting method; can be `'natural'` or `'standard'`, `'none'`, or false (the last two since 4.1.0); defaults to `'standard'`
      specialComments: 'all', // denotes a number of /*! ... */ comments preserved; defaults to `all`
      tidyAtRules: true, // controls at-rules (e.g. `@charset`, `@import`) optimizing; defaults to `true`
      tidyBlockScopes: true, // controls block scopes (e.g. `@media`) optimizing; defaults to `true`
      tidySelectors: true, // controls selectors optimizing; defaults to `true`,
      variableValueOptimizers: [] // controls value optimizers which are applied to variables
    }
  }
});

There is an all shortcut for toggling all options at the same time, e.g.

new CleanCSS({
  level: {
    1: {
      all: false, // set all values to `false`
      tidySelectors: true // turns on optimizing selectors
    }
  }
});

Level 2 optimizations

Level 2 optimizations operate at rules or multiple properties level, e.g. can remove duplicate rules, remove properties redefined further down a stylesheet, or restructure rules by moving them around.

Please note that if level 2 optimizations are turned on then, unless explicitely disabled, level 1 optimizations are applied as well.

Here is a full list of available options:

new CleanCSS({
  level: {
    2: {
      mergeAdjacentRules: true, // controls adjacent rules merging; defaults to true
      mergeIntoShorthands: true, // controls merging properties into shorthands; defaults to true
      mergeMedia: true, // controls `@media` merging; defaults to true
      mergeNonAdjacentRules: true, // controls non-adjacent rule merging; defaults to true
      mergeSemantically: false, // controls semantic merging; defaults to false
      overrideProperties: true, // controls property overriding based on understandability; defaults to true
      removeEmpty: true, // controls removing empty rules and nested blocks; defaults to `true`
      reduceNonAdjacentRules: true, // controls non-adjacent rule reducing; defaults to true
      removeDuplicateFontRules: true, // controls duplicate `@font-face` removing; defaults to true
      removeDuplicateMediaBlocks: true, // controls duplicate `@media` removing; defaults to true
      removeDuplicateRules: true, // controls duplicate rules removing; defaults to true
      removeUnusedAtRules: false, // controls unused at rule removing; defaults to false (available since 4.1.0)
      restructureRules: false, // controls rule restructuring; defaults to false
      skipProperties: [] // controls which properties won't be optimized, defaults to `[]` which means all will be optimized (since 4.1.0)
    }
  }
});

There is an all shortcut for toggling all options at the same time, e.g.

new CleanCSS({
  level: {
    2: {
      all: false, // sets all values to `false`
      removeDuplicateRules: true // turns on removing duplicate rules
    }
  }
});

Plugins

In clean-css version 5 and above you can define plugins which run alongside level 1 and level 2 optimizations, e.g.

var myPlugin = {
  level1: {
    property: function removeRepeatedBackgroundRepeat(_rule, property, _options) {
      // So `background-repeat:no-repeat no-repeat` becomes `background-repeat:no-repeat`
      if (property.name == 'background-repeat' && property.value.length == 2 && property.value[0][1] == property.value[1][1]) {
        property.value.pop();
        property.dirty = true;
      }
    }
  }
}

new CleanCSS({plugins: [myPlugin]})

Search test\module-test.js for plugins or check out lib/optimizer/level-1/property-optimizers and lib/optimizer/level-1/value-optimizers for more examples.

Important: To rewrite your old transform as a plugin, check out this commit.

Minify method

Once configured clean-css provides a minify method to optimize a given CSS, e.g.

var output = new CleanCSS(options).minify(source);

The output of the minify method is a hash with following fields:

console.log(output.styles); // optimized output CSS as a string
console.log(output.sourceMap); // output source map if requested with `sourceMap` option
console.log(output.errors); // a list of errors raised
console.log(output.warnings); // a list of warnings raised
console.log(output.stats.originalSize); // original content size after import inlining
console.log(output.stats.minifiedSize); // optimized content size
console.log(output.stats.timeSpent); // time spent on optimizations in milliseconds
console.log(output.stats.efficiency); // `(originalSize - minifiedSize) / originalSize`, e.g. 0.25 if size is reduced from 100 bytes to 75 bytes

Example: Minifying a CSS string:

const CleanCSS = require("clean-css");

const output = new CleanCSS().minify(`

  a {
    color: blue;
  }
  div {
    margin: 5px
  }

`);

console.log(output);

// Log:
{
  styles: 'a{color:#00f}div{margin:5px}',
  stats: {
    efficiency: 0.6704545454545454,
    minifiedSize: 29,
    originalSize: 88,
    timeSpent: 6
  },
  errors: [],
  inlinedStylesheets: [],
  warnings: []
}

The minify method also accepts an input source map, e.g.

var output = new CleanCSS(options).minify(source, inputSourceMap);

or a callback invoked when optimizations are finished, e.g.

new CleanCSS(options).minify(source, function (error, output) {
  // `output` is the same as in the synchronous call above
});

To optimize a single file, without reading it first, pass a path to it to minify method as follows:

var output = new CleanCSS(options).minify(['path/to/file.css'])

(if you won't enclose the path in an array, it will be treated as a CSS source instead).

There are several ways to optimize multiple files at the same time, see How to optimize multiple files?.

Promise interface

If you prefer clean-css to return a Promise object then you need to explicitely ask for it, e.g.

new CleanCSS({ returnPromise: true })
  .minify(source)
  .then(function (output) { console.log(output.styles); })
  .catch(function (error) { // deal with errors });

CLI utility

Clean-css has an associated command line utility that can be installed separately using npm install clean-css-cli. For more detailed information, please visit https://github.com/clean-css/clean-css-cli.

FAQ

How to optimize multiple files?

It can be done either by passing an array of paths, or, when sources are already available, a hash or an array of hashes:

new CleanCSS().minify(['path/to/file/one', 'path/to/file/two']);
new CleanCSS().minify({
  'path/to/file/one': {
    styles: 'contents of file one'
  },
  'path/to/file/two': {
    styles: 'contents of file two'
  }
});
new CleanCSS().minify([
  {'path/to/file/one': {styles: 'contents of file one'}},
  {'path/to/file/two': {styles: 'contents of file two'}}
]);

Passing an array of hashes allows you to explicitly specify the order in which the input files are concatenated. Whereas when you use a single hash the order is determined by the traversal order of object properties - available since 4.1.0.

Important note - any @import rules already present in the hash will be resolved in memory.

How to process multiple files without concatenating them into one output file?

Since clean-css 5.0 you can, when passing an array of paths, hash, or array of hashes (see above), ask clean-css not to join styles into one output, but instead return stylesheets optimized one by one, e.g.

var output = new CleanCSS({ batch: true }).minify(['path/to/file/one', 'path/to/file/two']);
var outputOfFile1 = output['path/to/file/one'].styles // all other fields, like errors, warnings, or stats are there too
var outputOfFile2 = output['path/to/file/two'].styles

How to process remote @imports correctly?

In order to inline remote @import statements you need to provide a callback to minify method as fetching remote assets is an asynchronous operation, e.g.:

var source = '@import url(http://example.com/path/to/remote/styles);';
new CleanCSS({ inline: ['remote'] }).minify(source, function (error, output) {
  // output.styles
});

If you don't provide a callback, then remote @imports will be left as is.

How to apply arbitrary transformations to CSS properties?

Please see plugins.

How to specify a custom rounding precision?

The level 1 roundingPrecision optimization option accept a string with per-unit rounding precision settings, e.g.

new CleanCSS({
  level: {
    1: {
      roundingPrecision: 'all=3,px=5'
    }
  }
}).minify(source)

which sets all units rounding precision to 3 digits except px unit precision of 5 digits.

How to optimize a stylesheet with custom rpx units?

Since rpx is a non standard unit (see #1074), it will be dropped by default as an invalid value.

However you can treat rpx units as regular ones:

new CleanCSS({
  compatibility: {
    customUnits: {
      rpx: true
    }
  }
}).minify(source)

How to keep a CSS fragment intact?

Note: available since 4.2.0.

Wrap the CSS fragment in special comments which instruct clean-css to preserve it, e.g.

.block-1 {
  color: red
}
/* clean-css ignore:start */
.block-special {
  color: transparent
}
/* clean-css ignore:end */
.block-2 {
  margin: 0
}

Optimizing this CSS will result in the following output:

.block-1{color:red}
.block-special {
  color: transparent
}
.block-2{margin:0}

How to preserve a comment block?

Use the /*! notation instead of the standard one /*:

/*!
  Important comments included in optimized output.
*/

How to rebase relative image URLs?

clean-css will handle it automatically for you in the following cases:

  • when full paths to input files are passed in as options;
  • when correct paths are passed in via a hash;
  • when rebaseTo is used with any of above two.

How to work with source maps?

To generate a source map, use sourceMap: true option, e.g.:

new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
  .minify(source, function (error, output) {
    // access output.sourceMap for SourceMapGenerator object
    // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
});

You can also pass an input source map directly as a 2nd argument to minify method:

new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory })
  .minify(source, inputSourceMap, function (error, output) {
    // access output.sourceMap to access SourceMapGenerator object
    // see https://github.com/mozilla/source-map/#sourcemapgenerator for more details
});

or even multiple input source maps at once:

new CleanCSS({ sourceMap: true, rebaseTo: pathToOutputDirectory }).minify({
  'path/to/source/1': {
    styles: '...styles...',
    sourceMap: '...source-map...'
  },
  'path/to/source/2': {
    styles: '...styles...',
    sourceMap: '...source-map...'
  }
}, function (error, output) {
  // access output.sourceMap as above
});

How to apply level 1 & 2 optimizations at the same time?

Using the hash configuration specifying both optimization levels, e.g.

new CleanCSS({
  level: {
    1: {
      all: true,
      normalizeUrls: false
    },
    2: {
      restructureRules: true
    }
  }
})

will apply level 1 optimizations, except url normalization, and default level 2 optimizations with rule restructuring.

What level 2 optimizations do?

All level 2 optimizations are dispatched here, and this is what they do:

  • recursivelyOptimizeBlocks - does all the following operations on a nested block, like @media or @keyframe;
  • recursivelyOptimizeProperties - optimizes properties in rulesets and flat at-rules, like @font-face, by splitting them into components (e.g. margin into margin-(bottom|left|right|top)), optimizing, and restoring them back. You may want to use mergeIntoShorthands option to control whether you want to turn multiple components into shorthands;
  • removeDuplicates - gets rid of duplicate rulesets with exactly the same set of properties, e.g. when including a Sass / Less partial twice for no good reason;
  • mergeAdjacent - merges adjacent rulesets with the same selector or rules;
  • reduceNonAdjacent - identifies which properties are overridden in same-selector non-adjacent rulesets, and removes them;
  • mergeNonAdjacentBySelector - identifies same-selector non-adjacent rulesets which can be moved (!) to be merged, requires all intermediate rulesets to not redefine the moved properties, or if redefined to have the same value;
  • mergeNonAdjacentByBody - same as the one above but for same-selector non-adjacent rulesets;
  • restructure - tries to reorganize different-selector different-rules rulesets so they take less space, e.g. .one{padding:0}.two{margin:0}.one{margin-bottom:3px} into .two{margin:0}.one{padding:0;margin-bottom:3px};
  • removeDuplicateFontAtRules - removes duplicated @font-face rules;
  • removeDuplicateMediaQueries - removes duplicated @media nested blocks;
  • mergeMediaQueries - merges non-adjacent @media at-rules by the same rules as mergeNonAdjacentBy* above;

What errors and warnings are?

If clean-css encounters invalid CSS, it will try to remove the invalid part and continue optimizing the rest of the code. It will make you aware of the problem by generating an error or warning. Although clean-css can work with invalid CSS, it is always recommended that you fix warnings and errors in your CSS.

Example: Minify invalid CSS, resulting in two warnings:

const CleanCSS = require("clean-css");

const output = new CleanCSS().minify(`

  a {
    -notarealproperty-: 5px;
    color:
  }
  div {
    margin: 5px
  }

`);

console.log(output);

// Log:
{
  styles: 'div{margin:5px}',
  stats: {
    efficiency: 0.8695652173913043,
    minifiedSize: 15,
    originalSize: 115,
    timeSpent: 1
  },
  errors: [],
  inlinedStylesheets: [],
  warnings: [
    "Invalid property name '-notarealproperty-' at 4:8. Ignoring.",
    "Empty property 'color' at 5:8. Ignoring."
  ]
}

Example: Minify invalid CSS, resulting in one error:

const CleanCSS = require("clean-css");

const output = new CleanCSS().minify(`

  @import "idontexist.css";
  a {
    color: blue;
  }
  div {
    margin: 5px
  }

`);

console.log(output);

// Log:
{
  styles: 'a{color:#00f}div{margin:5px}',
  stats: {
    efficiency: 0.7627118644067796,
    minifiedSize: 28,
    originalSize: 118,
    timeSpent: 2
  },
  errors: [
    'Ignoring local @import of "idontexist.css" as resource is missing.'
  ],
  inlinedStylesheets: [],
  warnings: []
}

Clean-css for Gulp

An example of how you can include clean-css in gulp

const { src, dest, series } = require('gulp');
const CleanCSS = require('clean-css');
const concat = require('gulp-concat');

function css() {
    const options = {
        compatibility: '*', // (default) - Internet Explorer 10+ compatibility mode
        inline: ['all'], // enables all inlining, same as ['local', 'remote']
        level: 2 // Optimization levels. The level option can be either 0, 1 (default), or 2, e.g.
        // Please note that level 1 optimization options are generally safe while level 2 optimizations should be safe for most users.
    };

    return src('app/**/*.css')
        .pipe(concat('style.min.css'))
        .on('data', function(file) {
            const buferFile = new CleanCSS(options).minify(file.contents)
            return file.contents = Buffer.from(buferFile.styles)
        })
        .pipe(dest('build'))
}
exports.css = series(css)

How to use clean-css with build tools?

There is a number of 3rd party plugins to popular build tools:

How to use clean-css from web browser?

Contributing

See CONTRIBUTING.md.

How to get started?

First clone the sources:

git clone git@github.com:clean-css/clean-css.git

then install dependencies:

cd clean-css
npm install

then use any of the following commands to verify your copy:

npm run bench # for clean-css benchmarks (see [test/bench.js](https://github.com/clean-css/clean-css/blob/master/test/bench.js) for details)
npm run browserify # to create the browser-ready clean-css version
npm run check # to lint JS sources with [JSHint](https://github.com/jshint/jshint/)
npm test # to run all tests

Acknowledgments

Sorted alphabetically by GitHub handle:

  • @abarre (Anthony Barre) for improvements to @import processing;
  • @alexlamsl (Alex Lam S.L.) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
  • @altschuler (Simon Altschuler) for fixing @import processing inside comments;
  • @ben-eb (Ben Briggs) for sharing ideas about CSS optimizations;
  • @davisjam (Jamie Davis) for disclosing ReDOS vulnerabilities;
  • @facelessuser (Isaac) for pointing out a flaw in clean-css' stateless mode;
  • @grandrath (Martin Grandrath) for improving minify method source traversal in ES6;
  • @jmalonzo (Jan Michael Alonzo) for a patch removing node.js' old sys package;
  • @lukeapage (Luke Page) for suggestions and testing the source maps feature; Plus everyone else involved in #125 for pushing it forward;
  • @madwizard-thomas for sharing ideas about @import inlining and URL rebasing.
  • @ngyikp (Ng Yik Phang) for testing early clean-css 4 versions, reporting bugs, and suggesting numerous improvements.
  • @wagenet (Peter Wagenet) for suggesting improvements to @import inlining behavior;
  • @venemo (Timur Kristóf) for an outstanding contribution of advanced property optimizer for 2.2 release;
  • @vvo (Vincent Voyer) for a patch with better empty element regex and for inspiring us to do many performance improvements in 0.4 release;
  • @xhmikosr for suggesting new features, like option to remove special comments and strip out URLs quotation, and pointing out numerous improvements like JSHint, media queries, etc.

License

clean-css is released under the MIT License.

changelog

5.3.3 / 2023-11-30

  • Fixed issue #1262 - dynamically require os for edge runtime compatibility.

5.3.2 / 2023-01-19

  • Fixed issue #1224 - incorrect parsing of selectors with double hyphen.
  • Fixed issue #1228 - incorrect appending of '%' inside rgba colors.
  • Fixed issue #1232 - support for @container keyword.
  • Fixed issue #1239 - edge case in handling @import statements.
  • Fixed issue #1242 - support for @layer keyword.

5.3.1 / 2022-07-13

  • Fixed issue #1218 - double hyphen in at-rule breaks parsing.
  • Fixed issue #1220 - adds optimization for nth-* rules.

5.3.0 / 2022-03-31

  • Adds customizable value optimizers for variables.
  • Fixed issue #1159 - adds optimization for nth-child and nth-of-type.
  • Fixed issue #1181 - CSS level 4 color functions with spaces.
  • Fixed issue #1183 - fraction optimizer breaks image-set.
  • Fixed issue #1208 - handling generic family names.
  • Fixed issue #1210 - handling file:// protocol.

5.2.4 / 2022-01-28

  • Fixed issue #1196 - correctly parse variables & comments mix.

5.2.3 / 2022-01-26

  • Fixed issue #1185 - keeping comments inside variables.
  • Fixed issue #1194 - unexpected end of JSON input when source map is empty.

5.2.2 / 2021-10-21

  • Fixed an unsafe data URI regex, which, when clean-css is used as a service, could be used in a DOS attack.

5.2.1 / 2021-09-30

  • Fixed issue #1186 - bad error handling in batch mode with promises.

5.2.0 / 2021-09-25

  • Fixed issue #1180 - properly handle empty variable values.

5.1.5 / 2021-08-05

  • Fixed issue #1178 - fixes lack of space removal in variable blocks.

5.1.4 / 2021-07-29

  • Fixed issue #1177 - fix to missing local imports when only remote ones allowed.

5.1.3 / 2021-06-25

  • Fixed issue #1160 - keep zero units when inside multiple functions.
  • Fixed issue #1161 - extra whitespace in URLs.
  • Fixed issue #1166 - incorrect compoment splitting when empty multiplex part.

5.1.2 / 2021-03-19

  • Fixed issue #996 - space removed from pseudo classes.

5.1.1 / 2021-03-03

  • Fixed issue #1156 - invalid hsl/hsla validation in level 2 optimizations.

5.1.0 / 2021-02-18

  • Fixes stripping '%' from inside color functions.
  • Improves tokenization speed by ~30%.
  • Fixed issue #1143 - some missing level 1 value optimizations.

5.0.1 / 2021-01-29

  • Fixed issue #1139 - overriding & merging properties without canOverride set.

5.0.0 / 2021-01-29

  • Adds a way process input files without bundling it into one big output file.
  • Adds level 1 and level 2 optimization plugins.
  • Disables URL rebasing by default.
  • Disables URL unquoting by default.
  • Drops support for Node.js 6 & 8 to support last 3 Node.js releases: 10, 12, and 14.
  • Fixed issue #889 - whitelisted level 1 optimizations.
  • Fixed issue #975 - incorrect block name optimization.
  • Fixed issue #1009 - whitespace around comments.
  • Fixed issue #1021 - allow one- and two-letter property names.
  • Fixed issue #1022 - merging into shorthands new property positioning.
  • Fixed issue #1032 - wrong order of merged shorthands with inherit.
  • Fixed issue #1043 - calc fallback removed within other function.
  • Fixed issue #1045 - non-standard protocol-less URL first slash removed.
  • Fixed issue #1050 - correctly keeps default animation duration if delay is also set.
  • Fixed issue #1053 - treats calc() as first class width value.
  • Fixed issue #1055 - supports 4- and 8-character hex with alpha color notation.
  • Fixed issue #1057 - level 2 optimizations and quoted font family name.
  • Fixed issue #1059 - animation time units as CSS expressions.
  • Fixed issue #1060 - variable removed when shorthand's only value.
  • Fixed issue #1062 - wrong optimization of CSS pseudo-classes with selector list.
  • Fixed issue #1073 - adds support for non-standard rpx units.
  • Fixed issue #1075 - media merging and variables.
  • Fixed issue #1087 - allow units with any case.
  • Fixed issue #1088 - building source maps with source preserved via comments.
  • Fixed issue #1090 - edge case in merging for border and border-image.
  • Fixed issue #1103 - don't allow merging longhand into unset shorthand.
  • Fixed issue #1115 - incorrect multiplex longhand into shorthand merging.
  • Fixed issue #1117 - don't change zero values inside min, max, and clamp functions.
  • Fixed issue #1122 - don't wrap data URI in single quotes.
  • Fixed issue #1125 - quotes stripped from withing @supports clause.
  • Fixed issue #1128 - take variables into account when reordering properties.
  • Fixed issue #1132 - vendor-prefixed classes inside :not().
  • Reworks all level 1 optimizations to conform to plugin style.

4.2.3 / 2020-01-28

  • Fixed issue #1106 - regression in handling RGBA/HSLA colors.

4.2.2 / 2020-01-25

  • Fixed error when property block has no value.
  • Fixed issue #1077 - local fonts with color in name.
  • Fixed issue #1082 - correctly convert colors if alpha >= 1.
  • Fixed issue #1085 - prevent unquoting of grid elements.

4.2.1 / 2018-08-07

  • Fixes giving breakWith option via a string.

4.2.0 / 2018-08-02

  • Adds process method for compatibility with optimize-css-assets-webpack-plugin.
  • Fixed issue #861 - new transition property optimizer.
  • Fixed issue #895 - ignoring specific styles.
  • Fixed issue #947 - selector based filtering.
  • Fixed issue #964 - adds configurable line breaks.
  • Fixed issue #986 - level 2 optimizations and CSS 4 colors.
  • Fixed issue #1000 - carriage return handling in tokenizer.
  • Fixed issue #1038 - font-variation-settings quoting.
  • Fixes ReDOS vulnerabilities in validator code.

4.1.11 / 2018-03-06

  • Backports fixes to ReDOS vulnerabilities in validator code.

4.1.10 / 2018-03-05

  • Fixed issue #988 - edge case in dropping default animation-duration.
  • Fixed issue #989 - edge case in removing unused at rules.
  • Fixed issue #1001 - corrupted tokenizer state.
  • Fixed issue #1006 - edge case in handling invalid source maps.
  • Fixed issue #1008 - edge case in breaking up font shorthand.

4.1.9 / 2017-09-19

  • Fixed issue #971 - edge case in removing unused at rules.

4.1.8 / 2017-09-02

  • Fixed issue #959 - regression in shortening long hex values.
  • Fixed issue #960 - better explanation of efficiency stat.
  • Fixed issue #965 - edge case in parsing comment endings.
  • Fixed issue #966 - remote @imports referenced from local ones.

4.1.7 / 2017-07-14

  • Fixed issue #957 - 0% minification of width property.

4.1.6 / 2017-07-08

  • Fixed issue #887 - edge case in serializing comments.
  • Fixed issue #953 - beautify breaks attribute selectors.

4.1.5 / 2017-06-29

  • Fixed issue #945 - hex RGBA colors in IE filters.
  • Fixed issue #952 - parsing @page according to CSS3 spec.

4.1.4 / 2017-06-14

  • Fixed issue #950 - bug in removing unused @font-face rules.

4.1.3 / 2017-05-18

  • Fixed issue #946 - tokenizing -ms-grid-columns repeat syntax.

4.1.2 / 2017-05-10

  • Fixed issue #939 - semicolon after @apply at rule.
  • Fixed issue #940 - handling more font keywords.
  • Fixed issue #941 - breaking up vendor prefixed animation.

4.1.1 / 2017-05-08

  • Fixed issue #938 - removing unused at-rules with !important.

4.1.0 / 2017-05-07

  • Improves longhand-into-shorthand merging mechanism in complex cases as with border-* shorthands.
  • Fixed issue #254 - adds font property optimizer.
  • Fixed issue #525 - restores inherit-based merging.
  • Fixed issue #755 - adds custom handling of remote requests.
  • Fixed issue #860 - adds animation property optimizer.
  • Fixed issue #862 - allows removing unused at rules.
  • Fixed issue #886 - better multi pseudo class / element merging.
  • Fixed issue #890 - adds toggle to disable empty tokens removal.
  • Fixed issue #893 - inline: false as alias to inline: 'none'.
  • Fixed issue #905 - allows disabling selector sorting.
  • Fixed issue #906 - improves usability of web UI settings.
  • Fixed issue #908 - improved minify method signature.
  • Fixed issue #916 - maximum number of merged selectors.
  • Fixed issue #920 - allows skipping certain properties in level 2 optimizations.
  • Fixed issue #934 - smarter longhand into shorthand merging.

4.0.13 / 2017-05-10

  • Backports #939 - semicolon after @apply at rule.

4.0.12 / 2017-04-12

  • Fixed issue #930 - regression in tidying selectors.

4.0.11 / 2017-04-04

  • Fixed issue #924 - hsl zero percent eager optimization.

4.0.10 / 2017-03-22

  • Fixed issue #917 - prevents grid area unquoting.
  • Backported #916 - maximum number of merged selectors.
  • Refixed issue #556 - IE backslash hacks.

4.0.9 / 2017-03-15

  • Fixed issue #902 - case insensitive attribute matchers.
  • Fixed issue #903 - web UI and source maps.
  • Fixed issue #907 - space after closing brace in @supports.
  • Fixed issue #910 - too aggressive precision optimizations.

4.0.8 / 2017-02-22

  • Fixes edge case in remote stylesheet fetching.
  • Fixed issue #899 - regression in optimizing pseudo class arguments.

4.0.7 / 2017-02-14

  • Fixed issue #891 - merging vendor-prefixed pseudo-classes.

4.0.6 / 2017-02-10

  • Fixed issue #885 - unquoting font-feature-settings.

4.0.5 / 2017-02-07

  • Fixed issue #884 - handling absolute paths on Windows.
  • Fixed issue #881 - incorrect require arity.
  • Fixed issue #880 - incorrect token type identification.

4.0.4 / 2017-02-04

  • Fixed issue #879 - incorrect handling of spaces in paths.
  • Fixed issue #878 - invalid double backslash tokenization.

4.0.3 / 2017-01-30

  • Fixed issue #875 - invalid traversing in semantic merging.

4.0.2 / 2017-01-26

  • Fixed issue #874 - regression in at-rule tokenization.

4.0.1 / 2017-01-25

  • Fixed issue #866 - edge case in inline option.
  • Fixed issue #867 - skip optimizing variable values.
  • Fixed issue #868 - accept absolute paths in input hash.
  • Fixed issue #872 - edge case in CSS tokenization.

4.0.0 / 2017-01-23

  • Adds more detailed error & warning messages on top of the new tokenizer.
  • Disables restructuring optimizations by default until optimized in #533.
  • Fixes a bug ignoring incorrect properties in complex restructuring.
  • Requires Node.js 4.0+ to run.
  • Removes benchmark API option as total time is always reported under stats property.
  • Removes debug API switch as stats are always gathered and available under stats property.
  • Replaces the old tokenizer with a new one which doesn't use any escaping.
  • Replaces the old @import inlining with one on top of the new tokenizer.
  • Re-enables background-(clip|origin|size) merging with background shorthand.
  • Simplifies URL rebasing with a single rebaseTo option in API or inferred from --output in CLI.
  • Splits inliner option into inlineRequest and inlineTimeout.
  • Fixed issue #209 - adds output formatting via format flag.
  • Fixed issue #290 - removes aggressive merging.
  • Fixed issue #432 - adds URLs normalization.
  • Fixed issue #460 - unescaped semicolon in selector.
  • Fixed issue #657 - adds property name validation.
  • Fixed issue #685 - adds lowercasing hex colors optimization.
  • Fixed issue #686 - adds rounding precision for all units.
  • Fixed issue #703 - changes default IE compatibility to 10+.
  • Fixed issue #731 - adds granular control over level 2 optimizations.
  • Fixed issue #739 - error when a closing brace is missing.
  • Fixed issue #750 - allows width overriding.
  • Fixed issue #756 - adds disabling font-weight optimizations.
  • Fixed issue #758 - ignores rules with empty selector.
  • Fixed issue #767 - disables remote @import inlining by default.
  • Fixed issue #773 - adds reordering based on selector specificity.
  • Fixed issue #785 - adds @font-face de-duplication.
  • Fixed issue #791 - resolves imports in-memory if possible.
  • Fixed issue #796 - semantic merging for @media blocks.
  • Fixed issue #801 - smarter @import inlining.
  • Fixed issue #806 - skip optimizing variable properties.
  • Fixed issue #817 - makes off disable rounding.
  • Fixed issue #818 - disables px rounding by default.
  • Fixed issue #828 - -chrome- hack support.
  • Fixed issue #829 - adds more strict selector merging rules.
  • Fixed issue #834 - adds extra line break in nested blocks.
  • Fixed issue #836 - enables level 0 optimizations.
  • Fixed issue #839 - allows URIs in import inlining rules.
  • Fixed issue #840 - allows input source map as map object.
  • Fixed issue #843 - regression in selector handling.
  • Fixed issue #845 - web compatibility of 4.0 branch.
  • Fixed issue #847 - regression in handling invalid selectors.
  • Fixed issue #849 - disables inlining protocol-less resources.
  • Fixed issue #856 - allows minify to return a promise.
  • Fixed issue #857 - normalizes CleanCSS API interface.
  • Fixed issue #863 - adds transform callback for custom optimizations.

3.4.26 / 2017-05-10

  • Backports #939 - semicolon after @apply at-rule.

3.4.25 / 2017-02-22

  • Fixed issue #897 - tokenization with escaped markers.

3.4.24 / 2017-01-20

  • Fixed issue #859 - avoid -webkit-border-radius optimizations.

3.4.23 / 2016-12-17

  • Fixed issue #844 - regression in property values extraction.

3.4.22 / 2016-12-12

  • Fixed issue #841 - disabled importing and files passed as array.
  • Ignores @import at-rules if appearing after any non-@import rules.

3.4.21 / 2016-11-16

  • Fixed issue #821 - reducing non-adjacent rules.
  • Fixed issue #830 - reordering border-* properties.
  • Fixed issue #833 - moving @media queries.

3.4.20 / 2016-09-26

  • Fixed issue #814 - :selection rule merging.

3.4.19 / 2016-07-25

  • Fixed issue #795 - !important and override compacting.

3.4.18 / 2016-06-15

  • Fixed issue #787 - regression in processing data URIs.

3.4.17 / 2016-06-04

  • Fixed issue #783 - regression in processing data URIs.

3.4.16 / 2016-06-02

  • Fixed issue #781 - regression in override compacting.
  • Fixed issue #782 - regression in processing data URIs.

3.4.15 / 2016-06-01

  • Fixed issue #776 - edge case in quoted data URIs.
  • Fixed issue #779 - merging background-(position|size).
  • Fixed issue #780 - space after inlined variables.

3.4.14 / 2016-05-31

  • Fixed issue #751 - stringifying CSS variables.
  • Fixed issue #763 - data URI SVG and quoting.
  • Fixed issue #765 - two values of border-radius.
  • Fixed issue #768 - invalid border-radius property.

3.4.13 / 2016-05-23

  • Fixed issue #734 - Node.js 6.x support.

3.4.12 / 2016-04-09

  • Fixed issue #734 - --root option edge case.
  • Fixed issue #758 - treats empty rule as unmergeable.

3.4.11 / 2016-04-01

  • Fixed issue #738 - edge case in comment processing.
  • Fixed issue #741 - HTTP proxy with HTTPS inlining.
  • Fixed issue #743 - background shorthand and source maps.
  • Fixed issue #745 - matching mixed case !important.

3.4.10 / 2016-02-29

  • Fixed issue #735 - whitespace removal with escaped chars.

3.4.9 / 2016-01-03

  • Sped up merging by body advanced optimization.
  • Fixed issue #693 - restructuring edge case.
  • Fixed issue #711 - border fuzzy matching.
  • Fixed issue #714 - stringifying property level at rules.
  • Fixed issue #715 - stack too deep in comment scan.

3.4.8 / 2015-11-13

  • Fixed issue #676 - fuzzy matching unqoted data URIs.

3.4.7 / 2015-11-10

  • Fixed issue #692 - edge case in URL quoting.
  • Fixed issue #695 - shorthand overriding edge case.
  • Fixed issue #699 - IE9 transparent hack.
  • Fixed issue #701 - url quoting with hash arguments.

3.4.6 / 2015-10-14

  • Fixed issue #679 - wrong rebasing of remote URLs.

3.4.5 / 2015-09-28

  • Fixed issue #681 - property inheritance & restructuring.
  • Fixed issue #675 - overriding with !important.

3.4.4 / 2015-09-21

  • Fixed issue #626 - edge case in import rebasing.
  • Fixed issue #674 - adjacent merging order.

3.4.3 / 2015-09-15

  • Fixed issue #668 - node v4 path.join.
  • Fixed issue #669 - adjacent overriding with !important.

3.4.2 / 2015-09-14

  • Fixed issue #598 - restructuring border properties.
  • Fixed issue #654 - disables length optimizations.
  • Fixed issue #655 - shorthands override merging.
  • Fixed issue #660 - !important token overriding.
  • Fixed issue #662 - !important selector reducing.
  • Fixed issue #667 - rebasing remote URLs.

3.4.1 / 2015-08-27

  • Fixed issue #652 - order of restoring and removing tokens.

3.4.0 / 2015-08-27

  • Adds an option for a fine-grained @import control.
  • Adds unit compatibility switches to disable length optimizations.
  • Adds inferring proxy settings from HTTP_PROXY environment variable.
  • Adds support for Polymer / Web Components special selectors.
  • Adds support for Polymer mixins.
  • Adds testing source maps in batch mode.
  • Unifies wrappers for simple & advanced optimizations.
  • Fixed issue #596 - support for !ie IE<8 hack.
  • Fixed issue #599 - support for inlined source maps.
  • Fixed issue #607 - adds better rule reordering.
  • Fixed issue #612 - adds HTTP proxy support.
  • Fixed issue #618 - adds safer function validation.
  • Fixed issue #625 - adds length unit optimizations.
  • Fixed issue #632 - adds disabling remote imports.
  • Fixed issue #635 - adds safer 0% optimizations.
  • Fixed issue #644 - adds time unit optimizations.
  • Fixed issue #645 - adds bottom to top media merging.
  • Fixed issue #648 - adds property level at-rule support.

3.3.10 / 2015-08-27

  • Adds better comments + keepBreaks handling.
  • Adds better text normalizing in source maps mode.
  • Fixes non-adjacent optimizations for source maps.
  • Fixes removing unused items.
  • Improves outline break up with source maps.
  • Refixed issue #629 - source maps & background shorthands.

3.3.9 / 2015-08-09

  • Fixed issue #640 - URI processing regression.

3.3.8 / 2015-08-06

  • Fixed issue #629 - source maps & background shorthands.
  • Fixed issue #630 - vendor prefixed flex optimizations.
  • Fixed issue #633 - handling data URI with brackets.
  • Fixed issue #634 - merging :placeholder selectors.

3.3.7 / 2015-07-29

  • Fixed issue #616 - ordering in restructuring.

3.3.6 / 2015-07-14

  • Fixed issue #620 - bold style in font shorthands.

3.3.5 / 2015-07-01

  • Fixed issue #608 - custom URI protocols handling.

3.3.4 / 2015-06-24

  • Fixed issue #610 - border:inherit restoring.
  • Fixed issue #611 - edge case in quote stripping.

3.3.3 / 2015-06-16

  • Fixed issue #603 - IE suffix hack defaults to on.

3.3.2 / 2015-06-14

  • Fixed issue #595 - more relaxed block matching.
  • Fixed issue #601 - percentage minifying inside flex.
  • Fixed issue #602 - backslash IE hacks after a space.

3.3.1 / 2015-06-02

  • Fixed issue #590 - edge case in @import processing.

3.3.0 / 2015-05-31

  • Cleans up url rebase code getting rid of unnecessary state.
  • Cleans up tokenizer code getting rid of unnecessary state.
  • Moves source maps tracker into lib/source-maps/track.
  • Moves tokenizer code into lib/tokenizer.
  • Moves URL scanner into lib/urls/reduce (was named incorrectly before).
  • Moves URL rebasing & rewriting into lib/urls.
  • Fixed issue #375 - unit compatibility switches.
  • Fixed issue #436 - refactors URI rewriting.
  • Fixed issue #448 - rebasing no protocol URIs.
  • Fixed issue #517 - turning off color optimizations.
  • Fixed issue #542 - space after closing brace in IE.
  • Fixed issue #562 - optimizing invalid color values.
  • Fixed issue #563 - background:inherit restoring.
  • Fixed issue #570 - rebasing "no-url()" imports.
  • Fixed issue #574 - rewriting internal URLs.
  • Fixed issue #575 - missing directory as a target.
  • Fixed issue #577 - background-clip into shorthand.
  • Fixed issue #579 - background-origin into shorthand.
  • Fixed issue #580 - mixed @import processing.
  • Fixed issue #582 - overriding with prefixed values.
  • Fixed issue #583 - URL quoting for SVG data.
  • Fixed issue #587 - too aggressive border reordering.

3.2.11 / 2015-05-31

  • Fixed issue #563 - background:inherit restoring.
  • Fixed issue #582 - overriding with prefixed values.
  • Fixed issue #583 - URL quoting for SVG data.
  • Fixed issue #587 - too aggressive border reordering.

3.2.10 / 2015-05-14

  • Fixed issue #572 - empty elements removal.

3.2.9 / 2015-05-08

  • Fixed issue #567 - merging colors as functions.

3.2.8 / 2015-05-04

  • Fixed issue #561 - restructuring special selectors.

3.2.7 / 2015-05-03

  • Fixed issue #551 - edge case in restructuring.
  • Fixed issue #553 - another style of SVG fallback.
  • Fixed issue #558 - units in same selector merging.

3.2.6 / 2015-04-28

  • Fixed issue #550 - proper contentSources tracking.
  • Fixed issue #556 - regression in IE backslash hacks.

3.2.5 / 2015-04-25

  • Fixed issue #543 - better "comment in body" handling.
  • Fixed issue #548 - regression in font minifying.
  • Fixed issue #549 - special comments in source maps.

3.2.4 / 2015-04-24

  • Fixed issue #544 - regression in same value merging.
  • Fixed issue #546 - IE<11 calc() issue.

3.2.3 / 2015-04-22

  • Fixed issue #541 - outline-style:auto in shorthand.

3.2.2 / 2015-04-21

  • Fixed issue #537 - regression in simple optimizer.

3.2.1 / 2015-04-20

  • Fixed issue #534 - wrong @font-face stringifying.

3.2.0 / 2015-04-19

  • Bumps commander to 2.8.x.
  • Fixes remote asset rebasing when passing data as a hash.
  • Improves path resolution inside source maps.
  • Makes root option implicitely default to process.cwd().
  • Fixed issue #371 - background fallback with none.
  • Fixed issue #376 - option to disable 0[unit] -> 0.
  • Fixed issue #396 - better input source maps tracking.
  • Fixed issue #397 - support for source map sources.
  • Fixed issue #399 - support compacting with source maps.
  • Fixed issue #429 - unifies data tokenization.
  • Fixed issue #446 - list-style fuzzy matching.
  • Fixed issue #468 - bumps source-map to 0.4.x.
  • Fixed issue #480 - extracting uppercase property names.
  • Fixed issue #487 - source map paths under Windows.
  • Fixed issue #490 - vendor prefixed multivalue background.
  • Fixed issue #500 - merging duplicate adjacent properties.
  • Fixed issue #504 - keeping url() quotes.
  • Fixed issue #507 - merging longhands into many shorthands.
  • Fixed issue #508 - removing duplicate media queries.
  • Fixed issue #521 - unit optimizations inside calc().
  • Fixed issue #524 - timeouts in @import inlining.
  • Fixed issue #526 - shorthand overriding into a function.
  • Fixed issue #528 - better support for IE<9 hacks.
  • Fixed issue #529 - wrong font weight minification.

3.1.9 / 2015-04-04

  • Fixes issue #511 - ) advanced processing.

3.1.8 / 2015-03-17

  • Fixes issue #498 - reordering and flexbox.
  • Fixes issue #499 - too aggressive - removal.

3.1.7 / 2015-03-16

  • Backports fix to #480 - reordering and uppercase properties.
  • Fixes issue #496 - space after bracket removal.

3.1.6 / 2015-03-12

  • Fixes issue #489 - AlphaImageLoader IE filter.

3.1.5 / 2015-03-06

  • Fixes issue #483 - property order in restructuring.

3.1.4 / 2015-03-04

  • Fixes issue #472 - broken function minification.
  • Fixes issue #477 - @imports order in restructuring.
  • Fixes issue #478 - ultimate fix to brace whitespace.

3.1.3 / 2015-03-03

  • Fixes issue #464 - data URI with quoted braces.
  • Fixes issue #475 - whitespace after closing brace.

3.1.2 / 2015-03-01

  • Refixed issue #471 - correct order after restructuring.
  • Fixes issue #466 - rebuilding background shorthand.
  • Fixes issue #462 - escaped apostrophes in selectors.

3.1.1 / 2015-02-27

  • Fixed issue #469 - extracting broken property.
  • Fixed issue #470 - negative padding removal.
  • Fixed issue #471 - correct order after restructuring.

3.1.0 / 2015-02-26

  • Adds 0deg to 0 minification where possible.
  • Adds better non-adjacent selector merging when body is the same.
  • Adds official support for node.js 0.12.
  • Adds official support for io.js 1.0.
  • Adds restructuring optimizations to reorganize selectors, which vastly improves minification.
  • Fixed issue #158 - adds body-based selectors reduction.
  • Fixed issue #182 - removing space after closing brace.
  • Fixed issue #204 - @media merging.
  • Fixed issue #351 - remote @imports after content.
  • Fixed issue #357 - non-standard but valid URLs.
  • Fixed issue #416 - accepts hash as minify argument.
  • Fixed issue #419 - multiple input source maps.
  • Fixed issue #435 - background-clip in shorthand.
  • Fixed issue #439 - background-origin in shorthand.
  • Fixed issue #442 - space before adjacent nav.
  • Fixed issue #445 - regression issue in url processor.
  • Fixed issue #449 - warns of missing close braces.
  • Fixed issue #463 - relative remote @import URLs.

3.0.10 / 2015-02-07

  • Fixed issue #453 - double background-repeat.
  • Fixed issue #455 - property extracting regression.

3.0.9 / 2015-02-04

  • Fixed issue #452 - regression in advanced merging.

3.0.8 / 2015-01-31

  • Fixed issue #447 - background-color in shorthands.
  • Fixed issue #450 - name to hex color converting.

3.0.7 / 2015-01-22

  • Fixed issue #441 - hex to name color converting.

3.0.6 / 2015-01-20

  • Refixed issue #414 - source maps position fallback.

3.0.5 / 2015-01-18

  • Fixed issue #414 - source maps position fallback.
  • Fixed issue #433 - meging !important in shorthands.

3.0.4 / 2015-01-11

  • Fixed issue #314 - spaces inside calc.

3.0.3 / 2015-01-07

  • Just a version bump as npm incorrectly things 2.2.23 is the latest one.

3.0.2 / 2015-01-04

  • Fixed issue #422 - handling calc as a unit.

3.0.1 / 2014-12-19

  • Fixed issue #410 - advanced merging and comments.
  • Fixed issue #411 - properties and important comments.

3.0.0 / 2014-12-18

  • Adds more granular control over compatibility settings.
  • Adds support for @counter-style at-rule.
  • Adds --source-map/sourceMap switch for building input's source map.
  • Adds --skip-shorthand-compacting/shorthandComacting option for disabling shorthand compacting.
  • Allows target option to be a path to a folder instead of a file.
  • Allows disabling rounding precision. By @superlukas.
  • Breaks 2.x compatibility for using CleanCSS as a function.
  • Changes minify method output to handle multiple outputs.
  • Reworks minification to tokenize first then minify. See changes.
  • Removes support for node.js 0.8.x.
  • Renames noAdvanced option into advanced.
  • Renames noAggressiveMerging option into aggressiveMerging.
  • Renames noRebase option into rebase.
  • Speeds up advanced processing by shortening optimize loop.
  • Fixed issue #125 - source maps!
  • Fixed issue #344 - merging background-size into shorthand.
  • Fixed issue #352 - honors rebasing in imported stylesheets.
  • Fixed issue #360 - adds 7 extra CSS colors.
  • Fixed issue #363 - rem units overriding px.
  • Fixed issue #373 - proper background shorthand merging.
  • Fixed issue #395 - unescaped brackets in data URIs.
  • Fixed issue #398 - restoring important comments.
  • Fixed issue #400 - API to accept an array of filenames.
  • Fixed issue #403 - tracking input files in source maps.
  • Fixed issue #404 - no state sharing in API.
  • Fixed issue #405 - disables default background-size merging.
  • Refixed issue #304 - background-position merging.

2.2.22 / 2014-12-13

  • Backports fix to issue #304 - background-position merging.

2.2.21 / 2014-12-10

  • Backports fix to issue #373 - background shorthand merging.

2.2.20 / 2014-12-02

  • Backports fix to issue #390 - pseudo-class merging.

2.2.19 / 2014-11-20

  • Fixed issue #385 - edge cases in processing cut off data.

2.2.18 / 2014-11-17

  • Fixed issue #383 - rounding fractions once again.

2.2.17 / 2014-11-09

  • Fixed issue #380 - rounding fractions to a whole number.

2.2.16 / 2014-09-16

  • Fixed issue #359 - handling escaped double backslash.
  • Fixed issue #358 - property merging in compatibility mode.
  • Fixed issue #356 - preserving *+html hack.
  • Fixed issue #354 - !important overriding in shorthands.

2.2.15 / 2014-09-01

  • Fixed issue #343 - too aggressive rgba/hsla minification.
  • Fixed issue #345 - URL rebasing for document relative ones.
  • Fixed issue #346 - overriding !important by !important.
  • Fixed issue #350 - edge cases in @import processing.

2.2.14 / 2014-08-25

  • Makes multival operations idempotent.
  • Fixed issue #339 - skips invalid properties.
  • Fixed issue #341 - ensure output is shorter than input.

2.2.13 / 2014-08-12

  • Fixed issue #337 - handling component importance.

2.2.12 / 2014-08-02

  • Fixed issue with tokenizer removing first selector after an unknown @ rule.
  • Fixed issue #329 - font shorthands incorrectly processed.
  • Fixed issue #332 - background shorthand with colors.
  • Refixed issue #325 - invalid charset declarations.

2.2.11 / 2014-07-28

  • Fixed issue #326 - background-size regression.

2.2.10 / 2014-07-27

  • Improved performance of advanced mode validators.
  • Fixed issue #307 - background-color in multiple backgrounds.
  • Fixed issue #322 - adds background-size support.
  • Fixed issue #323 - stripping variable references.
  • Fixed issue #325 - removing invalid @charset declarations.

2.2.9 / 2014-07-23

  • Adds background normalization according to W3C spec.
  • Fixed issue #316 - incorrect background processing.

2.2.8 / 2014-07-14

  • Fixed issue #313 - processing comment marks in URLs.
  • Fixed issue #315 - rgba/hsla -> transparent in gradients.

2.2.7 / 2014-07-10

  • Fixed issue #304 - merging multiple backgrounds.
  • Fixed issue #312 - merging with mixed repeat.

2.2.6 / 2014-07-05

  • Adds faster quote matching in QuoteScanner.
  • Improves QuoteScanner to handle comments correctly.
  • Fixed issue #308 - parsing comments in quoted URLs.
  • Fixed issue #311 - leading/trailing decimal points.

2.2.5 / 2014-06-29

  • Adds removing extra spaces around / in border-radius.
  • Adds replacing same horizontal & vertical value in border-radius.
  • Fixed issue #305 - allows width keywords in border-width.

2.2.4 / 2014-06-27

  • Fixed issue #301 - proper border-radius processing.
  • Fixed issue #303 - correctly preserves viewport units.

2.2.3 / 2014-06-24

  • Fixed issue #302 - handling of outline-style: auto.

2.2.2 / 2014-06-18

  • Fixed issue #297 - box-shadow zeros minification.

2.2.1 / 2014-06-14

  • Fixes new property optimizer for 'none' values.
  • Fixed issue #294 - space after rgba/hsla in IE<=11.

2.2.0 / 2014-06-11

  • Adds a better algorithm for quotation marks' removal.
  • Adds a better non-adjacent optimizer compatible with the upcoming new property optimizer.
  • Adds minifying remote files directly from CLI.
  • Adds --rounding-precision to control rounding precision.
  • Moves quotation matching into a QuoteScanner class.
  • Adds npm run browserify for creating embeddable version of clean-css.
  • Fixed list-style-* advanced processing.
  • Fixed issue #134 - merges properties into shorthand form.
  • Fixed issue #164 - removes default values if not needed.
  • Fixed issue #168 - adds better property merging algorithm.
  • Fixed issue #173 - merges same properties if grouped.
  • Fixed issue #184 - uses !important for optimization opportunities.
  • Fixed issue #190 - uses shorthand to override another shorthand.
  • Fixed issue #197 - adds borders merging by understandability.
  • Fixed issue #210 - adds temporary workaround for aggressive merging.
  • Fixed issue #246 - removes IE hacks when not in compatibility mode.
  • Fixed issue #247 - removes deprecated selectorsMergeMode switch.
  • Refixed issue #250 - based on new quotation marks removal.
  • Fixed issue #257 - turns rgba/hsla to transparent if possible.
  • Fixed issue #265 - adds support for multiple input files.
  • Fixed issue #275 - handling transform properties.
  • Fixed issue #276 - corrects unicode handling.
  • Fixed issue #288 - adds smarter expression parsing.
  • Fixed issue #293 - handles escaped @ symbols in class names and IDs.

2.1.8 / 2014-03-28

  • Fixed issue #267 - incorrect non-adjacent selector merging.

2.1.7 / 2014-03-24

  • Fixed issue #264 - @import statements inside comments.

2.1.6 / 2014-03-10

  • Fixed issue #258 - wrong @import handling in EmptyRemoval.

2.1.5 / 2014-03-07

  • Fixed issue #255 - incorrect processing of a trailing -0.

2.1.4 / 2014-03-01

  • Fixed issue #250 - correctly handle JSON data in quotations.

2.1.3 / 2014-02-26

  • Fixed issue #248 - incorrect merging for vendor selectors.

2.1.2 / 2014-02-25

  • Fixed issue #245 - incorrect handling of backslash IE hack.

2.1.1 / 2014-02-18

  • Adds faster selectors processing in advanced optimizer.
  • Fixed issue #241 - incorrect handling of :not() selectors.

2.1.0 / 2014-02-13

  • Adds an optional callback to minify method.
  • Deprecates --selectors-merge-mode / selectorsMergeMode in favor to --compatibility / compatibility.
  • Fixes debug mode stats for stylesheets using @import statements.
  • Skips empty removal if advanced processing is enabled.
  • Fixed issue #85 - resolving protocol @imports.
  • Fixed issue #160 - re-runs optimizer until a clean pass.
  • Fixed issue #161 - improves tokenizer performance.
  • Fixed issue #163 - round pixels to 2nd decimal place.
  • Fixed issue #165 - extra space after trailing parenthesis.
  • Fixed issue #186 - strip unit from 0rem.
  • Fixed issue #207 - bug in parsing protocol @imports.
  • Fixed issue #213 - faster rgb to hex transforms.
  • Fixed issue #215 - leading zeros in numerical values.
  • Fixed issue #217 - whitespace inside attribute selectors and URLs.
  • Fixed issue #218 - @import statements cleanup.
  • Fixed issue #220 - selector between comments.
  • Fixed issue #223 - two-pass adjacent selectors merging.
  • Fixed issue #226 - don't minify border:none to border:0.
  • Fixed issue #229 - improved processing of fraction numbers.
  • Fixed issue #230 - better handling of zero values.
  • Fixed issue #235 - IE7 compatibility mode.
  • Fixed issue #236 - incorrect rebasing with nested imports.

2.0.8 / 2014-02-07

  • Fixed issue #232 - edge case in non-adjacent selectors merging.

2.0.7 / 2014-01-16

  • Fixed issue #208 - don't swallow @page and @viewport.

2.0.6 / 2014-01-04

  • Fixed issue #198 - process comments and @imports correctly.
  • Fixed issue #205 - freeze on broken @import declaration.

2.0.5 / 2014-01-03

  • Fixed issue #199 - keep line breaks with no advanced optimizations.
  • Fixed issue #203 - Buffer as a first argument to minify method.

2.0.4 / 2013-12-19

  • Fixed issue #193 - HSL color space normalization.

2.0.3 / 2013-12-18

  • Fixed issue #191 - leading numbers in font/animation names.
  • Fixed issue #192 - many @imports inside a comment.

2.0.2 / 2013-11-18

  • Fixed issue #177 - process broken content correctly.

2.0.1 / 2013-11-14

  • Fixed issue #176 - hangs on undefined keyword.

2.0.0 / 2013-11-04

  • Adds simplified and more advanced text escaping / restoring via EscapeStore class.
  • Adds simplified and much faster empty elements removal.
  • Adds missing @import processing to our benchmark (run via npm run bench).
  • Adds CSS tokenizer which will make it possible to optimize content by reordering and/or merging selectors.
  • Adds basic optimizer removing duplicate selectors from a list.
  • Adds merging duplicate properties within a single selector's body.
  • Adds merging adjacent selectors within a scope (single and multiple ones).
  • Changes behavior of --keep-line-breaks/keepBreaks option to keep breaks after trailing braces only.
  • Makes all multiple selectors ordered alphabetically (aids merging).
  • Adds property overriding so more coarse properties override more granular ones.
  • Adds reducing non-adjacent selectors.
  • Adds --skip-advanced/noAdvanced switch to disable advanced optimizations.
  • Adds reducing non-adjacent selectors when overridden by more complex selectors.
  • Fixed issue #138 - makes CleanCSS interface OO.
  • Fixed issue #139 - consistent error & warning handling.
  • Fixed issue #145 - debug mode in library too.
  • Fixed issue #157 - gets rid of removeEmpty option.
  • Fixed issue #159 - escaped quotes inside content.
  • Fixed issue #162 - strip quotes from Base64 encoded URLs.
  • Fixed issue #166 - debug formatting in CLI
  • Fixed issue #167 - background:transparent minification.

1.1.7 / 2013-10-28

  • Fixed issue #156 - @imports inside comments.

1.1.6 / 2013-10-26

  • Fixed issue #155 - broken irregular CSS content.

1.1.5 / 2013-10-24

  • Fixed issue #153 - keepSpecialComments 0/1 as a string.

1.1.4 / 2013-10-23

  • Fixed issue #152 - adds an option to disable rebasing.

1.1.3 / 2013-10-04

  • Fixed issue #150 - minifying background:none.

1.1.2 / 2013-09-29

  • Fixed issue #149 - shorthand font property.

1.1.1 / 2013-09-07

  • Fixed issue #144 - skip URLs rebasing by default.

1.1.0 / 2013-09-06

  • Renamed lib's debug option to benchmark when doing per-minification benchmarking.
  • Added simplified comments processing & imports.
  • Fixed issue #43 - --debug switch for minification stats.
  • Fixed issue #65 - full color name / hex shortening.
  • Fixed issue #84 - support for @import with media queries.
  • Fixed issue #124 - raise error on broken imports.
  • Fixed issue #126 - proper CSS expressions handling.
  • Fixed issue #129 - rebasing imported URLs.
  • Fixed issue #130 - better code modularity.
  • Fixed issue #135 - require node.js 0.8+.

1.0.12 / 2013-07-19

  • Fixed issue #121 - ability to skip @import processing.

1.0.11 / 2013-07-08

  • Fixed issue #117 - line break escaping in comments.

1.0.10 / 2013-06-13

  • Fixed issue #114 - comments in imported stylesheets.

1.0.9 / 2013-06-11

  • Fixed issue #113 - @import in comments.

1.0.8 / 2013-06-10

  • Fixed issue #112 - reducing box-shadow zeros.

1.0.7 / 2013-06-05

  • Support for @import URLs starting with //. By @petetak.

1.0.6 / 2013-06-04

  • Fixed issue #110 - data URIs in URLs.

1.0.5 / 2013-05-26

  • Fixed issue #107 - data URIs in imported stylesheets.

1.0.4 / 2013-05-23

  • Rewrite relative URLs in imported stylesheets. By @bluej100.

1.0.3 / 2013-05-20

  • Support alternative @import syntax with file name not wrapped inside url() statement. By @bluej100.

1.0.2 / 2013-04-29

  • Fixed issue #97 - --remove-empty & FontAwesome.

1.0.1 / 2013-04-08

  • Do not pick up bench and test while building npm package. By @sindresorhus.

1.0.0 / 2013-03-30

  • Fixed issue #2 - resolving @import rules.
  • Fixed issue #44 - examples in --help.
  • Fixed issue #46 - preserving special characters in URLs and attributes.
  • Fixed issue #80 - quotation in multi line strings.
  • Fixed issue #83 - HSL to hex color conversions.
  • Fixed issue #86 - broken @charset replacing.
  • Fixed issue #88 - removes space in ! important.
  • Fixed issue #92 - uppercase hex to short versions.

0.10.2 / 2013-03-19

  • Fixed issue #79 - node.js 0.10.x compatibility.

0.10.1 / 2013-02-14

  • Fixed issue #66 - line breaks without extra spaces should be handled correctly.

0.10.0 / 2013-02-09

  • Switched from optimist to commander for CLI processing.
  • Changed long options from --removeempty to --remove-empty and from --keeplinebreaks to --keep-line-breaks.
  • Fixed performance issue with replacing multiple @charset declarations and issue with line break after @charset when using keepLineBreaks option. By @rrjaime.
  • Removed Makefile in favor to npm run commands (e.g. make check -> npm run check).
  • Fixed issue #47 - commandline issues on Windows.
  • Fixed issue #49 - remove empty selectors from media query.
  • Fixed issue #52 - strip fraction zeros if not needed.
  • Fixed issue #58 - remove colon where possible.
  • Fixed issue #59 - content property handling.

0.9.1 / 2012-12-19

  • Fixed issue #37 - converting white and other colors in class names (reported by @malgorithms).

0.9.0 / 2012-12-15

  • Added stripping quotation from font names (if possible).
  • Added stripping quotation from @keyframes declaration, animation and animation-name property.
  • Added stripping quotations from attributes' value (e.g. [data-target='x']).
  • Added better hex->name and name->hex color shortening.
  • Added font: normal and font: bold shortening the same way as font-weight is.
  • Refactored shorthand selectors and added border-radius, border-style and border-color shortening.
  • Added margin, padding and border-width shortening.
  • Added removing line break after commas.
  • Fixed removing whitespace inside media query definition.
  • Added removing line breaks after a comma, so all declarations are one-liners now.
  • Speed optimizations (~10% despite many new features).
  • Added JSHint validation rules via make check.

0.8.3 / 2012-11-29

  • Fixed HSL/HSLA colors processing.

0.8.2 / 2012-10-31

  • Fixed shortening hex colors and their relation to hashes in URLs.
  • Cleanup by @XhmikosR.

0.8.1 / 2012-10-28

  • Added better zeros processing for rect(...) syntax (clip property).

0.8.0 / 2012-10-21

  • Added removing URLs quotation if possible.
  • Rewrote breaks processing.
  • Added keepBreaks/-b option to keep line breaks in the minimized file.
  • Reformatted lib/clean.js so it's easier to follow the rules.
  • Minimized test data is now minimized with line breaks so it's easier to compare the changes line by line.

0.7.0 / 2012-10-14

  • Added stripping special comments to CLI (--s0 and --s1 options).
  • Added stripping special comments to programmatic interface (keepSpecialComments option).

0.6.0 / 2012-08-05

  • Full Windows support with tests (./test.bat).

0.5.0 / 2012-08-02

  • Made path to vows local.
  • Explicit node.js 0.6 requirement.

0.4.2 / 2012-06-28

  • Updated binary -v option (version).
  • Updated binary to output help when no options given (but not in piped mode).
  • Added binary tests.

0.4.1 / 2012-06-10

  • Fixed stateless mode where calling CleanCSS#process directly was giving errors (reported by @facelessuser).

0.4.0 / 2012-06-04

  • Speed improvements up to 4x thanks to the rewrite of comments and CSS' content processing.
  • Stripping empty CSS tags is now optional (see bin/cleancss for details).
  • Improved debugging mode (see test/bench.js)
  • Added make bench for a one-pass benchmark.

0.3.3 / 2012-05-27

  • Fixed tests, package.json for development, and regex for removing empty declarations (thanks to @vvo).

0.3.2 / 2012-01-17

  • Fixed output method under node.js 0.6 which incorrectly tried to close process.stdout.

0.3.1 / 2011-12-16

  • Fixed cleaning up 0 0 0 0 expressions.

0.3.0 / 2011-11-29

  • Clean-css requires node.js 0.4.0+ to run.
  • Removed node.js's 0.2.x 'sys' package dependency (thanks to @jmalonzo for a patch).

0.2.6 / 2011-11-27

  • Fixed expanding + signs in calc() when mixed up with adjacent + selector.

0.2.5 / 2011-11-27

  • Fixed issue with cleaning up spaces inside calc/-moz-calc declarations (thanks to @cvan for reporting it).
  • Fixed converting #f00 to red in borders and gradients.

0.2.4 / 2011-05-25

  • Fixed problem with expanding none to 0 in partial/full background declarations.
  • Fixed including clean-css library from binary (global to local).

0.2.3 / 2011-04-18

  • Fixed problem with optimizing IE filters.

0.2.2 / 2011-04-17

  • Fixed problem with space before color in border property.

0.2.1 / 2011-03-19

  • Added stripping space before !important keyword.
  • Updated repository location and author information in package.json.

0.2.0 / 2011-03-02

  • Added options parsing via optimist.
  • Changed code inclusion (thus the version bump).

0.1.0 / 2011-02-27

  • First version of clean-css library.
  • Implemented all basic CSS transformations.