diff --git a/node_modules/architect-build/build.js b/node_modules/architect-build/build.js index 48888813..f59581f3 100644 --- a/node_modules/architect-build/build.js +++ b/node_modules/architect-build/build.js @@ -1,8 +1,9 @@ -var fs = require("fs"); -var path = require("path"); -var async = require("async"); -var mkdirp = require("mkdirp"); +var async = require("async"); +var fs = require("fs"); +var less = require("less"); +var mkdirp = require("mkdirp"); var moduleDeps = require("./module-deps"); +var path = require("path"); function build(config, opts, callback){ if (!opts.configFile) { @@ -157,7 +158,6 @@ function build(config, opts, callback){ }); } -// TODO function createOutputFolder(opts, cb) { var output = (opts.outputFolder || ".") + "/" + (opts.outputFile || ""); output = path.dirname(output); @@ -213,43 +213,80 @@ function compileLess(opts, sources, callback) { }); } + +function compileLibRules(libs, ctx, next) { + // Libs is an array of paths; adds property .compiled to keep a state(cache). + if (libs.compiled) + return next(null, libs.compiled.rules, libs.compiled.css); + + var src = lessPathLib(libs.staticPrefix) + libs.join("\n"); + + less.parse(src, ctx, function(err, root, imports, options) { + if (err) return next(err); + + toCss(root, imports, options, function(err, css) { + if (err) return next(err); + + libs.compiled = { + rules: root.rules, + css: css, + }; + + next(null, libs.compiled.rules, libs.compiled.css); + }); + }); +} + function compileLessFragment(css, libs, root, staticPrefix, path, compress, callback) { - var less = require("less"); - var baseLib = lessPathLib(staticPrefix || libs.staticPrefix); - var parser = new less.Parser({ + + var ctx = { paths: ["/"], filename: root + '/unknown.less', - }); - - if (!libs.compiled) { - parser.parse(lessPathLib(libs.staticPrefix) + libs.join("\n"), function(err, tree) { - libs.compiled = tree; // actually parse isn't async - }); - - libs.css = libs.compiled.toCSS().trim(); - } - // Parse Less Code - var code = baseLib + "\n" + css; - - // Complete paths, but not subdirectories like foo/images/bar.png - code = code.replace(/(["(])(images|icons)\//g, "$1" + staticPrefix + "/$2/"); + compress: !!compress + }; - console.log("[Less] compiling ", path || "skin", root); - parser.parse(code, function (err, tree) { - if (err) - return callback(err); - if (libs.compiled) - tree.rules = libs.compiled.rules.concat(tree.rules); - var css = tree.toCSS({ compress: compress }); - if (libs.css && css.substring(0, libs.css.length) == libs.css) { - css = css.substr(libs.css.length); - } else { - console.warn("couldn't strip default less"); - } - callback(null, css); + compileLibRules( libs, ctx, function(err, libRules, libCss) { + if (err) return callback(err); + + var baseLib = lessPathLib(staticPrefix || libs.staticPrefix); + var code = baseLib + "\n" + css; + + // Complete paths, but not subdirectories like foo/images/bar.png + code = code.replace(/(["(])(images|icons)\//g, "$1" + staticPrefix + "/$2/"); + + console.log("[Less] compiling ", path || "skin", root); + + less.parse(code, ctx, function (err, tree, imports, options) { + if (err) return callback(err); + tree.rules = libRules.concat(tree.rules); + + toCss(tree, imports, options, function(err, css) { + if (err) return callback(err); + + if (css.substring(0, libCss.length) == libCss) { + css = css.substr(libCss.length); + } else { + console.warn("couldn't strip default less"); + } + callback(null, css); + + }); + }); }); } +function toCss(tree, imports, options, callback) { + var parseTree = new less.ParseTree(tree, imports); + var css; + try { + css = parseTree.toCSS(options).css; + } + catch (err) { + return callback(err); + } + callback(null, css); +} + function lessPathLib(staticPrefix) { if (!staticPrefix) return ""; return "@base-path : \"" + staticPrefix + "\";\n" diff --git a/package.json b/package.json index 5840e5b9..aa9cdd22 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "engine.io-client": "~1.5.1", "eslint": "git://github.com/cloud9ide/eslint.git#e2d052aafd81ea0aa6d1d4fd9f88f3613e386160", "http-error": "~0.0.5", - "less": "~1.5.1", + "less": "^2.4.0", "mime": "~1.2.9", "mkdirp": "~0.3.5", "msgpack-js": "~0.1.1",