ts-ioc-container
Version:
Typescript IoC container
78 lines (77 loc) • 2.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.by = exports.InstancesResolver = exports.InjectionResolver = void 0;
const IContainer_1 = require("./container/IContainer");
const DepKey_1 = require("./DepKey");
class InjectionResolver {
resolveByOptions;
isLazy = false;
getArgs = () => [];
constructor(resolveByOptions) {
this.resolveByOptions = resolveByOptions;
}
args(...deps) {
this.getArgs = () => deps;
return this;
}
argsFn(fn) {
this.getArgs = fn;
return this;
}
lazy() {
this.isLazy = true;
return this;
}
resolve(s) {
return this.resolveByOptions(s, {
lazy: this.isLazy,
args: this.getArgs(s),
});
}
}
exports.InjectionResolver = InjectionResolver;
class InstancesResolver {
predicate;
isCascade = true;
constructor(predicate) {
this.predicate = predicate;
}
cascade(isTrue) {
this.isCascade = isTrue;
return this;
}
resolve(c) {
const result = new Set(c.getInstances().filter(this.predicate));
if (this.isCascade) {
for (const s of c.getScopes()) {
for (const instance of s.getInstances().filter(this.predicate)) {
result.add(instance);
}
}
}
return [...result];
}
}
exports.InstancesResolver = InstancesResolver;
exports.by = {
many: (target) => {
const alias = (0, IContainer_1.isDependencyKey)(target) ? target : target.key;
return new InjectionResolver((s, options) => s.resolveMany(alias, options));
},
one: (target) => {
const key = (0, DepKey_1.isDepKey)(target) ? target.key : target;
return new InjectionResolver((s, options) => s.resolveOne(key, options));
},
/**
* Use it only for optimization. Otherwise, recommended to use `by.one`
*/
aliasOne: (target) => {
const alias = (0, DepKey_1.isDepKey)(target) ? target.key : target;
return new InjectionResolver((s, options) => s.resolveOneByAlias(alias, options));
},
instances: (predicate = () => true) => new InstancesResolver(predicate),
scope: {
current: (container) => container,
create: (options) => (l) => l.createScope(options),
},
};