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.
31 lines (30 loc) • 1.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveArgs = exports.argsFn = exports.args = exports.inject = exports.MetadataInjector = void 0;
const IInjector_1 = require("./IInjector");
const basic_1 = require("../utils/basic");
const parameter_1 = require("../metadata/parameter");
const toToken_1 = require("../token/toToken");
class MetadataInjector extends IInjector_1.Injector {
createInstance(scope, Target, { args: deps = [] } = {}) {
const args = (0, exports.resolveArgs)(Target)(scope, { args: deps });
return new Target(...args);
}
}
exports.MetadataInjector = MetadataInjector;
const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`;
const inject = (fn) => (target, propertyKey, parameterIndex) => {
(0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), () => (0, toToken_1.toToken)(fn))(basic_1.Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex);
};
exports.inject = inject;
const args = (index) => (c, { args = [] }) => {
return args[index];
};
exports.args = args;
const argsFn = (fn) => (c, options) => fn(...(options.args ?? []));
exports.argsFn = argsFn;
const resolveArgs = (Target, methodName) => {
const tokens = (0, parameter_1.getParamMeta)(hookMetaKey(methodName), Target);
return (scope, { args = [], lazy }) => tokens.map((fn) => fn.resolve(scope, { args: args.map(toToken_1.argToToken).map((t) => t.resolve(scope)), lazy }));
};
exports.resolveArgs = resolveArgs;