UNPKG

@glimmer/di

Version:

Dependency injection support for Glimmer applications.

118 lines (103 loc) 11.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Container = function () { function Container(registry) { var resolver = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; _classCallCheck(this, Container); this._registry = registry; this._resolver = resolver; this._lookups = {}; this._factoryDefinitionLookups = {}; } Container.prototype.factoryFor = function factoryFor(specifier) { var factoryDefinition = this._factoryDefinitionLookups[specifier]; if (!factoryDefinition) { if (this._resolver) { factoryDefinition = this._resolver.retrieve(specifier); } if (!factoryDefinition) { factoryDefinition = this._registry.registration(specifier); } if (factoryDefinition) { this._factoryDefinitionLookups[specifier] = factoryDefinition; } } if (!factoryDefinition) { return; } return this.buildFactory(specifier, factoryDefinition); }; Container.prototype.lookup = function lookup(specifier) { var singleton = this._registry.registeredOption(specifier, 'singleton') !== false; if (singleton) { var lookup = this._lookups[specifier]; if (lookup) { return lookup.instance; } } var factory = this.factoryFor(specifier); if (!factory) { return; } if (this._registry.registeredOption(specifier, 'instantiate') === false) { return factory.class; } var instance = factory.create(); if (singleton && instance) { this._lookups[specifier] = { factory: factory, instance: instance }; } return instance; }; Container.prototype.defaultInjections = function defaultInjections(specifier) { return {}; }; Container.prototype.teardown = function teardown() { var specifiers = Object.keys(this._lookups); for (var i = 0; i < specifiers.length; i++) { var specifier = specifiers[i]; var _lookups$specifier = this._lookups[specifier], factory = _lookups$specifier.factory, instance = _lookups$specifier.instance; factory.teardown(instance); } }; Container.prototype.defaultTeardown = function defaultTeardown(instance) {}; Container.prototype.buildInjections = function buildInjections(specifier) { var hash = this.defaultInjections(specifier); var injections = this._registry.registeredInjections(specifier); var injection = void 0; for (var i = 0; i < injections.length; i++) { injection = injections[i]; hash[injection.property] = this.lookup(injection.source); } return hash; }; Container.prototype.buildFactory = function buildFactory(specifier, factoryDefinition) { var _this = this; var injections = this.buildInjections(specifier); return { class: factoryDefinition, teardown: function (instance) { if (factoryDefinition.teardown) { factoryDefinition.teardown(instance); } else { _this.defaultTeardown(instance); } }, create: function (options) { var mergedOptions = Object.assign({}, injections, options); return factoryDefinition.create(mergedOptions); } }; }; return Container; }(); exports.default = Container; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJDb250YWluZXIiLCJyZXNvbHZlciIsImZhY3RvcnlGb3IiLCJzcGVjaWZpZXIiLCJmYWN0b3J5RGVmaW5pdGlvbiIsImxvb2t1cCIsInNpbmdsZXRvbiIsImZhY3RvcnkiLCJpbnN0YW5jZSIsImRlZmF1bHRJbmplY3Rpb25zIiwidGVhcmRvd24iLCJzcGVjaWZpZXJzIiwiT2JqZWN0IiwiaSIsImRlZmF1bHRUZWFyZG93biIsImJ1aWxkSW5qZWN0aW9ucyIsImhhc2giLCJpbmplY3Rpb25zIiwiaW5qZWN0aW9uIiwiYnVpbGRGYWN0b3J5IiwiY2xhc3MiLCJtZXJnZWRPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUFxQkEsWTtBQUNqQixhQUFBLFNBQUEsQ0FBQSxRQUFBLEVBQXVDO0FBQUEsWUFBakJDLFdBQWlCLFVBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxVQUFBLENBQUEsTUFBQSxTQUFBLEdBQUEsVUFBQSxDQUFBLENBQUEsR0FBTixJQUFNOztBQUFBLHdCQUFBLElBQUEsRUFBQSxTQUFBOztBQUNuQyxhQUFBLFNBQUEsR0FBQSxRQUFBO0FBQ0EsYUFBQSxTQUFBLEdBQUEsUUFBQTtBQUNBLGFBQUEsUUFBQSxHQUFBLEVBQUE7QUFDQSxhQUFBLHlCQUFBLEdBQUEsRUFBQTtBQUNIOzt3QkFDREMsVSx1QkFBV0MsUyxFQUFXO0FBQ2xCLFlBQUlDLG9CQUFvQixLQUFBLHlCQUFBLENBQXhCLFNBQXdCLENBQXhCO0FBQ0EsWUFBSSxDQUFKLGlCQUFBLEVBQXdCO0FBQ3BCLGdCQUFJLEtBQUosU0FBQSxFQUFvQjtBQUNoQkEsb0NBQW9CLEtBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBcEJBLFNBQW9CLENBQXBCQTtBQUNIO0FBQ0QsZ0JBQUksQ0FBSixpQkFBQSxFQUF3QjtBQUNwQkEsb0NBQW9CLEtBQUEsU0FBQSxDQUFBLFlBQUEsQ0FBcEJBLFNBQW9CLENBQXBCQTtBQUNIO0FBQ0QsZ0JBQUEs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LGFBQU9BLENBQVA7QUFDSDtBQVpFLFNBQVA7Ozs7OztrQkF0RWFKLFMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXIge1xuICAgIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5LCByZXNvbHZlciA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgICAgICAgdGhpcy5fbG9va3VwcyA9IHt9O1xuICAgICAgICB0aGlzLl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHMgPSB7fTtcbiAgICB9XG4gICAgZmFjdG9yeUZvcihzcGVjaWZpZXIpIHtcbiAgICAgICAgbGV0IGZhY3RvcnlEZWZpbml0aW9uID0gdGhpcy5fZmFjdG9yeURlZmluaXRpb25Mb29rdXBzW3NwZWNpZmllcl07XG4gICAgICAgIGlmICghZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNvbHZlcikge1xuICAgICAgICAgICAgICAgIGZhY3RvcnlEZWZpbml0aW9uID0gdGhpcy5fcmVzb2x2ZXIucmV0cmlldmUoc3BlY2lmaWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5RGVmaW5pdGlvbiA9IHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdHJhdGlvbihzcGVjaWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZhY3RvcnlEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFjdG9yeURlZmluaXRpb25Mb29rdXBzW3NwZWNpZmllcl0gPSBmYWN0b3J5RGVmaW5pdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZhY3RvcnlEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGYWN0b3J5KHNwZWNpZmllciwgZmFjdG9yeURlZmluaXRpb24pO1xuICAgIH1cbiAgICBsb29rdXAoc3BlY2lmaWVyKSB7XG4gICAgICAgIGxldCBzaW5nbGV0b24gPSB0aGlzLl9yZWdpc3RyeS5yZWdpc3RlcmVkT3B0aW9uKHNwZWNpZmllciwgJ3NpbmdsZXRvbicpICE9PSBmYWxzZTtcbiAgICAgICAgaWYgKHNpbmdsZXRvbikge1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHRoaXMuX2xvb2t1cHNbc3BlY2lmaWVyXTtcbiAgICAgICAgICAgIGlmIChsb29rdXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwLmluc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5Rm9yKHNwZWNpZmllcik7XG4gICAgICAgIGlmICghZmFjdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yZWdpc3RyeS5yZWdpc3RlcmVkT3B0aW9uKHNwZWNpZmllciwgJ2luc3RhbnRpYXRlJykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jbGFzcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5zdGFuY2UgPSBmYWN0b3J5LmNyZWF0ZSgpO1xuICAgICAgICBpZiAoc2luZ2xldG9uICYmIGluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb29rdXBzW3NwZWNpZmllcl0gPSB7IGZhY3RvcnksIGluc3RhbmNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBkZWZhdWx0SW5qZWN0aW9ucyhzcGVjaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgbGV0IHNwZWNpZmllcnMgPSBPYmplY3Qua2V5cyh0aGlzLl9sb29rdXBzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGVjaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3BlY2lmaWVyID0gc3BlY2lmaWVyc1tpXTtcbiAgICAgICAgICAgIGxldCB7IGZhY3RvcnksIGluc3RhbmNlIH0gPSB0aGlzLl9sb29rdXBzW3NwZWNpZmllcl07XG4gICAgICAgICAgICBmYWN0b3J5LnRlYXJkb3duKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0VGVhcmRvd24oaW5zdGFuY2UpIHt9XG4gICAgYnVpbGRJbmplY3Rpb25zKHNwZWNpZmllcikge1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMuZGVmYXVsdEluamVjdGlvbnMoc3BlY2lmaWVyKTtcbiAgICAgICAgbGV0IGluamVjdGlvbnMgPSB0aGlzLl9yZWdpc3RyeS5yZWdpc3RlcmVkSW5qZWN0aW9ucyhzcGVjaWZpZXIpO1xuICAgICAgICBsZXQgaW5qZWN0aW9uO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGluamVjdGlvbiA9IGluamVjdGlvbnNbaV07XG4gICAgICAgICAgICBoYXNoW2luamVjdGlvbi5wcm9wZXJ0eV0gPSB0aGlzLmxvb2t1cChpbmplY3Rpb24uc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG4gICAgYnVpbGRGYWN0b3J5KHNwZWNpZmllciwgZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgbGV0IGluamVjdGlvbnMgPSB0aGlzLmJ1aWxkSW5qZWN0aW9ucyhzcGVjaWZpZXIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3M6IGZhY3RvcnlEZWZpbml0aW9uLFxuICAgICAgICAgICAgdGVhcmRvd246IGluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeURlZmluaXRpb24udGVhcmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeURlZmluaXRpb24udGVhcmRvd24oaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFRlYXJkb3duKGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGluamVjdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5RGVmaW5pdGlvbi5jcmVhdGUobWVyZ2VkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==