From ceea2a1cf26996c7e64f4107137ea6e9dbabb310 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Fri, 13 Dec 2013 16:40:12 -0800 Subject: [PATCH] Pull all imports with css-parse --- .../.npm/package/npm-shrinkwrap.json | 16 ++++++++++ packages/minifiers/minifiers.js | 4 +++ packages/minifiers/package.js | 5 +++- tools/bundler.js | 29 +++++++++++++++---- 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/packages/minifiers/.npm/package/npm-shrinkwrap.json b/packages/minifiers/.npm/package/npm-shrinkwrap.json index e2eb3b72aa..db17ed6c94 100644 --- a/packages/minifiers/.npm/package/npm-shrinkwrap.json +++ b/packages/minifiers/.npm/package/npm-shrinkwrap.json @@ -34,6 +34,22 @@ "version": "1.0.1" } } + }, + "css-parse": { + "version": "1.6.0" + }, + "css-stringify": { + "version": "1.4.1", + "dependencies": { + "source-map": { + "version": "0.1.31", + "dependencies": { + "amdefine": { + "version": "0.1.0" + } + } + } + } } } } diff --git a/packages/minifiers/minifiers.js b/packages/minifiers/minifiers.js index ad15487d26..f09748fd71 100644 --- a/packages/minifiers/minifiers.js +++ b/packages/minifiers/minifiers.js @@ -5,4 +5,8 @@ CleanCSSProcess = function (source, options) { return instance.minify(source); }; +CssParse = Npm.require('css-parse'); +CssStringify = Npm.require('css-stringify'); + UglifyJSMinify = Npm.require('uglify-js').minify; + diff --git a/packages/minifiers/package.js b/packages/minifiers/package.js index c76efd3ee9..2424ed5906 100644 --- a/packages/minifiers/package.js +++ b/packages/minifiers/package.js @@ -5,10 +5,13 @@ Package.describe({ Npm.depends({ "clean-css": "2.0.2", - "uglify-js": "2.4.7" + "uglify-js": "2.4.7", + "css-parse": "1.6.0", + "css-stringify": "1.4.1" }); Package.on_use(function (api) { api.export(['CleanCSSProcess', 'UglifyJSMinify']); + api.export(['CssParse', 'CssStringify']); api.add_files('minifiers.js', 'server'); }); diff --git a/tools/bundler.js b/tools/bundler.js index 8049026e98..8047b31522 100644 --- a/tools/bundler.js +++ b/tools/bundler.js @@ -759,13 +759,32 @@ _.extend(ClientTarget.prototype, { minifyCss: function (minifiers) { var self = this; - var allCss = _.map(self.css, function (file) { - return file.contents('utf8'); - }).join('\n'); + // after concatenation some @import's might be left in the middle of CSS + // file but they required to be in the beginning. + var importsAst = { + type: 'stylesheet', + stylesheet: { rules: [] } + }; - allCss = minifiers.CleanCSSProcess(allCss); + var cssAsts = _.map(self.css, function (file) { + var ast = minifiers.CssParse(file.contents('utf8')); + function isImportRule (node) { + return node.type === 'import'; + } - self.css = [new File({ data: new Buffer(allCss, 'utf8') })]; + var imports = _.filter(ast.stylesheet.rules, isImportRule); + importsAst.stylesheet.rules = importsAst.stylesheet.rules.concat(imports); + + ast.stylesheet.rules = _.reject(ast.stylesheet.rules, isImportRule); + return ast; + }); + + var allCss = + _.map([importsAst].concat(cssAsts), minifiers.CssStringify).join('\n'); + + var minifiedCss = minifiers.CleanCSSProcess(allCss); + + self.css = [new File({ data: new Buffer(minifiedCss, 'utf8') })]; self.css[0].setUrlToHash(".css"); },