From a5a7ebea3dab9e14240a5258ae5477e2f2c00e2a Mon Sep 17 00:00:00 2001 From: Dan Bornstein Date: Fri, 9 Sep 2016 12:32:24 -0700 Subject: [PATCH] Handle `@import` during CSS minification. This meant plumbing a callback through to `compressCSS()`, which meant that I had to alter the innards of `getFileCompressed()`. I tried to leave that function looking more understandable than when I found it; for example, I flattened out the nested `if`. I went ahead and upgraded the version of `clean-css` while I was in the territory. --- src/node/utils/Minify.js | 53 +++++++++++++++++++++++----------------- src/package.json | 2 +- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/node/utils/Minify.js b/src/node/utils/Minify.js index ee8f5f455..101dc97a1 100644 --- a/src/node/utils/Minify.js +++ b/src/node/utils/Minify.js @@ -1,7 +1,7 @@ /** - * This Module manages all /minified/* requests. It controls the - * minification && compression of Javascript and CSS. - */ + * This Module manages all /minified/* requests. It controls the + * minification && compression of Javascript and CSS. + */ /* * 2011 Peter 'Pita' Martischka (Primary Technology Ltd) @@ -151,7 +151,7 @@ function minify(req, res, next) } else { res.writeHead(404, {}); res.end(); - return; + return; } /* Handle static files for plugins/libraries: @@ -371,21 +371,19 @@ function requireDefinition() { function getFileCompressed(filename, contentType, callback) { getFile(filename, function (error, content) { - if (error || !content) { + if (error || !content || !settings.minify) { callback(error, content); - } else { - if (settings.minify) { - if (contentType == 'text/javascript') { - try { - content = compressJS([content]); - } catch (error) { - // silence - } - } else if (contentType == 'text/css') { - content = compressCSS([content]); - } + } else if (contentType == 'text/javascript') { + try { + content = compressJS(content); + } catch (error) { + // silence } callback(null, content); + } else if (contentType == 'text/css') { + compressCSS(filename, content, callback); + } else { + callback(null, content); } }); } @@ -400,20 +398,29 @@ function getFile(filename, callback) { } } -function compressJS(values) +function compressJS(content) { - var complete = values.join("\n"); - var ast = jsp.parse(complete); // parse code and get the initial AST + var ast = jsp.parse(content); // parse code and get the initial AST ast = pro.ast_mangle(ast); // get a new AST with mangled names ast = pro.ast_squeeze(ast); // get an AST with compression optimizations return pro.gen_code(ast); // compressed code here } -function compressCSS(values) +function compressCSS(filename, content, callback) { - var complete = values.join("\n"); - var minimized = new CleanCSS().minify(complete).styles; - return minimized; + try { + new CleanCSS({relativeTo: ROOT_DIR}).minify(content, function (errors, minified) { + if (errors) { + // On error, just yield the un-minified original. + callback(null, content); + } else { + callback(null, minified.styles); + } + }); + } catch (error) { + // On error, just yield the un-minified original. + callback(null, content); + } } exports.minify = minify; diff --git a/src/package.json b/src/package.json index bdbf35c24..98e0fed05 100644 --- a/src/package.json +++ b/src/package.json @@ -22,7 +22,7 @@ "express-session" : "1.13.0", "cookie-parser" : "1.3.4", "async" : "0.9.0", - "clean-css" : "3.4.12", + "clean-css" : "3.4.19", "uglify-js" : "2.6.2", "formidable" : "1.0.17", "log4js" : "0.6.35",