UNPKG

@glimmer/di

Version:

Dependency injection support for Glimmer applications.

109 lines (95 loc) 11.9 kB
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; }(); export default Container; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJDb250YWluZXIiLCJyZWdpc3RyeSIsInJlc29sdmVyIiwiX3JlZ2lzdHJ5IiwiX3Jlc29sdmVyIiwiX2xvb2t1cHMiLCJfZmFjdG9yeURlZmluaXRpb25Mb29rdXBzIiwiZmFjdG9yeUZvciIsInNwZWNpZmllciIsImZhY3RvcnlEZWZpbml0aW9uIiwicmV0cmlldmUiLCJyZWdpc3RyYXRpb24iLCJidWlsZEZhY3RvcnkiLCJsb29rdXAiLCJzaW5nbGV0b24iLCJyZWdpc3RlcmVkT3B0aW9uIiwiaW5zdGFuY2UiLCJmYWN0b3J5IiwiY2xhc3MiLCJjcmVhdGUiLCJkZWZhdWx0SW5qZWN0aW9ucyIsInRlYXJkb3duIiwic3BlY2lmaWVycyIsIk9iamVjdCIsImtleXMiLCJpIiwibGVuZ3RoIiwiZGVmYXVsdFRlYXJkb3duIiwiYnVpbGRJbmplY3Rpb25zIiwiaGFzaCIsImluamVjdGlvbnMiLCJyZWdpc3RlcmVkSW5qZWN0aW9ucyIsImluamVjdGlvbiIsInByb3BlcnR5Iiwic291cmNlIiwib3B0aW9ucyIsIm1lcmdlZE9wdGlvbnMiLCJhc3NpZ24iXSwibWFwcGluZ3MiOiI7O0lBQXFCQSxTO0FBQ2pCLHVCQUFZQyxRQUFaLEVBQXVDO0FBQUEsWUFBakJDLFFBQWlCLHVFQUFOLElBQU07O0FBQUE7O0FBQ25DLGFBQUtDLFNBQUwsR0FBaUJGLFFBQWpCO0FBQ0EsYUFBS0csU0FBTCxHQUFpQkYsUUFBakI7QUFDQSxhQUFLRyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsYUFBS0MseUJBQUwsR0FBaUMsRUFBakM7QUFDSDs7d0JBQ0RDLFUsdUJBQVdDLFMsRUFBVztBQUNsQixZQUFJQyxvQkFBb0IsS0FBS0gseUJBQUwsQ0FBK0JFLFNBQS9CLENBQXhCO0FBQ0EsWUFBSSxDQUFDQyxpQkFBTCxFQUF3QjtBQUNwQixnQkFBSSxLQUFLTCxTQUFULEVBQW9CO0FBQ2hCSyxvQ0FBb0IsS0FBS0wsU0FBTCxDQUFlTSxRQUFm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bEIsQ0FBMkJMLFFBQTNCO0FBQ0gsaUJBRkQsTUFFTztBQUNILDBCQUFLVyxlQUFMLENBQXFCWCxRQUFyQjtBQUNIO0FBQ0osYUFSRTtBQVNIRyxrQkFURyxZQVNJZ0IsT0FUSixFQVNhO0FBQ1osb0JBQUlDLGdCQUFnQmIsT0FBT2MsTUFBUCxDQUFjLEVBQWQsRUFBa0JQLFVBQWxCLEVBQThCSyxPQUE5QixDQUFwQjtBQUNBLHVCQUFPMUIsa0JBQWtCVSxNQUFsQixDQUF5QmlCLGFBQXpCLENBQVA7QUFDSDtBQVpFLFNBQVA7QUFjSCxLOzs7OztlQXBGZ0JwQyxTIiwiZmlsZSI6ImNvbnRhaW5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lciB7XG4gICAgY29uc3RydWN0b3IocmVnaXN0cnksIHJlc29sdmVyID0gbnVsbCkge1xuICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgICAgICB0aGlzLl9yZXNvbHZlciA9IHJlc29sdmVyO1xuICAgICAgICB0aGlzLl9sb29rdXBzID0ge307XG4gICAgICAgIHRoaXMuX2ZhY3RvcnlEZWZpbml0aW9uTG9va3VwcyA9IHt9O1xuICAgIH1cbiAgICBmYWN0b3J5Rm9yKHNwZWNpZmllcikge1xuICAgICAgICBsZXQgZmFjdG9yeURlZmluaXRpb24gPSB0aGlzLl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHNbc3BlY2lmaWVyXTtcbiAgICAgICAgaWYgKCFmYWN0b3J5RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgZmFjdG9yeURlZmluaXRpb24gPSB0aGlzLl9yZXNvbHZlci5yZXRyaWV2ZShzcGVjaWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmYWN0b3J5RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgIGZhY3RvcnlEZWZpbml0aW9uID0gdGhpcy5fcmVnaXN0cnkucmVnaXN0cmF0aW9uKHNwZWNpZmllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHNbc3BlY2lmaWVyXSA9IGZhY3RvcnlEZWZpbml0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZhY3Rvcnkoc3BlY2lmaWVyLCBmYWN0b3J5RGVmaW5pdGlvbik7XG4gICAgfVxuICAgIGxvb2t1cChzcGVjaWZpZXIpIHtcbiAgICAgICAgbGV0IHNpbmdsZXRvbiA9IHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyZWRPcHRpb24oc3BlY2lmaWVyLCAnc2luZ2xldG9uJykgIT09IGZhbHNlO1xuICAgICAgICBpZiAoc2luZ2xldG9uKSB7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0gdGhpcy5fbG9va3Vwc1tzcGVjaWZpZXJdO1xuICAgICAgICAgICAgaWYgKGxvb2t1cCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXAuaW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZhY3RvcnkgPSB0aGlzLmZhY3RvcnlGb3Ioc3BlY2lmaWVyKTtcbiAgICAgICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyZWRPcHRpb24oc3BlY2lmaWVyLCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNsYXNzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IGZhY3RvcnkuY3JlYXRlKCk7XG4gICAgICAgIGlmIChzaW5nbGV0b24gJiYgaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvb2t1cHNbc3BlY2lmaWVyXSA9IHsgZmFjdG9yeSwgaW5zdGFuY2UgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIGRlZmF1bHRJbmplY3Rpb25zKHNwZWNpZmllcikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICBsZXQgc3BlY2lmaWVycyA9IE9iamVjdC5rZXlzKHRoaXMuX2xvb2t1cHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWNpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGVjaWZpZXIgPSBzcGVjaWZpZXJzW2ldO1xuICAgICAgICAgICAgbGV0IHsgZmFjdG9yeSwgaW5zdGFuY2UgfSA9IHRoaXMuX2xvb2t1cHNbc3BlY2lmaWVyXTtcbiAgICAgICAgICAgIGZhY3RvcnkudGVhcmRvd24oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHRUZWFyZG93bihpbnN0YW5jZSkge31cbiAgICBidWlsZEluamVjdGlvbnMoc3BlY2lmaWVyKSB7XG4gICAgICAgIGxldCBoYXNoID0gdGhpcy5kZWZhdWx0SW5qZWN0aW9ucyhzcGVjaWZpZXIpO1xuICAgICAgICBsZXQgaW5qZWN0aW9ucyA9IHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyZWRJbmplY3Rpb25zKHNwZWNpZmllcik7XG4gICAgICAgIGxldCBpbmplY3Rpb247XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaW5qZWN0aW9uID0gaW5qZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIGhhc2hbaW5qZWN0aW9uLnByb3BlcnR5XSA9IHRoaXMubG9va3VwKGluamVjdGlvbi5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH1cbiAgICBidWlsZEZhY3Rvcnkoc3BlY2lmaWVyLCBmYWN0b3J5RGVmaW5pdGlvbikge1xuICAgICAgICBsZXQgaW5qZWN0aW9ucyA9IHRoaXMuYnVpbGRJbmplY3Rpb25zKHNwZWNpZmllcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbGFzczogZmFjdG9yeURlZmluaXRpb24sXG4gICAgICAgICAgICB0ZWFyZG93bjogaW5zdGFuY2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5RGVmaW5pdGlvbi50ZWFyZG93bikge1xuICAgICAgICAgICAgICAgICAgICBmYWN0b3J5RGVmaW5pdGlvbi50ZWFyZG93bihpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VGVhcmRvd24oaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGUob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBtZXJnZWRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgaW5qZWN0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnlEZWZpbml0aW9uLmNyZWF0ZShtZXJnZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59Il19