vue-di-container
Version:
Dependency injection container for Vue
45 lines (44 loc) • 1.38 kB
JavaScript
export class Container {
constructor(parent, resolver) {
this.parent = parent;
this.resolver = resolver;
this.definitions = new Map();
this.values = new Map();
this.resolvingKeys = new Set();
}
register(provider) {
const def = this.resolver.resolve(provider);
if (def === undefined) {
throw new Error('Malformed provider');
}
this.definitions.set(def.key, def);
}
get(key) {
let value = this.values.get(key);
if (value !== undefined) {
return value;
}
const def = this.definitions.get(key);
if (def !== undefined) {
if (this.resolvingKeys.has(key)) {
const keys = Array.from(this.resolvingKeys.values())
.map(k => k.name)
.join('\'\n\'');
throw new Error(`Circular dependency while resolving:\n'${keys}'`);
}
this.resolvingKeys.add(key);
try {
value = def.get(this);
}
finally {
this.resolvingKeys.delete(key);
}
this.values.set(key, value);
return value;
}
if (this.parent) {
return this.parent.get(key);
}
throw new Error(`Dependency '${key.name}' not found`);
}
}