import * as fs from "fs"; import * as optimist from "optimist"; export class ConfigLoader { static init(configObject:any, configFilePath?:string) { this.processConfigFile(configFilePath, configObject); this.processArguments(configObject); this.processEnvVariables(configObject); } private static processEnvVariables(configObject:any) { this.loadObject(configObject, process.env); }; private static processArguments(configObject:any) { let argv = optimist.argv; delete(argv._); delete(argv.$0); let config = {}; Object.keys(argv).forEach((key)=> { let keyArray = key.split("-"); let value = argv[key]; let setObject = (object, keyArray, value) => { let key = keyArray.shift(); object[key] = {}; if (keyArray.length == 0) { object[key] = value; return; } return setObject(object[key], keyArray, value); }; setObject(config, keyArray, value); }); this.loadObject(configObject, config); }; private static processConfigFile(configFilePath:string, configObject:any) { if (typeof configFilePath !== 'undefined') { if (ConfigLoader.loadConfigFile(configFilePath, configObject) === false) { ConfigLoader.saveConfigFile(configFilePath, configObject); } } }; private static loadConfigFile(configFilePath, configObject):boolean { if (fs.existsSync(configFilePath) === false) { return false; } try { let config = JSON.parse(fs.readFileSync(configFilePath, 'utf8')); this.loadObject(configObject, config); return true; } catch (err) { } return false; } private static saveConfigFile(configFilePath, configObject) { try { fs.writeFileSync(configFilePath, JSON.stringify(configObject, null, 4)); } catch (err) { } } private static loadObject(targetObject, sourceObject) { Object.keys(sourceObject).forEach((key)=> { if (typeof targetObject[key] === "undefined") { return; } if (typeof targetObject[key] === "object") { this.loadObject(targetObject[key], sourceObject[key]); } else { targetObject[key] = sourceObject[key]; } }); } }