const Shell = require('./shell') const lodash = require('lodash') const defConfig = require('./config/index.js') let configTarget = lodash.cloneDeep(defConfig) function _deleteDisabledItem (target) { lodash.forEach(target, (item, key) => { if (item == null) { delete target[key] } if (lodash.isObject(item)) { _deleteDisabledItem(item) } }) } const configApi = { get () { return configTarget }, set (newConfig) { if (newConfig == null) { return } const merged = lodash.cloneDeep(newConfig) const clone = lodash.cloneDeep(defConfig) lodash.merge(merged, clone) lodash.merge(merged, newConfig) _deleteDisabledItem(merged) configTarget = merged return configTarget }, getDefault () { return lodash.cloneDeep(defConfig) }, addDefault (key, defValue) { lodash.set(defConfig, key, defValue) }, resetDefault (key) { if (key) { let value = lodash.get(defConfig, key) value = lodash.cloneDeep(value) lodash.set(configTarget, key, value) } else { configTarget = lodash.cloneDeep(defConfig) } return configTarget }, async getVariables (type) { const method = type === 'npm' ? Shell.getNpmEnv : Shell.getSystemEnv const currentMap = await method() const list = [] const map = configTarget.variables[type] for (const key in map) { const exists = currentMap[key] != null list.push({ key, value: map[key], exists }) } return list }, async setVariables (type) { const list = await configApi.getVariables(type) const noSetList = list.filter(item => { return !item.exists }) if (list.length > 0) { const context = { root_ca_cert_path: configApi.get().server.setting.rootCaFile.certPath } for (const item of noSetList) { if (item.value.indexOf('${') >= 0) { for (const key in context) { item.value = item.value.replcace(new RegExp('${' + key + '}', 'g'), context[key]) } } } const method = type === 'npm' ? Shell.setNpmEnv : Shell.setSystemEnv return method({ list: noSetList }) } } } module.exports = configApi