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
JavaScript
;
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;