import * as plugins from './qenv.plugins' export interface IKeyValueObject { key: string, value: string } export class Qenv { requiredEnvVars: string[] = [] availableEnvVars: string[] = [] missingEnvVars: string[] = [] keyValueObjectArray: IKeyValueObject[] = [] constructor (basePathArg = process.cwd(), envYmlPathArg, failOnMissing = true) { getRequiredEnvVars(basePathArg, this.requiredEnvVars) getAvailableEnvVars(this.requiredEnvVars, envYmlPathArg, this.availableEnvVars, this.keyValueObjectArray) this.missingEnvVars = getMissingEnvVars(this.requiredEnvVars, this.availableEnvVars) // handle missing variables if (this.missingEnvVars.length > 0) { console.info('Required Env Vars are:') console.log(this.requiredEnvVars) console.error('However some Env variables could not be resolved:') console.log(this.missingEnvVars) if (failOnMissing) { console.error('Exiting!') process.exit(1) } } } } let getRequiredEnvVars = (pathArg: string, requiredEnvVarsArray: string[]) => { let qenvFilePath = plugins.path.join(pathArg, 'qenv.yml') let qenvFile = plugins.smartfile.fs.toObjectSync(qenvFilePath) for (let keyArg in qenvFile.vars) { requiredEnvVarsArray.push(qenvFile.vars[ keyArg ]) } } let getAvailableEnvVars = ( requiredEnvVarsArg: string[], envYmlPathArg: string, availableEnvVarsArray: string[], keyValueObjectArrayArg: IKeyValueObject[] ) => { envYmlPathArg = plugins.path.join(envYmlPathArg, 'env.yml') let envYml try { envYml = plugins.smartfile.fs.toObjectSync(envYmlPathArg) } catch (err) { console.log("env file couldn't be found at " + envYmlPathArg) envYml = {} } for (let requiredEnvVar of requiredEnvVarsArg) { if (process.env[ requiredEnvVar ]) { availableEnvVarsArray.push(requiredEnvVar) keyValueObjectArrayArg.push({ key: requiredEnvVar, value: process.env[ requiredEnvVar ] }) } else if (envYml.hasOwnProperty(requiredEnvVar)) { process.env[ requiredEnvVar ] = envYml[ requiredEnvVar ] availableEnvVarsArray.push(requiredEnvVar) keyValueObjectArrayArg.push({ key: requiredEnvVar, value: process.env[ requiredEnvVar ] }) } } } let getMissingEnvVars = (requiredEnvVarsArray: string[], availableEnvVarsArray: string[]) => { return plugins.lodash.difference(requiredEnvVarsArray, availableEnvVarsArray) }