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