code/config.js

"use strict";

/**
 * Config
 * @description Load config files cascading from command line, environment variables to json/js files in config path
 * @namespace Config
 */

/**
 * @class
 * @classdesc Load config files cascading from command line, environment variables to json/js files in config path
 */


const Config = require('nconf');
const _ = require('underscore');
const s = require("underscore.string");
_.mixin(s.exports());

const path = require('path');
const user_home = process.env.HOME || process.env.USERPROFILE;
const default_config_dir = process.env.TEL_CONFIG_DIR || path.resolve(__dirname, '..', "config");

/**
 * @property {Boolean} initialized If initialized
 * @private
 * @memberof Config
 */
let initialized = false;

/**
 * @function init
 * @description Initialize config manager
 * @static
 * @param {String} config_dir Config dir path
 * @memberof Config
 * @public
 * @returns {Config}
 */

function init(config_dir) {
    Config.argv();
    const env = (Config.get('environment') || process.env.NODE_ENV || "development").toLowerCase();
    Config
        .add("env_js", {
            type: 'file',
            readOnly: true,
            file: path.resolve(config_dir, `${env}.js`)
        }).add("env_json", {
            type: 'file',
            readOnly: true,
            file: path.resolve(config_dir, `${env}.json`)
        }).add("shared_js", {
            type: 'file',
            readOnly: true,
            file: path.resolve(config_dir, 'shared.js')
        }).add("shared_json", {
            type: 'file',
            readOnly: true,
            file: path.resolve(config_dir, 'shared.json')
        }).add("home_js", {
            type: 'file',
            readOnly: true,
            file: path.resolve(user_home, `.telegrammer.js`)
        }).add("home_json", {
            type: 'file',
            readOnly: true,
            file: path.resolve(user_home, `.telegrammer.json`)
        });

    for (let key in Config.stores) {
        let store = Config.stores[key];
        if (store.type == 'file') {
            store.loadSync();
        }
    }

    Config.load_from = init;
    Config.env('__');
    initialized = true;
    return Config;
}

if (!initialized) {
    init(default_config_dir);
}

module.exports = Config;