diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..c0dd88b --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,85 @@ +{ + "env": { + "node": true, + "es6": true + }, + "rules": { + "block-spacing": [2, "always"], + "brace-style": [2, "1tbs", {"allowSingleLine": true}], + "comma-style": [2, "last"], + "func-style": [2, "expression"], + "semi": [2, "always"], + "quotes": [2, "single", "avoid-escape"], + "indent": [2, 2, {"SwitchCase": 1}], + "dot-location": [2, "property"], + "camelcase": [1, {"properties": "always"}], + "comma-spacing": [2, {"before": false, "after": true}], + "comma-dangle": [2, "never"], + "semi-spacing": [2, {"before": false, "after": true}], + "curly": [2, "multi-line", "consistent"], + "no-debugger": 2, + "no-dupe-args": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-empty": 2, + "no-ex-assign": 2, + "no-extra-semi": 2, + "no-func-assign": 2, + "no-irregular-whitespace": 2, + "no-sparse-arrays": 2, + "no-unexpected-multiline": 2, + "no-unreachable": 2, + "no-unused-vars": [2, {"varsIgnorePattern": "ignored"}], + "valid-typeof": 2, + "eqeqeq": [2, "allow-null"], + "no-array-constructor": 2, + "no-caller": 2, + "no-eval": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-fallthrough": 2, + "no-labels": 2, + "no-iterator": 2, + "no-magic-numbers": [1, {"ignore": [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8]}], + "no-multi-spaces": 2, + "no-native-reassign": 2, + "no-new-func": 2, + "no-new-wrappers": 2, + "no-new": 2, + "no-octal-escape": 2, + "no-octal": 2, + "no-redeclare": 2, + "no-self-compare": 2, + "no-sequences": 2, + "no-unused-expressions": 2, + "no-useless-call": 2, + "no-warning-comments": [1, {"terms": ["todo", "fixme", "xxx"], "location": "start"}], + "no-with": 2, + "new-parens": 2, + "wrap-iife": [2, "inside"], + "no-catch-shadow": 2, + "no-delete-var": 2, + "no-shadow-restricted-names": 2, + "no-undef": 2, + "callback-return": 2, + "handle-callback-err": 2, + "no-path-concat": 2, + "array-bracket-spacing": 2, + "eol-last": 2, + "no-multiple-empty-lines": [2, {"max": 2}], + "no-spaced-func": 2, + "no-trailing-spaces": 2, + "no-unneeded-ternary": 2, + "space-before-keywords": 2, + "space-after-keywords": 2, + "space-before-blocks": 2, + "space-before-function-paren": [2, "never"], + "space-in-parens": 2, + "space-return-throw-case": 2, + "space-unary-ops": [2, {"words": true, "nonwords": false}], + "arrow-spacing": [2, {"before": true, "after": true}], + "prefer-arrow-callback": 2, + "prefer-template": 0, + "prefer-const": 2 + } +} diff --git a/index.js b/index.js index 0fac459..0f0c712 100644 --- a/index.js +++ b/index.js @@ -1,35 +1,40 @@ -var CleanCSS = require('clean-css'); -var sysPath = require('path'); - -function CleanCSSMinifier(config) { - if (config == null) config = {}; - var plugins = config.plugins - if (plugins == null) plugins = {}; - this.options = plugins.cleancss || {}; -} +'use strict'; -CleanCSSMinifier.prototype.brunchPlugin = true; -CleanCSSMinifier.prototype.type = 'stylesheet'; +const CleanCSS = require('clean-css'); -CleanCSSMinifier.prototype.optimize = function(data, path, callback) { - var error, optimized; +class CleanCSSMinifier { + constructor(config) { + this.options = config && config.plugins && config.plugins.cleancss || {}; + } - try { - if (this.options.ignored && this.options.ignored.test(path)) { - // ignored file path: return non minified - return callback(null, data); + optimize(params) { + const data = params.data; + const path = params.path; + + let error, optimized; + + try { + if (this.options.ignored && this.options.ignored.test(path)) { + // ignored file path: return non minified + return Promise.resolve(data); + } + } catch (e) { + return Promise.reject(`error checking ignored files to minify ${e}`); } - } catch (e) { - return callback('error checking ignored files to minify ' + e); - } - try { - optimized = new CleanCSS(this.options).minify(data).styles; - } catch (_error) { - error = "CSS minify failed on " + path + ": " + _error; - } finally { - callback(error, optimized || data); + try { + optimized = new CleanCSS(this.options).minify(data).styles; + } catch (_error) { + error = `CSS minify failed on ${path}: ${_error}`; + } finally { + if (error) return Promise.reject(error); + + return Promise.resolve(optimized || data); + } } -}; +} + +CleanCSSMinifier.prototype.brunchPlugin = true; +CleanCSSMinifier.prototype.type = 'stylesheet'; module.exports = CleanCSSMinifier; diff --git a/package.json b/package.json index 2bd92e4..c4df339 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,14 @@ "url": "git@github.com:brunch/clean-css-brunch.git" }, "scripts": { - "test": "mocha" + "test": "node_modules/.bin/eslint index.js && node_modules/.bin/mocha" }, "dependencies": { "clean-css": "^3.4.8" }, "devDependencies": { "chai": "^3.4.1", - "mocha": "^2.3.4" + "mocha": "^2.3.4", + "eslint": "^1.10.3" } } diff --git a/test.js b/test.js index 93c43ce..3f82e4e 100644 --- a/test.js +++ b/test.js @@ -19,11 +19,10 @@ describe('Plugin', function() { var content = '#first { font-size: 14px; color: #b0b; }'; var expected = '#first{font-size:14px;color:#b0b}'; - plugin.optimize(content, '', function(error, data) { - expect(error).not.to.be.ok; + plugin.optimize({data: content, path: ''}).then(data => { expect(data).to.equal(expected); done(); - }); + }, error => expect(error).not.to.be.ok); }); it('should compile and produce a result clean-css options are reflected in', function(done) { @@ -37,11 +36,10 @@ describe('Plugin', function() { var content = '/*! comment */\n#first { color: red; }\r\n#second { color: blue; }'; var expected = '#first{color:red}' + eol + '#second{color:#00f}'; - plugin.optimize(content, '', function(error, data) { - expect(error).not.to.be.ok; + plugin.optimize({data: content, path: ''}).then(data => { expect(data).to.equal(expected); done(); - }); + }, error => expect(error).not.to.be.ok); }); it('should return a non minified css if path is in "ignore" list', function(done) { @@ -52,11 +50,10 @@ describe('Plugin', function() { var content = '#first { font-size: 14px; color: #b0b; }'; var expected = content; - plugin.optimize(content, 'dist\/ignore-me.css', function(error, data) { - expect(error).not.to.be.ok; + plugin.optimize({data: content, path: "dist/ignore-me.css"}).then(data => { expect(data).to.equal(expected); done(); - }); + }, error => expect(error).not.to.be.ok); });