import { AutoConfigure, Effects, ExpectedExports } from "../types"; import { Utils, deepEqual, deepMerge, utils } from "../util"; export type AutoConfigFrom = { [key: string]: (options: { effects: Effects; localConfig: Input; remoteConfig: unknown; utils: Utils; }) => Promise>; }; export class AutoConfig { constructor( readonly configs: AutoConfigFrom, readonly path: keyof AutoConfigFrom, ) {} async check( options: Parameters[0], ): ReturnType { const origConfig = JSON.parse(JSON.stringify(options.localConfig)); const newOptions = { ...options, utils: utils(options.effects), localConfig: options.localConfig as Input, }; if ( !deepEqual( origConfig, deepMerge( {}, options.localConfig, await this.configs[this.path](newOptions), ), ) ) throw new Error(`Check failed for ${this.path}`); } async autoConfigure( options: Parameters[0], ): ReturnType { const newOptions = { ...options, utils: utils(options.effects), localConfig: options.localConfig as Input, }; return deepMerge( {}, options.localConfig, await this.configs[this.path](newOptions), ); } }