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");
const fs = require('fs');
_.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) {
    let statSync = fs.lstatSync(config_dir);

    Config.argv();
    if (statSync.isDirectory()) {
        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`)
            });
    } else if (statSync.isFile()) {
        Config.file({
            file: config_dir
        });
    }
    Config.env('__');

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

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

module.exports = Config;