UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

64 lines (63 loc) 1.89 kB
/** * DevExtreme (esm/__internal/core/di/index.js) * Version: 25.1.3 * Build date: Wed Jun 25 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ export class DIContext { constructor() { this.instances = new Map; this.fabrics = new Map; this.aliases = new Map; this.antiRecursionSet = new Set } register(id, fabric) { fabric ?? (fabric = id); this.fabrics.set(id, fabric) } registerInstance(id, instance) { this.instances.set(id, instance) } get(id) { const instance = this.tryGet(id); if (instance) { return instance } throw new Error(`DI item is not registered: ${id}`) } tryGet(id) { id = this.resolveAlias(id); if (this.instances.get(id)) { return this.instances.get(id) } const fabric = this.fabrics.get(id); if (fabric) { const res = this.create(fabric); this.instances.set(id, res); this.instances.set(fabric, res); return res } return null } create(fabric) { if (this.antiRecursionSet.has(fabric)) { throw new Error("dependency cycle in DI") } this.antiRecursionSet.add(fabric); const args = fabric.dependencies.map((dependency => this.get(dependency))); this.antiRecursionSet.delete(fabric); return new fabric(...args) } addAlias(aliasId, id) { this.aliases.set(aliasId, id) } resolveAlias(aliasId) { let result = aliasId; while (this.aliases.has(result)) { result = this.aliases.get(result) } return result } }