/*! * Copyright(c) 2011 Einar Otto Stangvik * MIT Licensed */ var fs = require('fs'); function Options(defaults) { var internalValues = {}; var values = this.value = {}; Object.keys(defaults).forEach(function(key) { internalValues[key] = defaults[key]; Object.defineProperty(values, key, { get: function() { return internalValues[key]; }, configurable: false, enumerable: true }); }); this.reset = function() { Object.keys(defaults).forEach(function(key) { internalValues[key] = defaults[key]; }); return this; }; this.merge = function(options, required) { options = options || {}; if (Object.prototype.toString.call(required) === '[object Array]') { var missing = []; for (var i = 0, l = required.length; i < l; ++i) { var key = required[i]; if (!(key in options)) { missing.push(key); } } if (missing.length > 0) { if (missing.length > 1) { throw new Error('options ' + missing.slice(0, missing.length - 1).join(', ') + ' and ' + missing[missing.length - 1] + ' must be defined'); } else throw new Error('option ' + missing[0] + ' must be defined'); } } Object.keys(options).forEach(function(key) { if (key in internalValues) { internalValues[key] = options[key]; } }); return this; }; this.copy = function(keys) { var obj = {}; Object.keys(defaults).forEach(function(key) { if (keys.indexOf(key) !== -1) { obj[key] = values[key]; } }); return obj; }; this.read = function(filename, cb) { if (typeof cb == 'function') { var self = this; fs.readFile(filename, function(error, data) { if (error) return cb(error); var conf = JSON.parse(data); self.merge(conf); cb(); }); } else { var conf = JSON.parse(fs.readFileSync(filename)); this.merge(conf); } return this; }; this.isDefined = function(key) { return typeof values[key] != 'undefined'; }; this.isDefinedAndNonNull = function(key) { return typeof values[key] != 'undefined' && values[key] !== null; }; Object.freeze(values); Object.freeze(this); } module.exports = Options;