diff --git a/build/build.js b/build/build.js index cafef8f..05cc12c 100644 --- a/build/build.js +++ b/build/build.js @@ -26,14 +26,10 @@ function require(path, parent, orig) { // perform real require() // by invoking the module's // registered function - if (!module._resolving && !module.exports) { - var mod = {}; - mod.exports = {}; - mod.client = mod.component = true; - module._resolving = true; - module.call(this, mod.exports, require.relative(resolved), mod); - delete module._resolving; - module.exports = mod.exports; + if (!module.exports) { + module.exports = {}; + module.client = module.component = true; + module.call(this, module.exports, require.relative(resolved), module); } return module.exports; @@ -205,7 +201,7 @@ module.exports = require('./dist/lodash.compat.js'); require.register("lodash-lodash/dist/lodash.compat.js", function(exports, require, module){ /** * @license - * Lo-Dash 2.2.0 (Custom Build) + * Lo-Dash 2.2.1 (Custom Build) * Build: `lodash -o ./dist/lodash.compat.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 @@ -792,8 +788,8 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir /*--------------------------------------------------------------------------*/ /** - * Creates a `lodash` object which wraps the given value to enable method - * chaining. + * Creates a `lodash` object which wraps the given value to enable intuitive + * method chaining. * * In addition to Lo-Dash methods, wrappers also have the following `Array` methods: * `concat`, `join`, `pop`, `push`, `reverse`, `shift`, `slice`, `sort`, `splice`, @@ -827,6 +823,8 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir * The wrapper functions `first` and `last` return wrapped values when `n` is * provided, otherwise they return unwrapped values. * + * Explicit chaining can be enabled by using the `_.chain` method. + * * @name _ * @constructor * @category Chaining @@ -6104,9 +6102,12 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir push.apply(args, arguments); var result = func.apply(object, args); - return (value && typeof value == 'object' && value === result) - ? this - : new ctor(result); + if (value && typeof value == 'object' && value === result) { + return this; + } + result = new ctor(result); + result.__chain__ = this.__chain__; + return result; }; } }); @@ -6336,7 +6337,7 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir // and Laura Doktorova's doT.js // https://github.com/olado/doT var settings = lodash.templateSettings; - text || (text = ''); + text = String(text || ''); // avoid missing dependencies when `iteratorTemplate` is not defined options = defaults({}, options, settings); @@ -6508,7 +6509,8 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir /*--------------------------------------------------------------------------*/ /** - * Creates a `lodash` object that wraps the given value. + * Creates a `lodash` object that wraps the given value with explicit + * method chaining enabled. * * @static * @memberOf _ @@ -6524,9 +6526,10 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir * ]; * * var youngest = _.chain(stooges) - * .sortBy(function(stooge) { return stooge.age; }) + * .sortBy('age') * .map(function(stooge) { return stooge.name + ' is ' + stooge.age; }) - * .first(); + * .first() + * .value(); * // => 'moe is 40' */ function chain(value) { @@ -6563,7 +6566,7 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir } /** - * Enables method chaining on the wrapper object. + * Enables explicit method chaining on the wrapper object. * * @name chain * @memberOf _ @@ -6571,11 +6574,21 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir * @returns {*} Returns the wrapper object. * @example * - * var sum = _([1, 2, 3]) - * .chain() - * .reduce(function(sum, num) { return sum + num; }) - * .value() - * // => 6` + * var stooges = [ + * { 'name': 'moe', 'age': 40 }, + * { 'name': 'larry', 'age': 50 } + * ]; + * + * // without explicit chaining + * _(stooges).first(); + * // => { 'name': 'moe', 'age': 40 } + * + * // with explicit chaining + * _(stooges).chain() + * .first() + * .pick('age') + * .value() + * // => { 'age': 40 } */ function wrapperChain() { this.__chain__ = true; @@ -6809,7 +6822,7 @@ require.register("lodash-lodash/dist/lodash.compat.js", function(exports, requir * @memberOf _ * @type string */ - lodash.VERSION = '2.2.0'; + lodash.VERSION = '2.2.1'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; @@ -28108,6 +28121,9 @@ validators = { }; module.exports = function(cb) { + if (typeof window === 'undefined') { + config = null; + } if (config) { return cb(null, config); } @@ -28115,16 +28131,9 @@ module.exports = function(cb) { if (!wait) { wait = true; return request.config(function(err, result) { - var field, k, v, validator; - if (err || !_.isObject(result)) { - config = {}; - } - for (k in defaults) { - v = defaults[k]; - if (config[k] == null) { - config[k] = v; - } - } + var field, validator, _results; + wait = false; + config = _.defaults(result || {}, defaults); if (config.size_label) { config.size_label = new RegExp(config.size_label); } else { @@ -28138,9 +28147,11 @@ module.exports = function(cb) { } } } - return _.each(queue, function(cb) { - return cb(null, config); - }); + _results = []; + while (queue.length) { + _results.push(queue.pop()(null, config)); + } + return _results; }); } }; diff --git a/src/modules/config.coffee b/src/modules/config.coffee index 341f070..38a40fa 100644 --- a/src/modules/config.coffee +++ b/src/modules/config.coffee @@ -33,6 +33,8 @@ validators = # Get (& cache) configuration from the server. module.exports = (cb) -> + # Skip cache in node. + config = null if typeof window is 'undefined' # Have config? return cb null, config if config # Enqueue. @@ -43,9 +45,12 @@ module.exports = (cb) -> wait = yes # Make the request. request.config (err, result) -> + # The wait is over. + wait = no + # We do not strictly require config files. - config = _.defaults result, defaults - + config = _.defaults result or {}, defaults + # RegExpify the size label? if config.size_label config.size_label = new RegExp config.size_label @@ -58,5 +63,4 @@ module.exports = (cb) -> return cb "Config field `#{field}` misconfigured" # Call back for each enqueued. - _.each queue, (cb) -> - cb null, config \ No newline at end of file + ( queue.pop() null, config while queue.length ) \ No newline at end of file diff --git a/test/config.coffee b/test/config.coffee new file mode 100644 index 0000000..b79df89 --- /dev/null +++ b/test/config.coffee @@ -0,0 +1,81 @@ +#!/usr/bin/env coffee +proxy = do require('proxyquire').noCallThru +assert = require 'assert' +path = require 'path' + +req = {} + +config = proxy path.resolve(__dirname, '../src/modules/config.coffee'), + './request': req + +{ size_label } = require path.resolve __dirname, '../src/modules/regex.coffee' + +module.exports = + + 'config - is null': (done) -> + req.config = (cb) -> + cb null, null + + config (err, cfg) -> + assert.ifError err + assert.deepEqual cfg, + 'host': 'api.github.com' + 'protocol': 'https' + 'size_label': new RegExp size_label + do done + + 'config - is empty': (done) -> + req.config = (cb) -> + cb null, {} + + config (err, cfg) -> + assert.ifError err + assert.deepEqual cfg, + 'host': 'api.github.com' + 'protocol': 'https' + 'size_label': new RegExp size_label + do done + + 'config - custom size label': (done) -> + size = '/^taille (\d+)$/' + + req.config = (cb) -> + cb null, { 'size_label': size } + + config (err, cfg) -> + assert.ifError err + assert.deepEqual cfg, + 'host': 'api.github.com' + 'protocol': 'https' + 'size_label': new RegExp size + do done + + 'config - custom valid protocol': (done) -> + req.config = (cb) -> + cb null, { 'protocol': 'http' } + + config (err, cfg) -> + assert.ifError err + assert.deepEqual cfg, + 'host': 'api.github.com' + 'protocol': 'http' + 'size_label': new RegExp size_label + do done + + 'config - custom invalid protocol': (done) -> + req.config = (cb) -> + cb null, { 'protocol': 'nntp' } + + config (err, cfg) -> + assert.equal err, 'Config field `protocol` misconfigured' + assert.equal cfg, null + do done + + 'config - custom invalid off days': (done) -> + req.config = (cb) -> + cb null, { 'off_days': [ 0 ] } + + config (err, cfg) -> + assert.equal err, 'Config field `off_days` misconfigured' + assert.equal cfg, null + do done \ No newline at end of file