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.js var src_exports = {}; __export(src_exports, { Service: () => Service, ServiceContainer: () => ServiceContainer }); module.exports = __toCommonJS(src_exports); // node_modules/@e22m4u/js-format/src/utils/is-class.js function isClass(value) { if (!value) return false; return typeof value === "function" && /^class\s/.test(Function.prototype.toString.call(value)); } // node_modules/@e22m4u/js-format/src/value-to-string.js var BASE_CTOR_NAMES = [ "String", "Number", "Boolean", "Object", "Array", "Function", "Symbol", "Map", "Set", "Date" ]; function valueToString(input) { if (input == null) return String(input); if (typeof input === "string") return `"${input}"`; if (typeof input === "number" || typeof input === "boolean") return String(input); if (isClass(input)) return input.name ? input.name : "Class"; if (input.constructor && input.constructor.name) return BASE_CTOR_NAMES.includes(input.constructor.name) ? input.constructor.name : `${input.constructor.name} (instance)`; if (typeof input === "object" && input.constructor == null) return "Object"; return String(input); } // node_modules/@e22m4u/js-format/src/array-to-list.js var SEPARATOR = ", "; function arrayToList(input) { if (Array.isArray(input) && input.length) return input.map(valueToString).join(SEPARATOR); return valueToString(input); } // node_modules/@e22m4u/js-format/src/format.js function format(pattern) { if (pattern instanceof Date) { pattern = pattern.toISOString(); } else if (typeof pattern !== "string") { pattern = String(pattern); } const re = /(%?)(%([sdjvl]))/g; const args = Array.prototype.slice.call(arguments, 1); if (args.length) { pattern = pattern.replace(re, function(match, escaped, ptn, flag) { let arg = args.shift(); switch (flag) { case "s": arg = String(arg); break; case "d": arg = Number(arg); break; case "j": arg = JSON.stringify(arg); break; case "v": arg = valueToString(arg); break; case "l": arg = arrayToList(arg); break; } if (!escaped) return arg; args.unshift(arg); return match; }); } if (args.length) pattern += " " + args.join(" "); pattern = pattern.replace(/%{2}/g, "%"); return "" + pattern; } // node_modules/@e22m4u/js-format/src/errorf.js var Errorf = class extends Error { /** * Constructor. * * @param {string|undefined} pattern * @param {any} args */ constructor(pattern = void 0, ...args) { const message = pattern != null ? format(pattern, ...args) : void 0; super(message); } }; // src/errors/invalid-argument-error.js var InvalidArgumentError = class extends Errorf { }; // src/service-container.js var ServiceContainer = class _ServiceContainer { /** * Services map. * * @type {Map} * @private */ _services = /* @__PURE__ */ new Map(); /** * Parent container. * * @type {ServiceContainer} * @private */ _parent; /** * Constructor. * * @param {ServiceContainer|undefined} parent */ constructor(parent = void 0) { if (parent != null) { if (!(parent instanceof _ServiceContainer)) throw new InvalidArgumentError( 'The provided parameter "parent" of ServicesContainer.constructor must be an instance ServiceContainer, but %v given.', parent ); this._parent = parent; } } /** * Получить существующий или новый экземпляр. * * @param {*} ctor * @param {*} args * @return {*} */ get(ctor, ...args) { if (!ctor || typeof ctor !== "function") throw new InvalidArgumentError( "The first argument of ServicesContainer.get must be a class constructor, but %v given.", ctor ); if (!this._services.has(ctor) && this._parent && this._parent.has(ctor)) { return this._parent.get(ctor); } let service = this._services.get(ctor); if (!service || args.length) { service = ctor.kind === Service.name ? new ctor(this, ...args) : new ctor(...args); this._services.set(ctor, service); } else if (typeof service === "function") { service = service(); this._services.set(ctor, service); } return service; } /** * Проверка существования конструктора в контейнере. * * @param {*} ctor * @return {boolean} */ has(ctor) { if (this._services.has(ctor)) return true; if (this._parent) return this._parent.has(ctor); return false; } /** * Добавить конструктор в контейнер. * * @param {*} ctor * @param {*} args * @return {this} */ add(ctor, ...args) { if (!ctor || typeof ctor !== "function") throw new InvalidArgumentError( "The first argument of ServicesContainer.add must be a class constructor, but %v given.", ctor ); const factory = () => ctor.kind === Service.name ? new ctor(this, ...args) : new ctor(...args); this._services.set(ctor, factory); return this; } /** * Добавить конструктор и создать экземпляр. * * @param {*} ctor * @param {*} args * @return {this} */ use(ctor, ...args) { if (!ctor || typeof ctor !== "function") throw new InvalidArgumentError( "The first argument of ServicesContainer.use must be a class constructor, but %v given.", ctor ); const service = ctor.kind === Service.name ? new ctor(this, ...args) : new ctor(...args); this._services.set(ctor, service); return this; } /** * Добавить конструктор и связанный экземпляр. * * @param {*} ctor * @param {*} service * @return {this} */ set(ctor, service) { if (!ctor || typeof ctor !== "function") throw new InvalidArgumentError( "The first argument of ServicesContainer.set must be a class constructor, but %v given.", ctor ); if (!service || typeof service !== "object" || Array.isArray(service)) throw new InvalidArgumentError( "The second argument of ServicesContainer.set must be an Object, but %v given.", service ); this._services.set(ctor, service); return this; } }; // src/service.js var Service = class _Service { /** * Kind. * * @type {string} */ static kind = _Service.name; /** * Container. * * @type {ServiceContainer} */ container; /** * Constructor. * * @param {ServiceContainer|undefined} container */ constructor(container = void 0) { this.container = container instanceof ServiceContainer ? container : new ServiceContainer(); } /** * Получить существующий или новый экземпляр. * * @param {*} ctor * @param {*} args * @return {*} */ getService(ctor, ...args) { return this.container.get(ctor, ...args); } /** * Проверка существования конструктора в контейнере. * * @param {*} ctor * @return {boolean} */ hasService(ctor) { return this.container.has(ctor); } /** * Добавить конструктор в контейнер. * * @param {*} ctor * @param {*} args * @return {this} */ addService(ctor, ...args) { this.container.add(ctor, ...args); return this; } /** * Добавить конструктор и создать экземпляр. * * @param {*} ctor * @param {*} args * @return {this} */ useService(ctor, ...args) { this.container.use(ctor, ...args); return this; } /** * Добавить конструктор и связанный экземпляр. * * @param {*} ctor * @param {*} service * @return {this} */ setService(ctor, service) { this.container.set(ctor, service); return this; } }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Service, ServiceContainer });