ts-ioc-container
Version:
Fast, lightweight TypeScript dependency injection container with a clean API, scoped lifecycles, decorators, tokens, hooks, lazy injection, customizable providers, and no global container objects.
39 lines (38 loc) • 1.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createHookContextFactory = exports.createHookContext = exports.HookContext = void 0;
const proxy_1 = require("../utils/proxy");
const MetadataInjector_1 = require("../injector/MetadataInjector");
class HookContext {
scope;
methodName;
instance;
initialArgs = [];
constructor(instance, scope, methodName) {
this.scope = scope;
this.methodName = methodName;
this.instance = (0, proxy_1.isProxy)(instance) ? (0, proxy_1.getProxyTarget)(instance) : instance;
}
resolveArgs(...args) {
return (0, MetadataInjector_1.resolveArgs)(this.instance.constructor, this.methodName)(this.scope, {
args: [...this.initialArgs, ...args],
});
}
invokeMethod({ args = this.resolveArgs() } = {}) {
// @ts-ignore
return this.instance[this.methodName](...args);
}
setProperty(fn) {
// @ts-ignore
this.instance[this.methodName] = fn.resolve(this.scope);
}
setInitialArgs(...args) {
this.initialArgs = args;
return this;
}
}
exports.HookContext = HookContext;
const createHookContext = (Target, scope, methodName = 'constructor') => new HookContext(Target, scope, methodName);
exports.createHookContext = createHookContext;
const createHookContextFactory = ({ args = [] } = {}) => (Target, scope, methodName) => (0, exports.createHookContext)(Target, scope, methodName).setInitialArgs(...args);
exports.createHookContextFactory = createHookContextFactory;