From: Jakub Pawlowicz Date: Mon, 3 Nov 2014 20:59:13 +0000 (+0000) Subject: Changes minify method output to handle multiple outputs. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=6d473802041bda4a07dc4ff4daa11401ea5debd5;p=clean-css.git Changes minify method output to handle multiple outputs. --- diff --git a/History.md b/History.md index 1e13e145..5b087831 100644 --- a/History.md +++ b/History.md @@ -6,6 +6,7 @@ * Allows `target` option to be a path to a folder instead of a file. * Allows disabling rounding precision. By [@superlukas](https://github.com/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](https://github.com/jakubpawlowicz/clean-css/compare/b06f37d...dd8c14a). * Removes support for node.js 0.8.x. diff --git a/README.md b/README.md index 7e5908e6..9bc5de12 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ npm install clean-css * `noAggressiveMerging` became `aggressiveMerging` - make sure to reverse the value; * `noRebase` became `rebase` - make sure to reverse the value; * no longer possible to use `CleanCSS` as a function as `new CleanCSS` is always required; +* `minify` method returns a hash instead of a string now, so use `new CleanCSS().minify(source).styles` instead of `new CleanCSS().minify(source)`. This change is due to addition of source-maps. ### How to upgrade clean-css from 1.x to 2.x? @@ -128,11 +129,11 @@ cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzip ```js var CleanCSS = require('clean-css'); var source = 'a{font-weight:bold;}'; -var minimized = new CleanCSS().minify(source); +var minimized = new CleanCSS().minify(source).styles; ``` CleanCSS constructor accepts a hash as a parameter, i.e., -`new CleanCSS(options).minify(source)` with the following options available: +`new CleanCSS(options)` with the following options available: * `advanced` - set to false to disable advanced optimizations - selector & property merging, reduction, etc. * `aggressiveMerging` - set to false to disable aggressive merging of properties. diff --git a/bin/cleancss b/bin/cleancss index 666fae54..a1b6ffe9 100755 --- a/bin/cleancss +++ b/bin/cleancss @@ -137,7 +137,7 @@ function minify(data) { if (this.errors.length > 0) process.exit(1); - output(minified); + output(minified.styles); }); } diff --git a/lib/clean.js b/lib/clean.js index b716ecbe..703fb5a8 100644 --- a/lib/clean.js +++ b/lib/clean.js @@ -93,8 +93,8 @@ function minifyWithDebug(self, data) { var elapsed = process.hrtime(startedAt); self.stats.timeSpent = ~~(elapsed[0] * 1e3 + elapsed[1] / 1e6); - self.stats.efficiency = 1 - data.length / self.stats.originalSize; - self.stats.minifiedSize = data.length; + self.stats.efficiency = 1 - data.styles.length / self.stats.originalSize; + self.stats.minifiedSize = data.styles.length; return data; } diff --git a/lib/selectors/stringifier.js b/lib/selectors/stringifier.js index c89f50a6..fcbc3d96 100644 --- a/lib/selectors/stringifier.js +++ b/lib/selectors/stringifier.js @@ -50,7 +50,10 @@ function rebuild(tokens, keepBreaks, isFlatBlock) { Stringifier.prototype.toString = function (tokens) { var rebuilt = rebuild(tokens, this.keepBreaks, false); - return this.restoreCallback(rebuilt).trim(); + + return { + styles: this.restoreCallback(rebuilt).trim() + }; }; module.exports = Stringifier; diff --git a/test/batch-test.js b/test/batch-test.js index e5503989..27cc61a0 100644 --- a/test/batch-test.js +++ b/test/batch-test.js @@ -33,7 +33,7 @@ var batchContexts = function() { keepBreaks: true, root: data.root }).minify(data.plain, function(errors, minified) { - self.callback(errors, minified, data); + self.callback(errors, minified.styles, data); }); }, 'should output right content': function(errors, minified, data) { diff --git a/test/integration-test.js b/test/integration-test.js index 0f7d6fa6..f565f626 100644 --- a/test/integration-test.js +++ b/test/integration-test.js @@ -11,7 +11,7 @@ var cssContext = function(groups, options) { var clean = function(expectedCss) { return function(css) { - var minifiedCss = new CleanCSS(options).minify(css); + var minifiedCss = new CleanCSS(options).minify(css).styles; assert.equal(minifiedCss, expectedCss); }; }; diff --git a/test/module-test.js b/test/module-test.js index f994e0af..f478c7e2 100644 --- a/test/module-test.js +++ b/test/module-test.js @@ -10,7 +10,7 @@ vows.describe('module tests').addBatch({ return css.minify.bind(css); }, 'should minify CSS correctly': function(minify) { - assert.equal(minify('a{ color: #f00; }'), 'a{color:red}'); + assert.equal(minify('a{ color: #f00; }').styles, 'a{color:red}'); } }, 'extended via prototype': { @@ -21,7 +21,7 @@ vows.describe('module tests').addBatch({ new CleanCSS().foo('a{ color: #f00; }', this.callback); }, 'should minify CSS correctly': function(error, minified) { - assert.equal(minified, 'a{color:red}'); + assert.equal(minified.styles, 'a{color:red}'); }, teardown: function() { delete CleanCSS.prototype.foo; @@ -39,7 +39,7 @@ vows.describe('module tests').addBatch({ assert.equal(errors, null); }, 'should yield minified data': function(errors, minified) { - assert.equal(minified, 'a{color:red}'); + assert.equal(minified.styles, 'a{color:red}'); } }, 'with callback passed and one error': { @@ -111,7 +111,7 @@ vows.describe('module tests').addBatch({ this.callback(null, minified, minifier); }, 'should minify correctly': function(error, minified) { - assert.equal(minified, 'a{display:block}'); + assert.equal(minified.styles, 'a{display:block}'); }, 'should raise no errors': function(error, minified, minifier) { assert.equal(minifier.errors.length, 0); @@ -128,7 +128,7 @@ vows.describe('module tests').addBatch({ this.callback(null, minified, minifier); }, 'should minify correctly': function(error, minified) { - assert.equal(minified, 'a{display:block}p{color:red}'); + assert.equal(minified.styles, 'a{display:block}p{color:red}'); }, 'should raise no errors': function(error, minified, minifier) { assert.equal(minifier.errors.length, 0); @@ -145,7 +145,7 @@ vows.describe('module tests').addBatch({ this.callback(null, minified, minifier); }, 'should minify correctly': function(error, minified) { - assert.equal(minified, ''); + assert.equal(minified.styles, ''); }, 'should raise no errors': function(error, minified, minifier) { assert.equal(minifier.errors.length, 0); @@ -234,32 +234,32 @@ vows.describe('module tests').addBatch({ return new CleanCSS().minify(new Buffer('@import url(test/data/partials/one.css);')); }, 'should be processed correctly': function(minified) { - assert.equal('.one{color:red}', minified); + assert.equal('.one{color:red}', minified.styles); } }, 'options': { 'advanced': { 'topic': new CleanCSS({ advanced: true }).minify('a{color:red}a{color:#fff}'), 'gets right output': function (minified) { - assert.equal('a{color:#fff}', minified); + assert.equal('a{color:#fff}', minified.styles); } }, 'aggressive merging': { 'topic': new CleanCSS({ aggressiveMerging: true }).minify('a{display:block;color:red;display:inline-block}'), 'gets right output': function (minified) { - assert.equal('a{color:red;display:inline-block}', minified); + assert.equal('a{color:red;display:inline-block}', minified.styles); } }, 'process import': { 'topic': new CleanCSS({ processImport: true }).minify('@import url(/test/data/partials/one.css);'), 'gets right output': function (minified) { - assert.equal('.one{color:red}', minified); + assert.equal('.one{color:red}', minified.styles); } }, 'rebase': { 'topic': new CleanCSS({ rebase: true, relativeTo: path.join(process.cwd(), 'test', 'data'), root: process.cwd() }).minify('div{background:url(./dummy.png)}'), 'gets right output': function (minified) { - assert.include(minified, 'url(/test/data/dummy.png)'); + assert.include(minified.styles, 'url(/test/data/dummy.png)'); } } } diff --git a/test/protocol-imports-test.js b/test/protocol-imports-test.js index 9c1e13da..32a2fe0b 100644 --- a/test/protocol-imports-test.js +++ b/test/protocol-imports-test.js @@ -24,7 +24,7 @@ vows.describe('protocol imports').addBatch({ assert.equal(errors.length, 1); }, 'should ignore @import': function(errors, minified) { - assert.equal(minified, '@import url(http://127.0.0.1/missing.css);a{color:red}'); + assert.equal(minified.styles, '@import url(http://127.0.0.1/missing.css);a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -43,7 +43,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'p{font-size:13px}a{color:red}'); + assert.equal(minified.styles, 'p{font-size:13px}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -62,7 +62,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'p{font-size:13px}'); + assert.equal(minified.styles, 'p{font-size:13px}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -81,7 +81,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'p{font-size:13px}a{color:red}'); + assert.equal(minified.styles, 'p{font-size:13px}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -100,7 +100,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, '@media screen{p{font-size:13px}}a{color:red}'); + assert.equal(minified.styles, '@media screen{p{font-size:13px}}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -124,7 +124,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'body{margin:0}div{padding:0}p{font-size:13px}a{color:red}'); + assert.equal(minified.styles, 'body{margin:0}div{padding:0}p{font-size:13px}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks1.isDone(), true); @@ -146,7 +146,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'body{margin:0}p{font-size:13px}a{color:red}'); + assert.equal(minified.styles, 'body{margin:0}p{font-size:13px}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -168,7 +168,7 @@ vows.describe('protocol imports').addBatch({ assert.equal(errors[0], 'Broken @import declaration of "http://127.0.0.1/missing.css" - error 404'); }, 'should process @import': function(errors, minified) { - assert.equal(minified, '@import url(http://127.0.0.1/missing.css);p{font-size:13px}a{color:red}'); + assert.equal(minified.styles, '@import url(http://127.0.0.1/missing.css);p{font-size:13px}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -187,7 +187,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'a{background:url(http://127.0.0.1/test.png)}'); + assert.equal(minified.styles, 'a{background:url(http://127.0.0.1/test.png)}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -208,7 +208,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'a{background:url(http://127.0.0.1/deeply/images/test.png)}'); + assert.equal(minified.styles, 'a{background:url(http://127.0.0.1/deeply/images/test.png)}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -224,7 +224,7 @@ vows.describe('protocol imports').addBatch({ assert.include(errors[0], 'Broken @import declaration of "http://notdefined.127.0.0.1/custom.css"'); }, 'should process @import': function(errors, minified) { - assert.equal(minified, '@import url(http://notdefined.127.0.0.1/custom.css);a{color:red}'); + assert.equal(minified.styles, '@import url(http://notdefined.127.0.0.1/custom.css);a{color:red}'); } }, 'of a 30x response with absolute URL': { @@ -241,7 +241,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'body{margin:0}a{color:red}'); + assert.equal(minified.styles, 'body{margin:0}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -262,7 +262,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'body{margin:0}a{color:red}'); + assert.equal(minified.styles, 'body{margin:0}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -289,7 +289,7 @@ vows.describe('protocol imports').addBatch({ assert.equal(errors[0], 'Broken @import declaration of "http://localhost:' + port + '/timeout.css" - timeout'); }, 'should process @import': function(errors, minified) { - assert.equal(minified, '@import url(http://localhost:' + port + '/timeout.css);a{color:red}'); + assert.equal(minified.styles, '@import url(http://localhost:' + port + '/timeout.css);a{color:red}'); }, teardown: function() { this.server.close(); @@ -309,7 +309,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'body{margin:0}div{padding:0}a{color:red}'); + assert.equal(minified.styles, 'body{margin:0}div{padding:0}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -328,7 +328,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'div{padding:0}a{color:red}'); + assert.equal(minified.styles, 'div{padding:0}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -353,7 +353,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'div{padding:0}a{color:red}'); + assert.equal(minified.styles, 'div{padding:0}a{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -373,7 +373,7 @@ vows.describe('protocol imports').addBatch({ assert.isNull(errors); }, 'should process @import': function(errors, minified) { - assert.equal(minified, 'div{padding:0}.one{color:red}'); + assert.equal(minified.styles, 'div{padding:0}.one{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), true); @@ -399,7 +399,7 @@ vows.describe('protocol imports').addBatch({ assert.match(minifier.warnings[0], /no callback given/); }, 'should process @import': function(error, minifier, minified) { - assert.equal(minified, '@import url(http://127.0.0.1/remote.css);.one{color:red}'); + assert.equal(minified.styles, '@import url(http://127.0.0.1/remote.css);.one{color:red}'); }, teardown: function() { assert.equal(this.reqMocks.isDone(), false); diff --git a/test/selectors/optimizer-test.js b/test/selectors/optimizer-test.js index d3160380..bd7ab2c7 100644 --- a/test/selectors/optimizer-test.js +++ b/test/selectors/optimizer-test.js @@ -13,7 +13,7 @@ function optimizerContext(group, specs, options) { function optimized(target) { return function (source) { - assert.equal(new SelectorsOptimizer(options).process(source, stringifier), target); + assert.equal(new SelectorsOptimizer(options).process(source, stringifier).styles, target); }; }