@hestjs/core
Version:
HestJS Core Framework - A TypeScript framework built on Hono with dependency injection and decorators
108 lines • 4.39 kB
JavaScript
;
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