import path from 'path'; import * as _ from 'lodash-es'; import yaml from 'js-yaml'; import fs from 'fs'; import { logger } from '@certd/basic'; function parseEnv(defaultConfig: any) { const config = {}; for (const key in process.env) { let keyName = key; if (!keyName.startsWith('certd_')) { continue; } keyName = keyName.replace('certd_', ''); const configKey = keyName.replaceAll('_', '.'); const oldValue = _.get(defaultConfig, configKey); let value: any = process.env[key]; if (typeof oldValue === 'boolean') { value = value === 'true'; } else if (Number.isInteger(oldValue)) { value = parseInt(value, 10); } else if (typeof oldValue === 'number') { value = parseFloat(value); } _.set(config, configKey, value); } return config; } export function load(config, env = '') { // Get document, or throw exception on error logger.info('load config', env); const yamlPath = path.join(process.cwd(), `.env.${env}.yaml`); if (fs.existsSync(yamlPath)) { const doc = yaml.load(fs.readFileSync(yamlPath, 'utf8')); return _.merge(doc, parseEnv(config)); } return parseEnv(config); } export function mergeConfig(config: any, envType: string) { _.merge(config, load(config, envType)); const keys = _.get(config, 'auth.jwt.secret'); if (keys) { config.keys = keys; } return config; } export function loadDotEnv() { const envStr = fs.readFileSync('.env').toString(); envStr.split('\n').forEach(line => { const [key, value] = line.trim().split('='); const oldValue = process.env[key]; if (!oldValue) { process.env[key] = value; } }); }