UNPKG

@sentzunhat/zacatl

Version:

A modular, high-performance TypeScript microservice framework for Node.js, featuring layered architecture, dependency injection, and robust validation for building scalable APIs and distributed systems.

77 lines 3.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerAndResolve = exports.registerDependencies = exports.resolveDependencies = exports.clearContainer = exports.resolveDependency = exports.registerValue = exports.registerSingleton = exports.registerDependency = exports.getContainer = void 0; require("../third-party/reflect-metadata"); const error_1 = require("../error/index.js"); const tsyringe_1 = require("../third-party/tsyringe.js"); const getContainer = () => { return tsyringe_1.container; }; exports.getContainer = getContainer; const registerDependency = (token, implementation) => { tsyringe_1.container.register(token, { useClass: implementation }); }; exports.registerDependency = registerDependency; const registerSingleton = (token, implementation) => { tsyringe_1.container.registerSingleton(token, implementation); }; exports.registerSingleton = registerSingleton; const registerValue = (token, value) => { tsyringe_1.container.register(token, { useValue: value }); }; exports.registerValue = registerValue; const resolveDependency = (token) => { return tsyringe_1.container.resolve(token); }; exports.resolveDependency = resolveDependency; const clearContainer = () => { tsyringe_1.container.clearInstances(); tsyringe_1.container.reset(); }; exports.clearContainer = clearContainer; const resolveDependencies = (dependencies) => { return dependencies.map((dependency) => { if (!tsyringe_1.container.isRegistered(dependency)) { const name = dependency.name ?? String(dependency); throw new error_1.InternalServerError({ message: `Failed to resolve '${name}' from the DI container`, reason: 'Make sure the class is decorated with @injectable() (or @singleton()) ' + 'and is registered before resolution. ' + "If this class is a repository, ensure it is listed under 'layers.infrastructure.repositories'. " + "If it is a domain service, ensure it is listed under 'layers.domain.providers'.", component: 'DIContainer', operation: 'resolveDependencies', metadata: { dependencyName: name }, }); } try { return tsyringe_1.container.resolve(dependency); } catch (err) { const name = dependency.name ?? String(dependency); throw new error_1.InternalServerError({ message: `Failed to resolve '${name}' from the DI container`, reason: err instanceof Error ? err.message : String(err), component: 'DIContainer', operation: 'resolveDependencies', metadata: { dependencyName: name }, error: err instanceof Error ? err : undefined, }); } }); }; exports.resolveDependencies = resolveDependencies; const registerDependencies = (dependencies) => { for (const dependency of dependencies) { tsyringe_1.container.register(dependency, { useClass: dependency, }); } }; exports.registerDependencies = registerDependencies; const registerAndResolve = (dependencies) => { (0, exports.registerDependencies)(dependencies); return (0, exports.resolveDependencies)(dependencies); }; exports.registerAndResolve = registerAndResolve; //# sourceMappingURL=container.js.map