UNPKG

@hestjs/core

Version:

HestJS Core Framework - A TypeScript framework built on Hono with dependency injection and decorators

108 lines 4.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HestFactory = void 0; const container_1 = require("../container/container"); const metadata_scanner_1 = require("../metadata/metadata-scanner"); const router_explorer_1 = require("../router/router-explorer"); const hest_application_1 = require("./hest-application"); const application_hooks_1 = require("./application-hooks"); const logger_1 = require("@hestjs/logger"); /** * HestJS 应用工厂 */ class HestFactory { /** * 创建应用实例 */ static async create(honoApp, moduleClass) { // 使用用户传入的 Hono 实例 const app = honoApp; // 创建 DI 容器 const container = container_1.Container.getInstance(); // 初始化模块 await HestFactory.initializeModule(moduleClass, container); // 创建应用实例 const appInstance = new hest_application_1.HestApplicationInstance(app, container); // 设置路由 const routerExplorer = new router_explorer_1.RouterExplorer(app, container); // 收集所有模块的控制器 const allControllers = HestFactory.collectAllControllers(moduleClass); if (allControllers.length > 0) { routerExplorer.explore(allControllers); } // 执行所有注册的应用启动钩子 await application_hooks_1.ApplicationHooks.getInstance().executeHooks(container); return appInstance; } /** * 初始化模块 */ static async initializeModule(moduleClass, container) { const moduleMetadata = metadata_scanner_1.MetadataScanner.scanModule(moduleClass); if (!moduleMetadata) { throw new Error(`Module metadata not found for ${moduleClass.name}`); } // 注册模块自身 container.register(moduleClass, moduleClass, 'module'); // 注册提供者 if (moduleMetadata.providers) { for (const provider of moduleMetadata.providers) { if (metadata_scanner_1.MetadataScanner.isInjectable(provider)) { // 注册类本身作为令牌 container.register(provider, provider, 'provider'); // 同时注册类名字符串作为令牌,以支持 @Inject('ClassName') 语法 container.register(provider.name, provider, 'provider'); } else { console.warn(`Provider ${provider.name} is not injectable, skipping registration`); } } } // 注册控制器 if (moduleMetadata.controllers) { for (const controller of moduleMetadata.controllers) { if (metadata_scanner_1.MetadataScanner.isController(controller)) { container.register(controller, controller, 'controller'); } else { throw new Error(`${controller.name} is not a valid controller`); } } } // 处理导入的模块 if (moduleMetadata.imports) { for (const importedModule of moduleMetadata.imports) { await HestFactory.initializeModule(importedModule, container); } } logger_1.logger.info(`✅ Module ${moduleClass.name} initialized`); } /** * 递归收集所有模块的控制器 */ static collectAllControllers(moduleClass, visited = new Set()) { // 防止循环依赖 if (visited.has(moduleClass)) { return []; } visited.add(moduleClass); const controllers = []; const moduleMetadata = metadata_scanner_1.MetadataScanner.scanModule(moduleClass); if (!moduleMetadata) { return controllers; } // 收集当前模块的控制器 if (moduleMetadata.controllers) { controllers.push(...moduleMetadata.controllers); } // 递归收集导入模块的控制器 if (moduleMetadata.imports) { for (const importedModule of moduleMetadata.imports) { controllers.push(...HestFactory.collectAllControllers(importedModule, visited)); } } return controllers; } } exports.HestFactory = HestFactory; //# sourceMappingURL=application-factory.js.map