UNPKG

@glimmer/di

Version:

Dependency injection support for Glimmer applications.

93 lines (92 loc) 11.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); class Container { constructor(registry, resolver = null) { this._registry = registry; this._resolver = resolver; this._lookups = {}; this._factoryDefinitionLookups = {}; } factoryFor(specifier) { let 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); } lookup(specifier) { let singleton = this._registry.registeredOption(specifier, 'singleton') !== false; if (singleton) { let lookup = this._lookups[specifier]; if (lookup) { return lookup.instance; } } let factory = this.factoryFor(specifier); if (!factory) { return; } if (this._registry.registeredOption(specifier, 'instantiate') === false) { return factory.class; } let instance = factory.create(); if (singleton && instance) { this._lookups[specifier] = { factory, instance }; } return instance; } defaultInjections(specifier) { return {}; } teardown() { let specifiers = Object.keys(this._lookups); for (let i = 0; i < specifiers.length; i++) { let specifier = specifiers[i]; let { factory, instance } = this._lookups[specifier]; factory.teardown(instance); } } defaultTeardown(instance) {} buildInjections(specifier) { let hash = this.defaultInjections(specifier); let injections = this._registry.registeredInjections(specifier); let injection; for (let i = 0; i < injections.length; i++) { injection = injections[i]; hash[injection.property] = this.lookup(injection.source); } return hash; } buildFactory(specifier, factoryDefinition) { let injections = this.buildInjections(specifier); return { class: factoryDefinition, teardown: instance => { if (factoryDefinition.teardown) { factoryDefinition.teardown(instance); } else { this.defaultTeardown(instance); } }, create(options) { let mergedOptions = Object.assign({}, injections, options); return factoryDefinition.create(mergedOptions); } }; } } exports.default = Container; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyJDb250YWluZXIiLCJjb25zdHJ1Y3RvciIsInJlZ2lzdHJ5IiwicmVzb2x2ZXIiLCJfcmVnaXN0cnkiLCJfcmVzb2x2ZXIiLCJfbG9va3VwcyIsIl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHMiLCJmYWN0b3J5Rm9yIiwic3BlY2lmaWVyIiwiZmFjdG9yeURlZmluaXRpb24iLCJyZXRyaWV2ZSIsInJlZ2lzdHJhdGlvbiIsImJ1aWxkRmFjdG9yeSIsImxvb2t1cCIsInNpbmdsZXRvbiIsInJlZ2lzdGVyZWRPcHRpb24iLCJpbnN0YW5jZSIsImZhY3RvcnkiLCJjbGFzcyIsImNyZWF0ZSIsImRlZmF1bHRJbmplY3Rpb25zIiwidGVhcmRvd24iLCJzcGVjaWZpZXJzIiwiT2JqZWN0Iiwia2V5cyIsImkiLCJsZW5ndGgiLCJkZWZhdWx0VGVhcmRvd24iLCJidWlsZEluamVjdGlvbnMiLCJoYXNoIiwiaW5qZWN0aW9ucyIsInJlZ2lzdGVyZWRJbmplY3Rpb25zIiwiaW5qZWN0aW9uIiwicHJvcGVydHkiLCJzb3VyY2UiLCJvcHRpb25zIiwibWVyZ2VkT3B0aW9ucyIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBZSxNQUFNQSxTQUFOLENBQWdCO0FBQzNCQyxnQkFBWUMsUUFBWixFQUFzQkMsV0FBVyxJQUFqQyxFQUF1QztBQUNuQyxhQUFLQyxTQUFMLEdBQWlCRixRQUFqQjtBQUNBLGFBQUtHLFNBQUwsR0FBaUJGLFFBQWpCO0FBQ0EsYUFBS0csUUFBTCxHQUFnQixFQUFoQjtBQUNBLGFBQUtDLHlCQUFMLEdBQWlDLEVBQWpDO0FBQ0g7QUFDREMsZUFBV0MsU0FBWCxFQUFzQjtBQUNsQixZQUFJQyxvQkFBb0IsS0FBS0gseUJBQUwsQ0FBK0JFLFNBQS9CLENBQXhCO0FBQ0EsWUFBSSxDQUFDQyxpQkFBTCxFQUF3QjtBQUNwQixnQkFBSSxLQUFLTCxTQUFULEVBQW9CO0FBQ2hCSyxvQ0FBb0IsS0FBS0wsU0FB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QUFxQlgsUUFBckI7QUFDSDtBQUNKLGFBUkU7QUFTSEcsbUJBQU9nQixPQUFQLEVBQWdCO0FBQ1osb0JBQUlDLGdCQUFnQmIsT0FBT2MsTUFBUCxDQUFjLEVBQWQsRUFBa0JQLFVBQWxCLEVBQThCSyxPQUE5QixDQUFwQjtBQUNBLHVCQUFPMUIsa0JBQWtCVSxNQUFsQixDQUF5QmlCLGFBQXpCLENBQVA7QUFDSDtBQVpFLFNBQVA7QUFjSDtBQXBGMEI7a0JBQVZyQyxTIiwiZmlsZSI6ImNvbnRhaW5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lciB7XG4gICAgY29uc3RydWN0b3IocmVnaXN0cnksIHJlc29sdmVyID0gbnVsbCkge1xuICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgICAgICB0aGlzLl9yZXNvbHZlciA9IHJlc29sdmVyO1xuICAgICAgICB0aGlzLl9sb29rdXBzID0ge307XG4gICAgICAgIHRoaXMuX2ZhY3RvcnlEZWZpbml0aW9uTG9va3VwcyA9IHt9O1xuICAgIH1cbiAgICBmYWN0b3J5Rm9yKHNwZWNpZmllcikge1xuICAgICAgICBsZXQgZmFjdG9yeURlZmluaXRpb24gPSB0aGlzLl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHNbc3BlY2lmaWVyXTtcbiAgICAgICAgaWYgKCFmYWN0b3J5RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgZmFjdG9yeURlZmluaXRpb24gPSB0aGlzLl9yZXNvbHZlci5yZXRyaWV2ZShzcGVjaWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFmYWN0b3J5RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgIGZhY3RvcnlEZWZpbml0aW9uID0gdGhpcy5fcmVnaXN0cnkucmVnaXN0cmF0aW9uKHNwZWNpZmllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWN0b3J5RGVmaW5pdGlvbkxvb2t1cHNbc3BlY2lmaWVyXSA9IGZhY3RvcnlEZWZpbml0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZmFjdG9yeURlZmluaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZhY3Rvcnkoc3BlY2lmaWVyLCBmYWN0b3J5RGVmaW5pdGlvbik7XG4gICAgfVxuICAgIGxvb2t1cChzcGVjaWZpZXIpIHtcbiAgICAgICAgbGV0IHNpbmdsZXRvbiA9IHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyZWRPcHRpb24oc3BlY2lmaWVyLCAnc2luZ2xldG9uJykgIT09IGZhbHNlO1xuICAgICAgICBpZiAoc2luZ2xldG9uKSB7XG4gICAgICAgICAgICBsZXQgbG9va3VwID0gdGhpcy5fbG9va3Vwc1tzcGVjaWZpZXJdO1xuICAgICAgICAgICAgaWYgKGxvb2t1cCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXAuaW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZhY3RvcnkgPSB0aGlzLmZhY3RvcnlGb3Ioc3BlY2lmaWVyKTtcbiAgICAgICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyZWRPcHRpb24oc3BlY2lmaWVyLCAnaW5zdGFudGlhdGUnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNsYXNzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IGZhY3RvcnkuY3JlYXRlKCk7XG4gICAgICAgIGlmIChzaW5nbGV0b24gJiYgaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvb2t1cHNbc3BlY2lmaWVyXSA9IHsgZmFjdG9yeSwgaW5zdGFuY2UgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICAgIGRlZmF1bHRJbmplY3Rpb25zKHNwZWNpZmllcikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHRlYXJkb3duKCkge1xuICAgICAgICBsZXQgc3BlY2lmaWVycyA9IE9iamVjdC5rZXlzKHRoaXMuX2xvb2t1cHMpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWNpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzcGVjaWZpZXIgPSBzcGVjaWZpZXJzW2ldO1xuICAgICAgICAgICAgbGV0IHsgZmFjdG9yeSwgaW5zdGFuY2UgfSA9IHRoaXMuX2xvb2t1cHNbc3BlY2lmaWVyXTtcbiAgICAgICAgICAgIGZhY3RvcnkudGVhcmRvd24oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlZmF1bHRUZWFyZG93bihpbnN0YW5jZSkge31cbiAgICBidWlsZEluamVjdGlvbnMoc3BlY2lmaWVyKSB7XG4gICAgICAgIGxldCBoYXNoID0gdGhpcy5kZWZhdWx0SW5qZWN0aW9ucyhzcGVjaWZpZXIpO1xuICAgICAgICBsZXQgaW5qZWN0aW9ucyA9IHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyZWRJbmplY3Rpb25zKHNwZWNpZmllcik7XG4gICAgICAgIGxldCBpbmplY3Rpb247XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaW5qZWN0aW9uID0gaW5qZWN0aW9uc1tpXTtcbiAgICAgICAgICAgIGhhc2hbaW5qZWN0aW9uLnByb3BlcnR5XSA9IHRoaXMubG9va3VwKGluamVjdGlvbi5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH1cbiAgICBidWlsZEZhY3Rvcnkoc3BlY2lmaWVyLCBmYWN0b3J5RGVmaW5pdGlvbikge1xuICAgICAgICBsZXQgaW5qZWN0aW9ucyA9IHRoaXMuYnVpbGRJbmplY3Rpb25zKHNwZWNpZmllcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbGFzczogZmFjdG9yeURlZmluaXRpb24sXG4gICAgICAgICAgICB0ZWFyZG93bjogaW5zdGFuY2UgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5RGVmaW5pdGlvbi50ZWFyZG93bikge1xuICAgICAgICAgICAgICAgICAgICBmYWN0b3J5RGVmaW5pdGlvbi50ZWFyZG93bihpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VGVhcmRvd24oaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGUob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIGxldCBtZXJnZWRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgaW5qZWN0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnlEZWZpbml0aW9uLmNyZWF0ZShtZXJnZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59Il19