@glimmer/di
Version:
Dependency injection support for Glimmer applications.
109 lines (95 loc) • 11.9 kB
JavaScript
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