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.

23 lines (22 loc) 1.14 kB
import { Injector } from './IInjector'; import { Is } from '../utils/basic'; import { getParamMeta, addParamMeta } from '../metadata/parameter'; import { argToToken, toToken } from '../token/toToken'; export class MetadataInjector extends Injector { createInstance(scope, Target, { args: deps = [] } = {}) { const args = resolveArgs(Target)(scope, { args: deps }); return new Target(...args); } } const hookMetaKey = (methodName = 'constructor') => `inject:${methodName}`; export const inject = (fn) => (target, propertyKey, parameterIndex) => { addParamMeta(hookMetaKey(propertyKey), () => toToken(fn))(Is.instance(target) ? target.constructor : target, propertyKey, parameterIndex); }; export const args = (index) => (c, { args = [] }) => { return args[index]; }; export const argsFn = (fn) => (c, options) => fn(...(options.args ?? [])); export const resolveArgs = (Target, methodName) => { const tokens = getParamMeta(hookMetaKey(methodName), Target); return (scope, { args = [], lazy }) => tokens.map((fn) => fn.resolve(scope, { args: args.map(argToToken).map((t) => t.resolve(scope)), lazy })); };