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.

44 lines (43 loc) 2.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.singleton = exports.decorate = exports.lazy = exports.scopeAccess = exports.appendArgsFn = exports.appendArgs = exports.scope = exports.bindTo = exports.register = exports.getTransformers = exports.registerPipe = exports.isProviderPipe = void 0; const SingleToken_1 = require("../token/SingleToken"); const BindToken_1 = require("../token/BindToken"); const class_1 = require("../metadata/class"); const isProviderPipe = (obj) => obj !== null && typeof obj === 'object' && 'mapProvider' in obj; exports.isProviderPipe = isProviderPipe; const registerPipe = (mapProvider) => ({ mapProvider, mapRegistration: (r) => r.pipe(mapProvider), }); exports.registerPipe = registerPipe; const METADATA_KEY = 'registration'; const getTransformers = (Target) => (0, class_1.getClassMeta)(Target, METADATA_KEY) ?? []; exports.getTransformers = getTransformers; const register = (...mappers) => (0, class_1.addClassMeta)(METADATA_KEY, (acc) => { const result = mappers.map((m) => (0, exports.isProviderPipe)(m) ? (r) => m.mapRegistration(r) : m); return acc ? [...result, ...acc] : result; }); exports.register = register; const bindTo = (...tokens) => (r) => { for (const token of tokens) { const targetToken = (0, BindToken_1.isBindToken)(token) ? token : new SingleToken_1.SingleToken(token); targetToken.bindTo(r); } return r; }; exports.bindTo = bindTo; const scope = (...rules) => (r) => r.when(...rules); exports.scope = scope; const appendArgs = (...extraArgs) => (0, exports.registerPipe)((p) => p.addArgsFn((_, { args = [] } = {}) => [...args, ...extraArgs])); exports.appendArgs = appendArgs; const appendArgsFn = (fn) => (0, exports.registerPipe)((p) => p.addArgsFn((scope, options) => [...(options?.args ?? []), ...fn(scope, options)])); exports.appendArgsFn = appendArgsFn; const scopeAccess = (rule) => (0, exports.registerPipe)((p) => p.addAccessRule(rule)); exports.scopeAccess = scopeAccess; const lazy = () => (0, exports.registerPipe)((p) => p.lazy()); exports.lazy = lazy; const decorate = (...fns) => (0, exports.registerPipe)((p) => p.map(...fns)); exports.decorate = decorate; const singleton = (getCacheKey) => (0, exports.registerPipe)((p) => p.singleton(getCacheKey)); exports.singleton = singleton;