ts-ioc-container
Version:
Typescript IoC container
27 lines (26 loc) • 1.19 kB
JavaScript
import { getParameterMetadata, setParameterMetadata } from '../metadata';
import { constant, fillEmptyIndexes, Is } from '../utils';
import { hookMetaKey } from '../hooks/HookContext';
export const inject = (fn) => (target, propertyKey, parameterIndex) => {
setParameterMetadata(hookMetaKey(propertyKey), toInjectFn(fn))(Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
};
export function isInjectBuilder(fn) {
return 'resolve' in fn && typeof fn['resolve'] === 'function';
}
export const toInjectFn = (target) => {
if (typeof target === 'object' && isInjectBuilder(target)) {
return (s) => target.resolve(s);
}
if (Is.constructor(target)) {
return (scope) => scope.resolveClass(target);
}
if (Is.dependencyKey(target)) {
return (scope) => scope.resolveOne(target);
}
return target;
};
export const resolveArgs = (Target, methodName) => {
const argsFns = getInjectFns(Target, methodName);
return (scope, ...deps) => fillEmptyIndexes(argsFns, deps.map(constant)).map((fn) => fn(scope));
};
const getInjectFns = (Target, methodName) => getParameterMetadata(hookMetaKey(methodName), Target);