Uecko_ERP/apps/server/src/core/package-loader.ts.bak
2025-05-02 23:43:51 +02:00

56 lines
1.6 KiB
TypeScript

import { IPackageServer } from "@libs/package";
import { Express } from "express";
import { Sequelize } from "sequelize";
import { registerService } from "./service-registry.ts.bak";
const registeredPackages: Map<string, IPackageServer> = new Map();
const initializedPackages = new Set<string>();
export function registerPackage(pkg: IPackageServer) {
if (registeredPackages.has(pkg.metadata.name)) {
throw new Error(`❌ Paquete "${pkg.metadata.name}" ya registrado.`);
}
registeredPackages.set(pkg.metadata.name, pkg);
}
export function initPackages(app: Express, sequelize: Sequelize) {
for (const [name] of registeredPackages) {
loadPackage(name, app, sequelize);
}
}
function loadPackage(name: string, app: Express, sequelize: Sequelize) {
if (initializedPackages.has(name)) return;
const pkg = registeredPackages.get(name);
if (!pkg) throw new Error(`❌ Paquete "${name}" no encontrado.`);
// Resolver dependencias primero
const deps = pkg.metadata.dependencies || [];
deps.forEach((dep) => loadPackage(dep, app, sequelize));
// Inicializar el package
pkg.init(app);
const pkgApi = pkg.registerDependencies?.();
// Registrar modelos de Sequelize, si los expone
if (pkgApi?.models) {
for (const initModelFn of pkgApi.models) {
initModelFn(sequelize);
}
}
// Registrar sus servicios, si los expone
if (pkgApi?.services) {
const services = pkgApi.services;
if (services && typeof services === "object") {
registerService(pkg.metadata.name, services);
}
}
initializedPackages.add(name);
console.log(`✅ Paquete "${name}" inicializado.`);
}