import { invariant } from '@rekajs/utils'; import { runInAction } from 'mobx'; import { ExtensionDefinition } from './definition'; import { Extension } from './extension'; import { Reka } from '../reka'; export class ExtensionRegistry { private keyToExtension: Map = new Map(); extensions: Extension[] = []; constructor(readonly reka: Reka, definitions: ExtensionDefinition[]) { definitions.forEach((definition) => { const extension = new Extension(this.reka, definition); this.keyToExtension.set(definition.key, extension); this.extensions.push(extension); runInAction(() => { Object.assign(this.reka.externals.states, extension.definition.globals); }); }); } init() { this.reka.change(() => { this.extensions.map((extension) => extension.init()); }); } dispose() { this.extensions.map((extension) => extension.dispose()); } getExtensionFromDefinition>( definition: D ): Extension { const extension = this.keyToExtension.get(definition.key); invariant(extension, `Extension "${definition.key}" not found`); return extension; } getExtensionStateValue>(definition: D) { const extension = this.getExtensionFromDefinition(definition); return extension.state as D['state']; } }