import { ConfigType } from '../types/Config'; import config from '../config'; import { ChainNetwork } from '../types/ChainNetwork'; import { valueOrDefault } from '../utils/check'; type RecursivePartial = { [P in keyof T]?: RecursivePartial }; type ServiceName = keyof ConfigType['services']; export class ConfigService { _config: ConfigType; constructor({ _config = config } = {}) { this._config = _config; } public get() { return this._config; } public updateConfig(partialConfig: RecursivePartial) { const newConfig = Object.assign({}, this.get(), partialConfig); this._config = newConfig; } public chains() { return Object.keys(this.get().chains); } public networksFor(chain: keyof ConfigType['chains']) { return Object.keys(this.get().chains[chain]); } public chainNetworks(): Array { const chainNetworks = new Array(); for (let chain of this.chains()) { for (let network of this.networksFor(chain)) { chainNetworks.push({ chain, network }); } } return chainNetworks; } public chainConfig({ chain, network }: ChainNetwork) { return this.get().chains[chain][network]; } public for(service: T): ConfigType['services'][T] { return this.get().services[service] || {}; } public isDisabled(service: ServiceName) { const serviceConfig = this.for(service); const isDefined = x => x !== undefined; const disabled = isDefined(serviceConfig) ? valueOrDefault(serviceConfig.disabled, false) : false; return disabled; } } export const Config = new ConfigService();