UNPKG

vue-di-container

Version:
45 lines (44 loc) 1.38 kB
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`); } }