export class ConfigContainer { private readonly subContainerMap:Map = new Map() private readonly buildConfigMap:Map = new Map() public constructor( private readonly name:string, private readonly configMap:Map ) {} public getName():string { return this.name } public getConfigMap():Map { return this.configMap } public addSubContainer(config:ConfigContainer,cover:boolean=false):void { let name = config.getName() if ( !cover ) { let hasState = this.subContainerMap.has(name) if ( hasState ) return } this.subContainerMap.set(name,config) } public removeSubContainer(name:string):boolean { let hasState = this.subContainerMap.has(name) if ( !hasState ) return hasState this.subContainerMap.delete(name) return hasState } public getSubContainerLength():number { let sum:number = 0 if ( this.subContainerMap.size !== 0 ) { sum += this.subContainerMap.size for( let sub of this.subContainerMap.values() ){ sum += sub.getSubContainerLength() } } return sum } public getSubContainer(subContainerName:string):ConfigContainer | undefined { let subContainer = undefined let subContainerHasState = this.subContainerMap.has(subContainerName) if ( subContainerHasState ) { subContainer = this.subContainerMap.get(subContainerName) } else { let subContainerSize = this.subContainerMap.size if ( subContainerSize !== 0 ) { for ( let container of this.subContainerMap.values() ) { subContainer = container.getSubContainer(subContainerName) } } } return subContainer } public build(subContainerName:string):this { let subContainer = this.getSubContainer(subContainerName) if ( subContainer ) { let subContainerConfigMap = subContainer.getConfigMap() for ( let [key,val] of subContainerConfigMap.entries() ) { this.buildConfigMap.set(key,val) } } return this; } public make(mergeSelf:boolean = false):object { let configs = {} let selfConfigMap = this.getConfigMap() let buildConfigMap = this.buildConfigMap if ( buildConfigMap.size !== 0 ) { for ( let [key,val] of buildConfigMap.entries() ) { configs[key] = val } } if ( mergeSelf ) { if ( selfConfigMap.size !== 0 ) { for ( let [key,val] of selfConfigMap.entries() ) { configs[key] = val } } } return configs } }