ts-ioc-container
Version:
Typescript IoC container
34 lines (33 loc) • 1.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveArgs = exports.toInjectFn = exports.inject = void 0;
exports.isInjectBuilder = isInjectBuilder;
const metadata_1 = require("../metadata");
const utils_1 = require("../utils");
const HookContext_1 = require("../hooks/HookContext");
const inject = (fn) => (target, propertyKey, parameterIndex) => {
(0, metadata_1.setParameterMetadata)((0, HookContext_1.hookMetaKey)(propertyKey), (0, exports.toInjectFn)(fn))(utils_1.Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
};
exports.inject = inject;
function isInjectBuilder(fn) {
return 'resolve' in fn && typeof fn['resolve'] === 'function';
}
const toInjectFn = (target) => {
if (typeof target === 'object' && isInjectBuilder(target)) {
return (s) => target.resolve(s);
}
if (utils_1.Is.constructor(target)) {
return (scope) => scope.resolveClass(target);
}
if (utils_1.Is.dependencyKey(target)) {
return (scope) => scope.resolveOne(target);
}
return target;
};
exports.toInjectFn = toInjectFn;
const resolveArgs = (Target, methodName) => {
const argsFns = getInjectFns(Target, methodName);
return (scope, ...deps) => (0, utils_1.fillEmptyIndexes)(argsFns, deps.map(utils_1.constant)).map((fn) => fn(scope));
};
exports.resolveArgs = resolveArgs;
const getInjectFns = (Target, methodName) => (0, metadata_1.getParameterMetadata)((0, HookContext_1.hookMetaKey)(methodName), Target);