UNPKG

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.

34 lines (33 loc) 1.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveArgs = exports.args = exports.argsFn = 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"); const FunctionToken_1 = require("../token/FunctionToken"); 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, selectFn = (instance) => instance) => (target, propertyKey, parameterIndex) => { const toSelectedToken = () => { const token = (0, toToken_1.toToken)(fn); return new FunctionToken_1.FunctionToken((scope, options) => selectFn(token.resolve(scope, options))); }; (0, parameter_1.addParamMeta)(hookMetaKey(propertyKey), toSelectedToken)(basic_1.Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex); }; exports.inject = inject; const argsFn = (predicate) => (c, { args = [] }) => args.find((value, index) => predicate(value, index)); exports.argsFn = argsFn; const args = (index) => (0, exports.argsFn)((value, i) => i === index); exports.args = args; 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;