UNPKG

@discordx/di

Version:

dependency injection service with TSyringe support

250 lines (243 loc) 7.92 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { AbstractConfigurableDependencyInjector: () => AbstractConfigurableDependencyInjector, DIService: () => DIService, DefaultDependencyRegistryEngine: () => DefaultDependencyRegistryEngine, TsyringeDependencyRegistryEngine: () => TsyringeDependencyRegistryEngine, TypeDiDependencyRegistryEngine: () => TypeDiDependencyRegistryEngine, defaultDependencyRegistryEngine: () => defaultDependencyRegistryEngine, tsyringeDependencyRegistryEngine: () => tsyringeDependencyRegistryEngine, typeDiDependencyRegistryEngine: () => typeDiDependencyRegistryEngine }); module.exports = __toCommonJS(index_exports); // src/logic/impl/DefaultDependencyRegistryEngine.ts var DefaultDependencyRegistryEngine = class _DefaultDependencyRegistryEngine { static _instance; _services = /* @__PURE__ */ new Map(); static get instance() { _DefaultDependencyRegistryEngine._instance ??= new _DefaultDependencyRegistryEngine(); return _DefaultDependencyRegistryEngine._instance; } addService(serviceConstructor) { const service = new serviceConstructor(); this._services.set(serviceConstructor, service); } clearAllServices() { this._services.clear(); } getAllServices() { return new Set(this._services.values()); } getService(classType) { return this._services.get(classType); } }; // src/logic/AbstractConfigurableDependencyInjector.ts var AbstractConfigurableDependencyInjector = class { injector; useToken = false; _serviceSet = /* @__PURE__ */ new Set(); setInjector(injector) { this.injector = injector; return this; } setUseTokenization(useToken) { this.useToken = useToken; return this; } }; // src/logic/impl/TsyringeDependencyRegistryEngine.ts var TsyringeDependencyRegistryEngine = class _TsyringeDependencyRegistryEngine extends AbstractConfigurableDependencyInjector { static token = Symbol("discordx"); static _instance; factory = null; static get instance() { _TsyringeDependencyRegistryEngine._instance ??= new _TsyringeDependencyRegistryEngine(); return _TsyringeDependencyRegistryEngine._instance; } addService(serviceConstructor) { if (!this.injector) { throw new Error("Please set the container!"); } this._serviceSet.add(serviceConstructor); if (this.useToken) { if (!this.factory) { throw new Error("Unable to init tokenization without instance factory"); } const instanceCashingSingletonFactory = this.getInstanceCashingSingletonFactory(serviceConstructor); this.injector.register(_TsyringeDependencyRegistryEngine.token, { useFactory: instanceCashingSingletonFactory }); } else { this.injector.registerSingleton(serviceConstructor); } } clearAllServices() { if (!this.injector) { throw new Error("Please set the container!"); } this.injector.clearInstances(); } getService(classType) { if (!this.injector) { throw new Error("Please set the container!"); } const clazz = classType; if (this.useToken && !this.injector.isRegistered(clazz)) { return this.injector.resolveAll(_TsyringeDependencyRegistryEngine.token).find( (instance) => instance.constructor === clazz ) ?? null; } return this.injector.resolve(clazz); } getAllServices() { if (!this.injector) { throw new Error("Please set the container!"); } if (this.useToken) { return new Set( this.injector.resolveAll(_TsyringeDependencyRegistryEngine.token) ); } const retSet = /* @__PURE__ */ new Set(); for (const classRef of this._serviceSet) { retSet.add(this.injector.resolve(classRef)); } return retSet; } setToken(token) { _TsyringeDependencyRegistryEngine.token = token; return this; } setCashingSingletonFactory(factory) { this.factory = factory; return this; } getInstanceCashingSingletonFactory(clazz) { if (!this.factory) { throw new Error("Unable to init tokenization without instance factory"); } return this.factory((c) => { if (!c.isRegistered(clazz)) { c.registerSingleton(clazz); } return c.resolve(clazz); }); } }; // src/logic/impl/TypeDiDependencyRegistryEngine.ts var import_typedi = require("typedi"); var TypeDiDependencyRegistryEngine = class _TypeDiDependencyRegistryEngine extends AbstractConfigurableDependencyInjector { static token = new import_typedi.Token("discordx"); static _instance; service; static get instance() { _TypeDiDependencyRegistryEngine._instance ??= new _TypeDiDependencyRegistryEngine(); return _TypeDiDependencyRegistryEngine._instance; } addService(serviceConstructor) { if (!this.service) { throw new Error("Please set the Service!"); } this._serviceSet.add(serviceConstructor); if (this.useToken) { this.service({ id: _TypeDiDependencyRegistryEngine.token, multiple: true })(serviceConstructor); } else { this.service()(serviceConstructor); } } clearAllServices() { if (!this.injector) { throw new Error("Please set the Service!"); } this.injector.reset(); } setService(service) { this.service = service; return this; } setToken(token) { _TypeDiDependencyRegistryEngine.token = token; return this; } getAllServices() { if (!this.injector) { throw new Error("Please set the Service!"); } if (this.useToken) { return new Set( this.injector.getMany(_TypeDiDependencyRegistryEngine.token) ); } const retSet = /* @__PURE__ */ new Set(); for (const classRef of this._serviceSet) { retSet.add(this.injector.get(classRef)); } return retSet; } getService(classType) { if (!this.injector) { throw new Error("Please set the Service!"); } if (this.useToken) { return this.injector.getMany(_TypeDiDependencyRegistryEngine.token).find( (clazz) => clazz.constructor === classType ) ?? null; } return this.injector.get(classType); } }; // src/index.ts var typeDiDependencyRegistryEngine = TypeDiDependencyRegistryEngine.instance; var tsyringeDependencyRegistryEngine = TsyringeDependencyRegistryEngine.instance; var defaultDependencyRegistryEngine = DefaultDependencyRegistryEngine.instance; var DIService = class _DIService { static _engine = defaultDependencyRegistryEngine; static get engine() { return _DIService._engine; } static set engine(engine) { _DIService._engine = engine; } /** * @deprecated use DIService.engine instead */ static get instance() { return this.engine; } constructor() { } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AbstractConfigurableDependencyInjector, DIService, DefaultDependencyRegistryEngine, TsyringeDependencyRegistryEngine, TypeDiDependencyRegistryEngine, defaultDependencyRegistryEngine, tsyringeDependencyRegistryEngine, typeDiDependencyRegistryEngine });