@glimmer/di
Version:
Dependency injection support for Glimmer applications.
118 lines (103 loc) • 11.7 kB
JavaScript
'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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJDb250YWluZXIiLCJyZXNvbHZlciIsImZhY3RvcnlGb3IiLCJzcGVjaWZpZXIiLCJmYWN0b3J5RGVmaW5pdGlvbiIsImxvb2t1cCIsInNpbmdsZXRvbiIsImZhY3RvcnkiLCJpbnN0YW5jZSIsImRlZmF1bHRJbmplY3Rpb25zIiwidGVhcmRvd24iLCJzcGVjaWZpZXJzIiwiT2JqZWN0IiwiaSIsImRlZmF1bHRUZWFyZG93biIsImJ1aWxkSW5qZWN0aW9ucyIsImhhc2giLCJpbmplY3Rpb25zIiwiaW5qZWN0aW9uIiwiYnVpbGRGYWN0b3J5IiwiY2xhc3MiLCJtZXJnZWRPcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQUFxQkEsWTtBQUNqQixhQUFBLFNBQUEsQ0FBQSxRQUFBLEVBQXVDO0FBQUEsWUFBakJDLFdBQWlCLFVBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxVQUFBLENBQUEsTUFBQSxTQUFBLEdBQUEsVUFBQSxDQUFBLENBQUEsR0FBTixJQUFNOztBQUFBLHdCQUFBLElBQUEsRUFBQSxTQUFBOztBQUNuQyxhQUFBLFNBQUEsR0FBQSxRQUFBO0FBQ0EsYUFBQSxTQUFBLEdBQUEsUUFBQTtBQUNBLGFBQUEsUUFBQSxHQUFBLEVBQUE7QUFDQSxhQUFBLHlCQUFBLEdBQUEsRUFBQTtBQUNIOzt3QkFDREMsVSx1QkFBV0MsUyxFQUFXO0FBQ2xCLFlBQUlDLG9CQUFvQixLQUFBLHlCQUFBLENBQXhCLFNBQXdCLENBQXhCO0FBQ0EsWUFBSSxDQUFKLGlCQUFBLEVBQXdCO0FBQ3BCLGdCQUFJLEtBQUosU0FBQSxFQUFvQjtBQUNoQkEsb0NBQW9CLEtBQUEsU0FBQSxDQUFBLFFBQUEsQ0FBcEJBLFNBQW9CLENBQXBCQTtBQUNIO0FBQ0QsZ0JBQUksQ0FBSixpQkFBQSxFQUF3QjtBQUNwQkEsb0NBQW9CLEtBQUEsU0FBQSxDQUFBLFlBQUEsQ0FBcEJBLFNBQW9CLENBQXBCQTtBQUNIO0FBQ0QsZ0JBQUEsaUJBQUEsRUFBdUI7QUFDbkIscUJBQUEseUJBQUEsQ0FBQSxTQUFBLElBQUEsaUJBQUE7QUFDSDtBQUNKO0FBQ0QsWUFBSSxDQUFKLGlCQUFBLEVBQXdCO0FBQ3BCO0FBQ0g7QUFDRCxlQUFPLEtBQUEsWUFBQSxDQUFBLFNBQUEsRUFBUCxpQkFBTyxDQUFQOzs7d0JBRUpDLE0sbUJBQU9GLFMsRUFBVztBQUNkLFlBQUlHLFlBQVksS0FBQSxTQUFBLENBQUEsZ0JBQUEsQ0FBQSxTQUFBLEVBQUEsV0FBQSxNQUFoQixLQUFBO0FBQ0EsWUFBQSxTQUFBLEVBQWU7QUFDWCxnQkFBSUQsU0FBUyxLQUFBLFFBQUEsQ0FBYixTQUFhLENBQWI7QUFDQSxnQkFBQSxNQUFBLEVBQVk7QUFDUix1QkFBT0EsT0FBUCxRQUFBO0FBQ0g7QUFDSjtBQUNELFlBQUlFLFVBQVUsS0FBQSxVQUFBLENBQWQsU0FBYyxDQUFkO0FBQ0EsWUFBSSxDQUFKLE9BQUEsRUFBYztBQUNWO0FBQ0g7QUFDRCxZQUFJLEtBQUEsU0FBQSxDQUFBLGdCQUFBLENBQUEsU0FBQSxFQUFBLGFBQUEsTUFBSixLQUFBLEVBQXlFO0FBQ3JFLG1CQUFPQSxRQUFQLEtBQUE7QUFDSDtBQUNELFlBQUlDLFdBQVdELFFBQWYsTUFBZUEsRUFBZjtBQUNBLFlBQUlELGFBQUosUUFBQSxFQUEyQjtBQUN2QixpQkFBQSxRQUFBLENBQUEsU0FBQSxJQUEyQixFQUFFQyxTQUFGLE9BQUEsRUFBV0MsVUFBdEMsUUFBMkIsRUFBM0I7QUFDSDtBQUNELGVBQUEsUUFBQTs7O3dCQUVKQyxpQiw4QkFBa0JOLFMsRUFBVztBQUN6QixlQUFBLEVBQUE7Ozt3QkFFSk8sUSx1QkFBVztBQUNQLFlBQUlDLGFBQWFDLE9BQUFBLElBQUFBLENBQVksS0FBN0IsUUFBaUJBLENBQWpCO0FBQ0EsYUFBSyxJQUFJQyxJQUFULENBQUEsRUFBZ0JBLElBQUlGLFdBQXBCLE1BQUEsRUFBQSxHQUFBLEVBQTRDO0FBQ3hDLGdCQUFJUixZQUFZUSxXQUFoQixDQUFnQkEsQ0FBaEI7QUFEd0MsZ0JBQUEscUJBRVosS0FBQSxRQUFBLENBRlksU0FFWixDQUZZO0FBQUEsZ0JBQUEsVUFBQSxtQkFBQSxPQUFBO0FBQUEsZ0JBQUEsV0FBQSxtQkFBQSxRQUFBOztBQUd4Q0osb0JBQUFBLFFBQUFBLENBQUFBLFFBQUFBO0FBQ0g7Ozt3QkFFTE8sZSw0QkFBZ0JOLFEsRUFBVSxDOzt3QkFDMUJPLGUsNEJBQWdCWixTLEVBQVc7QUFDdkIsWUFBSWEsT0FBTyxLQUFBLGlCQUFBLENBQVgsU0FBVyxDQUFYO0FBQ0EsWUFBSUMsYUFBYSxLQUFBLFNBQUEsQ0FBQSxvQkFBQSxDQUFqQixTQUFpQixDQUFqQjtBQUNBLFlBQUlDLFlBQUFBLEtBQUosQ0FBQTtBQUNBLGFBQUssSUFBSUwsSUFBVCxDQUFBLEVBQWdCQSxJQUFJSSxXQUFwQixNQUFBLEVBQUEsR0FBQSxFQUE0QztBQUN4Q0Msd0JBQVlELFdBQVpDLENBQVlELENBQVpDO0FBQ0FGLGlCQUFLRSxVQUFMRixRQUFBQSxJQUEyQixLQUFBLE1BQUEsQ0FBWUUsVUFBdkNGLE1BQTJCLENBQTNCQTtBQUNIO0FBQ0QsZUFBQSxJQUFBOzs7d0JBRUpHLFkseUJBQWFoQixTLEVBQVdDLGlCLEVBQW1CO0FBQUEsWUFBQSxRQUFBLElBQUE7O0FBQ3ZDLFlBQUlhLGFBQWEsS0FBQSxlQUFBLENBQWpCLFNBQWlCLENBQWpCO0FBQ0EsZUFBTztBQUNIRyxtQkFERyxpQkFBQTtBQUVIVixzQkFBVSxVQUFBLFFBQUEsRUFBWTtBQUNsQixvQkFBSU4sa0JBQUosUUFBQSxFQUFnQztBQUM1QkEsc0NBQUFBLFFBQUFBLENBQUFBLFFBQUFBO0FBREosaUJBQUEsTUFFTztBQUNILDBCQUFBLGVBQUEsQ0FBQSxRQUFBO0FBQ0g7QUFQRixhQUFBO0FBQUEsb0JBQUEsVUFBQSxPQUFBLEVBU2E7QUFDWixvQkFBSWlCLGdCQUFnQlQsT0FBQUEsTUFBQUEsQ0FBQUEsRUFBQUEsRUFBQUEsVUFBQUEsRUFBcEIsT0FBb0JBLENBQXBCO0FBQ0EsdUJBQU9SLGtCQUFBQSxNQUFBQSxDQUFQLGFBQU9BLENBQVA7QUFDSDtBQVpFLFNBQVA7Ozs7OztrQkF0RWFKLFMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBjbGFzcyBDb250YWluZXIge1xuICAgIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5LCByZXNvbHZlciA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgICAgICAgdGhpcy5fbG9va3VwcyA9IHt9O1xuICAgICAgICB0aGlzLl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHMgPSB7fTtcbiAgICB9XG4gICAgZmFjdG9yeUZvcihzcGVjaWZpZXIpIHtcbiAgICAgICAgbGV0IGZhY3RvcnlEZWZpbml0aW9uID0gdGhpcy5fZmFjdG9yeURlZmluaXRpb25Mb29rdXBzW3NwZWNpZmllcl07XG4gICAgICAgIGlmICghZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNvbHZlcikge1xuICAgICAgICAgICAgICAgIGZhY3RvcnlEZWZpbml0aW9uID0gdGhpcy5fcmVzb2x2ZXIucmV0cmlldmUoc3BlY2lmaWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5RGVmaW5pdGlvbiA9IHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdHJhdGlvbihzcGVjaWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZhY3RvcnlEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFjdG9yeURlZmluaXRpb25Mb29rdXBzW3NwZWNpZmllcl0gPSBmYWN0b3J5RGVmaW5pdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZhY3RvcnlEZWZpbml0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGYWN0b3J5KHNwZWNpZmllciwgZmFjdG9yeURlZmluaXRpb24pO1xuICAgIH1cbiAgICBsb29rdXAoc3BlY2lmaWVyKSB7XG4gICAgICAgIGxldCBzaW5nbGV0b24gPSB0aGlzLl9yZWdpc3RyeS5yZWdpc3RlcmVkT3B0aW9uKHNwZWNpZmllciwgJ3NpbmdsZXRvbicpICE9PSBmYWxzZTtcbiAgICAgICAgaWYgKHNpbmdsZXRvbikge1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHRoaXMuX2xvb2t1cHNbc3BlY2lmaWVyXTtcbiAgICAgICAgICAgIGlmIChsb29rdXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwLmluc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5Rm9yKHNwZWNpZmllcik7XG4gICAgICAgIGlmICghZmFjdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yZWdpc3RyeS5yZWdpc3RlcmVkT3B0aW9uKHNwZWNpZmllciwgJ2luc3RhbnRpYXRlJykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5jbGFzcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5zdGFuY2UgPSBmYWN0b3J5LmNyZWF0ZSgpO1xuICAgICAgICBpZiAoc2luZ2xldG9uICYmIGluc3RhbmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb29rdXBzW3NwZWNpZmllcl0gPSB7IGZhY3RvcnksIGluc3RhbmNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBkZWZhdWx0SW5qZWN0aW9ucyhzcGVjaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICB0ZWFyZG93bigpIHtcbiAgICAgICAgbGV0IHNwZWNpZmllcnMgPSBPYmplY3Qua2V5cyh0aGlzLl9sb29rdXBzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGVjaWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3BlY2lmaWVyID0gc3BlY2lmaWVyc1tpXTtcbiAgICAgICAgICAgIGxldCB7IGZhY3RvcnksIGluc3RhbmNlIH0gPSB0aGlzLl9sb29rdXBzW3NwZWNpZmllcl07XG4gICAgICAgICAgICBmYWN0b3J5LnRlYXJkb3duKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0VGVhcmRvd24oaW5zdGFuY2UpIHt9XG4gICAgYnVpbGRJbmplY3Rpb25zKHNwZWNpZmllcikge1xuICAgICAgICBsZXQgaGFzaCA9IHRoaXMuZGVmYXVsdEluamVjdGlvbnMoc3BlY2lmaWVyKTtcbiAgICAgICAgbGV0IGluamVjdGlvbnMgPSB0aGlzLl9yZWdpc3RyeS5yZWdpc3RlcmVkSW5qZWN0aW9ucyhzcGVjaWZpZXIpO1xuICAgICAgICBsZXQgaW5qZWN0aW9uO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGluamVjdGlvbiA9IGluamVjdGlvbnNbaV07XG4gICAgICAgICAgICBoYXNoW2luamVjdGlvbi5wcm9wZXJ0eV0gPSB0aGlzLmxvb2t1cChpbmplY3Rpb24uc291cmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9XG4gICAgYnVpbGRGYWN0b3J5KHNwZWNpZmllciwgZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgbGV0IGluamVjdGlvbnMgPSB0aGlzLmJ1aWxkSW5qZWN0aW9ucyhzcGVjaWZpZXIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xhc3M6IGZhY3RvcnlEZWZpbml0aW9uLFxuICAgICAgICAgICAgdGVhcmRvd246IGluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeURlZmluaXRpb24udGVhcmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeURlZmluaXRpb24udGVhcmRvd24oaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFRlYXJkb3duKGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVyZ2VkT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGluamVjdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5RGVmaW5pdGlvbi5jcmVhdGUobWVyZ2VkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufSJdfQ==