lib/less/js/lib/less/index.js in less-2.4.0 vs lib/less/js/lib/less/index.js in less-2.5.0

- old
+ new

@@ -1,37 +1,38 @@ var path = require('path'), - sys = require('util'), url = require('url'), request, fs = require('fs'); var less = { - version: [1, 4, 2], + version: [1, 6, 2], Parser: require('./parser').Parser, - importer: require('./parser').importer, tree: require('./tree'), render: function (input, options, callback) { options = options || {}; if (typeof(options) === 'function') { - callback = options, options = {}; + callback = options; + options = {}; } var parser = new(less.Parser)(options), ee; if (callback) { parser.parse(input, function (e, root) { - callback(e, root && root.toCSS && root.toCSS(options)); + try { callback(e, root && root.toCSS && root.toCSS(options)); } + catch (err) { callback(err); } }); } else { - ee = new(require('events').EventEmitter); + ee = new (require('events').EventEmitter)(); process.nextTick(function () { parser.parse(input, function (e, root) { - if (e) { ee.emit('error', e) } - else { ee.emit('success', root.toCSS(options)) } + if (e) { return ee.emit('error', e); } + try { ee.emit('success', root.toCSS(options)); } + catch (err) { ee.emit('error', err); } }); }); return ee; } }, @@ -39,14 +40,14 @@ options = options || {}; var message = ""; var extract = ctx.extract; var error = []; - var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str }; + var stylize = options.color ? require('./lessc_helper').stylize : function (str) { return str; }; // only output a stack if it isn't a less error - if (ctx.stack && !ctx.type) { return stylize(ctx.stack, 'red') } + if (ctx.stack && !ctx.type) { return stylize(ctx.stack, 'red'); } if (!ctx.hasOwnProperty('index') || !extract) { return ctx.stack || ctx.message; } @@ -68,12 +69,14 @@ error.push(stylize((ctx.line + 1) + ' ' + extract[2], 'grey')); } error = error.join('\n') + stylize('', 'reset') + '\n'; message += stylize(ctx.type + 'Error: ' + ctx.message, 'red'); - ctx.filename && (message += stylize(' in ', 'red') + ctx.filename + - stylize(' on line ' + ctx.line + ', column ' + (ctx.column + 1) + ':', 'grey')); + if (ctx.filename) { + message += stylize(' in ', 'red') + ctx.filename + + stylize(' on line ' + ctx.line + ', column ' + (ctx.column + 1) + ':', 'grey'); + } message += '\n' + error; if (ctx.callLine) { message += stylize('from ', 'red') + (ctx.filename || '') + '/n'; @@ -82,44 +85,57 @@ return message; }, writeError: function (ctx, options) { options = options || {}; - if (options.silent) { return } - sys.error(less.formatError(ctx, options)); + if (options.silent) { return; } + console.error(less.formatError(ctx, options)); } }; -['color', 'directive', 'operation', 'dimension', - 'keyword', 'variable', 'ruleset', 'element', - 'selector', 'quoted', 'expression', 'rule', - 'call', 'url', 'alpha', 'import', - 'mixin', 'comment', 'anonymous', 'value', - 'javascript', 'assignment', 'condition', 'paren', - 'media', 'unicode-descriptor', 'negative', 'extend' -].forEach(function (n) { - require('./tree/' + n); -}); +require('./tree/color'); +require('./tree/directive'); +require('./tree/operation'); +require('./tree/dimension'); +require('./tree/keyword'); +require('./tree/variable'); +require('./tree/ruleset'); +require('./tree/element'); +require('./tree/selector'); +require('./tree/quoted'); +require('./tree/expression'); +require('./tree/rule'); +require('./tree/call'); +require('./tree/url'); +require('./tree/alpha'); +require('./tree/import'); +require('./tree/mixin'); +require('./tree/comment'); +require('./tree/anonymous'); +require('./tree/value'); +require('./tree/javascript'); +require('./tree/assignment'); +require('./tree/condition'); +require('./tree/paren'); +require('./tree/media'); +require('./tree/unicode-descriptor'); +require('./tree/negative'); +require('./tree/extend'); var isUrlRe = /^(?:https?:)?\/\//i; -less.Parser.importer = function (file, currentFileInfo, callback, env) { +less.Parser.fileLoader = function (file, currentFileInfo, callback, env) { var pathname, dirname, data, newFileInfo = { relativeUrls: env.relativeUrls, entryPath: currentFileInfo.entryPath, rootpath: currentFileInfo.rootpath, rootFilename: currentFileInfo.rootFilename }; - function parseFile(e, data) { - if (e) { return callback(e); } - - env = new less.tree.parseEnv(env); - env.processImports = false; - + function handleDataAndCallCallback(data) { var j = file.lastIndexOf('/'); // Pass on an updated rootpath if path of imported file is relative and file // is in a (sub|sup) directory // @@ -133,16 +149,12 @@ newFileInfo.rootpath = newFileInfo.rootpath + relativeSubDirectory; // append (sub|sup) directory path of imported file } newFileInfo.currentDirectory = pathname.replace(/[^\\\/]*$/, ""); newFileInfo.filename = pathname; - env.contents[pathname] = data; // Updating top importing parser content cache. - env.currentFileInfo = newFileInfo; - new(less.Parser)(env).parse(data, function (e, root) { - callback(e, root, pathname); - }); - }; + callback(null, data, pathname, newFileInfo); + } var isUrl = isUrlRe.test( file ); if (isUrl || isUrlRe.test(currentFileInfo.currentDirectory)) { if (request === undefined) { try { request = require('request'); } @@ -152,72 +164,82 @@ callback({ type: 'File', message: "optional dependency 'request' required to import over http(s)\n" }); return; } var urlStr = isUrl ? file : url.resolve(currentFileInfo.currentDirectory, file), - urlObj = url.parse(urlStr), - req = { - host: urlObj.hostname, - port: urlObj.port || 80, - path: urlObj.pathname + (urlObj.search||'') - }; + urlObj = url.parse(urlStr); - request.get(urlStr, function (error, res, body) { + request.get({uri: urlStr, strictSSL: !env.insecure }, function (error, res, body) { if (res.statusCode === 404) { callback({ type: 'File', message: "resource '" + urlStr + "' was not found\n" }); return; } if (!body) { - sys.error( 'Warning: Empty body (HTTP '+ res.statusCode + ') returned by "' + urlStr +'"' ); + console.error( 'Warning: Empty body (HTTP '+ res.statusCode + ') returned by "' + urlStr +'"' ); } if (error) { callback({ type: 'File', message: "resource '" + urlStr + "' gave this Error:\n "+ error +"\n" }); } pathname = urlStr; dirname = urlObj.protocol +'//'+ urlObj.host + urlObj.pathname.replace(/[^\/]*$/, ''); - parseFile(null, body); + handleDataAndCallCallback(body); }); } else { var paths = [currentFileInfo.currentDirectory].concat(env.paths); paths.push('.'); - for (var i = 0; i < paths.length; i++) { - try { - pathname = path.join(paths[i], file); - fs.statSync(pathname); - break; - } catch (e) { - pathname = null; + if (env.syncImport) { + for (var i = 0; i < paths.length; i++) { + try { + pathname = path.join(paths[i], file); + fs.statSync(pathname); + break; + } catch (e) { + pathname = null; + } } - } - - if (!pathname) { - callback({ type: 'File', message: "'" + file + "' wasn't found" }); - return; - } - - dirname = path.dirname(pathname); + if (!pathname) { + callback({ type: 'File', message: "'" + file + "' wasn't found" }); + return; + } - if (env.syncImport) { try { data = fs.readFileSync(pathname, 'utf-8'); - parseFile(null, data); + handleDataAndCallCallback(data); } catch (e) { - parseFile(e); + callback(e); } } else { - fs.readFile(pathname, 'utf-8', parseFile); + (function tryPathIndex(i) { + if (i < paths.length) { + pathname = path.join(paths[i], file); + fs.stat(pathname, function (err) { + if (err) { + tryPathIndex(i + 1); + } else { + fs.readFile(pathname, 'utf-8', function(e, data) { + if (e) { callback(e); } + handleDataAndCallCallback(data); + }); + } + }); + } else { + callback({ type: 'File', message: "'" + file + "' wasn't found" }); + } + }(0)); } } -} +}; require('./env'); require('./functions'); require('./colors'); require('./visitor.js'); require('./import-visitor.js'); require('./extend-visitor.js'); require('./join-selector-visitor.js'); +require('./to-css-visitor.js'); +require('./source-map-output.js'); -for (var k in less) { exports[k] = less[k]; } +for (var k in less) { if (less.hasOwnProperty(k)) { exports[k] = less[k]; }}