| /*! |
| * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com> |
| * 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; |