UNPKG

@inversifyjs/container

Version:

InversifyJs container

57 lines 2.44 kB
import { isPlugin, } from '@inversifyjs/plugin'; import { InversifyContainerError } from '../../error/models/InversifyContainerError.js'; import { InversifyContainerErrorKind } from '../../error/models/InversifyContainerErrorKind.js'; export class PluginManager { #pluginApi; #pluginContext; #serviceResolutionManager; #serviceReferenceManager; constructor(container, serviceReferenceManager, serviceResolutionManager) { this.#serviceReferenceManager = serviceReferenceManager; this.#serviceResolutionManager = serviceResolutionManager; this.#pluginApi = this.#buildPluginApi(container); this.#pluginContext = this.#buildPluginContext(); } register(container, pluginConstructor) { const pluginInstance = new pluginConstructor(container, this.#pluginContext); this.#assertIsPlugin(pluginInstance); pluginInstance.load(this.#pluginApi); } #assertIsPlugin(value) { if (value[isPlugin] !== true) { throw new InversifyContainerError(InversifyContainerErrorKind.invalidOperation, 'Invalid plugin. The plugin must extend the Plugin class'); } } #buildPluginApi(container) { return { define: (name, // eslint-disable-next-line @typescript-eslint/no-explicit-any method) => { if (Object.prototype.hasOwnProperty.call(container, name)) { throw new InversifyContainerError(InversifyContainerErrorKind.invalidOperation, `Container already has a method named "${String(name)}"`); } container[name] = method; }, onPlan: this.#serviceResolutionManager.onPlan.bind(this.#serviceResolutionManager), }; } #buildPluginContext() { const serviceReferenceManager = this.#serviceReferenceManager; return { get activationService() { return serviceReferenceManager.activationService; }, get bindingService() { return serviceReferenceManager.bindingService; }, get deactivationService() { return serviceReferenceManager.deactivationService; }, get planResultCacheService() { return serviceReferenceManager.planResultCacheService; }, }; } } //# sourceMappingURL=PluginManager.js.map