UNPKG

@difizen/mana-syringe

Version:

200 lines (198 loc) 9.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.register = exports.GlobalContainer = exports.ContainerMeta = exports.Container = void 0; var _manaCommon = require("@difizen/mana-common"); var _inversify = require("inversify"); var _containerApi = require("./container-api"); var _core = require("./core"); var _inversifyApi = require("./inversify-api"); var _module = require("./module"); var _register = require("./register"); function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } var ContainerMeta = exports.ContainerMeta = Symbol('ContainerMeta'); /* eslint-disable @typescript-eslint/no-explicit-any */ var Container = exports.Container = /*#__PURE__*/function () { function Container(inversifyContainer) { _classCallCheck(this, Container); _defineProperty(this, "disposed", void 0); _defineProperty(this, "toDisposeOnParentChange", new _manaCommon.DisposableCollection()); _defineProperty(this, "onModuleChangedEmitter", new _manaCommon.Emitter()); _defineProperty(this, "onRegisteredEmitter", new _manaCommon.Emitter()); _defineProperty(this, "_parent", void 0); _defineProperty(this, "loadedModules", []); _defineProperty(this, "container", void 0); if (inversifyContainer) { this.container = inversifyContainer; } else { this.container = new _inversify.Container(); } _containerApi.ContainerAPI.setCache(this.container, this); this.register({ token: _core.Syringe.ContextToken, useDynamic: function useDynamic(ctx) { return ctx; }, lifecycle: _core.Syringe.Lifecycle.singleton }); } _createClass(Container, [{ key: "onModuleChanged", get: function get() { return this.onModuleChangedEmitter.event; } }, { key: "onRegistered", get: function get() { return this.onRegisteredEmitter.event; } }, { key: "parent", get: function get() { return this._parent; }, set: function set(p) { var _this = this; this._parent = p; if (this.toDisposeOnParentChange) { this.toDisposeOnParentChange.dispose(); this.toDisposeOnParentChange = new _manaCommon.DisposableCollection(); } if (p) { this.toDisposeOnParentChange.push(p.onModuleChanged(function () { _this.onModuleChangedEmitter.fire(); })); this.toDisposeOnParentChange.push(p.onRegistered(function () { _this.onRegisteredEmitter.fire(); })); } } }, { key: "dispose", value: function dispose() { this.toDisposeOnParentChange.dispose(); this.onModuleChangedEmitter.dispose(); this.onRegisteredEmitter.dispose(); this.disposed = true; } }, { key: "load", value: function load(module, force) { var deep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (force || !this.loadedModules.includes(module.id)) { if ((0, _module.isSyringeModule)(module)) { if (deep) { var _module$toLoader = module.toLoader(), dependencies = _module$toLoader.dependencies; if (dependencies) { var _iterator = _createForOfIteratorHelper(dependencies), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var dep = _step.value; this.load(dep); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } } this.container.load(module.inversifyModule); this.onModuleChangedEmitter.fire(); } else { console.warn("Unsupported module".concat(module.name ? " ".concat(module.name) : '', "."), module); } this.loadedModules.push(module.id); } } }, { key: "unload", value: function unload(module) { if ((0, _module.isSyringeModule)(module)) { this.container.unload(module.inversifyModule); this.onModuleChangedEmitter.fire(); this.loadedModules = this.loadedModules.filter(function (id) { return id !== module.id; }); } } }, { key: "remove", value: function remove(token) { return this.container.unbind((0, _inversifyApi.tokenToIdentifier)(token)); } }, { key: "get", value: function get(token) { return this.container.get((0, _inversifyApi.tokenToIdentifier)(token)); } }, { key: "getNamed", value: function getNamed(token, named) { return this.container.getNamed((0, _inversifyApi.tokenToIdentifier)(token), (0, _inversifyApi.namedToIdentifier)(named)); } }, { key: "getAll", value: function getAll(token) { return this.container.getAll((0, _inversifyApi.tokenToIdentifier)(token)); } }, { key: "getAllNamed", value: function getAllNamed(token, named) { return this.container.getAllNamed((0, _inversifyApi.tokenToIdentifier)(token), (0, _inversifyApi.namedToIdentifier)(named)); } }, { key: "isBound", value: function isBound(token) { return this.container.isBound((0, _inversifyApi.tokenToIdentifier)(token)); } }, { key: "isBoundNamed", value: function isBoundNamed(token, named) { return this.container.isBoundNamed((0, _inversifyApi.tokenToIdentifier)(token), (0, _inversifyApi.namedToIdentifier)(named)); } }, { key: "createChild", value: function createChild() { var childContainer = this.container.createChild(); var child = new Container(childContainer); child.parent = this; return child; } }, { key: "register", value: function register(token) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (_core.Utils.isInjectOption(token)) { _register.Register.resolveOption(this, token); } else { _register.Register.resolveTarget(this, token, options); } this.onRegisteredEmitter.fire(); } }], [{ key: "config", value: function config(option) { _register.Register.globalConfig = option; } }]); return Container; }(); var GlobalContainer = exports.GlobalContainer = new Container(_inversifyApi.GlobalContainer); var register = exports.register = GlobalContainer.register.bind(GlobalContainer); _containerApi.ContainerAPI.toContainer = function (ctn) { var container = new Container(ctn); return container; };