lib/Config.js

/*!
 * clout-js
 * Copyright(c) 2015 - 2016 Muhammad Dadu
 * MIT Licensed
 */
/**
 * @module clout-js/lib/Config
 */
const path = require('path');
const fs = require('fs-extra');
const _ = require('lodash');
const utils = require('./utils');
const debug = require('debug')('clout:config');

/**
 * Creates a configuration object
 * @class
 */
class Config {

	/**
	 * @constructor
	 * @param {object} defaultConf default configuration object
	 */
	constructor(defaultConf) {
		debug('initializing config');
		this.env = process.env.NODE_ENV || 'development';

		if (defaultConf) {
			_.merge(this, defaultConf);
		}
	}

	/**
	 * Loads configuration
	 * @param  {object} dir directory
	 */
	loadFromDir(dir) {
		debug('loading config from dir %s', dir);
		if (!fs.existsSync(dir)) {
			debug('dir does not exist');
			return;
		}

		// load configurations
		var globDefault = '*default.js',
			globEnv = '*' + this.env + '.js';

		// 1) load default configuration
		utils.getGlobbedFiles(path.join(dir, globDefault)).forEach((file) => {
			debug('loading config from: %s', file);
			_.merge(this, require(file));
		});

		// 2) load env specific configuration
		utils.getGlobbedFiles(path.join(dir, globEnv)).forEach((file) => {
			debug('loading config from: %s', file);
			_.merge(this, require(file));
		});
	}

	/**
	 * Add config
	 * @param  {array} config configuration object
	 */
	merge(...opts) {
		_.merge(...[this, ...opts]);
	}

	toString() {
		return `[clout config] ${JSON.stringify(this, null, '  ')}`;
	}
}

module.exports = Config;