UNPKG

ts-ioc-container

Version:
27 lines (26 loc) 1.19 kB
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);