@libreworks/container
Version:
A simple dependency injection container and event target
78 lines • 13 kB
JavaScript
import { measureTime, nullLogger } from "./util.js";
export class Provider {
#logger;
#name;
#factory;
#tags;
#instance;
constructor(name, factory, tags = [], logger = nullLogger) {
this.#name = name;
this.#factory = factory;
this.#tags = new Set(tags);
this.#logger = logger;
}
get name() {
return this.#name;
}
get tags() {
return this.#tags;
}
async provide(container) {
if (this.#instance === undefined) {
this.#logger.debug(`Instantiating component: ${this.#name}`);
this.#instance = measureTime(() => this.#factory(container), this.#logger, `Component instantiated: ${this.#name}`);
return this.#instance;
}
return this.#instance;
}
}
export class Container extends EventTarget {
#logger;
#providers;
#bytag;
constructor(providers, logger = nullLogger) {
super();
this.#logger = logger;
this.#providers = new Map(providers);
this.#logger.trace(`Number of value providers: ${providers.size}`);
const byTag = new Map();
for (let provider of providers.values()) {
for (let tag of provider.tags) {
if (!byTag.has(tag)) {
byTag.set(tag, new Set());
}
byTag.get(tag).add(provider);
}
}
this.#bytag = byTag;
this.#logger.trace(`Number of tags: ${providers.size}`);
}
async get(name) {
if (!this.#providers.has(name)) {
throw new RangeError(`No component is registered under the name '${name}'`);
}
const provider = this.#providers.get(name);
return provider.provide(this);
}
getAll(names) {
const namesList = Array.from(names);
if (namesList.length === 0) {
return Promise.resolve([]);
}
return Promise.all(namesList.map((name) => this.get(name)));
}
getAllTagged(tag) {
if (!this.#bytag.has(tag)) {
return Promise.resolve([]);
}
const providers = this.#bytag.get(tag);
return Promise.all(Array.from(providers, (p) => p.provide(this)));
}
getNames() {
return Array.from(this.#providers.keys());
}
has(name) {
return this.#providers.has(name);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVVwRCxNQUFNLE9BQU8sUUFBUTtJQUNWLE9BQU8sQ0FBUztJQUNoQixLQUFLLENBQVM7SUFDZCxRQUFRLENBQWE7SUFDckIsS0FBSyxDQUFjO0lBQzVCLFNBQVMsQ0FBYztJQVV2QixZQUNFLElBQVksRUFDWixPQUFtQixFQUNuQixPQUFpQixFQUFFLEVBQ25CLFNBQWlCLFVBQVU7UUFFM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBS0QsSUFBVyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFLRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQVFNLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBb0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FDMUIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFDWiwyQkFBMkIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUN4QyxDQUFD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QyxDQUFDO0lBQ3BFLENBQUM7SUFPTSxRQUFRO1FBQ2IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBV00sR0FBRyxDQUFDLElBQVk7UUFDckIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJ0cy1sb2dcIjtcbmltcG9ydCB7IG1lYXN1cmVUaW1lLCBudWxsTG9nZ2VyIH0gZnJvbSBcIi4vdXRpbC5qc1wiO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBhIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBGYWN0b3J5PFY+ID0gKGNvbnRhaW5lcjogQ29udGFpbmVyKSA9PiBWO1xuXG4vKipcbiAqIEEgbmFtZWQgb2JqZWN0IHRoYXQgcHJvdmlkZXMgYSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb3ZpZGVyPFQgPSBhbnk+IHtcbiAgcmVhZG9ubHkgI2xvZ2dlcjogTG9nZ2VyO1xuICByZWFkb25seSAjbmFtZTogc3RyaW5nO1xuICByZWFkb25seSAjZmFjdG9yeTogRmFjdG9yeTxUPjtcbiAgcmVhZG9ubHkgI3RhZ3M6IFNldDxzdHJpbmc+O1xuICAjaW5zdGFuY2U/OiBQcm9taXNlPFQ+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFByb3ZpZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBmYWN0b3J5IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHRhZ3MgLSBBbiBvcHRpb25hbCBhcnJheSBvZiBzdHJpbmcgdGFncyBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIGxvZ2dlciAtIFRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZhY3Rvcnk6IEZhY3Rvcnk8VD4sXG4gICAgdGFnczogc3RyaW5nW10gPSBbXSxcbiAgICBsb2dnZXI6IExvZ2dlciA9IG51bGxMb2dnZXIsXG4gICkge1xuICAgIHRoaXMuI25hbWUgPSBuYW1lO1xuICAgIHRoaXMuI2ZhY3RvcnkgPSBmYWN0b3J5O1xuICAgIHRoaXMuI3RhZ3MgPSBuZXcgU2V0KHRhZ3MpO1xuICAgIHRoaXMuI2xvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgY29tcG9uZW50IG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdGFncyBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFncygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuI3RhZ3M7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGVzIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBUaGUgY29udGFpbmVyIG9iamVjdC5cbiAgICogQHJldHVybnMgdGhlIGNvbXBvbmVudCBhcyBwcm9kdWNlZCBieSB0aGUgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcm92aWRlKGNvbnRhaW5lcjogQ29udGFpbmVyKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuI2luc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuI2xvZ2dlci5kZWJ1ZyhgSW5zdGFudGlhdGluZyBjb21wb25lbnQ6ICR7dGhpcy4jbmFtZX1gKTtcbiAgICAgIHRoaXMuI2luc3RhbmNlID0gbWVhc3VyZVRpbWUoXG4gICAgICAgICgpID0+IHRoaXMuI2ZhY3RvcnkoY29udGFpbmVyKSxcbiAgICAgICAgdGhpcy4jbG9nZ2VyLFxuICAgICAgICBgQ29tcG9uZW50IGluc3RhbnRpYXRlZDogJHt0aGlzLiNuYW1lfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuI2luc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy4jaW5zdGFuY2U7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbXBsaXN0aWMgYXN5bmNocm9ub3VzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRhaW5lciBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgcmVhZG9ubHkgI2xvZ2dlcjogTG9nZ2VyO1xuICByZWFkb25seSAjcHJvdmlkZXJzOiBNYXA8c3RyaW5nLCBQcm92aWRlcjx1bmtub3duPj47XG4gIHJlYWRvbmx5ICNieXRhZzogTWFwPHN0cmluZywgU2V0PFByb3ZpZGVyPHVua25vd24+Pj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBDb250YWluZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlcnMgLSBBIE1hcCBvZiBwcm92aWRlcnMgYnkgbmFtZS5cbiAgICogQHBhcmFtIGxvZ2dlciAtIFRoZSBsb2dnZXIgaW5zdGFuY2UsIGRlZmF1bHQ6IG5vIGxvZ3NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm92aWRlcnM6IE1hcDxzdHJpbmcsIFByb3ZpZGVyPHVua25vd24+PixcbiAgICBsb2dnZXI6IExvZ2dlciA9IG51bGxMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jbG9nZ2VyID0gbG9nZ2VyO1xuXG4gICAgdGhpcy4jcHJvdmlkZXJzID0gbmV3IE1hcChwcm92aWRlcnMpO1xuICAgIHRoaXMuI2xvZ2dlci50cmFjZShgTnVtYmVyIG9mIHZhbHVlIHByb3ZpZGVyczogJHtwcm92aWRlcnMuc2l6ZX1gKTtcblxuICAgIGNvbnN0IGJ5VGFnID0gbmV3IE1hcCgpO1xuICAgIGZvciAobGV0IHByb3ZpZGVyIG9mIHByb3ZpZGVycy52YWx1ZXMoKSkge1xuICAgICAgZm9yIChsZXQgdGFnIG9mIHByb3ZpZGVyLnRhZ3MpIHtcbiAgICAgICAgaWYgKCFieVRhZy5oYXModGFnKSkge1xuICAgICAgICAgIGJ5VGFnLnNldCh0YWcsIG5ldyBTZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnlUYWcuZ2V0KHRhZykuYWRkKHByb3ZpZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jYnl0YWcgPSBieVRhZztcbiAgICB0aGlzLiNsb2dnZXIudHJhY2UoYE51bWJlciBvZiB0YWdzOiAke3Byb3ZpZGVycy5zaXplfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBuYW1lZCBjb21wb25lbnQgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBjb21wb25lbnQgbmFtZS5cbiAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gaWYgbm8gY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGlmICghdGhpcy4jcHJvdmlkZXJzLmhhcyhuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgIGBObyBjb21wb25lbnQgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgbmFtZSAnJHtuYW1lfSdgLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcHJvdmlkZXIgPSB0aGlzLiNwcm92aWRlcnMuZ2V0KG5hbWUpIGFzIFByb3ZpZGVyPFQ+O1xuICAgIHJldHVybiBwcm92aWRlci5wcm92aWRlKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbXVsdGlwbGUgbmFtZWQgY29tcG9uZW50cyBmcm9tIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lcyAtIFRoZSBjb21wb25lbnQgbmFtZXMuXG4gICAqIEB0aHJvd3Mge1JhbmdlRXJyb3J9IGlmIG5vIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkIHdpdGggb25lIG9mIHRoZSBwcm92aWRlZCBuYW1lcy5cbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlZ2lzdGVyZWQgY29tcG9uZW50c1xuICAgKi9cbiAgcHVibGljIGdldEFsbDxUID0gYW55PihcbiAgICBuYW1lczogSXRlcmFibGU8c3RyaW5nPiB8IEFycmF5TGlrZTxzdHJpbmc+LFxuICApOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IG5hbWVzTGlzdCA9IEFycmF5LmZyb20obmFtZXMpO1xuICAgIGlmIChuYW1lc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKG5hbWVzTGlzdC5tYXAoKG5hbWUpID0+IHRoaXMuZ2V0KG5hbWUpKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbnkgY29tcG9uZW50cyByZWdpc3RlcmVkIHVuZGVyIGEgc3BlY2lmaWMgdGFnLlxuICAgKlxuICAgKiBAcGFyYW0gdGFnIC0gVGhlIHRhZy5cbiAgICogQHJldHVybnMgQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHRhZ2dlZCBjb21wb25lbnRzLlxuICAgKi9cbiAgcHVibGljIGdldEFsbFRhZ2dlZDxUID0gYW55Pih0YWc6IHN0cmluZyk6IFByb21pc2U8VFtdPiB7XG4gICAgaWYgKCF0aGlzLiNieXRhZy5oYXModGFnKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgfVxuICAgIGNvbnN0IHByb3ZpZGVycyA9IHRoaXMuI2J5dGFnLmdldCh0YWcpISBhcyBTZXQ8UHJvdmlkZXI8VD4+O1xuICAgIHJldHVybiBQcm9taXNlLmFsbChBcnJheS5mcm9tKHByb3ZpZGVycywgKHApID0+IHAucHJvdmlkZSh0aGlzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIGNvbXBvbmVudCBuYW1lcy5cbiAgICovXG4gIHB1YmxpYyBnZXROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy4jcHJvdmlkZXJzLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb250YWluZXIgaG9sZHMgYSBuYW1lZCBjb21wb25lbnQuXG4gICAqXG4gICAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLCBpbnZva2luZyBgZ2V0YCB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlciB3aWxsXG4gICAqIG5vdCB0aHJvdyBhIGBSYW5nZUVycm9yYC5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgY29tcG9uZW50IG5hbWUuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBleGlzdHMgaW4gdGhlIGNvbnRhaW5lclxuICAgKi9cbiAgcHVibGljIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jcHJvdmlkZXJzLmhhcyhuYW1lKTtcbiAgfVxufVxuIl19