noot
Version:
High quality, well tested, lightweight object oriented toolset for Node.js
112 lines (97 loc) • 2.59 kB
JavaScript
/**
* Dependencies
*/
var path = require('path');
var _ = require('lodash');
var NOOT = require('../../')('object');
/***********************************************************************************************************************
* @class Configurator
* @constructor
* @namespace NOOT
**********************************************************************************************************************/
var Configurator = NOOT.Object.extend({
directory: null,
env: null,
/**
* @method init
*/
init: function() {
if (!this.env) throw new Error('No environment defined for NOOT.Configurator');
this.directory = this.directory || Configurator.DEFAULTS.DIRECTORY;
},
/**
* Get a configuration or configuration field
*
* @method get
* @param {String} fileName
* @param {...String} [fields]
* @return {*}
*/
get: function() {
var args = NOOT.makeArray(arguments);
var ret = this._load(args.shift());
args.forEach(function(arg) {
ret = ret[arg];
});
return ret;
},
/**
* Retrieve the configuration
*
* @method _load
* @param {String} fileName
* @return {*}
*/
_load: function(fileName) {
var config;
try {
config = require(path.join(this.directory, fileName));
} catch (e) {
throw new Error('Could not load configuration : ' + fileName);
}
return this._merge(config.all || {}, config[this.env] || {});
},
/**
* Deeply merge 2 objects
*
* @method _merge
* @param {Object} left
* @param {Object} right
* @return {Object}
* @private
*/
_merge: function(left, right) {
var self = this;
var ret = {};
var leftKeys = Object.keys(left);
var rightKeys = Object.keys(right);
rightKeys.forEach(function(key) {
var leftValue = left[key];
var rightValue = right[key];
switch (NOOT.typeOf(leftValue)) {
case 'object':
if (NOOT.isObject(rightValue)) ret[key] = self._merge(leftValue, rightValue);
break;
case 'array':
if (NOOT.isArray(rightValue)) ret[key] = _.union(leftValue, rightValue);
break;
default:
ret[key] = rightValue;
}
if (NOOT.isNone(ret[key])) ret[key] = rightValue;
});
_.pull.apply(_, [leftKeys].concat(rightKeys));
leftKeys.forEach(function(key) { ret[key] = left[key]; });
return ret;
}
}, {
/**
* @property DEFAULTS
* @static
*/
DEFAULTS: { DIRECTORY: path.join(process.cwd(), 'config') }
});
/**
* @exports
*/
module.exports = Configurator;